import express from "express"; import logger from "../logger.mjs"; import Story from "./Story.mjs"; import Publication from "./Publication.mjs"; import Submission from "./Submission.mjs"; import passport from "passport"; export const getEndpoints = (dbObject) => { const router = express.Router(); router.get("/stories", (_, res) => { res.statusCode = 200; res.send(dbObject.stories); return; }); router.get("/publications", (_, res) => { res.statusCode = 200; res.send(dbObject.publications); return; }); router.get("/submissions", (_, res) => { res.statusCode = 200; res.send(dbObject.submissions); return; }); router.get("/responses", (_, res) => { res.statusCode = 200; res.send(dbObject.responses); return; }); router.get("/genres", (_, res) => { res.statusCode = 200; res.send(dbObject.genres); return; }); return router; }; export const protectedEndpoints = (db, data) => { const router = express.Router(); writeEndpoint(router, Story, "create", "insert", db, data); writeEndpoint(router, Story, "edit", "update", db, data); writeEndpoint(router, Story, "delete", "update", db, data); writeEndpoint(router, Submission, "create", "insert", db, data); writeEndpoint(router, Submission, "edit", "update", db, data); writeEndpoint(router, Submission, "delete", "update", db, data); writeEndpoint(router, Publication, "create", "insert", db, data); writeEndpoint(router, Publication, "edit", "update", db, data); writeEndpoint(router, Publication, "delete", "del", db, data); //Auth endpoints router.post( "/signup", passport.authenticate("signup", { session: false }), async (req, res) => { res.json({ message: "Signup successful", user: req.user, }); }, ); router.post("/login", async (req, res, next) => { passport.authenticate("login", async (err, user, info) => { try { if (err || !user) { const error = new Error("An error occurred."); return next(error); } req.login(user, { session: false }, async (error) => { if (error) return next(error); const body = { _id: user._id, email: user.email }; const token = require("jsonwebtoken").sign( { user: body }, "TOP_SECRET", ); return res.json({ token }); }); } catch (error) { return next(error); } })(req, res, next); }); return router; }; const writeEndpoint = (router, Entity, path, method, db, data) => { router.post( `/${Entity.name.toLowerCase()}/${path}`, passport.authenticate("jwt", { session: false }), async (req, res) => { try { logger.trace({ data: req.body }, "POST request received"); const entity = new Entity(req.body); await entity[method](db, data); res.sendStatus(200); data.init(); return; } catch (error) { logger.error(error); if (error instanceof TypeError) { res.sendStatus(400); return; } res.sendStatus(500); return; } }, ); };