package controllers; import com.avaje.ebean.Expr; import com.fasterxml.jackson.databind.JsonNode; import models.Problem; import models.ProblemVote; import models.Solution; import models.User; import play.mvc.Result; import utils.Authentication; import java.io.File; import java.util.List; public class ProblemController extends OJController { public static Result problemListPage() { List<Problem> problems = Problem.find.where().or(Expr.eq("status", 0), Expr.eq("status", 3)).findList(); return ok(views.html.problem.list.render(problems, null)); } public static Result problemListPage(User user) { List<Problem> problems = user.getSolvedProblems(); return ok(views.html.problem.list.render(problems, user)); } public static Result problemDetailPage(String slug) { Problem problem = Problem.findBySlug(slug); if (problem == null) { return notFound("Problem not found."); } boolean solvedByCurrentUser = false; boolean votedByCurrentUser = false; User user = UserController.currentUser(); if (user != null && problem.isSolvedBy(user)) { solvedByCurrentUser = true; ProblemVote vote = ProblemVote.find.where().eq("problem", problem).eq("user", user).findUnique(); if (vote != null) { votedByCurrentUser = true; } } return ok(views.html.problem.detail.render(problem, solvedByCurrentUser, votedByCurrentUser)); } public static Result problemDetail(String slug) { Problem problem = Problem.findBySlug(slug); if (problem == null) { return notFound(jsonResponse(1, "Problem not found.")); } return ok(jsonResponse(0, problem)); } @Authentication(json = true) public static Result handleProblemSubmit(String slug) { JsonNode in = request().body().asJson(); if (in == null) { return formSubmitResponse(1, null, "Expecting Json data."); } Problem problem = Problem.findBySlug(slug); User user = (User) ctx().args.get("user"); Solution solution = new Solution(); solution.language = in.get("language").asInt(); solution.code = in.get("code").asText(); solution.user = user; solution.problem = problem; solution.save(); return formSubmitResponse(0, null, null); } public static Result assetFile(Long id, String filename) { String path = "upload/assets/" + id + "/" + filename; File file = new File(path); return ok(file); } @Authentication(json = true) public static Result handleVoting(String slug) { Problem problem = Problem.findBySlug(slug); User user = (User) ctx().args.get("user"); if (problem == null) { return notFound(jsonResponse(1, "Problem not found.")); } JsonNode in = request().body().asJson(); if (in == null) { return formSubmitResponse(1, null, "Expecting Json data."); } try { ProblemVote vote = ProblemVote.find.where().eq("problem", problem).eq("user", user).findUnique(); if (vote == null) { vote = new ProblemVote(); } vote.problem = problem; vote.user = user; vote.rating = in.get("quality").asInt(); vote.difficulty = in.get("difficulty").asInt(); vote.save(); return ok(jsonResponse(0, null)); } catch (Exception e) { return badRequest(jsonResponse(2, e.toString())); } } }