arkos 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/README.md +161 -0
- package/dist/src/app.d.ts +10 -0
- package/dist/src/app.d.ts.map +1 -0
- package/dist/src/app.js +114 -0
- package/dist/src/app.js.map +1 -0
- package/dist/src/index.d.ts +21 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +51 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/modules/auth/auth.controller.d.ts +23 -0
- package/dist/src/modules/auth/auth.controller.d.ts.map +1 -0
- package/dist/src/modules/auth/auth.controller.js +317 -0
- package/dist/src/modules/auth/auth.controller.js.map +1 -0
- package/dist/src/modules/auth/auth.router.d.ts +4 -0
- package/dist/src/modules/auth/auth.router.d.ts.map +1 -0
- package/dist/src/modules/auth/auth.router.js +64 -0
- package/dist/src/modules/auth/auth.router.js.map +1 -0
- package/dist/src/modules/auth/auth.service.d.ts +16 -0
- package/dist/src/modules/auth/auth.service.d.ts.map +1 -0
- package/dist/src/modules/auth/auth.service.js +122 -0
- package/dist/src/modules/auth/auth.service.js.map +1 -0
- package/dist/src/modules/base/base.controller.d.ts +17 -0
- package/dist/src/modules/base/base.controller.d.ts.map +1 -0
- package/dist/src/modules/base/base.controller.js +296 -0
- package/dist/src/modules/base/base.controller.js.map +1 -0
- package/dist/src/modules/base/base.middlewares.d.ts +20 -0
- package/dist/src/modules/base/base.middlewares.d.ts.map +1 -0
- package/dist/src/modules/base/base.middlewares.js +86 -0
- package/dist/src/modules/base/base.middlewares.js.map +1 -0
- package/dist/src/modules/base/base.router.d.ts +4 -0
- package/dist/src/modules/base/base.router.d.ts.map +1 -0
- package/dist/src/modules/base/base.router.js +74 -0
- package/dist/src/modules/base/base.router.js.map +1 -0
- package/dist/src/modules/base/base.service.d.ts +32 -0
- package/dist/src/modules/base/base.service.d.ts.map +1 -0
- package/dist/src/modules/base/base.service.js +149 -0
- package/dist/src/modules/base/base.service.js.map +1 -0
- package/dist/src/modules/base/utils/base.helpers.d.ts +29 -0
- package/dist/src/modules/base/utils/base.helpers.d.ts.map +1 -0
- package/dist/src/modules/base/utils/base.helpers.js +106 -0
- package/dist/src/modules/base/utils/base.helpers.js.map +1 -0
- package/dist/src/modules/email/email.service.d.ts +22 -0
- package/dist/src/modules/email/email.service.d.ts.map +1 -0
- package/dist/src/modules/email/email.service.js +45 -0
- package/dist/src/modules/email/email.service.js.map +1 -0
- package/dist/src/modules/email/utils/email.helpers.d.ts +9 -0
- package/dist/src/modules/email/utils/email.helpers.d.ts.map +1 -0
- package/dist/src/modules/email/utils/email.helpers.js +25 -0
- package/dist/src/modules/email/utils/email.helpers.js.map +1 -0
- package/dist/src/modules/error-handler/error-handler.controller.d.ts +4 -0
- package/dist/src/modules/error-handler/error-handler.controller.d.ts.map +1 -0
- package/dist/src/modules/error-handler/error-handler.controller.js +182 -0
- package/dist/src/modules/error-handler/error-handler.controller.js.map +1 -0
- package/dist/src/modules/error-handler/utils/app-error.d.ts +11 -0
- package/dist/src/modules/error-handler/utils/app-error.d.ts.map +1 -0
- package/dist/src/modules/error-handler/utils/app-error.js +23 -0
- package/dist/src/modules/error-handler/utils/app-error.js.map +1 -0
- package/dist/src/modules/error-handler/utils/catch-async.d.ts +4 -0
- package/dist/src/modules/error-handler/utils/catch-async.d.ts.map +1 -0
- package/dist/src/modules/error-handler/utils/catch-async.js +9 -0
- package/dist/src/modules/error-handler/utils/catch-async.js.map +1 -0
- package/dist/src/modules/error-handler/utils/error-handler.helpers.d.ts +43 -0
- package/dist/src/modules/error-handler/utils/error-handler.helpers.d.ts.map +1 -0
- package/dist/src/modules/error-handler/utils/error-handler.helpers.js +209 -0
- package/dist/src/modules/error-handler/utils/error-handler.helpers.js.map +1 -0
- package/dist/src/modules/file-uploader/file-uploader.service.d.ts +20 -0
- package/dist/src/modules/file-uploader/file-uploader.service.d.ts.map +1 -0
- package/dist/src/modules/file-uploader/file-uploader.service.js +114 -0
- package/dist/src/modules/file-uploader/file-uploader.service.js.map +1 -0
- package/dist/src/paths.d.ts +2 -0
- package/dist/src/paths.d.ts.map +1 -0
- package/dist/src/paths.js +9 -0
- package/dist/src/paths.js.map +1 -0
- package/dist/src/utils/features/api.features.d.ts +20 -0
- package/dist/src/utils/features/api.features.d.ts.map +1 -0
- package/dist/src/utils/features/api.features.js +177 -0
- package/dist/src/utils/features/api.features.js.map +1 -0
- package/dist/src/utils/features/prisma.helpers.d.ts +3 -0
- package/dist/src/utils/features/prisma.helpers.d.ts.map +1 -0
- package/dist/src/utils/features/prisma.helpers.js +20 -0
- package/dist/src/utils/features/prisma.helpers.js.map +1 -0
- package/dist/src/utils/helpers/api.features.helpers.d.ts +41 -0
- package/dist/src/utils/helpers/api.features.helpers.d.ts.map +1 -0
- package/dist/src/utils/helpers/api.features.helpers.js +161 -0
- package/dist/src/utils/helpers/api.features.helpers.js.map +1 -0
- package/dist/src/utils/helpers/models.helpers.d.ts +21 -0
- package/dist/src/utils/helpers/models.helpers.d.ts.map +1 -0
- package/dist/src/utils/helpers/models.helpers.js +195 -0
- package/dist/src/utils/helpers/models.helpers.js.map +1 -0
- package/dist/src/utils/helpers/text.helpers.d.ts +2 -0
- package/dist/src/utils/helpers/text.helpers.d.ts.map +1 -0
- package/dist/src/utils/helpers/text.helpers.js +12 -0
- package/dist/src/utils/helpers/text.helpers.js.map +1 -0
- package/dist/src/utils/permissions/index.d.ts +3 -0
- package/dist/src/utils/permissions/index.d.ts.map +1 -0
- package/dist/src/utils/permissions/index.js +17 -0
- package/dist/src/utils/permissions/index.js.map +1 -0
- package/dist/src/utils/scripts/export-prisma-types.d.ts +2 -0
- package/dist/src/utils/scripts/export-prisma-types.d.ts.map +1 -0
- package/dist/src/utils/scripts/export-prisma-types.js +152 -0
- package/dist/src/utils/scripts/export-prisma-types.js.map +1 -0
- package/dist/src/utils/scripts/generate-zod-schemas.d.ts +2 -0
- package/dist/src/utils/scripts/generate-zod-schemas.d.ts.map +1 -0
- package/dist/src/utils/scripts/generate-zod-schemas.js +121 -0
- package/dist/src/utils/scripts/generate-zod-schemas.js.map +1 -0
- package/dist/src/utils/scripts/prisma-db-push.d.ts +2 -0
- package/dist/src/utils/scripts/prisma-db-push.d.ts.map +1 -0
- package/dist/src/utils/scripts/prisma-db-push.js +24 -0
- package/dist/src/utils/scripts/prisma-db-push.js.map +1 -0
- package/dist/src/utils/validate-dto.d.ts +3 -0
- package/dist/src/utils/validate-dto.d.ts.map +1 -0
- package/dist/src/utils/validate-dto.js +17 -0
- package/dist/src/utils/validate-dto.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const deepmerge_1 = __importDefault(require("deepmerge"));
|
|
7
|
+
const api_features_helpers_1 = require("../helpers/api.features.helpers");
|
|
8
|
+
const app_error_1 = __importDefault(require("../../modules/error-handler/utils/app-error"));
|
|
9
|
+
const app_1 = require("../../app");
|
|
10
|
+
class APIFeatures {
|
|
11
|
+
req; // The Prisma query
|
|
12
|
+
searchParams; // The query string parameters from the request
|
|
13
|
+
searchParamsWithModifiers; // The query string parameters from the request
|
|
14
|
+
filters = {};
|
|
15
|
+
modelName;
|
|
16
|
+
relationFields;
|
|
17
|
+
excludedFields = [
|
|
18
|
+
'page',
|
|
19
|
+
'sort',
|
|
20
|
+
'limit',
|
|
21
|
+
'fields',
|
|
22
|
+
'addFields',
|
|
23
|
+
'removeFields',
|
|
24
|
+
'search',
|
|
25
|
+
'include',
|
|
26
|
+
'filterMode',
|
|
27
|
+
'where',
|
|
28
|
+
'prismaQueryOptions',
|
|
29
|
+
'ignoredFields',
|
|
30
|
+
];
|
|
31
|
+
constructor(req, modelName, relationFields) {
|
|
32
|
+
this.req = req;
|
|
33
|
+
this.modelName = modelName;
|
|
34
|
+
this.searchParams = (0, api_features_helpers_1.parseQueryParamsWithModifiers)(req.query);
|
|
35
|
+
this.filters = { ...this.filters };
|
|
36
|
+
if (relationFields)
|
|
37
|
+
this.filters.iclude = relationFields;
|
|
38
|
+
this.relationFields = relationFields || {};
|
|
39
|
+
}
|
|
40
|
+
filter() {
|
|
41
|
+
const searchableFields = [];
|
|
42
|
+
const prisma = app_1.initConfigs.prisma;
|
|
43
|
+
const queryObj = { ...this.searchParams };
|
|
44
|
+
this.excludedFields.forEach((el) => delete queryObj[el]);
|
|
45
|
+
let queryStr = JSON.stringify(queryObj);
|
|
46
|
+
queryStr = queryStr.replace(/\b(gte|gt|lte|lt)\b/g, (match) => `${match}`);
|
|
47
|
+
const whereObj = { ...this.req.params, ...queryObj };
|
|
48
|
+
const whereLogicalOperatorFilters = Object.keys(whereObj).map((key) => ({
|
|
49
|
+
[key]: whereObj[key],
|
|
50
|
+
}));
|
|
51
|
+
let whereOptions = whereLogicalOperatorFilters.length > 0
|
|
52
|
+
? {
|
|
53
|
+
[this.req.query?.filterMode ?? 'OR']: whereLogicalOperatorFilters,
|
|
54
|
+
}
|
|
55
|
+
: {};
|
|
56
|
+
if (!!this.searchParams.search) {
|
|
57
|
+
Object.keys(prisma[this.modelName].fields).forEach((key) => {
|
|
58
|
+
const field = prisma[this.modelName].fields[key];
|
|
59
|
+
if (field.typeName === 'String' &&
|
|
60
|
+
key !== 'id' &&
|
|
61
|
+
!field.isList &&
|
|
62
|
+
!field.name.includes('Id') &&
|
|
63
|
+
!field.name.includes('ID')) {
|
|
64
|
+
searchableFields.push({
|
|
65
|
+
[`${key}`]: {
|
|
66
|
+
contains: this.searchParams.search,
|
|
67
|
+
mode: 'insensitive',
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
whereOptions = (0, deepmerge_1.default)(whereOptions, {
|
|
73
|
+
OR: searchableFields,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const parsedQueryOptions = typeof this.req.query?.prismaQueryOptions === 'string'
|
|
77
|
+
? JSON.parse(this.req.query?.prismaQueryOptions)
|
|
78
|
+
: {};
|
|
79
|
+
this.filters = (0, deepmerge_1.default)({
|
|
80
|
+
where: whereOptions,
|
|
81
|
+
}, parsedQueryOptions, this.filters);
|
|
82
|
+
return this;
|
|
83
|
+
}
|
|
84
|
+
search() {
|
|
85
|
+
if (this.searchParams?.search) {
|
|
86
|
+
this.filters = (0, deepmerge_1.default)(this.filters, {
|
|
87
|
+
where: {
|
|
88
|
+
OR: [],
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
sort() {
|
|
94
|
+
if (this.searchParams.sort) {
|
|
95
|
+
const sortBy = this.searchParams?.sort
|
|
96
|
+
?.split(',')
|
|
97
|
+
?.map((field) => ({
|
|
98
|
+
[field.startsWith('-') ? field.substring(1) : field]: field.startsWith('-') ? 'desc' : 'asc',
|
|
99
|
+
}));
|
|
100
|
+
this.filters = (0, deepmerge_1.default)(this.filters, { orderBy: sortBy });
|
|
101
|
+
}
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
limitFields() {
|
|
105
|
+
if (this.searchParams?.fields &&
|
|
106
|
+
!this.searchParams?.addFields &&
|
|
107
|
+
!this.searchParams?.removeFields) {
|
|
108
|
+
const fieldsToSelect = this.searchParams.fields
|
|
109
|
+
.split(',')
|
|
110
|
+
.filter((field) => !field.startsWith('+') && !field.startsWith('-'));
|
|
111
|
+
this.filters = {
|
|
112
|
+
...this.filters,
|
|
113
|
+
select: fieldsToSelect.reduce((acc, field) => {
|
|
114
|
+
acc[field] = true;
|
|
115
|
+
return acc;
|
|
116
|
+
}, {}),
|
|
117
|
+
};
|
|
118
|
+
this.filters.select = { ...this.filters.select, ...this.filters.include };
|
|
119
|
+
delete this.filters.include;
|
|
120
|
+
}
|
|
121
|
+
else if (this.searchParams?.fields &&
|
|
122
|
+
(this.searchParams?.addFields || this.searchParams?.removeFields))
|
|
123
|
+
throw new app_error_1.default('Cannot use fields in the same query with addFields or removeFields.', 400);
|
|
124
|
+
if (this.searchParams?.addFields && !this.searchParams?.fields) {
|
|
125
|
+
const fieldsToAdd = this.searchParams.addFields
|
|
126
|
+
.split(',')
|
|
127
|
+
.filter((field) => field.startsWith('+'));
|
|
128
|
+
this.filters = {
|
|
129
|
+
...this.filters,
|
|
130
|
+
select: {
|
|
131
|
+
...this.filters.include,
|
|
132
|
+
...fieldsToAdd.reduce((acc, field) => {
|
|
133
|
+
acc[field.replace('+', '')] = true;
|
|
134
|
+
return acc;
|
|
135
|
+
}, {}),
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
else if (this.searchParams?.fields && this.searchParams?.addFields)
|
|
140
|
+
throw new app_error_1.default('Cannot use addFields in the same query with fields.', 400);
|
|
141
|
+
if (this.searchParams?.removeFields && !this.searchParams?.fields) {
|
|
142
|
+
const fieldsToRemove = this.searchParams.removeFields
|
|
143
|
+
.split(',')
|
|
144
|
+
.filter((field) => field.startsWith('-'));
|
|
145
|
+
this.filters = {
|
|
146
|
+
...this.filters,
|
|
147
|
+
select: {
|
|
148
|
+
...this.filters.include,
|
|
149
|
+
...fieldsToRemove.reduce((acc, field) => {
|
|
150
|
+
acc[field.replace('-', '')] = false;
|
|
151
|
+
return acc;
|
|
152
|
+
}, {}),
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
else if (this.searchParams?.removeFields && this.searchParams?.addFields)
|
|
157
|
+
throw new app_error_1.default('Cannot use removeFields in the same query with fields.', 400);
|
|
158
|
+
return this;
|
|
159
|
+
}
|
|
160
|
+
paginate() {
|
|
161
|
+
const page = parseInt(this.searchParams.page, 10) || 1;
|
|
162
|
+
const limit = parseInt(this.searchParams.limit, 10) || 30;
|
|
163
|
+
const skip = (page - 1) * limit;
|
|
164
|
+
this.filters = {
|
|
165
|
+
...this.filters,
|
|
166
|
+
skip,
|
|
167
|
+
take: limit,
|
|
168
|
+
};
|
|
169
|
+
return this;
|
|
170
|
+
}
|
|
171
|
+
async exec() {
|
|
172
|
+
const prisma = app_1.initConfigs.prisma;
|
|
173
|
+
return await prisma[this.modelName].findMany(this.filters);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
exports.default = APIFeatures;
|
|
177
|
+
//# sourceMappingURL=api.features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.features.js","sourceRoot":"","sources":["../../../../src/utils/features/api.features.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.helpers.d.ts","sourceRoot":"","sources":["../../../../src/utils/features/prisma.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI1D,eAAO,MAAM,uBAAuB,GAAI,QAAQ,GAAG,8DAS/C,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.checkDatabaseConnection = void 0;
|
|
7
|
+
const catch_async_1 = __importDefault(require("../../modules/error-handler/utils/catch-async"));
|
|
8
|
+
const app_error_1 = __importDefault(require("../../modules/error-handler/utils/app-error"));
|
|
9
|
+
const checkDatabaseConnection = (prisma) => (0, catch_async_1.default)(async (req, res, next) => {
|
|
10
|
+
try {
|
|
11
|
+
await prisma.$connect();
|
|
12
|
+
next();
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
console.error("Database connection error", error.message);
|
|
16
|
+
next(new app_error_1.default(error.message, 503));
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
exports.checkDatabaseConnection = checkDatabaseConnection;
|
|
20
|
+
//# sourceMappingURL=prisma.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.helpers.js","sourceRoot":"","sources":["../../../../src/utils/features/prisma.helpers.ts"],"names":[],"mappings":";;;;;;AACA,gGAAuE;AACvE,4FAAmE;AAE5D,MAAM,uBAAuB,GAAG,CAAC,MAAW,EAAE,EAAE,CACrD,IAAA,qBAAU,EAAC,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;IACnE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,IAAI,EAAE,CAAC;IACT,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,mBAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;AACH,CAAC,CAAC,CAAC;AATQ,QAAA,uBAAuB,2BAS/B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration types for field type mapping
|
|
3
|
+
*/
|
|
4
|
+
interface FieldConfig {
|
|
5
|
+
dateFields: string[];
|
|
6
|
+
booleanFields: string[];
|
|
7
|
+
numericFields: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Type for the structured filter object returned by the parser
|
|
11
|
+
*/
|
|
12
|
+
type ParsedFilter = {
|
|
13
|
+
[key: string]: any;
|
|
14
|
+
orderBy?: Record<string, 'asc' | 'desc'>;
|
|
15
|
+
OR?: Record<string, any>[];
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Parses query parameters into a structured filter object compatible with Prisma queries.
|
|
19
|
+
* Supports various operators and data type conversions.
|
|
20
|
+
*
|
|
21
|
+
* @param query - Object containing query parameters
|
|
22
|
+
* @param fieldConfig - Optional configuration for field type mapping
|
|
23
|
+
* @returns Structured filter object for database queries
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // Basic usage
|
|
27
|
+
* parseQueryParamsWithModifiers({ name__contains: 'john' })
|
|
28
|
+
* // => { name: { contains: 'john', mode: 'sensitive' } }
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* // Complex query
|
|
32
|
+
* parseQueryParamsWithModifiers({
|
|
33
|
+
* name__not__equals: 'john',
|
|
34
|
+
* age__gt: '25',
|
|
35
|
+
* tags__in: 'tag1,tag2',
|
|
36
|
+
* orderBy__createdAt: 'desc'
|
|
37
|
+
* })
|
|
38
|
+
*/
|
|
39
|
+
export declare function parseQueryParamsWithModifiers(query: Record<string, any>, fieldConfig?: FieldConfig): ParsedFilter;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=api.features.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.features.helpers.d.ts","sourceRoot":"","sources":["../../../../src/utils/helpers/api.features.helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,UAAU,WAAW;IACnB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAED;;GAEG;AACH,KAAK,YAAY,GAAG;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,CAAA;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAA;CAC3B,CAAA;AAWD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAE1B,WAAW,GAAE,WAAkC,GAC9C,YAAY,CAuHd"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseQueryParamsWithModifiers = parseQueryParamsWithModifiers;
|
|
4
|
+
/**
|
|
5
|
+
* Default configuration for field types
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_FIELD_CONFIG = {
|
|
8
|
+
dateFields: ['createdAt', 'updatedAt', 'deletedAt', 'date'],
|
|
9
|
+
booleanFields: ['isActive', 'isDeleted', 'isPublished', 'isArchived'],
|
|
10
|
+
numericFields: ['age', 'price', 'quantity', 'amount', 'rating'],
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Parses query parameters into a structured filter object compatible with Prisma queries.
|
|
14
|
+
* Supports various operators and data type conversions.
|
|
15
|
+
*
|
|
16
|
+
* @param query - Object containing query parameters
|
|
17
|
+
* @param fieldConfig - Optional configuration for field type mapping
|
|
18
|
+
* @returns Structured filter object for database queries
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Basic usage
|
|
22
|
+
* parseQueryParamsWithModifiers({ name__contains: 'john' })
|
|
23
|
+
* // => { name: { contains: 'john', mode: 'sensitive' } }
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* // Complex query
|
|
27
|
+
* parseQueryParamsWithModifiers({
|
|
28
|
+
* name__not__equals: 'john',
|
|
29
|
+
* age__gt: '25',
|
|
30
|
+
* tags__in: 'tag1,tag2',
|
|
31
|
+
* orderBy__createdAt: 'desc'
|
|
32
|
+
* })
|
|
33
|
+
*/
|
|
34
|
+
function parseQueryParamsWithModifiers(query,
|
|
35
|
+
// excludedFields: string[],
|
|
36
|
+
fieldConfig = DEFAULT_FIELD_CONFIG) {
|
|
37
|
+
const queryObj = JSON.parse(JSON.stringify(query));
|
|
38
|
+
// excludedFields.forEach((el) => delete queryObj[el])
|
|
39
|
+
return Object.entries(JSON.parse(JSON.stringify(query))).reduce((acc, [key, value]) => {
|
|
40
|
+
if (!value)
|
|
41
|
+
return acc;
|
|
42
|
+
// Convert value to string if it's not already
|
|
43
|
+
const stringValue = Array.isArray(value)
|
|
44
|
+
? value[0]?.toString()
|
|
45
|
+
: value.toString();
|
|
46
|
+
const parts = key.split('__');
|
|
47
|
+
if (parts.length < 2) {
|
|
48
|
+
acc[key] = value;
|
|
49
|
+
return acc;
|
|
50
|
+
}
|
|
51
|
+
const fieldName = parts[0];
|
|
52
|
+
// Handle ordering
|
|
53
|
+
if (fieldName === 'orderBy' && parts.length === 2) {
|
|
54
|
+
if (!acc.orderBy)
|
|
55
|
+
acc.orderBy = {};
|
|
56
|
+
acc.orderBy[parts[1]] = stringValue;
|
|
57
|
+
return acc;
|
|
58
|
+
}
|
|
59
|
+
// Handle simple equals case
|
|
60
|
+
if (parts.length === 1) {
|
|
61
|
+
acc[fieldName] = {
|
|
62
|
+
equals: convertValue(stringValue, fieldName, 'equals', fieldConfig),
|
|
63
|
+
};
|
|
64
|
+
return acc;
|
|
65
|
+
}
|
|
66
|
+
let currentLevel = acc;
|
|
67
|
+
let currentKey = fieldName;
|
|
68
|
+
// Build nested structure
|
|
69
|
+
for (let i = 1; i < parts.length - 1; i++) {
|
|
70
|
+
if (!currentLevel[currentKey]) {
|
|
71
|
+
currentLevel[currentKey] = {};
|
|
72
|
+
}
|
|
73
|
+
currentLevel = currentLevel[currentKey];
|
|
74
|
+
currentKey = parts[i];
|
|
75
|
+
}
|
|
76
|
+
const lastOperator = parts[parts.length - 1];
|
|
77
|
+
// Handle special operators
|
|
78
|
+
switch (lastOperator) {
|
|
79
|
+
case 'icontains':
|
|
80
|
+
currentLevel[currentKey] = {
|
|
81
|
+
contains: stringValue,
|
|
82
|
+
mode: 'insensitive',
|
|
83
|
+
};
|
|
84
|
+
break;
|
|
85
|
+
case 'contains':
|
|
86
|
+
currentLevel[currentKey] = {
|
|
87
|
+
contains: stringValue,
|
|
88
|
+
mode: 'sensitive',
|
|
89
|
+
};
|
|
90
|
+
break;
|
|
91
|
+
case 'in':
|
|
92
|
+
case 'notIn':
|
|
93
|
+
currentLevel[currentKey] = {
|
|
94
|
+
[lastOperator]: stringValue
|
|
95
|
+
.split(',')
|
|
96
|
+
.map((v) => convertValue(v.trim(), fieldName, lastOperator, fieldConfig)),
|
|
97
|
+
};
|
|
98
|
+
break;
|
|
99
|
+
case 'or':
|
|
100
|
+
const values = stringValue.split(',');
|
|
101
|
+
if (!acc.OR)
|
|
102
|
+
acc.OR = [];
|
|
103
|
+
acc.OR.push(...values.map((val) => ({
|
|
104
|
+
[fieldName]: {
|
|
105
|
+
equals: convertValue(val.trim(), fieldName, 'equals', fieldConfig),
|
|
106
|
+
},
|
|
107
|
+
})));
|
|
108
|
+
break;
|
|
109
|
+
case 'isNull':
|
|
110
|
+
currentLevel[currentKey] = {
|
|
111
|
+
equals: stringValue.toLowerCase() === 'true' ? null : undefined,
|
|
112
|
+
};
|
|
113
|
+
break;
|
|
114
|
+
case 'isEmpty':
|
|
115
|
+
currentLevel[currentKey] = {
|
|
116
|
+
equals: stringValue.toLowerCase() === 'true' ? '' : undefined,
|
|
117
|
+
};
|
|
118
|
+
break;
|
|
119
|
+
default:
|
|
120
|
+
currentLevel[currentKey] = {
|
|
121
|
+
[lastOperator]: convertValue(stringValue, fieldName, lastOperator, fieldConfig),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return acc;
|
|
125
|
+
}, {});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Converts string values to appropriate types based on field configuration
|
|
129
|
+
*/
|
|
130
|
+
function convertValue(value, fieldName, operator, config) {
|
|
131
|
+
// Handle date fields
|
|
132
|
+
if (config.dateFields.includes(fieldName)) {
|
|
133
|
+
return new Date(value);
|
|
134
|
+
}
|
|
135
|
+
// Handle boolean fields
|
|
136
|
+
if (config.booleanFields.includes(fieldName)) {
|
|
137
|
+
return value.toLowerCase() === 'true';
|
|
138
|
+
}
|
|
139
|
+
// Handle numeric fields
|
|
140
|
+
if (config.numericFields.includes(fieldName)) {
|
|
141
|
+
return Number(value);
|
|
142
|
+
}
|
|
143
|
+
return value;
|
|
144
|
+
}
|
|
145
|
+
// Example usage:
|
|
146
|
+
/*
|
|
147
|
+
const query = {
|
|
148
|
+
name__not__equals: 'uanela',
|
|
149
|
+
email__contains: 'example.com',
|
|
150
|
+
description__icontains: 'test',
|
|
151
|
+
age__gt: '25',
|
|
152
|
+
status: 'active',
|
|
153
|
+
tags__in: 'tag1,tag2,tag3',
|
|
154
|
+
createdAt__gt: '2024-01-01',
|
|
155
|
+
isActive: 'true',
|
|
156
|
+
orderBy__createdAt: 'desc'
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
const result = parseQueryParamsWithModifiers(query);
|
|
160
|
+
*/
|
|
161
|
+
//# sourceMappingURL=api.features.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.features.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/api.features.helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare function importPrismaModelModules(modelName: string): Promise<{
|
|
2
|
+
middlewares?: any;
|
|
3
|
+
authConfigs?: any;
|
|
4
|
+
prismaQueryOptions?: any;
|
|
5
|
+
}>;
|
|
6
|
+
export declare function getAppWidthEjectedMiddlewares(app: any): Promise<any>;
|
|
7
|
+
declare const models: string[];
|
|
8
|
+
export type RelationFields = {
|
|
9
|
+
singular: {
|
|
10
|
+
name: string;
|
|
11
|
+
type: string;
|
|
12
|
+
}[];
|
|
13
|
+
list: {
|
|
14
|
+
name: string;
|
|
15
|
+
type: string;
|
|
16
|
+
}[];
|
|
17
|
+
};
|
|
18
|
+
declare const prismaModelRelationFields: Record<string, RelationFields>;
|
|
19
|
+
export declare function getPrismaModelRelations(modelName: string): RelationFields | undefined;
|
|
20
|
+
export { models, prismaModelRelationFields };
|
|
21
|
+
//# sourceMappingURL=models.helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.helpers.d.ts","sourceRoot":"","sources":["../../../../src/utils/helpers/models.helpers.ts"],"names":[],"mappings":"AAMA,wBAAsB,wBAAwB,CAAC,SAAS,EAAE,MAAM;kBAuB9C,GAAG;kBACH,GAAG;yBACI,GAAG;GA4C3B;AAED,wBAAsB,6BAA6B,CAAC,GAAG,EAAE,GAAG,gBAoB3D;AAED,QAAA,MAAM,MAAM,EAAE,MAAM,EAAO,CAAC;AAkB5B,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACxC,CAAC;AAKF,QAAA,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAM,CAAC;AAsFrE,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,8BAIxD;AAED,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.prismaModelRelationFields = exports.models = void 0;
|
|
40
|
+
exports.importPrismaModelModules = importPrismaModelModules;
|
|
41
|
+
exports.getAppWidthEjectedMiddlewares = getAppWidthEjectedMiddlewares;
|
|
42
|
+
exports.getPrismaModelRelations = getPrismaModelRelations;
|
|
43
|
+
const paths_1 = require("../../paths");
|
|
44
|
+
const path_1 = __importDefault(require("path"));
|
|
45
|
+
const fs_1 = __importDefault(require("fs"));
|
|
46
|
+
const change_case_all_1 = require("change-case-all");
|
|
47
|
+
const app_1 = require("../../app");
|
|
48
|
+
async function importPrismaModelModules(modelName) {
|
|
49
|
+
const kebabModelName = (0, change_case_all_1.kebabCase)(modelName);
|
|
50
|
+
const moduleDir = path_1.default.resolve(paths_1.ROOT_DIR, "src", "modules", modelName);
|
|
51
|
+
const extension = process.env.NODE_ENV === "production" ? "js" : "ts";
|
|
52
|
+
// Define the expected file paths
|
|
53
|
+
const middlewaresFile = path_1.default.join(moduleDir, `${kebabModelName}.middlewares.${extension}`);
|
|
54
|
+
const authConfigsFile = path_1.default.join(moduleDir, `${kebabModelName}.auth-configs.${extension}`);
|
|
55
|
+
const prismaQueryOptionsFile = path_1.default.join(moduleDir, `${kebabModelName}.prisma-query-options.${extension}`);
|
|
56
|
+
// Initialize result object
|
|
57
|
+
const result = {};
|
|
58
|
+
// Try to import middlewares
|
|
59
|
+
try {
|
|
60
|
+
if (fs_1.default.existsSync(middlewaresFile)) {
|
|
61
|
+
const middlewareModule = await Promise.resolve(`${middlewaresFile}`).then(s => __importStar(require(s)));
|
|
62
|
+
result.middlewares = middlewareModule;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
console.error(`Error importing middlewares for model "${modelName}":`, error);
|
|
67
|
+
}
|
|
68
|
+
// Try to import auth configs
|
|
69
|
+
try {
|
|
70
|
+
if (fs_1.default.existsSync(authConfigsFile)) {
|
|
71
|
+
const authConfigsModule = await Promise.resolve(`${authConfigsFile}`).then(s => __importStar(require(s)));
|
|
72
|
+
result.authConfigs = authConfigsModule.default || authConfigsModule;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error(`Error importing auth configs for model "${modelName}":`, error);
|
|
77
|
+
}
|
|
78
|
+
// Try to import prisma query options
|
|
79
|
+
try {
|
|
80
|
+
if (fs_1.default.existsSync(prismaQueryOptionsFile)) {
|
|
81
|
+
const prismaQueryOptionsModule = await Promise.resolve(`${prismaQueryOptionsFile}`).then(s => __importStar(require(s)));
|
|
82
|
+
result.prismaQueryOptions =
|
|
83
|
+
prismaQueryOptionsModule.default || prismaQueryOptionsModule;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error(`Error importing prisma query options for model "${modelName}":`, error);
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
async function getAppWidthEjectedMiddlewares(app) {
|
|
92
|
+
const extension = process.env.NODE_ENV === "production" ? "js" : "ts";
|
|
93
|
+
const appWithEjectedMiddlewaresPath = path_1.default.resolve(paths_1.ROOT_DIR, "src", `app.${extension}`);
|
|
94
|
+
if (!appWithEjectedMiddlewaresPath) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
// const middlewarePath = path.join(middlewaresDir, matchingFile)
|
|
98
|
+
try {
|
|
99
|
+
const appEjected = await Promise.resolve(`${appWithEjectedMiddlewaresPath}`).then(s => __importStar(require(s)));
|
|
100
|
+
return appEjected;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const models = [];
|
|
107
|
+
exports.models = models;
|
|
108
|
+
(() => {
|
|
109
|
+
const prisma = app_1.initConfigs.prisma;
|
|
110
|
+
Object.keys(prisma || {}).forEach((key) => {
|
|
111
|
+
const value = prisma[key];
|
|
112
|
+
if (value &&
|
|
113
|
+
typeof value === "object" &&
|
|
114
|
+
typeof value.findUnique === "function") {
|
|
115
|
+
models.push(key);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
})();
|
|
119
|
+
const schemaFolderPath = `./prisma/schema`;
|
|
120
|
+
// Read and process the schema files once
|
|
121
|
+
const prismaModelRelationFields = {};
|
|
122
|
+
exports.prismaModelRelationFields = prismaModelRelationFields;
|
|
123
|
+
const files = fs_1.default
|
|
124
|
+
.readdirSync(schemaFolderPath)
|
|
125
|
+
.filter((file) => file.endsWith(".prisma"));
|
|
126
|
+
for (const model of models) {
|
|
127
|
+
const modelName = (0, change_case_all_1.pascalCase)(model);
|
|
128
|
+
let modelFile;
|
|
129
|
+
for (const file of files) {
|
|
130
|
+
const filePath = path_1.default.join(schemaFolderPath, file);
|
|
131
|
+
const stats = fs_1.default.statSync(filePath);
|
|
132
|
+
if (stats.isFile()) {
|
|
133
|
+
const content = fs_1.default.readFileSync(filePath, "utf-8");
|
|
134
|
+
if (content.includes(`model ${modelName} {`)) {
|
|
135
|
+
modelFile = file;
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (!modelFile) {
|
|
141
|
+
throw new Error(`Model ${modelName} not found`);
|
|
142
|
+
}
|
|
143
|
+
const content = fs_1.default.readFileSync(path_1.default.join(schemaFolderPath, modelFile), "utf-8");
|
|
144
|
+
const modelStart = content.indexOf(`model ${modelName} {`);
|
|
145
|
+
const modelEnd = content.indexOf("}", modelStart);
|
|
146
|
+
const modelDefinition = content.slice(modelStart, modelEnd);
|
|
147
|
+
const relations = {
|
|
148
|
+
singular: [],
|
|
149
|
+
list: [],
|
|
150
|
+
};
|
|
151
|
+
const lines = modelDefinition.split("\n");
|
|
152
|
+
for (const line of lines) {
|
|
153
|
+
const trimmedLine = line.trim();
|
|
154
|
+
if (!trimmedLine || trimmedLine.startsWith("model"))
|
|
155
|
+
continue;
|
|
156
|
+
// Check for relations
|
|
157
|
+
const [fieldName, type] = trimmedLine.split(/\s+/);
|
|
158
|
+
const cleanType = type?.replace("[]", "").replace("?", "");
|
|
159
|
+
if (trimmedLine.includes("@relation") ||
|
|
160
|
+
trimmedLine.match(/\s+\w+(\[\])?(\s+@|$)/) ||
|
|
161
|
+
models.includes((0, change_case_all_1.camelCase)(cleanType || ""))
|
|
162
|
+
// content.includes(`model ${cleanType} {`)
|
|
163
|
+
) {
|
|
164
|
+
const modelStart = content.indexOf(`enum ${cleanType} {`);
|
|
165
|
+
if (!cleanType ||
|
|
166
|
+
modelStart >= 0 ||
|
|
167
|
+
cleanType === "String" ||
|
|
168
|
+
cleanType === "Int" ||
|
|
169
|
+
cleanType === "Float" ||
|
|
170
|
+
cleanType === "Boolean" ||
|
|
171
|
+
cleanType === "DateTime" ||
|
|
172
|
+
cleanType === "Bytes" ||
|
|
173
|
+
cleanType === "Decimal" ||
|
|
174
|
+
cleanType === "BigInt" ||
|
|
175
|
+
cleanType === "Json") {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (!type?.includes("[]")) {
|
|
179
|
+
relations.singular.push({ name: fieldName, type: cleanType });
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
relations.list.push({ name: fieldName, type: cleanType });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
prismaModelRelationFields[modelName] = relations;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Function to get relations from the cache
|
|
189
|
+
function getPrismaModelRelations(modelName) {
|
|
190
|
+
modelName = (0, change_case_all_1.pascalCase)(modelName);
|
|
191
|
+
if (!(modelName in prismaModelRelationFields))
|
|
192
|
+
return;
|
|
193
|
+
return prismaModelRelationFields[modelName];
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=models.helpers.js.map
|