110 lines
2.8 KiB
TypeScript
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
|