package org.fluxtream.core.api; import org.codehaus.jackson.map.ObjectMapper; import org.fluxtream.core.auth.AuthHelper; import org.fluxtream.core.domain.oauth2.Application; import org.fluxtream.core.mvc.models.ApplicationModel; import org.fluxtream.core.services.PartnerAppsService; 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.io.IOException; import java.util.ArrayList; import java.util.List; /** * CRUD operations for Partner Applications. This API resource needs to live inside * of the dev webapp because it uses a separate security context. */ @Path("/v1/apps") @Component("RESTPartnerAppsStore") @Scope("request") public class PartnerAppsStore { @Autowired PartnerAppsService partnerAppsService; private final ObjectMapper mapper = new ObjectMapper(); @POST @Path("/{uid}") @Produces({ MediaType.APPLICATION_JSON }) @Consumes(MediaType.APPLICATION_JSON) public Response updateApplication(ApplicationModel appModel, @PathParam("uid") String uid) { return createOrUpdateApplication(appModel, uid); } @POST @Path("/") @Produces({ MediaType.APPLICATION_JSON }) @Consumes(MediaType.APPLICATION_JSON) public Response createApplication(ApplicationModel appModel) { return createOrUpdateApplication(appModel, null); } public Response createOrUpdateApplication(ApplicationModel appModel, String uid) { final long guestId = AuthHelper.getGuestId(); try { if (uid==null) { partnerAppsService.createApplication(guestId, appModel.organization, appModel.name, appModel.description, appModel.website); return Response.ok(String.format("Created app '%s': %s", appModel.name, appModel.description)).build(); } else { partnerAppsService.updateApplication(guestId, appModel.organization, appModel.uid, appModel.name, appModel.description, appModel.website); return Response.ok(String.format("Updated app '%s': %s", appModel.name, appModel.description)).build(); } } catch (Throwable e) { return Response.serverError().entity(String.format("Could not create app '%s'", appModel.name)).build(); } } @GET @Path("/{uid}") @Produces({ MediaType.APPLICATION_JSON }) public Response getApplication(@PathParam("uid") String uid) throws IOException { final long guestId = AuthHelper.getGuestId(); try { final Application app = partnerAppsService.getApplication(guestId, uid); if (app!=null) { return Response.ok(mapper.writeValueAsString(new ApplicationModel(app))).build(); } else { return Response.status(Response.Status.BAD_REQUEST).entity("No such application: " + uid).build(); } } catch (Throwable e) { return Response.serverError().entity("Couldn't list applications for user " + guestId).build(); } } @DELETE @Path("/{uid}") @Produces({ MediaType.APPLICATION_JSON }) public Response deleteApplication(@PathParam("uid") String uid) { final long guestId = AuthHelper.getGuestId(); try { partnerAppsService.deleteApplication(guestId, uid); return Response.ok(String.format("Deleted app '%s'", uid)).build(); } catch (Throwable e) { return Response.serverError().entity(String.format("Could not delete app '%s'", uid)).build(); } } @GET @Path("/") @Produces({ MediaType.APPLICATION_JSON }) public Response listApplications() throws IOException { final long guestId = AuthHelper.getGuestId(); try { final List<Application> applications = partnerAppsService.getApplications(guestId); List<ApplicationModel> apps = new ArrayList<ApplicationModel>(); for (Application application : applications) { ApplicationModel app = new ApplicationModel(application); apps.add(app); } final String json = mapper.writeValueAsString(apps); return Response.ok(json).build(); } catch (Throwable e) { return Response.serverError().entity("Couldn't list applications for user " + guestId).build(); } } }