import Ajv from "ajv"; import addFormats from "ajv-formats"; import db from "../../../lib/db"; import { withErrorHandling, withSession } from "../../../lib/apiHelpers"; const handler = withErrorHandling( withSession(async (req, res, session) => { const { method } = req; const { user } = session; switch (method) { case "GET": await getBookmarks(req, res, user); break; case "POST": await createBookmark(req, res, user); break; default: res.setHeader("Allow", ["GET", "POST"]); res.status(405).end(`Method ${method} Not Allowed`); } }) ); const ajv = new Ajv(); addFormats(ajv); const getBookmarks = async (req, res, user) => { const params = { TableName: process.env.FMN_DYNAMODB_TABLENAME, KeyConditionExpression: "hk = :hk AND begins_with(sk, :sk)", ExpressionAttributeValues: { ":hk": `user#${user.sub}`, ":sk": "bookmark#", }, }; let bookmarks = await db.query(params).promise(); res.status(200).json(bookmarks.Items); }; const createBookmarkSchema = { type: "object", properties: { title: { type: "string" }, url: { type: "string", format: "uri" }, }, required: ["title", "url"], }; const validateCreateBookmarkSchema = ajv.compile(createBookmarkSchema); const createBookmark = async (req, res, user) => { if (!validateCreateBookmarkSchema(req.body)) { console.warn(validateCreateBookmarkSchema.errors); res.status(400).json(validateCreateBookmarkSchema.errors); return; } const params = { TableName: process.env.FMN_DYNAMODB_TABLENAME, Item: { hk: `user#${user.sub}`, sk: `bookmark#${"abc"}`, title: req.body.title, url: req.body.url, }, }; await db.put(params).promise(); res.status(200).json(params.Item); }; export default handler;