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`to_char(date_trunc('month', e."transactionDate"), 'YYYY-MM')`.as('month'), sql`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`sum(amount)`.as('totalAmount')]) .select([ sql`to_char(date_trunc('year', e."transactionDate"), 'YYYY')`.as('year'), sql`sum(amount)`.as('totalAmount'), ]) .groupBy(sql`date_trunc('year', e."transactionDate")`) .orderBy('year') .where('t.accountNumber', '=', request.params.number) .execute() ) }, }) done() } export default accountRoutes