package org.karmaexchange.resources; import static org.karmaexchange.util.OfyService.ofy; import static org.karmaexchange.resources.OrganizationResource.MIN_ROLE_PARAM; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.GenericEntity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.karmaexchange.dao.Event; import org.karmaexchange.dao.Organization.Role; import org.karmaexchange.dao.User; import org.karmaexchange.resources.msg.ErrorResponseMsg; import org.karmaexchange.resources.msg.EventSearchView; import org.karmaexchange.resources.msg.ListResponseMsg; import org.karmaexchange.resources.msg.OrganizationMembershipView; import org.karmaexchange.resources.msg.ErrorResponseMsg.ErrorInfo; import org.karmaexchange.util.OfyUtil; import org.karmaexchange.util.PaginatedQuery; import org.karmaexchange.util.PaginatedQuery.ConditionFilter; import com.google.common.collect.Lists; import com.googlecode.objectify.Key; @Path("/user") public class UserResource extends ViewlessBaseDaoResource<User> { // TODO(avaliani): Lock down user class. Some fields are only visible to owners of the // user class. @Override protected void preProcessUpsert(User user) { if (!user.isKeyComplete()) { throw ErrorResponseMsg.createException("Key must be specified for user upsert", ErrorInfo.Type.BAD_REQUEST); } } @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public Response getResources() { // TODO(avaliani): When we start using this api we should sort the results and therefore // modify the query. PaginatedQuery.Builder<User> queryBuilder = PaginatedQuery.Builder.create(User.class, uriInfo, DEFAULT_NUM_SEARCH_RESULTS); ListResponseMsg<User> users = ListResponseMsg.create(queryBuilder.build().execute()); return Response.ok(new GenericEntity<ListResponseMsg<User>>(users) {}).build(); } @Path("{user_key}/event") @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public ListResponseMsg<EventSearchView> getEvents( @PathParam("user_key") String userKeyStr) { return userEventSearch(uriInfo, OfyUtil.<User>createKey(userKeyStr)); } public static ListResponseMsg<EventSearchView> userEventSearch(UriInfo uriInfo, Key<User> userKey) { ConditionFilter participantFilter = new ConditionFilter(Event.getParticipantPropertyName(), userKey); return EventResource.eventSearch(uriInfo, Lists.newArrayList(participantFilter), userKey); } @Path("{user_key}/user_managed_event") public UserManagedEventResource getUserManagedEvents(@PathParam("user_key") String userKeyStr) { Key<User> userKey = OfyUtil.<User>createKey(userKeyStr); return new UserManagedEventResource(uriInfo, request, servletContext, userKey); } @Path("{user_key}/org") @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public ListResponseMsg<OrganizationMembershipView> getOrgs( @PathParam("user_key") String userKeyStr) { return getOrgs(OfyUtil.<User>createKey(userKeyStr), uriInfo); } public static ListResponseMsg<OrganizationMembershipView> getOrgs(Key<User> userKey, UriInfo uriInfo) { MultivaluedMap<String, String> reqParams = uriInfo.getQueryParameters(); Role minRole = reqParams.containsKey(MIN_ROLE_PARAM) ? Role.valueOf(reqParams.getFirst(MIN_ROLE_PARAM)) : Role.ORGANIZER; User user = ofy().load().key(userKey).now(); // For now we always fetch all the organizations. Implementing offsetted results requires // fetching all the organizations and sorting them by name. So it doesn't save us anything // to return a smaller batch at a time. return ListResponseMsg.create(OrganizationMembershipView.create(user, minRole)); } }