Step toward a one-page application
[vchess.git] / routes / problems.js
index 43258a0..777543b 100644 (file)
@@ -6,20 +6,6 @@ const ProblemModel = require("../models/Problem");
 const sanitizeHtml = require('sanitize-html');
 const MaxNbProblems = 20;
 
-// Fetch N previous or next problems
-router.get("/problems/:vname([a-zA-Z0-9]+)", access.ajax, (req,res) => {
-       const vname = req.params["vname"];
-       const directionStr = (req.query.direction == "forward" ? ">" : "<");
-       const lastDt = req.query.last_dt;
-       if (!lastDt.match(/[0-9]+/))
-               return res.json({errmsg: "Bad timestamp"});
-       ProblemModel.fetchN(vname, directionStr, lastDt, MaxNbProblems, (err,problems) => {
-               if (!!err)
-                       return res.json(err);
-               return res.json({problems: problems});
-       });
-});
-
 function sanitizeUserInput(fen, instructions, solution)
 {
        if (!fen.match(/^[a-zA-Z0-9, /-]*$/))
@@ -37,30 +23,71 @@ function sanitizeUserInput(fen, instructions, solution)
        };
 }
 
+// Get one problem (TODO: vid unused, here for URL de-ambiguification)
+router.get("/problems/:vid([0-9]+)/:id([0-9]+)", access.ajax, (req,res) => {
+       const pid = req.params["id"];
+       ProblemModel.getOne(pid, (err,problem) => {
+               if (!!err)
+                       return res.json(err);
+               return res.json({problem: problem});
+       });
+});
+
+// Fetch N previous or next problems
+router.get("/problems/:vid([0-9]+)", access.ajax, (req,res) => {
+       const vid = req.params["vid"];
+       const directionStr = (req.query.direction == "forward" ? ">" : "<");
+       const lastDt = req.query.last_dt;
+       const type = req.query.type;
+       if (!lastDt.match(/[0-9]+/))
+               return res.json({errmsg: "Bad timestamp"});
+       if (!["others","mine"].includes(type))
+               return res.json({errmsg: "Bad type"});
+       ProblemModel.fetchN(vid, req.userId, type, directionStr, lastDt, MaxNbProblems,
+               (err,problems) => {
+                       if (!!err)
+                               return res.json(err);
+                       return res.json({problems: problems});
+               }
+       );
+});
+
 // Upload a problem (sanitize inputs)
-router.post("/problems/:vname([a-zA-Z0-9]+)", access.logged, access.ajax, (req,res) => {
-       const vname = req.params["vname"];
-       const s = sanitizeUserInput(req.body["fen"], req.body["instructions"], req.body["solution"]);
+router.post("/problems/:vid([0-9]+)", access.logged, access.ajax, (req,res) => {
+       const vid = req.params["vid"];
+       const s = sanitizeUserInput(
+               req.body["fen"], req.body["instructions"], req.body["solution"]);
        if (typeof s === "string")
                return res.json({errmsg: s});
-  ProblemModel.create(vname, s.fen, s.instructions, s.solution);
-       res.json({});
+  ProblemModel.create(req.userId, vid, s.fen, s.instructions, s.solution,
+               (err,pid) => {
+                       if (!!err)
+                               return res.json(err);
+                       res.json({id: pid["rowid"]});
+               }
+       );
 });
 
 // Update a problem (also sanitize inputs)
 router.put("/problems/:id([0-9]+)", access.logged, access.ajax, (req,res) => {
        const pid = req.params["id"]; //problem ID
-       const s = sanitizeUserInput(req.body["fen"], req.body["instructions"], req.body["solution"]);
+       const s = sanitizeUserInput(
+               req.body["fen"], req.body["instructions"], req.body["solution"]);
        if (typeof s === "string")
                return res.json({errmsg: s});
-       ProblemModel.update(pid, req.userId, fen, instructions, solution);
-       res.json({});
+       ProblemModel.update(pid, req.userId, s.fen, s.instructions, s.solution,
+               err => {
+                       if (!!err)
+                               return res.json(err);
+                       res.json({});
+               }
+       );
 });
 
 // Delete a problem
 router.delete("/problems/:id([0-9]+)", access.logged, access.ajax, (req,res) => {
        const pid = req.params["id"]; //problem ID
-  ProblemModel.delete(pid, req.userId);
+  ProblemModel.remove(pid, req.userId);
        res.json({});
 });