brf/server/routes/api/accounts.ts
2026-06-15 14:09:28 +02:00

110 lines
2.8 KiB
TypeScript

import _ from 'lodash'
import * as z from 'zod'
import type { FastifyPluginCallbackZod } from 'fastify-type-provider-zod'
import { AccountSchema } from '../../schemas/db.ts'
import { sql } from 'kysely'
const accountRoutes: FastifyPluginCallbackZod = (fastify, _, done) => {
const { db } = fastify
fastify.route({
url: '/',
method: 'GET',
schema: {
response: {
200: z.array(AccountSchema),
},
},
handler() {
return db.selectFrom('account').selectAll().orderBy('number').execute()
},
})
fastify.route({
url: '/:number',
method: 'GET',
schema: {
params: z.object({
number: z.coerce.number(),
}),
// response: {
// 200: z.array(AccountSchema),
// },
},
handler(request) {
return db
.selectFrom('account as a')
.innerJoin('transaction as t', 't.accountNumber', 'a.number')
.innerJoin('entry as e', 'e.id', 't.entryId')
.selectAll('a')
.select('e.transactionDate')
.where('a.number', '=', request.params.number)
.orderBy('e.transactionDate', 'asc')
.execute()
},
})
fastify.route({
url: '/month-sum/:number',
method: 'GET',
schema: {
params: z.object({
number: z.coerce.number(),
}),
response: {
200: z.array(
z.object({
month: z.string(),
totalAmount: z.coerce.number(),
}),
),
},
},
handler(request) {
return db
.selectFrom('transaction as t')
.innerJoin('entry as e', 'e.id', 't.entryId')
.select([
sql<string>`to_char(date_trunc('month', e."transactionDate"), 'YYYY-MM')`.as('month'),
sql<number>`sum(amount)`.as('totalAmount'),
])
.groupBy(sql`date_trunc('month', e."transactionDate")`)
.orderBy('month')
.where('t.accountNumber', '=', request.params.number)
.execute()
},
})
fastify.route({
url: '/year-sum/:number',
method: 'GET',
schema: {
params: z.object({
number: z.coerce.number(),
}),
},
handler(request) {
return (
db
.selectFrom('transaction as t')
.innerJoin('entry as e', 'e.id', 't.entryId')
// .select([sql`date_trunc('year', e."transactionDate")`.as('year'), sql<number>`sum(amount)`.as('totalAmount')])
.select([
sql`to_char(date_trunc('year', e."transactionDate"), 'YYYY')`.as('year'),
sql<number>`sum(amount)`.as('totalAmount'),
])
.groupBy(sql`date_trunc('year', e."transactionDate")`)
.orderBy('year')
.where('t.accountNumber', '=', request.params.number)
.execute()
)
},
})
done()
}
export default accountRoutes