package org.fluxtream.core.api; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.wordnik.swagger.annotations.ApiParam; import org.fluxtream.core.auth.AuthHelper; import org.fluxtream.core.auth.TrustRelationshipRevokedException; import org.fluxtream.core.domain.TrustedBuddy; import org.fluxtream.core.domain.DataUpdate; import org.fluxtream.core.domain.Guest; import org.fluxtream.core.mvc.models.DataUpdateDigestModel; import org.fluxtream.core.services.BuddiesService; import org.fluxtream.core.services.DataUpdateService; import org.fluxtream.core.services.GuestService; import org.fluxtream.core.services.SettingsService; import org.joda.time.format.ISODateTimeFormat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.List; @Path("/v1/dataUpdates") @Component("DataUpdateStore") @Scope("request") public class DataUpdateStore { Gson gson = new GsonBuilder().create(); @Autowired GuestService guestService; @Autowired SettingsService settingsService; @Autowired DataUpdateService dataUpdateService; @Autowired BuddiesService buddiesService; @GET @Path("/all") @Produces({MediaType.APPLICATION_JSON}) public Response getDataUpdates(@QueryParam("since") String since, @ApiParam(value="Buddy to access username parameter (" + BuddiesService.BUDDY_TO_ACCESS_PARAM + ")", required=false) @QueryParam(BuddiesService.BUDDY_TO_ACCESS_PARAM) String buddyToAccessParameter){ try{ TrustedBuddy trustedBuddy; try { trustedBuddy = AuthHelper.getBuddyTrustedBuddy(buddyToAccessParameter, buddiesService); } catch (TrustRelationshipRevokedException e) {return Response.status(403).entity("Sorry, permission to access this data has been revoked. Please reload your browser window").build();} Guest guest = ApiHelper.getBuddyToAccess(guestService, trustedBuddy); if (guest==null) return Response.status(401).entity("You are no longer logged in").build(); long guestId = guest.getId(); List<DataUpdate> updates = dataUpdateService.getAllUpdatesSince(guestId, ISODateTimeFormat.dateTime().parseMillis(since)); return Response.ok(gson.toJson(new DataUpdateDigestModel(updates,guestService,settingsService,ISODateTimeFormat.dateTime().parseMillis(since)))).build(); } catch (Exception e){ e.printStackTrace(); return Response.serverError().entity("Failed to fetch updates").build(); } } }