boring.tools-poc/apps/api/src/statistic/get.ts

112 lines
2.8 KiB
TypeScript

import { changelog, db, page } from '@boring.tools/database'
import { StatisticOutput } from '@boring.tools/schema'
import { createRoute } from '@hono/zod-openapi'
import { eq } from 'drizzle-orm'
import type { statisticApi } from '.'
import { verifyAuthentication } from '../utils/authentication'
import { openApiErrorResponses, openApiSecurity } from '../utils/openapi'
const route = createRoute({
method: 'get',
path: '/',
tags: ['statistic'],
responses: {
200: {
content: {
'application/json': { schema: StatisticOutput },
},
description: 'Return user',
},
...openApiErrorResponses,
},
...openApiSecurity,
})
export const registerStatisticGet = (api: typeof statisticApi) => {
return api.openapi(route, async (c) => {
const userId = await verifyAuthentication(c)
const pageResult = await db.query.page.findMany({
where: eq(page.userId, userId),
})
const result = await db.query.changelog.findMany({
where: eq(changelog.userId, userId),
with: {
commits: {
columns: {
id: true,
versionId: true,
},
},
versions: {
columns: {
id: true,
status: true,
},
},
},
})
const changelog_total = result.length
const version_total = result.reduce(
(acc, log) => acc + log.versions.length,
0,
)
const version_published = result.reduce(
(acc, log) =>
acc +
log.versions.filter((version) => version.status === 'published').length,
0,
)
const version_review = result.reduce(
(acc, log) =>
acc +
log.versions.filter((version) => version.status === 'review').length,
0,
)
const version_draft = result.reduce(
(acc, log) =>
acc +
log.versions.filter((version) => version.status === 'draft').length,
0,
)
const commit_total = result.reduce(
(acc, log) => acc + log.commits.length,
0,
)
const commit_unassigned = result.reduce(
(acc, log) =>
acc + log.commits.filter((commit) => !commit.versionId).length,
0,
)
const commit_assigned = result.reduce(
(acc, log) =>
acc + log.commits.filter((commit) => commit.versionId).length,
0,
)
const mappedData = {
changelog: {
total: changelog_total,
versions: {
total: version_total,
published: version_published,
review: version_review,
draft: version_draft,
},
commits: {
total: commit_total,
unassigned: commit_unassigned,
assigned: commit_assigned,
},
},
page: {
total: pageResult.length,
},
}
return c.json(StatisticOutput.parse(mappedData), 200)
})
}