package org.karmaexchange.resources.derived; import java.util.List; import javax.annotation.Nullable; import javax.servlet.ServletContext; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Request; import javax.ws.rs.core.UriInfo; import javax.xml.bind.annotation.XmlRootElement; import lombok.Data; import org.karmaexchange.dao.Event; import org.karmaexchange.dao.derived.EventSourceInfo; import org.karmaexchange.resources.EventResource; import org.karmaexchange.resources.msg.EventView; import org.karmaexchange.util.AdminUtil; import org.karmaexchange.util.AdminUtil.AdminSubtask; import org.karmaexchange.util.AdminUtil.AdminTaskType; @Path("/derived/event") public class SourceEventResource { @Context protected UriInfo uriInfo; @Context protected Request request; @Context protected ServletContext servletContext; @POST @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public void syncEvents( @QueryParam("org_id") String orgId, @QueryParam("org_secret") String orgSecret, List<SyncRequest> syncRequests) { EventSourceInfo sourceInfo = EventSourceInfo.validateOrgSecret(orgId, orgSecret); AdminUtil.executeSubtaskAsAdmin( AdminTaskType.SOURCE_EVENT_UPDATE, new SyncEventsAdminSubtask(syncRequests, sourceInfo)); } @Data private class SyncEventsAdminSubtask implements AdminSubtask { private final List<SyncRequest> syncRequests; private final EventSourceInfo sourceInfo; @Override public void execute() { // TODO(avaliani): Optimize this by doing a batch upsert / delete. for (SyncRequest syncRequest : syncRequests) { if (syncRequest.action == SyncRequest.Action.UPSERT) { if (syncRequest.sourceEvent != null) { Event event = syncRequest.sourceEvent.toEvent(sourceInfo); getEventResource().upsertResource( new EventView(event, false)); } else if (syncRequest.sourceUser != null) { syncRequest.sourceUser.upsert(sourceInfo); } else if (syncRequest.sourceConfig != null) { syncRequest.sourceConfig.upsert(sourceInfo); } } else { // DELETE if (syncRequest.sourceEventId != null) { getEventResource().deleteResource( SourceEvent.createKey(sourceInfo, syncRequest.sourceEventId)); } } } } } private EventResource getEventResource() { return new EventResource(uriInfo, request, servletContext); } @XmlRootElement @Data public static class SyncRequest { public enum Action { UPSERT, DELETE } private Action action; /** * Source db key of the event being synchronized. Only non-null for DELETE. */ @Nullable private String sourceEventId; /** * Source db event of being synchronized. Only non-null for UPSERT. */ @Nullable private SourceEvent sourceEvent; /** * Source db user being synchronized. Only non-null for UPSERT. */ @Nullable private SourceUser sourceUser; /** * Source configuration info. Only non-null for UPSERT. */ @Nullable private SourceConfig sourceConfig; } }