bradb 1.2.2 → 1.2.4

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.
package/LICENSE CHANGED
File without changes
package/README.md CHANGED
File without changes
package/dist/index.d.ts CHANGED
File without changes
package/dist/index.js CHANGED
File without changes
@@ -1,7 +1,21 @@
1
1
  import { PgTable } from "drizzle-orm/pg-core";
2
2
  import { Request, Response } from "express";
3
- import { z } from "zod";
4
- import { CRUDService } from "./types";
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>>>;
10
+ 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
+ interface CRUDService<FSchema extends ZodObject> {
12
+ findOne: (id: any) => Promise<any>;
13
+ findAll: (filters?: Filter<FSchema>, page?: number, pageSize?: number) => Promise<any>;
14
+ count: (filters: Filter<FSchema>) => Promise<number>;
15
+ create: (data: any) => Promise<any>;
16
+ update: (id: any, data: Partial<any>) => Promise<any>;
17
+ delete: (id: any) => Promise<any>;
18
+ }
5
19
  export declare class BaseController<T extends PgTable, FSchema extends z.ZodObject> {
6
20
  protected service: CRUDService<FSchema>;
7
21
  private filterSchema;
@@ -14,3 +28,4 @@ export declare class BaseController<T extends PgTable, FSchema extends z.ZodObje
14
28
  update: (req: Request, res: Response) => Promise<void>;
15
29
  delete: (req: Request, res: Response) => Promise<void>;
16
30
  }
31
+ export {};
@@ -1,6 +1,78 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BaseController = void 0;
4
+ exports.findOneBuilder = findOneBuilder;
5
+ exports.findAllBuilder = findAllBuilder;
6
+ exports.createBuilder = createBuilder;
7
+ exports.updateBuilder = updateBuilder;
8
+ exports.deleteBuilder = deleteBuilder;
9
+ exports.validate = validate;
10
+ function findOneBuilder(service, hook) {
11
+ return async (req, res) => {
12
+ const item = await service.findOne(req.params.id);
13
+ if (hook !== undefined) {
14
+ return hook(item);
15
+ }
16
+ else {
17
+ res.status(200).json(item);
18
+ }
19
+ };
20
+ }
21
+ function findAllBuilder(service, filter, hook) {
22
+ return async (req, res) => {
23
+ const filters = filter.parse({
24
+ ...req.params,
25
+ ...req.query
26
+ });
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);
34
+ }
35
+ else {
36
+ return res.status(200).json({
37
+ pagination,
38
+ items,
39
+ total
40
+ });
41
+ }
42
+ };
43
+ }
44
+ function createBuilder(service, schema) {
45
+ return validate(schema, async (req, res, data) => {
46
+ const item = await service.create(data);
47
+ return res.status(201).json(item);
48
+ });
49
+ }
50
+ function updateBuilder(service, schema) {
51
+ return validate(schema, async (req, res, data) => {
52
+ const item = await service.update(req.params.id, data);
53
+ return res.status(200).json(item);
54
+ });
55
+ }
56
+ function deleteBuilder(service) {
57
+ return async (req, res) => {
58
+ await service.delete(req.params.id);
59
+ return res.status(204).send();
60
+ };
61
+ }
62
+ function validate(schema, fn) {
63
+ return async (req, res) => {
64
+ const validated = schema.parse(req.body);
65
+ return fn(req, res, validated);
66
+ };
67
+ }
68
+ function getPagination(req) {
69
+ return {
70
+ page: req.query.page ? parseInt(req.query.page) : 1,
71
+ pageSize: req.query.pageSize
72
+ ? parseInt(req.query.pageSize)
73
+ : 10
74
+ };
75
+ }
4
76
  class BaseController {
5
77
  constructor(service, base, filter) {
6
78
  this.getAll = async (req, res) => {
@@ -55,14 +127,3 @@ function getFilters(req, filter) {
55
127
  ...req.query
56
128
  });
57
129
  }
58
- /*
59
- * Extract PaginationParams from the request
60
- */
61
- function getPagination(req) {
62
- return {
63
- page: req.query.page ? parseInt(req.query.page) : 1,
64
- pageSize: req.query.pageSize
65
- ? parseInt(req.query.pageSize)
66
- : 10
67
- };
68
- }
File without changes
File without changes
File without changes
File without changes
@@ -1,8 +1,8 @@
1
1
  import { Filter, FilterMap } from "../src/types";
2
- import { BuildQueryResult, DBQueryConfig, TableRelationalConfig, TablesRelationalConfig } from "drizzle-orm";
2
+ import { BuildQueryResult, DBQueryConfig, KnownKeysOnly, TableRelationalConfig, TablesRelationalConfig } from "drizzle-orm";
3
3
  import { RelationalQueryBuilder } from "drizzle-orm/pg-core/query-builders/query";
4
4
  import { ZodObject } from "zod";
5
5
  export declare function RelationalBuilder<TSchema extends TablesRelationalConfig, TFields extends TableRelationalConfig, FSchema extends ZodObject>(q: RelationalQueryBuilder<TSchema, TFields>, filterMap: FilterMap<FSchema>): {
6
6
  findAll<TConfig extends DBQueryConfig<"many", true, TSchema, TFields>>(config?: TConfig): (filters?: Filter<FSchema>, page?: number, pageSize?: number) => Promise<BuildQueryResult<TSchema, TFields, TConfig>[]>;
7
- findOne<TSelection extends Omit<DBQueryConfig<"many", true, TSchema, TFields>, "limit">>(config?: DBQueryConfig<any, true, TSchema, TFields>): (id: number) => Promise<BuildQueryResult<TSchema, TFields, TSelection>>;
7
+ findOne<TSelection extends Omit<DBQueryConfig<"many", true, TSchema, TFields>, "limit">>(config?: KnownKeysOnly<TSelection, Omit<DBQueryConfig<"many", true, TSchema, TFields>, "limit">>): (id: number) => Promise<BuildQueryResult<TSchema, TFields, TSelection>>;
8
8
  };
File without changes
@@ -9,8 +9,8 @@ export declare class ServiceBuilder<T extends Table, TSchema extends Record<stri
9
9
  private readonly map;
10
10
  readonly tableName: string;
11
11
  constructor(db: NodePgDatabase<TSchema>, table: T, map: FilterMap<FSchema>);
12
- findOne<S extends PgSelect>(select: S): (id: number) => Promise<S>;
13
- findAll<S extends PgSelect>(select: S): (filters?: Filter<FSchema>, page?: number, pageSize?: number) => Promise<S>;
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][]>;
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>;
@@ -14,9 +14,9 @@ class ServiceBuilder {
14
14
  findOne(select) {
15
15
  return async (id) => {
16
16
  const result = await select.where((0, drizzle_orm_1.eq)(this.table.id, id));
17
- if (!result)
17
+ if (result.length == 0)
18
18
  throw notFoundWithId(this.tableName, id);
19
- return result;
19
+ return result[0];
20
20
  };
21
21
  }
22
22
  findAll(select) {
@@ -1,13 +1,21 @@
1
1
  import { SQL } from "drizzle-orm";
2
- import { AnyPgTable, PgColumn } from "drizzle-orm/pg-core";
2
+ import { AnyPgTable, PgColumn, PgTable } from "drizzle-orm/pg-core";
3
3
  import z, { ZodObject } from "zod";
4
- export interface CRUDService<FSchema extends ZodObject> {
5
- findOne: (id: any) => Promise<any>;
6
- findAll: (filters?: Filter<FSchema>, page?: number, pageSize?: number) => Promise<any>;
4
+ export interface RetrieverService<FSchema extends ZodObject, TTable extends PgTable> {
5
+ findAll: (filters?: Filter<FSchema>, page?: number, pageSize?: number) => Promise<TTable["$inferSelect"][]>;
7
6
  count: (filters: Filter<FSchema>) => Promise<number>;
8
- create: (data: any) => Promise<any>;
9
- update: (id: any, data: Partial<any>) => Promise<any>;
10
- delete: (id: any) => Promise<any>;
7
+ }
8
+ export interface FindOneService<TTable extends PgTable> {
9
+ findOne: (id: any) => Promise<TTable["$inferSelect"]>;
10
+ }
11
+ export interface CreateService<TTable extends PgTable> {
12
+ create: (data: TTable["$inferInsert"]) => Promise<TTable["$inferSelect"]>;
13
+ }
14
+ export interface UpdateService<TTable extends PgTable> {
15
+ update: (id: any, data: Partial<TTable["$inferInsert"]>) => Promise<TTable["$inferSelect"]>;
16
+ }
17
+ export interface DeleteService<TTable extends PgTable> {
18
+ delete: (id: any) => Promise<TTable["$inferSelect"]>;
11
19
  }
12
20
  export type PrimaryKeyData<TTable extends AnyPgTable> = {
13
21
  [K in keyof TTable["_"]["columns"] as TTable["_"]["columns"][K] extends {
package/dist/src/types.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "name": "bradb",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "files": [
8
- "dist",
9
- "index.d.ts"
8
+ "dist"
10
9
  ],
11
10
  "scripts": {
12
11
  "build": "rm -rf dist/ && tsc",