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 +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 +17 -2
- package/dist/src/controller.js +72 -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 +2 -2
- package/dist/src/standard.js +2 -2
- 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,21 @@
|
|
|
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 { 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 {};
|
package/dist/src/controller.js
CHANGED
|
@@ -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
|
-
}
|
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
|
@@ -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>;
|
package/dist/src/standard.js
CHANGED
|
@@ -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 (
|
|
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) {
|
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<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