package controllers; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import play.db.DB; import play.mvc.Controller; import play.mvc.Result; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; public class Group extends Controller { public static Result createGroup() { JsonNode request = request().body().asJson(); try { Application.checkReqValid(request); } catch(AuthorizationException e) { return unauthorized(JsonNodeFactory.instance.objectNode().put("error", e.getMessage())); } catch(SQLException e) { e.printStackTrace(); return internalServerError(); } //check params String groupName; long userId; if(!request.has("group_name")) { return badRequest(JsonNodeFactory.instance.objectNode().put("error", "usage: group_name")); } groupName = request.get("group_name").textValue(); userId = Application.getUserId(request); Connection conn = null; PreparedStatement stmt = null; try { conn = DB.getConnection(); conn.setAutoCommit(false); //run sql stmt = conn.prepareStatement("INSERT INTO `Group` (name) VALUES (?)", Statement.RETURN_GENERATED_KEYS); stmt.setString(1, groupName); stmt.execute(); ResultSet rs = stmt.getGeneratedKeys(); if(rs.next()) { //get group id long groupId = rs.getLong(1); stmt.close(); //add user who created group as admin stmt = conn.prepareStatement("INSERT INTO Group_has_User (user_id, group_id, is_admin) VALUES (?, ?, 1)"); stmt.setLong(1, userId); stmt.setLong(2, groupId); stmt.execute(); conn.commit(); return ok(JsonNodeFactory.instance.objectNode().put("group_id", groupId)); } } catch(SQLException e) { //rollbak on failure try { conn.rollback(); } catch(SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { //cleanup try { if(conn != null) { conn.close(); } } catch(SQLException e) { e.printStackTrace(); } try { if(stmt != null) { stmt.close(); } } catch(SQLException e) { e.printStackTrace(); } } return internalServerError(); } public static Result joinGroup() { //check auth JsonNode request = request().body().asJson(); try { Application.checkReqValid(request); } catch(AuthorizationException e) { return unauthorized(JsonNodeFactory.instance.objectNode().put("error", e.getMessage())); } catch(SQLException e) { e.printStackTrace(); return internalServerError(); } //check params long groupId; long userId; if(!request.has("group_id") || !request.get("group_id").canConvertToInt()) { return badRequest(JsonNodeFactory.instance.objectNode().put("error", "usage: group_id (int)")); } groupId = request.get("group_id").intValue(); userId = Application.getUserId(request); try(Connection conn = DB.getConnection()) { try(PreparedStatement stmt = conn.prepareStatement("INSERT IGNORE INTO Group_has_User (user_id, group_id) VALUES (?, ?)")) { stmt.setLong(1, userId); stmt.setLong(2, groupId); stmt.execute(); return ok(); } } catch(SQLException e) { e.printStackTrace(); return internalServerError(); } } private static final String IS_MEMBER_ADMIN_SQL = "SELECT is_admin FROM Group_has_User WHERE user_id = ?"; private static final String LEAVE_GROUP_SQL = "DELETE FROM Group_has_User WHERE user_id = ?"; }