@asapjs/sequelize 0.0.1

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/.prettierrc ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "singleQuote": true,
3
+ "semi": true,
4
+ "useTabs": false,
5
+ "tabWidth": 2,
6
+ "trailingComma": "all",
7
+ "printWidth": 120
8
+ }
@@ -0,0 +1,36 @@
1
+ import 'reflect-metadata';
2
+ import { Model, TableOptions } from 'sequelize-typescript';
3
+ import { AbstractDataTypeConstructor, Includeable } from 'sequelize';
4
+ interface DtoMiddlewareReturn {
5
+ as?: string;
6
+ model: typeof Model;
7
+ attributes: string[];
8
+ include?: Includeable[];
9
+ }
10
+ export declare class SequelizeDto {
11
+ id?: number;
12
+ version?: number | any;
13
+ private getExampleDataWithSequelizeDataType;
14
+ private fixValue;
15
+ map: (data: any) => any;
16
+ middleware: (as?: string | undefined, user?: any, extraAs?: string[] | undefined) => DtoMiddlewareReturn;
17
+ swagger: () => any;
18
+ }
19
+ export declare function Dto(info: {
20
+ timestamps?: boolean;
21
+ tableName: string;
22
+ defineTable: typeof Model;
23
+ }): (target: any, options?: TableOptions) => void;
24
+ export declare function DtoType(ConnectTo: any, as: string): (target: any, propertyName: string, propertyDescriptor?: PropertyDescriptor | undefined) => void;
25
+ interface QueryParams {
26
+ user?: any;
27
+ association?: string;
28
+ }
29
+ interface DtoQueryParams {
30
+ query: (props: QueryParams) => string;
31
+ type?: AbstractDataTypeConstructor;
32
+ example?: any;
33
+ }
34
+ export declare function DtoQuery({ query, type, example }: DtoQueryParams): (target: any, propertyName: string, propertyDescriptor?: PropertyDescriptor | undefined) => void;
35
+ export {};
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dto/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAwB,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,WAAW,EAAW,MAAM,WAAW,CAAC;AAE9E,UAAU,mBAAmB;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,qBAAa,YAAY;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAE9B,OAAO,CAAC,mCAAmC,CAgBzC;IAEF,OAAO,CAAC,QAAQ,CAkBd;IAEK,GAAG,SAAU,GAAG,KAAG,GAAG,CAsC3B;IAEK,UAAU,mCAAwB,GAAG,yDAsD1C;IAEK,OAAO,YA0BZ;CACH;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,KAAK,CAAA;CAAE,YAC7D,GAAG,YAAW,YAAY,KAAQ,IAAI,CAQxE;AAuBD,wBAAgB,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,YAChC,GAAG,gBAAgB,MAAM,+DAkB1C;AAED,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,CAAC;IACtC,IAAI,CAAC,EAAE,2BAA2B,CAAC;IACnC,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,cAAc,YAC/C,GAAG,gBAAgB,MAAM,+DAe1C"}
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DtoQuery = exports.DtoType = exports.Dto = exports.SequelizeDto = void 0;
4
+ require("reflect-metadata");
5
+ const sequelize_typescript_1 = require("sequelize-typescript");
6
+ const sequelize_1 = require("sequelize");
7
+ class SequelizeDto {
8
+ constructor() {
9
+ this.getExampleDataWithSequelizeDataType = (type) => {
10
+ if (typeof type.values === 'object')
11
+ return type.values[0];
12
+ switch (type) {
13
+ case sequelize_typescript_1.DataType.INTEGER:
14
+ return 0;
15
+ case sequelize_typescript_1.DataType.ARRAY:
16
+ return [];
17
+ case sequelize_typescript_1.DataType.STRING:
18
+ return 'string';
19
+ case sequelize_typescript_1.DataType.DATE:
20
+ return '2022-01-01T00:00:00.000Z';
21
+ case sequelize_typescript_1.DataType.BOOLEAN:
22
+ return true;
23
+ default:
24
+ return 'string';
25
+ }
26
+ };
27
+ this.fixValue = (type, value) => {
28
+ switch (type) {
29
+ case sequelize_typescript_1.DataType.INTEGER:
30
+ if (value === undefined || value === null)
31
+ return value;
32
+ return parseInt(String(value), 10);
33
+ case sequelize_typescript_1.DataType.FLOAT:
34
+ if (value === undefined || value === null)
35
+ return value;
36
+ return parseFloat(String(value));
37
+ case sequelize_typescript_1.DataType.ARRAY:
38
+ return value;
39
+ case sequelize_typescript_1.DataType.STRING:
40
+ if (value === undefined || value === null)
41
+ return value;
42
+ return String(value);
43
+ case sequelize_typescript_1.DataType.BOOLEAN:
44
+ return !!value;
45
+ default:
46
+ return value;
47
+ }
48
+ };
49
+ this.map = (data) => {
50
+ const attributesOptions = Reflect.getMetadata('sequelize:attributes', this);
51
+ const connectOptions = Reflect.getMetadata('sequelize::dtoTypes', this);
52
+ const queryOptions = Reflect.getMetadata('sequelize::queryTypes', this);
53
+ const properties = Object.assign({}, attributesOptions);
54
+ if (queryOptions) {
55
+ Object.keys(queryOptions).forEach((key) => {
56
+ properties[key] = { type: queryOptions[key].data.type };
57
+ });
58
+ }
59
+ if (connectOptions) {
60
+ Object.keys(connectOptions).forEach((key) => {
61
+ properties[key] = connectOptions[key];
62
+ });
63
+ }
64
+ const o = (data === null || data === void 0 ? void 0 : data.dataValues) || data;
65
+ const isArray = Array.isArray(o);
66
+ if (isArray) {
67
+ return o.map((item) => this.map(item));
68
+ }
69
+ return Object.keys(properties).reduce((p, key) => {
70
+ const property = properties[key];
71
+ if (properties[key].type === 'dto') {
72
+ p[key] = new property.ConnectDto().map(o === null || o === void 0 ? void 0 : o[key]);
73
+ }
74
+ else {
75
+ p[key] = this.fixValue(property.type, o === null || o === void 0 ? void 0 : o[key]);
76
+ }
77
+ return p;
78
+ }, {});
79
+ };
80
+ this.middleware = (as, user, extraAs) => {
81
+ const modelInfo = Reflect.getMetadata('sequelize::dtoInfo', this);
82
+ const attributesOptions = Reflect.getMetadata('sequelize:attributes', this);
83
+ const connectOptions = Reflect.getMetadata('sequelize::dtoTypes', this);
84
+ const queryOptions = Reflect.getMetadata('sequelize::queryTypes', this);
85
+ const extraAsData = extraAs ? [...extraAs, as].filter((v) => !!v) : as ? [as] : [];
86
+ const attributes = ['id'];
87
+ if (attributesOptions) {
88
+ Object.keys(attributesOptions).forEach((key) => attributes.push(key));
89
+ }
90
+ const include = [];
91
+ if (connectOptions) {
92
+ Object.keys(connectOptions).forEach((key) => {
93
+ const { ConnectDto } = connectOptions[key];
94
+ include.push(new ConnectDto().middleware(connectOptions[key].as, user, extraAsData));
95
+ });
96
+ }
97
+ if (queryOptions) {
98
+ Object.keys(queryOptions).forEach((key) => {
99
+ const queryData = queryOptions[key];
100
+ attributes.push([
101
+ (0, sequelize_1.literal)(queryData.data.query({
102
+ association: extraAsData.length >= 2 ? '`' + `${extraAsData.join('->')}` + '`' : as || modelInfo.defineTable.name,
103
+ user,
104
+ })),
105
+ queryData.data.as,
106
+ ]);
107
+ });
108
+ }
109
+ if (modelInfo.timestamps) {
110
+ attributes.push('created_at');
111
+ attributes.push('updated_at');
112
+ }
113
+ const result = {
114
+ model: modelInfo.defineTable,
115
+ attributes,
116
+ };
117
+ if (as)
118
+ result.as = as;
119
+ if (include.length > 0)
120
+ result.include = include;
121
+ return result;
122
+ };
123
+ this.swagger = () => {
124
+ const attributesOptions = Reflect.getMetadata('sequelize:attributes', this);
125
+ const connectOptions = Reflect.getMetadata('sequelize::dtoTypes', this);
126
+ const queryOptions = Reflect.getMetadata('sequelize::queryTypes', this);
127
+ const attributes = {};
128
+ if (attributesOptions) {
129
+ Object.keys(attributesOptions).forEach((key) => {
130
+ attributes[key] = this.getExampleDataWithSequelizeDataType(attributesOptions[key].type);
131
+ });
132
+ }
133
+ if (queryOptions) {
134
+ Object.keys(queryOptions).forEach((key) => {
135
+ const queryData = queryOptions[key];
136
+ attributes[key] = (queryData === null || queryData === void 0 ? void 0 : queryData.example) || this.getExampleDataWithSequelizeDataType(queryData.data.type);
137
+ });
138
+ }
139
+ if (connectOptions) {
140
+ Object.keys(connectOptions).forEach((key) => {
141
+ attributes[key] = connectOptions[key].example;
142
+ });
143
+ }
144
+ return attributes;
145
+ };
146
+ }
147
+ }
148
+ exports.SequelizeDto = SequelizeDto;
149
+ function Dto(info) {
150
+ return function annotate(target, options = {}) {
151
+ const args = Object.assign(Object.assign({}, info), { timestamps: info.timestamps === undefined });
152
+ Reflect.defineMetadata('sequelize::dtoInfo', args, target.prototype);
153
+ (0, sequelize_typescript_1.addOptions)(target.prototype, options);
154
+ };
155
+ }
156
+ exports.Dto = Dto;
157
+ const getAttributes = (target, key) => {
158
+ let attributes = Reflect.getMetadata(key, target);
159
+ if (attributes) {
160
+ return Object.keys(attributes).reduce((copy, key) => {
161
+ copy[key] = Object.assign({}, attributes[key]);
162
+ return copy;
163
+ }, {});
164
+ }
165
+ if (!attributes) {
166
+ attributes = {};
167
+ }
168
+ return attributes;
169
+ };
170
+ const getDtoTypes = (target) => getAttributes(target, 'sequelize::dtoTypes');
171
+ const getDtoQueries = (target) => getAttributes(target, 'sequelize::queryTypes');
172
+ function DtoType(ConnectTo, as) {
173
+ return (target, propertyName, propertyDescriptor) => {
174
+ const attributes = getDtoTypes(target);
175
+ const ConnectDto = ConnectTo();
176
+ const swaggerExampleData = new ConnectDto().swagger(as);
177
+ const options = {
178
+ type: 'dto',
179
+ as,
180
+ ConnectDto,
181
+ example: swaggerExampleData,
182
+ };
183
+ attributes[propertyName] = Object.assign({}, options);
184
+ Reflect.defineMetadata('sequelize::dtoTypes', Object.assign({}, attributes), target);
185
+ };
186
+ }
187
+ exports.DtoType = DtoType;
188
+ function DtoQuery({ query, type, example }) {
189
+ return (target, propertyName, propertyDescriptor) => {
190
+ const queries = getDtoQueries(target);
191
+ queries[propertyName] = {
192
+ type: 'query',
193
+ data: {
194
+ as: propertyName,
195
+ query: (props) => query(props),
196
+ type,
197
+ },
198
+ example,
199
+ };
200
+ Reflect.defineMetadata('sequelize::queryTypes', Object.assign({}, queries), target);
201
+ };
202
+ }
203
+ exports.DtoQuery = DtoQuery;
204
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dto/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { SequelizeDto, Dto, DtoType, DtoQuery } from './dto';
2
+ export { dbInit, loadPath, addModelsToSequelize, modelsSync, getSequelize } from './sequelize';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSequelize = exports.modelsSync = exports.addModelsToSequelize = exports.loadPath = exports.dbInit = exports.DtoQuery = exports.DtoType = exports.Dto = exports.SequelizeDto = void 0;
4
+ var dto_1 = require("./dto");
5
+ Object.defineProperty(exports, "SequelizeDto", { enumerable: true, get: function () { return dto_1.SequelizeDto; } });
6
+ Object.defineProperty(exports, "Dto", { enumerable: true, get: function () { return dto_1.Dto; } });
7
+ Object.defineProperty(exports, "DtoType", { enumerable: true, get: function () { return dto_1.DtoType; } });
8
+ Object.defineProperty(exports, "DtoQuery", { enumerable: true, get: function () { return dto_1.DtoQuery; } });
9
+ var sequelize_1 = require("./sequelize");
10
+ Object.defineProperty(exports, "dbInit", { enumerable: true, get: function () { return sequelize_1.dbInit; } });
11
+ Object.defineProperty(exports, "loadPath", { enumerable: true, get: function () { return sequelize_1.loadPath; } });
12
+ Object.defineProperty(exports, "addModelsToSequelize", { enumerable: true, get: function () { return sequelize_1.addModelsToSequelize; } });
13
+ Object.defineProperty(exports, "modelsSync", { enumerable: true, get: function () { return sequelize_1.modelsSync; } });
14
+ Object.defineProperty(exports, "getSequelize", { enumerable: true, get: function () { return sequelize_1.getSequelize; } });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,6BAA6D;AAApD,mGAAA,YAAY,OAAA;AAAE,0FAAA,GAAG,OAAA;AAAE,8FAAA,OAAO,OAAA;AAAE,+FAAA,QAAQ,OAAA;AAC7C,yCAA+F;AAAtF,mGAAA,MAAM,OAAA;AAAE,qGAAA,QAAQ,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAAE,uGAAA,UAAU,OAAA;AAAE,yGAAA,YAAY,OAAA"}
@@ -0,0 +1,8 @@
1
+ import { Sequelize, SequelizeOptions } from 'sequelize-typescript';
2
+ import 'reflect-metadata';
3
+ export declare const dbInit: (config: SequelizeOptions) => Promise<Sequelize>;
4
+ export declare const loadPath: (path: string, subPath: string) => Promise<void>;
5
+ export declare const addModelsToSequelize: () => Promise<void>;
6
+ export declare const modelsSync: () => Promise<boolean>;
7
+ export declare const getSequelize: () => Sequelize;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sequelize/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKrF,OAAO,kBAAkB,CAAC;AAQ1B,eAAO,MAAM,MAAM,WAAkB,gBAAgB,uBAepD,CAAC;AAEF,eAAO,MAAM,QAAQ,SAAgB,MAAM,WAAW,MAAM,kBAY3D,CAAC;AAEF,eAAO,MAAM,oBAAoB,qBAGhC,CAAC;AAEF,eAAO,MAAM,UAAU,wBAItB,CAAC;AAEF,eAAO,MAAM,YAAY,iBAAmB,CAAC"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.getSequelize = exports.modelsSync = exports.addModelsToSequelize = exports.loadPath = exports.dbInit = void 0;
16
+ const sequelize_typescript_1 = require("sequelize-typescript");
17
+ const fs_1 = __importDefault(require("fs"));
18
+ const core_1 = require("@asapjs/core");
19
+ require("reflect-metadata");
20
+ let container = null;
21
+ const models = [];
22
+ const dtos = [];
23
+ const dbInit = (config) => __awaiter(void 0, void 0, void 0, function* () {
24
+ const sequelize = new sequelize_typescript_1.Sequelize(config);
25
+ container = sequelize;
26
+ sequelize
27
+ .authenticate()
28
+ .then(() => {
29
+ core_1.logger.info('@sequelize :: Database connected.');
30
+ })
31
+ .catch((err) => {
32
+ core_1.logger.error('@sequelize :: Unable to connect to the database:\n', err);
33
+ });
34
+ core_1.logger.info('@sequelize :: database initalize.');
35
+ return sequelize;
36
+ });
37
+ exports.dbInit = dbInit;
38
+ const loadPath = (path, subPath) => __awaiter(void 0, void 0, void 0, function* () {
39
+ const files = yield fs_1.default.readdirSync(path + subPath, { withFileTypes: true });
40
+ const extension = process.env.NODE_ENV === 'production' ? 'js' : 'ts';
41
+ for (const file of files) {
42
+ if (file.isDirectory()) {
43
+ yield (0, exports.loadPath)(path, `${subPath}/${file.name}`);
44
+ }
45
+ else if (file.name.includes(`Table.${extension}`) && file.name.endsWith('map') === false) {
46
+ models.push(require(`${path}/${subPath}/${file.name}`).default);
47
+ }
48
+ else if (file.name.includes(`Dto.${extension}`) && file.name.endsWith('map') === false) {
49
+ dtos.push(require(`${path}/${subPath}/${file.name}`).default);
50
+ }
51
+ }
52
+ });
53
+ exports.loadPath = loadPath;
54
+ const addModelsToSequelize = () => __awaiter(void 0, void 0, void 0, function* () {
55
+ container.addModels(models);
56
+ core_1.logger.info('@sequelize :: add models to sequelize instance.');
57
+ });
58
+ exports.addModelsToSequelize = addModelsToSequelize;
59
+ const modelsSync = () => __awaiter(void 0, void 0, void 0, function* () {
60
+ yield container.sync({ alter: { drop: false } });
61
+ core_1.logger.info('@sequelize :: models sync finished');
62
+ return true;
63
+ });
64
+ exports.modelsSync = modelsSync;
65
+ const getSequelize = () => container;
66
+ exports.getSequelize = getSequelize;
67
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sequelize/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+DAAqF;AACrF,4CAAoB;AAEpB,uCAAsC;AAEtC,4BAA0B;AAE1B,IAAI,SAAS,GAAqB,IAAI,CAAC;AAEvC,MAAM,MAAM,GAAiC,EAAE,CAAC;AAEhD,MAAM,IAAI,GAAU,EAAE,CAAC;AAEhB,MAAM,MAAM,GAAG,CAAO,MAAwB,EAAE,EAAE;IACvD,MAAM,SAAS,GAAG,IAAI,gCAAS,CAAC,MAAM,CAAC,CAAC;IACxC,SAAS,GAAG,SAAS,CAAC;IACtB,SAAS;SACN,YAAY,EAAE;SACd,IAAI,CAAC,GAAG,EAAE;QACT,aAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,aAAM,CAAC,KAAK,CAAC,oDAAoD,EAAE,GAAG,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEL,aAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAEjD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAA,CAAC;AAfW,QAAA,MAAM,UAejB;AAEK,MAAM,QAAQ,GAAG,CAAO,IAAY,EAAE,OAAe,EAAE,EAAE;IAC9D,MAAM,KAAK,GAAG,MAAM,YAAE,CAAC,WAAW,CAAC,IAAI,GAAG,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACtE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB,MAAM,IAAA,gBAAQ,EAAC,IAAI,EAAE,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;SACjD;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,SAAS,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;YAC1F,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;SACjE;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,SAAS,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE;YACxF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;SAC/D;KACF;AACH,CAAC,CAAA,CAAC;AAZW,QAAA,QAAQ,YAYnB;AAEK,MAAM,oBAAoB,GAAG,GAAS,EAAE;IAC7C,SAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7B,aAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;AACjE,CAAC,CAAA,CAAC;AAHW,QAAA,oBAAoB,wBAG/B;AAEK,MAAM,UAAU,GAAG,GAAS,EAAE;IACnC,MAAM,SAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAClD,aAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC;AACd,CAAC,CAAA,CAAC;AAJW,QAAA,UAAU,cAIrB;AAEK,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,SAAU,CAAC;AAAhC,QAAA,YAAY,gBAAoB"}
@@ -0,0 +1,2 @@
1
+ export declare const getUserIdInQuery: (user?: any) => string;
2
+ //# sourceMappingURL=getUserIdInQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUserIdInQuery.d.ts","sourceRoot":"","sources":["../../src/util/getUserIdInQuery.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,UAAW,GAAG,WAA0B,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getUserIdInQuery = void 0;
4
+ const getUserIdInQuery = (user) => `"${(user === null || user === void 0 ? void 0 : user.id) || ''}"`;
5
+ exports.getUserIdInQuery = getUserIdInQuery;
6
+ //# sourceMappingURL=getUserIdInQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUserIdInQuery.js","sourceRoot":"","sources":["../../src/util/getUserIdInQuery.ts"],"names":[],"mappings":";;;AAAO,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,EAAE,CAAC,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE,KAAI,EAAE,GAAG,CAAC;AAAzD,QAAA,gBAAgB,oBAAyC"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@asapjs/sequelize",
3
+ "version": "0.0.1",
4
+ "description": "",
5
+ "main": "dist/index.js",
6
+ "scripts": {
7
+ "build": "./node_modules/typescript/bin/tsc",
8
+ "localinstall": "yarn build && cp -r ./dist /Users/seungmin/projects/pangaia/pangaia-b4c-ms-shop/node_modules/@asapjs/sequelize/"
9
+ },
10
+ "author": "",
11
+ "license": "ISC",
12
+ "dependencies": {
13
+ "body-parser": "^1.19.2",
14
+ "cors": "^2.8.5",
15
+ "express": "^4.17.3",
16
+ "fs": "^0.0.1-security",
17
+ "reflect-metadata": "^0.1.13",
18
+ "sequelize": "^6.17.0",
19
+ "sequelize-typescript": "^2.1.3",
20
+ "winston": "^3.6.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/body-parser": "^1.19.2",
24
+ "@types/cors": "^2.8.12",
25
+ "@types/express": "^4.17.13",
26
+ "@types/node": "^17.0.21",
27
+ "typescript": "^4.6.2"
28
+ },
29
+ "peerDependencies": {
30
+ "@asapjs/core": "^0.0.1"
31
+ }
32
+ }
@@ -0,0 +1,261 @@
1
+ import 'reflect-metadata';
2
+
3
+ import { addOptions, DataType, Model, TableOptions } from 'sequelize-typescript';
4
+ import { AbstractDataTypeConstructor, Includeable, literal } from 'sequelize';
5
+
6
+ interface DtoMiddlewareReturn {
7
+ as?: string;
8
+ model: typeof Model;
9
+ attributes: string[];
10
+ include?: Includeable[];
11
+ }
12
+
13
+ export class SequelizeDto {
14
+ public id?: number;
15
+
16
+ public version?: number | any;
17
+
18
+ private getExampleDataWithSequelizeDataType = (type: any) => {
19
+ if (typeof type.values === 'object') return type.values[0];
20
+ switch (type) {
21
+ case DataType.INTEGER:
22
+ return 0;
23
+ case DataType.ARRAY:
24
+ return [];
25
+ case DataType.STRING:
26
+ return 'string';
27
+ case DataType.DATE:
28
+ return '2022-01-01T00:00:00.000Z';
29
+ case DataType.BOOLEAN:
30
+ return true;
31
+ default:
32
+ return 'string';
33
+ }
34
+ };
35
+
36
+ private fixValue = (type: any, value: any) => {
37
+ switch (type) {
38
+ case DataType.INTEGER:
39
+ if (value === undefined || value === null) return value;
40
+ return parseInt(String(value), 10);
41
+ case DataType.FLOAT:
42
+ if (value === undefined || value === null) return value;
43
+ return parseFloat(String(value));
44
+ case DataType.ARRAY:
45
+ return value;
46
+ case DataType.STRING:
47
+ if (value === undefined || value === null) return value;
48
+ return String(value);
49
+ case DataType.BOOLEAN:
50
+ return !!value;
51
+ default:
52
+ return value;
53
+ }
54
+ };
55
+
56
+ public map = (data: any): any => {
57
+ const attributesOptions = Reflect.getMetadata('sequelize:attributes', this);
58
+ const connectOptions = Reflect.getMetadata('sequelize::dtoTypes', this);
59
+ const queryOptions = Reflect.getMetadata('sequelize::queryTypes', this);
60
+
61
+ const properties = { ...attributesOptions };
62
+
63
+ if (queryOptions) {
64
+ Object.keys(queryOptions).forEach((key) => {
65
+ properties[key] = { type: queryOptions[key].data.type };
66
+ });
67
+ }
68
+
69
+ if (connectOptions) {
70
+ Object.keys(connectOptions).forEach((key) => {
71
+ properties[key] = connectOptions[key];
72
+ });
73
+ }
74
+
75
+ const o: any = data?.dataValues || data;
76
+
77
+ const isArray = Array.isArray(o);
78
+
79
+ if (isArray) {
80
+ return o.map((item: any) => this.map(item));
81
+ }
82
+
83
+ return Object.keys(properties).reduce((p: { [key: string]: unknown }, key) => {
84
+ const property = properties[key];
85
+
86
+ if (properties[key].type === 'dto') {
87
+ p[key] = new property.ConnectDto().map(o?.[key]);
88
+ } else {
89
+ p[key] = this.fixValue(property.type, o?.[key]);
90
+ }
91
+
92
+ return p;
93
+ }, {});
94
+ };
95
+
96
+ public middleware = (as?: string, user?: any, extraAs?: string[]) => {
97
+ const modelInfo = Reflect.getMetadata('sequelize::dtoInfo', this);
98
+ const attributesOptions = Reflect.getMetadata('sequelize:attributes', this);
99
+ const connectOptions = Reflect.getMetadata('sequelize::dtoTypes', this);
100
+ const queryOptions = Reflect.getMetadata('sequelize::queryTypes', this);
101
+
102
+ const extraAsData: string[] = extraAs ? ([...extraAs, as].filter((v) => !!v) as string[]) : as ? [as] : [];
103
+
104
+ const attributes: string[] = ['id'];
105
+
106
+ if (attributesOptions) {
107
+ Object.keys(attributesOptions).forEach((key) => attributes.push(key));
108
+ }
109
+
110
+ const include: any = [];
111
+
112
+ if (connectOptions) {
113
+ Object.keys(connectOptions).forEach((key) => {
114
+ const { ConnectDto } = connectOptions[key];
115
+ include.push(new ConnectDto().middleware(connectOptions[key].as, user, extraAsData));
116
+ });
117
+ }
118
+
119
+ if (queryOptions) {
120
+ Object.keys(queryOptions).forEach((key) => {
121
+ const queryData = queryOptions[key];
122
+ (attributes as any).push([
123
+ literal(
124
+ queryData.data.query({
125
+ association:
126
+ extraAsData.length >= 2 ? '`' + `${extraAsData.join('->')}` + '`' : as || modelInfo.defineTable.name,
127
+ user,
128
+ }),
129
+ ),
130
+ queryData.data.as,
131
+ ]);
132
+ });
133
+ }
134
+
135
+ if (modelInfo.timestamps) {
136
+ attributes.push('created_at');
137
+ attributes.push('updated_at');
138
+ }
139
+
140
+ const result: DtoMiddlewareReturn = {
141
+ model: modelInfo.defineTable,
142
+ attributes,
143
+ };
144
+
145
+ if (as) result.as = as;
146
+
147
+ if (include.length > 0) result.include = include;
148
+
149
+ return result;
150
+ };
151
+
152
+ public swagger = () => {
153
+ const attributesOptions = Reflect.getMetadata('sequelize:attributes', this);
154
+ const connectOptions = Reflect.getMetadata('sequelize::dtoTypes', this);
155
+ const queryOptions = Reflect.getMetadata('sequelize::queryTypes', this);
156
+
157
+ const attributes: any = {};
158
+ if (attributesOptions) {
159
+ Object.keys(attributesOptions).forEach((key) => {
160
+ attributes[key] = this.getExampleDataWithSequelizeDataType(attributesOptions[key].type);
161
+ });
162
+ }
163
+
164
+ if (queryOptions) {
165
+ Object.keys(queryOptions).forEach((key) => {
166
+ const queryData = queryOptions[key];
167
+ attributes[key] = queryData?.example || this.getExampleDataWithSequelizeDataType(queryData.data.type);
168
+ });
169
+ }
170
+
171
+ if (connectOptions) {
172
+ Object.keys(connectOptions).forEach((key) => {
173
+ attributes[key] = connectOptions[key].example;
174
+ });
175
+ }
176
+
177
+ return attributes;
178
+ };
179
+ }
180
+
181
+ export function Dto(info: { timestamps?: boolean; tableName: string; defineTable: typeof Model }) {
182
+ return function annotate(target: any, options: TableOptions = {}): void {
183
+ const args = {
184
+ ...info,
185
+ timestamps: info.timestamps === undefined,
186
+ };
187
+ Reflect.defineMetadata('sequelize::dtoInfo', args, target.prototype);
188
+ addOptions(target.prototype, options);
189
+ };
190
+ }
191
+
192
+ const getAttributes = (target: any, key: string) => {
193
+ let attributes = Reflect.getMetadata(key, target);
194
+
195
+ if (attributes) {
196
+ return Object.keys(attributes).reduce((copy: any, key: any) => {
197
+ copy[key] = { ...attributes[key] };
198
+
199
+ return copy;
200
+ }, {});
201
+ }
202
+
203
+ if (!attributes) {
204
+ attributes = {};
205
+ }
206
+
207
+ return attributes;
208
+ };
209
+
210
+ const getDtoTypes = (target: any) => getAttributes(target, 'sequelize::dtoTypes');
211
+ const getDtoQueries = (target: any) => getAttributes(target, 'sequelize::queryTypes');
212
+
213
+ export function DtoType(ConnectTo: any, as: string) {
214
+ return (target: any, propertyName: string, propertyDescriptor?: PropertyDescriptor) => {
215
+ const attributes = getDtoTypes(target);
216
+
217
+ const ConnectDto = ConnectTo();
218
+
219
+ const swaggerExampleData = new ConnectDto().swagger(as);
220
+
221
+ const options = {
222
+ type: 'dto',
223
+ as,
224
+ ConnectDto,
225
+ example: swaggerExampleData,
226
+ };
227
+
228
+ attributes[propertyName] = { ...options };
229
+
230
+ Reflect.defineMetadata('sequelize::dtoTypes', { ...attributes }, target);
231
+ };
232
+ }
233
+
234
+ interface QueryParams {
235
+ user?: any;
236
+ association?: string;
237
+ }
238
+
239
+ interface DtoQueryParams {
240
+ query: (props: QueryParams) => string;
241
+ type?: AbstractDataTypeConstructor;
242
+ example?: any;
243
+ }
244
+
245
+ export function DtoQuery({ query, type, example }: DtoQueryParams) {
246
+ return (target: any, propertyName: string, propertyDescriptor?: PropertyDescriptor) => {
247
+ const queries = getDtoQueries(target);
248
+
249
+ queries[propertyName] = {
250
+ type: 'query',
251
+ data: {
252
+ as: propertyName,
253
+ query: (props: QueryParams) => query(props),
254
+ type,
255
+ },
256
+ example,
257
+ };
258
+
259
+ Reflect.defineMetadata('sequelize::queryTypes', { ...queries }, target);
260
+ };
261
+ }
package/src/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export { SequelizeDto, Dto, DtoType, DtoQuery } from './dto';
2
+ export { dbInit, loadPath, addModelsToSequelize, modelsSync, getSequelize } from './sequelize';
@@ -0,0 +1,56 @@
1
+ import { Model, ModelCtor, Sequelize, SequelizeOptions } from 'sequelize-typescript';
2
+ import fs from 'fs';
3
+
4
+ import { logger } from '@asapjs/core';
5
+
6
+ import 'reflect-metadata';
7
+
8
+ let container: Sequelize | null = null;
9
+
10
+ const models: ModelCtor<Model<any, any>>[] = [];
11
+
12
+ const dtos: any[] = [];
13
+
14
+ export const dbInit = async (config: SequelizeOptions) => {
15
+ const sequelize = new Sequelize(config);
16
+ container = sequelize;
17
+ sequelize
18
+ .authenticate()
19
+ .then(() => {
20
+ logger.info('@sequelize :: Database connected.');
21
+ })
22
+ .catch((err) => {
23
+ logger.error('@sequelize :: Unable to connect to the database:\n', err);
24
+ });
25
+
26
+ logger.info('@sequelize :: database initalize.');
27
+
28
+ return sequelize;
29
+ };
30
+
31
+ export const loadPath = async (path: string, subPath: string) => {
32
+ const files = await fs.readdirSync(path + subPath, { withFileTypes: true });
33
+ const extension = process.env.NODE_ENV === 'production' ? 'js' : 'ts';
34
+ for (const file of files) {
35
+ if (file.isDirectory()) {
36
+ await loadPath(path, `${subPath}/${file.name}`);
37
+ } else if (file.name.includes(`Table.${extension}`) && file.name.endsWith('map') === false) {
38
+ models.push(require(`${path}/${subPath}/${file.name}`).default);
39
+ } else if (file.name.includes(`Dto.${extension}`) && file.name.endsWith('map') === false) {
40
+ dtos.push(require(`${path}/${subPath}/${file.name}`).default);
41
+ }
42
+ }
43
+ };
44
+
45
+ export const addModelsToSequelize = async () => {
46
+ container!.addModels(models);
47
+ logger.info('@sequelize :: add models to sequelize instance.');
48
+ };
49
+
50
+ export const modelsSync = async () => {
51
+ await container!.sync({ alter: { drop: false } });
52
+ logger.info('@sequelize :: models sync finished');
53
+ return true;
54
+ };
55
+
56
+ export const getSequelize = () => container!;
@@ -0,0 +1 @@
1
+ export const getUserIdInQuery = (user?: any) => `"${user?.id || ''}"`;
package/tsconfig.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "commonjs",
4
+ "esModuleInterop": true,
5
+ "target": "es6",
6
+ "noImplicitAny": true,
7
+ "moduleResolution": "node",
8
+ "sourceMap": true,
9
+ "declaration": true,
10
+ "declarationMap": true,
11
+ "baseUrl": ".",
12
+ "outDir": "dist",
13
+ "lib": ["es2015", "es2019", "es2020"],
14
+ "skipLibCheck": true,
15
+ "strictNullChecks": true,
16
+ "experimentalDecorators": true,
17
+ "emitDecoratorMetadata": true,
18
+ "resolveJsonModule": true
19
+ },
20
+ "include": ["src/**/*"]
21
+ }