From b8c587e3c3e717263da84522d59c7904715ae22a Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Tue, 11 Mar 2025 20:09:32 +0000 Subject: feat: Add endpoints for whoami and user stats. Fixes #1113 --- packages/open-api/hoarder-openapi-spec.json | 96 +++++++++++++++++++++++++++++ packages/open-api/index.ts | 2 + packages/open-api/lib/users.ts | 55 +++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 packages/open-api/lib/users.ts (limited to 'packages/open-api') diff --git a/packages/open-api/hoarder-openapi-spec.json b/packages/open-api/hoarder-openapi-spec.json index 7e1911cb..56dad7a7 100644 --- a/packages/open-api/hoarder-openapi-spec.json +++ b/packages/open-api/hoarder-openapi-spec.json @@ -2040,6 +2040,102 @@ } } } + }, + "/users/me": { + "get": { + "description": "Returns info about the current user", + "summary": "Get current user info", + "tags": [ + "Users" + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Object with user data.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string", + "nullable": true + }, + "email": { + "type": "string", + "nullable": true + } + }, + "required": [ + "id" + ] + } + } + } + } + } + } + }, + "/users/me/stats": { + "get": { + "description": "Returns stats about the current user", + "summary": "Get current user stats", + "tags": [ + "Users" + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Object with user stats.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "numBookmarks": { + "type": "number" + }, + "numFavorites": { + "type": "number" + }, + "numArchived": { + "type": "number" + }, + "numTags": { + "type": "number" + }, + "numLists": { + "type": "number" + }, + "numHighlights": { + "type": "number" + } + }, + "required": [ + "numBookmarks", + "numFavorites", + "numArchived", + "numTags", + "numLists", + "numHighlights" + ] + } + } + } + } + } + } } } } \ No newline at end of file diff --git a/packages/open-api/index.ts b/packages/open-api/index.ts index 75850e5a..d96cb5ca 100644 --- a/packages/open-api/index.ts +++ b/packages/open-api/index.ts @@ -9,6 +9,7 @@ import { registry as commonRegistry } from "./lib/common"; import { registry as highlightsRegistry } from "./lib/highlights"; import { registry as listsRegistry } from "./lib/lists"; import { registry as tagsRegistry } from "./lib/tags"; +import { registry as userRegistry } from "./lib/users"; function getOpenApiDocumentation() { const registry = new OpenAPIRegistry([ @@ -17,6 +18,7 @@ function getOpenApiDocumentation() { listsRegistry, tagsRegistry, highlightsRegistry, + userRegistry, ]); const generator = new OpenApiGeneratorV3(registry.definitions); diff --git a/packages/open-api/lib/users.ts b/packages/open-api/lib/users.ts new file mode 100644 index 00000000..657fcdc8 --- /dev/null +++ b/packages/open-api/lib/users.ts @@ -0,0 +1,55 @@ +import { + extendZodWithOpenApi, + OpenAPIRegistry, +} from "@asteasolutions/zod-to-openapi"; +import { z } from "zod"; + +import { + zUserStatsResponseSchema, + zWhoAmIResponseSchema, +} from "@hoarder/shared/types/users"; + +import { BearerAuth } from "./common"; + +export const registry = new OpenAPIRegistry(); +extendZodWithOpenApi(z); + +registry.registerPath({ + method: "get", + path: "/users/me", + description: "Returns info about the current user", + summary: "Get current user info", + tags: ["Users"], + security: [{ [BearerAuth.name]: [] }], + request: {}, + responses: { + 200: { + description: "Object with user data.", + content: { + "application/json": { + schema: zWhoAmIResponseSchema, + }, + }, + }, + }, +}); + +registry.registerPath({ + method: "get", + path: "/users/me/stats", + description: "Returns stats about the current user", + summary: "Get current user stats", + tags: ["Users"], + security: [{ [BearerAuth.name]: [] }], + request: {}, + responses: { + 200: { + description: "Object with user stats.", + content: { + "application/json": { + schema: zUserStatsResponseSchema, + }, + }, + }, + }, +}); -- cgit v1.2.3-70-g09d2