package org.karmaexchange.resources.derived; import static org.karmaexchange.util.OfyService.ofy; import javax.annotation.Nullable; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import org.karmaexchange.dao.BaseDao; import org.karmaexchange.dao.Organization; import org.karmaexchange.dao.PageRef; import org.karmaexchange.dao.Organization.SourceOrganizationInfo; import org.karmaexchange.dao.derived.EventSourceInfo; import org.karmaexchange.provider.FacebookSocialNetworkProvider; import org.karmaexchange.provider.SocialNetworkProvider.SocialNetworkProviderType; import org.karmaexchange.resources.msg.ErrorResponseMsg; import org.karmaexchange.resources.msg.ErrorResponseMsg.ErrorInfo; import com.googlecode.objectify.Key; import com.googlecode.objectify.VoidWork; @Data @NoArgsConstructor public final class SourceOrganization { private String id; private String name; @Nullable private String orgId; @Nullable private String secretKey; // This constructor is only meant to be used for source update requests. public SourceOrganization(SourceOrganizationInfo sourceOrgInfo) { id = sourceOrgInfo.getId(); } public void validate() { if ((id == null) || (name == null)) { throw ErrorResponseMsg.createException("invalid org info: " + this, ErrorInfo.Type.BAD_REQUEST); } } public Key<Organization> lookupOrCreateOrg(EventSourceInfo listingOrgInfo) { Organization listingOrg = ofy().load().key(listingOrgInfo.getOrgKey()).now(); SourceOrganizationInfo listingOrgIdInfo = listingOrg.getSourceOrgInfo(); // Check if the org being looked up is the listing org. if (id.equals(listingOrgIdInfo.getId())) { // Use the saved org name and not the one specified in the remote db. name = listingOrg.getOrgName(); orgId = Organization.getOrgId(listingOrgInfo.getOrgKey()); return listingOrgInfo.getOrgKey(); } Key<Organization> orgKey = null; Organization org; if (orgId == null) { orgId = computeOrgId(listingOrgInfo); orgKey = Organization.createKey(orgId); org = ofy().load().key(orgKey).now(); if (org == null) { // We automatically create organizations for organizations that // do not have an existing org. org = new Organization(); org.setName( Organization.orgIdToName(orgId)); org.setOrgName(name); org.setSourceOrgInfo( new SourceOrganizationInfo(id, Key.create(listingOrg))); org.setListingOrgPage(listingOrg.getPage()); SourceOrganization.CreateOrganizationTxn createOrgTxn = new CreateOrganizationTxn(org); ofy().transact(createOrgTxn); org = createOrgTxn.org; } } else { // TESTING: We're disabling the org secret check for now. // EventSourceInfo.validateOrgSecret(orgId, secretKey); orgKey = Organization.createKey(orgId); org = ofy().load().key(orgKey).now(); // TESTING: We're auto creating orgs that don't exist. if (org == null) { org = createOrganizationFromFb(orgId, listingOrgInfo.getOrgKey()); } } // Use the saved org name and not the one specified in the remote db. name = org.getOrgName(); return orgKey; } private String computeOrgId(EventSourceInfo listingOrgInfo) { String listingOrgId = Organization.getOrgId(listingOrgInfo.getOrgKey()); String orgNameSuffix = name.replaceAll("\\s","").toLowerCase(); return listingOrgId + "." + orgNameSuffix; } // TESTING private Organization createOrganizationFromFb(String orgId, Key<Organization> listingOrgKey) { Organization org = new Organization(); org.setPage(PageRef.create(orgId, FacebookSocialNetworkProvider.PAGE_BASE_URL + orgId, SocialNetworkProviderType.FACEBOOK)); org.initFromPage(); org.setSourceOrgInfo( new SourceOrganizationInfo(id, listingOrgKey)); SourceOrganization.CreateOrganizationTxn createOrgTxn = new CreateOrganizationTxn(org); ofy().transact(createOrgTxn); return createOrgTxn.org; } @Data @AllArgsConstructor @EqualsAndHashCode(callSuper=false) private static class CreateOrganizationTxn extends VoidWork { private Organization org; public void vrun() { Key<Organization> orgKey = Key.create(org); Organization existingOrg = ofy().load().key(orgKey).now(); if (existingOrg == null) { BaseDao.upsert(org); } else { org = existingOrg; } } } }