boring.tools-poc/apps/api/src/changelog/version/byId.ts

68 lines
1.8 KiB
TypeScript

import { changelog, changelog_version, db } from '@boring.tools/database'
import { VersionByIdParams, VersionOutput } from '@boring.tools/schema'
import { createRoute } from '@hono/zod-openapi'
import { and, eq } from 'drizzle-orm'
import { HTTPException } from 'hono/http-exception'
import type changelogVersionApi from '.'
import { verifyAuthentication } from '../../utils/authentication'
import { openApiErrorResponses, openApiSecurity } from '../../utils/openapi'
export const byId = createRoute({
method: 'get',
path: '/:id',
tags: ['version'],
request: {
params: VersionByIdParams,
},
responses: {
200: {
content: {
'application/json': {
schema: VersionOutput,
},
},
description: 'Return version by id',
},
...openApiErrorResponses,
},
...openApiSecurity,
})
export const registerVersionById = (api: typeof changelogVersionApi) => {
return api.openapi(byId, async (c) => {
const userId = await verifyAuthentication(c)
const { id } = c.req.valid('param')
const versionResult = await db.query.changelog_version.findFirst({
where: eq(changelog_version.id, id),
with: {
commits: true,
},
})
if (!versionResult) {
throw new HTTPException(404, { message: 'Not Found' })
}
if (!versionResult.changelogId) {
throw new HTTPException(404, { message: 'Not Found' })
}
const changelogResult = await db.query.changelog.findMany({
where: and(eq(changelog.userId, userId)),
columns: {
id: true,
},
})
const changelogIds = changelogResult.map((cl) => cl.id)
if (!changelogIds.includes(versionResult.changelogId)) {
throw new HTTPException(404, { message: 'Not Found' })
}
return c.json(VersionOutput.parse(versionResult), 200)
})
}