diff --git a/src/app/api/user/[user]/route.ts b/src/app/api/user/[user]/route.ts new file mode 100644 index 0000000..b90b1f8 --- /dev/null +++ b/src/app/api/user/[user]/route.ts @@ -0,0 +1,55 @@ +import { auth } from '@/auth'; +import { prisma } from '@/prisma'; +import { + returnZodTypeCheckedResponse, + userAuthenticated, +} from '@/lib/apiHelpers'; +import { PublicUserResponseSchema } from '../validation'; +import { ErrorResponseSchema } from '@/app/api/validation'; + +export const GET = auth(async function GET(req, { params }) { + const authCheck = userAuthenticated(req); + if (!authCheck.continue) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + authCheck.response, + authCheck.metadata, + ); + + const requestedUser = (await params).user; + const dbUser = await prisma.user.findFirst({ + where: { + OR: [{ id: requestedUser }, { name: requestedUser }], + }, + select: { + id: true, + name: true, + first_name: true, + last_name: true, + email: true, + created_at: true, + updated_at: true, + image: true, + timezone: true, + }, + }); + + if (!dbUser) + return returnZodTypeCheckedResponse( + ErrorResponseSchema, + { + success: false, + message: 'User not found', + }, + { status: 404 }, + ); + + return returnZodTypeCheckedResponse( + PublicUserResponseSchema, + { + success: true, + user: dbUser, + }, + { status: 200 }, + ); +}); diff --git a/src/app/api/user/[user]/swagger.ts b/src/app/api/user/[user]/swagger.ts new file mode 100644 index 0000000..741cbf9 --- /dev/null +++ b/src/app/api/user/[user]/swagger.ts @@ -0,0 +1,33 @@ +import { PublicUserResponseSchema } from '../validation'; +import { + notAuthenticatedResponse, + userNotFoundResponse, +} from '@/lib/defaultApiResponses'; +import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; +import zod from 'zod/v4'; +import { UserIdParamSchema } from '../../validation'; + +export default function registerSwaggerPaths(registry: OpenAPIRegistry) { + registry.registerPath({ + method: 'get', + path: '/api/user/{user}', + request: { + params: zod.object({ + user: UserIdParamSchema, + }), + }, + responses: { + 200: { + description: 'User information retrieved successfully.', + content: { + 'application/json': { + schema: PublicUserResponseSchema, + }, + }, + }, + ...notAuthenticatedResponse, + ...userNotFoundResponse, + }, + tags: ['User'], + }); +}