bradb 1.2.3 → 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.
- package/LICENSE +0 -0
- package/README.md +0 -0
- package/dist/index.d.ts +0 -0
- package/dist/index.js +0 -0
- package/dist/src/controller.d.ts +28 -2
- package/dist/src/controller.js +79 -11
- package/dist/src/errors.d.ts +0 -0
- package/dist/src/errors.js +0 -0
- package/dist/src/filters.d.ts +0 -0
- package/dist/src/filters.js +0 -0
- package/dist/src/relational.d.ts +2 -2
- package/dist/src/relational.js +0 -0
- package/dist/src/standard.d.ts +1 -1
- package/dist/src/standard.js +16 -8
- package/dist/src/types.d.ts +15 -7
- package/dist/src/types.js +0 -0
- package/package.json +2 -3
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
|
package/dist/src/controller.d.ts
CHANGED
|
@@ -1,7 +1,32 @@
|
|
|
1
1
|
import { PgTable } from "drizzle-orm/pg-core";
|
|
2
2
|
import { Request, Response } from "express";
|
|
3
|
-
import { z } from "zod";
|
|
4
|
-
import {
|
|
3
|
+
import { z, ZodObject } from "zod";
|
|
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>>>;
|
|
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>>>;
|
|
22
|
+
interface CRUDService<FSchema extends ZodObject> {
|
|
23
|
+
findOne: (id: any) => Promise<any>;
|
|
24
|
+
findAll: (filters?: Filter<FSchema>, page?: number, pageSize?: number) => Promise<any[]>;
|
|
25
|
+
count: (filters: Filter<FSchema>) => Promise<number>;
|
|
26
|
+
create: (data: any) => Promise<any>;
|
|
27
|
+
update: (id: any, data: Partial<any>) => Promise<any>;
|
|
28
|
+
delete: (id: any) => Promise<any>;
|
|
29
|
+
}
|
|
5
30
|
export declare class BaseController<T extends PgTable, FSchema extends z.ZodObject> {
|
|
6
31
|
protected service: CRUDService<FSchema>;
|
|
7
32
|
private filterSchema;
|
|
@@ -14,3 +39,4 @@ export declare class BaseController<T extends PgTable, FSchema extends z.ZodObje
|
|
|
14
39
|
update: (req: Request, res: Response) => Promise<void>;
|
|
15
40
|
delete: (req: Request, res: Response) => Promise<void>;
|
|
16
41
|
}
|
|
42
|
+
export {};
|
package/dist/src/controller.js
CHANGED
|
@@ -1,6 +1,85 @@
|
|
|
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
|
+
hook(item);
|
|
15
|
+
}
|
|
16
|
+
res.status(200).json(item);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function findAllBuilder(service, filter, hook, hasPagination = true) {
|
|
20
|
+
return async (req, res) => {
|
|
21
|
+
const filters = filter.parse({
|
|
22
|
+
...req.params,
|
|
23
|
+
...req.query
|
|
24
|
+
});
|
|
25
|
+
let pagination, itemsProm;
|
|
26
|
+
if (hasPagination) {
|
|
27
|
+
pagination = getPagination(req);
|
|
28
|
+
itemsProm = service.findAll(filters, pagination.page, pagination.pageSize);
|
|
29
|
+
}
|
|
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) {
|
|
37
|
+
return res.status(200).json({
|
|
38
|
+
pagination,
|
|
39
|
+
items,
|
|
40
|
+
total
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return res.status(200).json({
|
|
45
|
+
items,
|
|
46
|
+
total
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function createBuilder(service, schema) {
|
|
52
|
+
return validate(schema, async (req, res, data) => {
|
|
53
|
+
const item = await service.create(data);
|
|
54
|
+
return res.status(201).json(item);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function updateBuilder(service, schema) {
|
|
58
|
+
return validate(schema, async (req, res, data) => {
|
|
59
|
+
const item = await service.update(req.params.id, data);
|
|
60
|
+
return res.status(200).json(item);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function deleteBuilder(service) {
|
|
64
|
+
return async (req, res) => {
|
|
65
|
+
await service.delete(req.params.id);
|
|
66
|
+
return res.status(204).send();
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function validate(schema, fn) {
|
|
70
|
+
return async (req, res) => {
|
|
71
|
+
const validated = schema.parse(req.body);
|
|
72
|
+
return fn(req, res, validated);
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function getPagination(req) {
|
|
76
|
+
return {
|
|
77
|
+
page: req.query.page ? parseInt(req.query.page) : 1,
|
|
78
|
+
pageSize: req.query.pageSize
|
|
79
|
+
? parseInt(req.query.pageSize)
|
|
80
|
+
: 10
|
|
81
|
+
};
|
|
82
|
+
}
|
|
4
83
|
class BaseController {
|
|
5
84
|
constructor(service, base, filter) {
|
|
6
85
|
this.getAll = async (req, res) => {
|
|
@@ -55,14 +134,3 @@ function getFilters(req, filter) {
|
|
|
55
134
|
...req.query
|
|
56
135
|
});
|
|
57
136
|
}
|
|
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
|
-
}
|
package/dist/src/errors.d.ts
CHANGED
|
File without changes
|
package/dist/src/errors.js
CHANGED
|
File without changes
|
package/dist/src/filters.d.ts
CHANGED
|
File without changes
|
package/dist/src/filters.js
CHANGED
|
File without changes
|
package/dist/src/relational.d.ts
CHANGED
|
@@ -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<
|
|
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
|
};
|
package/dist/src/relational.js
CHANGED
|
File without changes
|
package/dist/src/standard.d.ts
CHANGED
|
@@ -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<S>;
|
|
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>;
|
package/dist/src/standard.js
CHANGED
|
@@ -19,14 +19,22 @@ class ServiceBuilder {
|
|
|
19
19
|
return result[0];
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
|
-
findAll(select) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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) => {
|
package/dist/src/types.d.ts
CHANGED
|
@@ -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
|
|
5
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
}
|
|
8
|
+
export interface FindOneService<TTable extends PgTable> {
|
|
9
|
+
findOne: (id: any) => Promise<Partial<TTable>>;
|
|
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