package org.karmaexchange.resources;
import static java.lang.String.format;
import static org.karmaexchange.util.UserService.getCurrentUser;
import static org.karmaexchange.util.UserService.getCurrentUserKey;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.karmaexchange.dao.BaseDao;
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.ImageUploadUtil;
import org.karmaexchange.util.UserService;
import com.google.appengine.api.blobstore.BlobKey;
import com.google.appengine.api.blobstore.BlobstoreServiceFactory;
@Path("/me")
public class MeResource {
@Context
private UriInfo uriInfo;
@Context
private Request request;
public MeResource() {
if (!UserService.isCurrentUserLoggedIn()) {
throw ErrorResponseMsg.createException("Login required", ErrorInfo.Type.LOGIN_REQUIRED);
}
// Make sure the current user is created any time the me resource is accessed;
getCurrentUser();
}
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public User getResource() {
return getCurrentUser();
}
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response updateResource(User updatedUser) {
if (!updatedUser.isKeyComplete()) {
throw ErrorResponseMsg.createException("Key must be specified for update",
ErrorInfo.Type.BAD_REQUEST);
}
if (!getCurrentUserKey().getString().equals(updatedUser.getKey())) {
throw ErrorResponseMsg.createException(
format("thew new resource key [%s] does not match the previous key [%s]",
getCurrentUserKey().getString(), updatedUser.getKey()),
ErrorInfo.Type.BAD_REQUEST);
}
BaseDao.upsert(updatedUser);
return Response.ok().build();
}
@DELETE
public void deleteResource() {
BaseDao.delete(getCurrentUserKey());
}
@Path("event")
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public ListResponseMsg<EventSearchView> getEvents() {
return UserResource.userEventSearch(uriInfo, getCurrentUserKey());
}
@Path("org")
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public ListResponseMsg<OrganizationMembershipView> getOrgs() {
return UserResource.getOrgs(getCurrentUserKey(), uriInfo);
}
@Path("profile_image")
@POST
@Consumes({MediaType.MULTIPART_FORM_DATA})
@Produces({MediaType.APPLICATION_JSON})
public Response updateProfileImage(
@Context HttpServletRequest servletRequest) {
BlobKey blobKey = ImageUploadUtil.persistImage(servletRequest);
try {
User.updateProfileImage(getCurrentUserKey(), blobKey);
} catch (RuntimeException e) {
BlobstoreServiceFactory.getBlobstoreService().delete(blobKey);
throw e;
}
return Response.ok().build();
}
@Path("profile_image")
@DELETE
public void deleteProfileImage() {
User.deleteProfileImage(getCurrentUserKey());
}
}