ICS React Native App
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>;