From 3c1ec3aa2f7d64932fd26c8cbcb1aee1e57861bd Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sun, 20 Oct 2024 17:36:02 +0000 Subject: chore: Define hoarder's rest API in zod format --- packages/open-api/lib/lists.ts | 199 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 packages/open-api/lib/lists.ts (limited to 'packages/open-api/lib/lists.ts') diff --git a/packages/open-api/lib/lists.ts b/packages/open-api/lib/lists.ts new file mode 100644 index 00000000..27f458fc --- /dev/null +++ b/packages/open-api/lib/lists.ts @@ -0,0 +1,199 @@ +import { + extendZodWithOpenApi, + OpenAPIRegistry, +} from "@asteasolutions/zod-to-openapi"; +import { z } from "zod"; + +import { + zBookmarkListSchema, + zNewBookmarkListSchema, +} from "@hoarder/shared/types/lists"; + +import { BookmarkIdSchema } from "./bookmarks"; +import { BearerAuth } from "./common"; +import { PaginatedBookmarksSchema, PaginationSchema } from "./pagination"; + +export const registry = new OpenAPIRegistry(); +extendZodWithOpenApi(z); + +export const ListIdSchema = registry.registerParameter( + "ListId", + z.string().openapi({ + param: { + name: "listId", + in: "path", + }, + example: "ieidlxygmwj87oxz5hxttoc8", + }), +); + +export const ListSchema = zBookmarkListSchema.openapi("List"); + +registry.registerPath({ + method: "get", + path: "/lists", + description: "Get all lists", + summary: "Get all lists", + security: [{ [BearerAuth.name]: [] }], + request: {}, + responses: { + 200: { + description: "Object with all lists data.", + content: { + "application/json": { + schema: z.object({ + lists: z.array(ListSchema), + }), + }, + }, + }, + }, +}); + +registry.registerPath({ + method: "post", + path: "/lists", + description: "Create a new list", + summary: "Create a new list", + security: [{ [BearerAuth.name]: [] }], + request: { + body: { + description: "The list to create", + content: { + "application/json": { + schema: zNewBookmarkListSchema, + }, + }, + }, + }, + responses: { + 201: { + description: "The created list", + content: { + "application/json": { + schema: ListSchema, + }, + }, + }, + }, +}); +registry.registerPath({ + method: "get", + path: "/lists/{listId}", + description: "Get list by its id", + summary: "Get a single list", + security: [{ [BearerAuth.name]: [] }], + request: { + params: z.object({ listId: ListIdSchema }), + }, + responses: { + 200: { + description: "Object with list data.", + content: { + "application/json": { + schema: ListSchema, + }, + }, + }, + }, +}); + +registry.registerPath({ + method: "delete", + path: "/lists/{listId}", + description: "Delete list by its id", + summary: "Delete a list", + security: [{ [BearerAuth.name]: [] }], + request: { + params: z.object({ listId: ListIdSchema }), + }, + responses: { + 204: { + description: "No content - the bookmark was deleted", + }, + }, +}); + +registry.registerPath({ + method: "patch", + path: "/list/{listId}", + description: "Update list by its id", + summary: "Update a list", + security: [{ [BearerAuth.name]: [] }], + request: { + params: z.object({ listId: ListIdSchema }), + body: { + description: + "The data to update. Only the fields you want to update need to be provided.", + content: { + "application/json": { + schema: zNewBookmarkListSchema.partial(), + }, + }, + }, + }, + responses: { + 200: { + description: "The updated list", + content: { + "application/json": { + schema: ListSchema, + }, + }, + }, + }, +}); + +registry.registerPath({ + method: "get", + path: "/lists/{listId}/bookmarks", + description: "Get the bookmarks in a list", + summary: "Get a bookmarks in a list", + security: [{ [BearerAuth.name]: [] }], + request: { + params: z.object({ listId: ListIdSchema }), + query: PaginationSchema, + }, + responses: { + 200: { + description: "Object with list data.", + content: { + "application/json": { + schema: PaginatedBookmarksSchema, + }, + }, + }, + }, +}); + +registry.registerPath({ + method: "put", + path: "/lists/{listId}/bookmarks/{bookmarkId}", + description: "Add the bookmarks to a list", + summary: "Add a bookmark to a list", + security: [{ [BearerAuth.name]: [] }], + request: { + params: z.object({ listId: ListIdSchema, bookmarkId: BookmarkIdSchema }), + }, + responses: { + 204: { + description: "No content - the bookmark was added", + }, + }, +}); + +registry.registerPath({ + method: "delete", + path: "/lists/{listId}/bookmarks/{bookmarkId}", + description: "Remove the bookmarks from a list", + summary: "Remove a bookmark from a list", + security: [{ [BearerAuth.name]: [] }], + request: { + params: z.object({ listId: ListIdSchema, bookmarkId: BookmarkIdSchema }), + }, + responses: { + 204: { + description: "No content - the bookmark was added", + }, + }, +}); -- cgit v1.2.3-70-g09d2