package controllers.crud; import static play.libs.Json.toJson; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.inject.Inject; import models.ActionType; import models.SecurityRole; import models.User; import models.UserFollow; import models.UserFollowPK; import models.dao.SecurityRoleDAO; import models.dao.UserDAO; import models.dao.UserFollowDAO; import com.fasterxml.jackson.databind.JsonNode; import play.mvc.Result; import play.utils.crud.APIController; import play.utils.dao.EntityNotFoundException; import com.google.common.collect.ImmutableMap; import controllers.ActionHandler; import controllers.HttpUtils; public class UserAPIController extends APIController<String, User> { private UserDAO userDAO; private UserFollowDAO userFollowDAO; private SecurityRoleDAO securityRoleDAO; private ActionHandler actionHandler; @Inject public UserAPIController(UserDAO userDAO, UserFollowDAO userFollowDAO, SecurityRoleDAO securityRoleDAO, ActionHandler actionHandler) { super(userDAO, String.class, User.class); this.userDAO = userDAO; this.userFollowDAO = userFollowDAO; this.securityRoleDAO = securityRoleDAO; this.actionHandler = actionHandler; } @Override public Result create() { /* TODO: Result check = checkRequired("url"); if (check != null) { return check; } String url = jsonText("url"); try { new URL(url ); } catch (MalformedURLException e) { return badRequest(toJson(ImmutableMap.of( "status", "error", "message", e.getMessage()))); } User m = new User(); m.setStatus(User.Status.NEW); m.setUrl(url); Long key = userDAO.create(m); */ return TODO; } public Result bulkList() { if (log.isDebugEnabled()) log.debug("bulkList() <-"); //clean cyclic dependencies List<User> list = userDAO.all(); for (User user : list) { user.getPosts().clear(); user.getComments().clear(); } return ok(toJson(list)); } public Result follow(String key) { if (log.isDebugEnabled()) log.debug("follow() <- " + key); User loginUser = HttpUtils.loginUser(); String sourceKey = loginUser.getKey(); UserFollowPK followKey = new UserFollowPK(sourceKey, key); UserFollow follow = userFollowDAO.get(followKey); if (follow == null) { follow = new UserFollow(); follow.setKey(followKey); userFollowDAO.create(follow); actionHandler.perform(loginUser, userDAO.get(key), ActionType.FOLLOW_USER); } return created(toJson(ImmutableMap.of("status", "OK", "key", key, "data", follow))); } public Result unfollow(String key) { if (log.isDebugEnabled()) log.debug("follow() <- " + key); User user = HttpUtils.loginUser(); if (user == null) return notFound("no user logged in"); String sourceKey = user.getKey(); UserFollowPK followKey = new UserFollowPK(sourceKey, key); UserFollow follow = userFollowDAO.get(followKey); if (follow != null) { try { userFollowDAO.remove(followKey); } catch (EntityNotFoundException e) { return ok(toJson(ImmutableMap.of("status", "not found", "key", key, "data", follow))); } } return created(toJson(ImmutableMap.of("status", "OK", "key", key, "data", follow))); } public Result roleUpdate(String key) { if (log.isDebugEnabled()) log.debug("roleUpdate <- " + key); //field name & value String name = jsonText("name"); List<String> values = jsonTextList("value"); if (log.isDebugEnabled()) log.debug("name : " + name); if (log.isDebugEnabled()) log.debug("values : " + values); User u = userDAO.get(key); if (log.isDebugEnabled()) log.debug("m : " + u); if (u == null) { return notFound(toJson(ImmutableMap.of( "status", "OK", "key", key, "message", "entity with the given key not found"))); } List<SecurityRole> roles = u.getSecurityRoles(); if (log.isDebugEnabled()) log.debug("old roles : " + roles); for (SecurityRole role : roles) { if (log.isDebugEnabled()) log.debug("old role : " + role); } roles.clear(); for (String rolekeyStr : values) { try { Long roleKey = Long.parseLong(rolekeyStr); SecurityRole role = securityRoleDAO.get(roleKey); if (role != null) roles.add(role); } catch (NumberFormatException e) { continue; } } if (log.isDebugEnabled()) log.debug("new roles : " + roles); userDAO.saveAssociation(u, "securityRoles"); //userDAO.update(key, u); if (log.isDebugEnabled()) log.debug("updated."); if (log.isDebugEnabled()) log.debug("m : " + u); u = userDAO.get(key); List<SecurityRole> newRoles = u.getSecurityRoles(); if (log.isDebugEnabled()) log.debug("newRoles : " + newRoles); for (SecurityRole role : newRoles) { if (log.isDebugEnabled()) log.debug("new role : " + role); } return ok(toJson(ImmutableMap.of( "status", "OK", "key", key, "message", "field[" + name + "] updated"))); } protected List<String> jsonTextList(String name) { JsonNode json = request().body().asJson(); JsonNode node = json.get(name); if (node == null) return null; List<String> list = new ArrayList<String>(); for (Iterator<JsonNode> elems = node.elements(); elems.hasNext();) { JsonNode elem = elems.next(); if (log.isDebugEnabled()) log.debug("elem : " + elem); list.add(elem.asText()); } return list; } }