conversations.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { Router } from "express";
  2. import { z } from "zod";
  3. import {
  4. listConversations,
  5. createConversation,
  6. getConversationMessages,
  7. updateConversationTitle,
  8. deleteConversation,
  9. exportConversationAsMarkdown
  10. } from "../services/conversationsService.js";
  11. import { requireUser } from "../middleware/requireUser.js";
  12. import { parseId } from "../middleware/parseId.js";
  13. export const conversationsRouter = Router();
  14. conversationsRouter.get("/", requireUser, async (req, res, next) => {
  15. try {
  16. const limit = z.coerce.number().int().positive().max(100).catch(50).parse(req.query.limit);
  17. const offset = z.coerce.number().int().nonnegative().catch(0).parse(req.query.offset);
  18. const items = await listConversations(req.userId, { limit, offset });
  19. res.json({ items });
  20. } catch (err) {
  21. next(err);
  22. }
  23. });
  24. conversationsRouter.post("/", requireUser, async (req, res, next) => {
  25. try {
  26. const title = z.string().max(200).catch("Nova conversa").parse(req.body?.title);
  27. const conv = await createConversation(req.userId, title);
  28. res.json(conv);
  29. } catch (err) {
  30. next(err);
  31. }
  32. });
  33. conversationsRouter.get("/:id/messages", requireUser, parseId, async (req, res, next) => {
  34. try {
  35. const msgs = await getConversationMessages(req.params.id, req.userId);
  36. if (!msgs) return res.status(404).json({ error: "not_found" });
  37. res.json({ items: msgs });
  38. } catch (err) {
  39. next(err);
  40. }
  41. });
  42. conversationsRouter.patch("/:id", requireUser, parseId, async (req, res, next) => {
  43. try {
  44. const title = z.string().min(1).max(200).parse(req.body?.title);
  45. await updateConversationTitle(req.params.id, req.userId, title);
  46. res.json({ ok: true });
  47. } catch (err) {
  48. next(err);
  49. }
  50. });
  51. conversationsRouter.delete("/:id", requireUser, parseId, async (req, res, next) => {
  52. try {
  53. await deleteConversation(req.params.id, req.userId);
  54. res.json({ ok: true });
  55. } catch (err) {
  56. next(err);
  57. }
  58. });
  59. conversationsRouter.get("/:id/export", requireUser, parseId, async (req, res, next) => {
  60. try {
  61. const markdown = await exportConversationAsMarkdown(req.params.id, req.userId);
  62. if (markdown == null) return res.status(404).json({ error: "not_found" });
  63. res.json({ markdown });
  64. } catch (err) {
  65. next(err);
  66. }
  67. });