// Admin comment moderation, dispatched by method: // GET /cms/admin/comments?status=pending -> list (admin) // PUT /cms/admin/comments/:id { status } -> approve/spam (admin) // DELETE /cms/admin/comments/:id -> delete (admin) import "auth" as auth; import "util" as util; let g = auth::guard(ctx, ["admin"]); if !g.ok { return g.response; } let comments = docs::collection("comments"); let m = ctx.request.method; if m == "GET" { let status = ctx.request.query.status; let filter = #{ "$sort": #{ created_at: -1 }, "$limit": 200 }; if status != () { filter.status = status; } let rows = comments.find(filter); let out = []; for r in rows { out.push(util::shape_doc(r)); } return #{ statusCode: 200, body: #{ comments: out } }; } let id = ctx.request.params.id; let doc = comments.get(id); if doc == () { return #{ statusCode: 404, body: #{ error: "not found" } }; } if m == "DELETE" { comments.delete(id); return #{ statusCode: 200, body: #{ ok: true } }; } if m == "PUT" { let b = ctx.request.body; let cur = doc.data; let valid = ["pending", "approved", "spam"]; if b.status != () && valid.contains(b.status) { cur.status = b.status; } comments.update(id, cur); // status->approved fires comment_on_approve (SSE) return #{ statusCode: 200, body: #{ id: id, status: cur.status } }; } #{ statusCode: 405, body: #{ error: "method not allowed" } }