package controllers; import static service.filestore.roles.Admin.isAdmin; import javax.jcr.RepositoryException; import javax.jcr.Session; import models.Notification; import models.NotificationDAO; import models.User; import models.UserDAO; import notification.Notifier.Events; import org.jcrom.Jcrom; import play.libs.F; import play.mvc.Result; import play.mvc.With; import providers.CacheableUserProvider; import service.EventManager; import service.JcrSessionFactory; import service.filestore.JsonBuilder; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.google.inject.Inject; @With(UncacheableAction.class) public final class UserController extends SessionAwareController { private final EventManager eventManager; @Inject UserController(JcrSessionFactory sessionFactory, Jcrom jcrom, CacheableUserProvider subjectHandler, EventManager eventManager) { super(sessionFactory, jcrom, subjectHandler); this.eventManager = eventManager; } @SubjectPresent public Result usersJson() { return inUserSession(new F.Function<Session, Result>() { @Override public final Result apply(Session session) throws RepositoryException { final JsonBuilder jb = new JsonBuilder(); final ArrayNode json = JsonNodeFactory.instance.arrayNode(); final UserDAO dao = new UserDAO(session, jcrom); for (final User user : dao.list()) { json.add(jb.toJson(user, isAdmin(session, dao, user))); } return ok(json).as("application/json; charset=utf-8"); } }); } @SubjectPresent public Result notificationsJson() { return inUserSession(new F.Function<Session, Result>() { @Override public final Result apply(Session session) throws RepositoryException { final JsonBuilder jb = new JsonBuilder(); final UserDAO dao = new UserDAO(session, jcrom); final ArrayNode json = JsonNodeFactory.instance.arrayNode(); for (final Notification n : dao.get(getUser()).getNotifications()) { json.add(jb.toJson(n)); } return ok(json).as("application/json; charset=utf-8"); } }); } @SubjectPresent public Result getNotification(final String id) { return inUserSession(new F.Function<Session, Result>() { @Override public final Result apply(Session session) throws RepositoryException { final JsonBuilder jb = new JsonBuilder(); final Notification n = findNotificationByID(session, id); if (n == null) return notFound(); return ok(jb.toJson(n)).as("application/json; charset=utf-8"); } }); } @SubjectPresent public Result putNotification(final String id) { return inUserSession(new F.Function<Session, Result>() { @Override public final Result apply(Session session) throws RepositoryException { final JsonBuilder jb = new JsonBuilder(); final NotificationDAO dao = new NotificationDAO(session, jcrom); final Notification n = findNotificationByID(session, id); if (n == null) return notFound(); final JsonNode json = ctx().request().body().asJson(); if (!json.has("read")) return badRequest("Should have read attribute."); n.setRead(json.get("read").asBoolean()); dao.update(n); eventManager.tell(Events.update(n)); return ok(jb.toJson(n)).as("application/json; charset=utf-8"); } }); } @SubjectPresent public Result deleteNotification(final String id) { return inUserSession(new F.Function<Session, Result>() { @Override public final Result apply(Session session) throws RepositoryException { final NotificationDAO dao = new NotificationDAO(session, jcrom); final Notification n = findNotificationByID(session, id); if (n == null) return notFound(); dao.removeById(n.getId()); session.save(); eventManager.tell(Events.delete(n)); return noContent(); } }); } /** * Inefficient but safe & simple finder for notifications by ID. * * @param session * @param id * @return */ protected Notification findNotificationByID(Session session, String id) { final UserDAO dao = new UserDAO(session, jcrom); for (Notification n : dao.get(getUser()).getNotifications()) { if (n.getId().equals(id)) return n; } return null; } }