import type { Context } from "@api/rest/types"; import { deleteTrackerProjectSchema, getTrackerProjectByIdSchema, getTrackerProjectsSchema, trackerProjectResponseSchema, trackerProjectsResponseSchema, upsertTrackerProjectSchema, } from "@api/schemas/tracker-projects"; import { validateResponse } from "@api/utils/validate-response"; import { createRoute, OpenAPIHono } from "@hono/zod-openapi"; import { deleteTrackerProject, getTrackerProjectById, getTrackerProjects, upsertTrackerProject, } from "@midday/db/queries"; import { withRequiredScope } from "../middleware"; const app = new OpenAPIHono(); app.openapi( createRoute({ method: "get", path: "/", summary: "List all tracker projects", operationId: "listTrackerProjects", "x-speakeasy-name-override": "list", description: "List all tracker projects for the authenticated team.", tags: ["Tracker Projects"], request: { query: getTrackerProjectsSchema, }, responses: { 200: { description: "List all tracker projects for the authenticated team.", content: { "application/json": { schema: trackerProjectsResponseSchema, }, }, }, }, middleware: [withRequiredScope("tracker-projects.read")], }), async (c) => { const db = c.get("db"); const teamId = c.get("teamId"); const { cursor, pageSize, sort, ...filter } = c.req.valid("query"); const result = await getTrackerProjects(db, { teamId, cursor, pageSize, ...filter, sort, }); return c.json(validateResponse(result, trackerProjectsResponseSchema)); }, ); app.openapi( createRoute({ method: "post", path: "/", summary: "Create a tracker project", operationId: "createTrackerProject", "x-speakeasy-name-override": "create", description: "Create a tracker project for the authenticated team.", tags: ["Tracker Projects"], request: { body: { content: { "application/json": { schema: upsertTrackerProjectSchema.omit({ id: true }), example: { name: "New Project", }, }, }, description: "Tracker project to create", }, }, responses: { 200: { description: "Tracker project created successfully.", content: { "application/json": { schema: trackerProjectResponseSchema, }, }, }, }, middleware: [withRequiredScope("tracker-projects.write")], }), async (c) => { const db = c.get("db"); const teamId = c.get("teamId"); const userId = c.get("session").user.id; const result = await upsertTrackerProject(db, { teamId, userId, ...c.req.valid("json"), }); return c.json(validateResponse(result, trackerProjectResponseSchema)); }, ); app.openapi( createRoute({ method: "patch", path: "/{id}", summary: "Update a tracker project", operationId: "updateTrackerProject", "x-speakeasy-name-override": "update", description: "Update a tracker project for the authenticated team.", tags: ["Tracker Projects"], request: { params: getTrackerProjectByIdSchema.pick({ id: true }), body: { content: { "application/json": { schema: upsertTrackerProjectSchema.omit({ id: true }), }, }, }, }, responses: { 200: { description: "Tracker project updated successfully.", content: { "application/json": { schema: trackerProjectResponseSchema, }, }, }, }, middleware: [withRequiredScope("tracker-projects.read")], }), async (c) => { const db = c.get("db"); const teamId = c.get("teamId"); const userId = c.get("session").user.id; const { id } = c.req.valid("param"); const result = await upsertTrackerProject(db, { teamId, id, userId, ...c.req.valid("json"), }); return c.json(validateResponse(result, trackerProjectResponseSchema)); }, ); app.openapi( createRoute({ method: "get", path: "/{id}", summary: "Retrieve a tracker project", operationId: "getTrackerProjectById", "x-speakeasy-name-override": "get", description: "Retrieve a tracker project for the authenticated team.", tags: ["Tracker Projects"], request: { params: getTrackerProjectByIdSchema.pick({ id: true }), }, responses: { 200: { description: "Tracker project by ID for the authenticated team.", content: { "application/json": { schema: trackerProjectResponseSchema, }, }, }, }, middleware: [withRequiredScope("tracker-projects.read")], }), async (c) => { const db = c.get("db"); const teamId = c.get("teamId"); const { id } = c.req.valid("param"); const result = await getTrackerProjectById(db, { teamId, id, }); return c.json(validateResponse(result, trackerProjectResponseSchema)); }, ); app.openapi( createRoute({ method: "delete", path: "/{id}", summary: "Delete a tracker project", operationId: "deleteTrackerProject", "x-speakeasy-name-override": "delete", description: "Delete a tracker project for the authenticated team.", tags: ["Tracker Projects"], request: { params: getTrackerProjectByIdSchema.pick({ id: true }), }, responses: { 200: { description: "Tracker project deleted successfully.", content: { "application/json": { schema: deleteTrackerProjectSchema, }, }, }, }, middleware: [withRequiredScope("tracker-projects.write")], }), async (c) => { const db = c.get("db"); const teamId = c.get("teamId"); const { id } = c.req.valid("param"); const result = await deleteTrackerProject(db, { teamId, id, }); return c.json(validateResponse(result, deleteTrackerProjectSchema)); }, ); export const trackerProjectsRouter = app;