at main 77 lines 1.7 kB view raw
1import { Request as ExpressRequest } from "express"; 2import { z } from "zod"; 3 4export type Request<T extends {} = {}> = ExpressRequest<T> & { 5 user?: User; 6}; 7 8export type User = { 9 id: number; 10 username: string; 11 fullname: string; 12 password: string; 13 created: Date; 14}; 15 16export type Account = { 17 id: number; 18 name: string; 19 user_id: number; 20 iban: string; 21 balance: number; 22}; 23 24export type Transaction = { 25 id: number; 26 user_id: number; 27 account_id: number; 28 amount: number; 29 type: string; 30 description: string; 31 date: string; 32}; 33 34export const LoginSchema = z.object({ 35 username: z.email(), 36 password: z.string().min(8), 37}); 38 39export type TransactionType = { 40 name: string; 41 count: number; 42}; 43 44export const TransactionTypesQuerySchema = z.object({ 45 accountId: z.preprocess( 46 (val) => (val ? Number(val) : undefined), 47 z.number().optional(), 48 ), 49}); 50 51export type PaginationRespone<T> = { 52 data: T[]; 53 meta: { 54 total: number; 55 page: number; 56 hasMore: boolean; 57 }; 58}; 59 60export type TransactionTypesQuery = z.infer<typeof TransactionTypesQuerySchema>; 61 62export const TransactionsQuerySchema = z.object({ 63 search: z.string().optional().default(""), 64 sort: z.string().optional().default("date"), 65 order: z.enum(["asc", "desc"]).optional().default("desc"), 66 page: z.preprocess((val) => Number(val ?? 1), z.int().min(1)).default(1), 67 limit: z 68 .preprocess((val) => Number(val ?? 25), z.int().min(1).max(100)) 69 .default(25), 70 accountId: z.preprocess( 71 (val) => (val ? Number(val) : undefined), 72 z.number().optional(), 73 ), 74 type: z.string().optional(), 75}); 76 77export type TransactionsQuery = z.infer<typeof TransactionsQuerySchema>;