bradb 1.2.4 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,27 @@
1
1
  import { PgTable } from "drizzle-orm/pg-core";
2
2
  import { Request, Response } from "express";
3
3
  import { z, ZodObject } from "zod";
4
- import { CreateService, DeleteService, UpdateService, FindOneService, RetrieverService, Filter } from "./types";
5
- export declare function findOneBuilder<TTable extends PgTable>(service: FindOneService<TTable>, hook?: (item: TTable["$inferSelect"]) => Response): (req: Request, res: Response) => Promise<Response<any, Record<string, any>> | undefined>;
6
- export declare function findAllBuilder<FSchema extends ZodObject, TTable extends PgTable>(service: RetrieverService<FSchema, TTable>, filter: FSchema, hook?: (items: TTable["$inferSelect"][], total: number) => Response): (req: Request, res: Response) => Promise<Response<any, Record<string, any>>>;
7
- export declare function createBuilder<TTable extends PgTable, Schema extends ZodObject>(service: CreateService<TTable>, schema: Schema): (req: Request, res: Response) => Promise<Response<any, Record<string, any>>>;
8
- export declare function updateBuilder<TTable extends PgTable, Schema extends ZodObject>(service: UpdateService<TTable>, schema: Schema): (req: Request, res: Response) => Promise<Response<any, Record<string, any>>>;
9
- export declare function deleteBuilder<TTable extends PgTable>(service: DeleteService<TTable>): (req: Request, res: Response) => Promise<Response<any, Record<string, any>>>;
4
+ import { Filter } from "./types";
5
+ export declare function findOneBuilder<TReturn>(service: {
6
+ findOne: (id: any) => Promise<TReturn>;
7
+ }, hook?: (item: TReturn) => void): (req: Request, res: Response) => Promise<void>;
8
+ export declare function findAllBuilder<FSchema extends ZodObject, TReturn>(service: {
9
+ findAll: (filters?: Filter<FSchema>, page?: number, pageSize?: number) => Promise<TReturn[]>;
10
+ count: (filters?: Filter<FSchema>) => Promise<number>;
11
+ }, filter: FSchema, hook?: (items: TReturn[], total: number) => void, hasPagination?: boolean): (req: Request, res: Response) => Promise<Response<any, Record<string, any>>>;
12
+ export declare function createBuilder<CSchema extends ZodObject, TReturn>(service: {
13
+ create: (data: z.core.output<CSchema>) => Promise<TReturn>;
14
+ }, schema: CSchema): (req: Request, res: Response) => Promise<Response<any, Record<string, any>>>;
15
+ export declare function updateBuilder<USchema extends ZodObject, TReturn>(service: {
16
+ update: (id: any, data: z.core.output<USchema>) => Promise<TReturn>;
17
+ }, schema: USchema): (req: Request, res: Response) => Promise<Response<any, Record<string, any>>>;
18
+ export declare function deleteBuilder(service: {
19
+ delete: (id: any) => Promise<void>;
20
+ }): (req: Request, res: Response) => Promise<Response<any, Record<string, any>>>;
10
21
  export declare function validate<T extends ZodObject>(schema: T, fn: (req: Request, res: Response, data: z.output<T>) => Promise<Response>): (req: Request, res: Response) => Promise<Response<any, Record<string, any>>>;
11
22
  interface CRUDService<FSchema extends ZodObject> {
12
23
  findOne: (id: any) => Promise<any>;
13
- findAll: (filters?: Filter<FSchema>, page?: number, pageSize?: number) => Promise<any>;
24
+ findAll: (filters?: Filter<FSchema>, page?: number, pageSize?: number) => Promise<any[]>;
14
25
  count: (filters: Filter<FSchema>) => Promise<number>;
15
26
  create: (data: any) => Promise<any>;
16
27
  update: (id: any, data: Partial<any>) => Promise<any>;
@@ -11,34 +11,41 @@ function findOneBuilder(service, hook) {
11
11
  return async (req, res) => {
12
12
  const item = await service.findOne(req.params.id);
13
13
  if (hook !== undefined) {
14
- return hook(item);
15
- }
16
- else {
17
- res.status(200).json(item);
14
+ hook(item);
18
15
  }
16
+ res.status(200).json(item);
19
17
  };
20
18
  }
21
- function findAllBuilder(service, filter, hook) {
19
+ function findAllBuilder(service, filter, hook, hasPagination = true) {
22
20
  return async (req, res) => {
23
21
  const filters = filter.parse({
24
22
  ...req.params,
25
23
  ...req.query
26
24
  });
27
- const pagination = getPagination(req);
28
- const [items, total] = await Promise.all([
29
- service.findAll(filters, pagination.page, pagination.pageSize),
30
- service.count(filters)
31
- ]);
32
- if (hook !== undefined) {
33
- return hook(items, total);
25
+ let pagination, itemsProm;
26
+ if (hasPagination) {
27
+ pagination = getPagination(req);
28
+ itemsProm = service.findAll(filters, pagination.page, pagination.pageSize);
34
29
  }
35
30
  else {
31
+ itemsProm = service.findAll(filters);
32
+ }
33
+ const totalProm = service.count(filters);
34
+ const [items, total] = await Promise.all([itemsProm, totalProm]);
35
+ hook?.(items, total);
36
+ if (hasPagination) {
36
37
  return res.status(200).json({
37
38
  pagination,
38
39
  items,
39
40
  total
40
41
  });
41
42
  }
43
+ else {
44
+ return res.status(200).json({
45
+ items,
46
+ total
47
+ });
48
+ }
42
49
  };
43
50
  }
44
51
  function createBuilder(service, schema) {
@@ -10,7 +10,7 @@ export declare class ServiceBuilder<T extends Table, TSchema extends Record<stri
10
10
  readonly tableName: string;
11
11
  constructor(db: NodePgDatabase<TSchema>, table: T, map: FilterMap<FSchema>);
12
12
  findOne<S extends PgSelect>(select: S): (id: number) => Promise<Awaited<ReturnType<S["execute"]>>[number]>;
13
- findAll<S extends PgSelect>(select: S): (filters?: Filter<FSchema>, page?: number, pageSize?: number) => Promise<Awaited<ReturnType<S["execute"]>>[number][]>;
13
+ findAll<S extends PgSelect>(select: S, paginated?: boolean): (filters?: Filter<FSchema>, page?: number, pageSize?: number) => Promise<Awaited<ReturnType<S["execute"]>>[number][]>;
14
14
  create(): (data: InferInsertModel<T>) => Promise<{ [Key in keyof T["_"]["columns"] & string as Key]: T["_"]["columns"][Key]["_"]["notNull"] extends true ? T["_"]["columns"][Key]["_"]["data"] : T["_"]["columns"][Key]["_"]["data"] | null; } extends infer T_1 ? { [K in keyof T_1]: T_1[K]; } : never>;
15
15
  update(): (id: PrimaryKeyType<T>, data: Partial<InferInsertModel<T>>) => Promise<{ [Key in keyof T["_"]["columns"] & string as Key]: T["_"]["columns"][Key]["_"]["notNull"] extends true ? T["_"]["columns"][Key]["_"]["data"] : T["_"]["columns"][Key]["_"]["data"] | null; } extends infer T_1 ? { [K in keyof T_1]: T_1[K]; } : never>;
16
16
  softDelete(): (id: PrimaryKeyType<T>) => Promise<void>;
@@ -19,14 +19,22 @@ class ServiceBuilder {
19
19
  return result[0];
20
20
  };
21
21
  }
22
- findAll(select) {
23
- return async (filters, page = 1, pageSize = 10) => {
24
- const offset = (page - 1) * pageSize;
25
- return await select
26
- .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.isNull)(this.table.deletedAt), (0, filters_1.buildFilters)(this.map, filters)))
27
- .limit(pageSize)
28
- .offset(offset);
29
- };
22
+ findAll(select, paginated = true) {
23
+ const base = (f) => select
24
+ .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.isNull)(this.table.deletedAt), (0, filters_1.buildFilters)(this.map, f)));
25
+ if (paginated) {
26
+ return async (filters, page = 1, pageSize = 10) => {
27
+ const offset = (page - 1) * pageSize;
28
+ return await base(filters)
29
+ .limit(pageSize)
30
+ .offset(offset);
31
+ };
32
+ }
33
+ else {
34
+ return async (filters) => {
35
+ return await base(filters);
36
+ };
37
+ }
30
38
  }
31
39
  create() {
32
40
  return async (data) => {
@@ -6,7 +6,7 @@ export interface RetrieverService<FSchema extends ZodObject, TTable extends PgTa
6
6
  count: (filters: Filter<FSchema>) => Promise<number>;
7
7
  }
8
8
  export interface FindOneService<TTable extends PgTable> {
9
- findOne: (id: any) => Promise<TTable["$inferSelect"]>;
9
+ findOne: (id: any) => Promise<Partial<TTable>>;
10
10
  }
11
11
  export interface CreateService<TTable extends PgTable> {
12
12
  create: (data: TTable["$inferInsert"]) => Promise<TTable["$inferSelect"]>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bradb",
3
- "version": "1.2.4",
3
+ "version": "1.3.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",