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.
Files changed (114) hide show
  1. package/README.md +161 -0
  2. package/dist/src/app.d.ts +10 -0
  3. package/dist/src/app.d.ts.map +1 -0
  4. package/dist/src/app.js +114 -0
  5. package/dist/src/app.js.map +1 -0
  6. package/dist/src/index.d.ts +21 -0
  7. package/dist/src/index.d.ts.map +1 -0
  8. package/dist/src/index.js +51 -0
  9. package/dist/src/index.js.map +1 -0
  10. package/dist/src/modules/auth/auth.controller.d.ts +23 -0
  11. package/dist/src/modules/auth/auth.controller.d.ts.map +1 -0
  12. package/dist/src/modules/auth/auth.controller.js +317 -0
  13. package/dist/src/modules/auth/auth.controller.js.map +1 -0
  14. package/dist/src/modules/auth/auth.router.d.ts +4 -0
  15. package/dist/src/modules/auth/auth.router.d.ts.map +1 -0
  16. package/dist/src/modules/auth/auth.router.js +64 -0
  17. package/dist/src/modules/auth/auth.router.js.map +1 -0
  18. package/dist/src/modules/auth/auth.service.d.ts +16 -0
  19. package/dist/src/modules/auth/auth.service.d.ts.map +1 -0
  20. package/dist/src/modules/auth/auth.service.js +122 -0
  21. package/dist/src/modules/auth/auth.service.js.map +1 -0
  22. package/dist/src/modules/base/base.controller.d.ts +17 -0
  23. package/dist/src/modules/base/base.controller.d.ts.map +1 -0
  24. package/dist/src/modules/base/base.controller.js +296 -0
  25. package/dist/src/modules/base/base.controller.js.map +1 -0
  26. package/dist/src/modules/base/base.middlewares.d.ts +20 -0
  27. package/dist/src/modules/base/base.middlewares.d.ts.map +1 -0
  28. package/dist/src/modules/base/base.middlewares.js +86 -0
  29. package/dist/src/modules/base/base.middlewares.js.map +1 -0
  30. package/dist/src/modules/base/base.router.d.ts +4 -0
  31. package/dist/src/modules/base/base.router.d.ts.map +1 -0
  32. package/dist/src/modules/base/base.router.js +74 -0
  33. package/dist/src/modules/base/base.router.js.map +1 -0
  34. package/dist/src/modules/base/base.service.d.ts +32 -0
  35. package/dist/src/modules/base/base.service.d.ts.map +1 -0
  36. package/dist/src/modules/base/base.service.js +149 -0
  37. package/dist/src/modules/base/base.service.js.map +1 -0
  38. package/dist/src/modules/base/utils/base.helpers.d.ts +29 -0
  39. package/dist/src/modules/base/utils/base.helpers.d.ts.map +1 -0
  40. package/dist/src/modules/base/utils/base.helpers.js +106 -0
  41. package/dist/src/modules/base/utils/base.helpers.js.map +1 -0
  42. package/dist/src/modules/email/email.service.d.ts +22 -0
  43. package/dist/src/modules/email/email.service.d.ts.map +1 -0
  44. package/dist/src/modules/email/email.service.js +45 -0
  45. package/dist/src/modules/email/email.service.js.map +1 -0
  46. package/dist/src/modules/email/utils/email.helpers.d.ts +9 -0
  47. package/dist/src/modules/email/utils/email.helpers.d.ts.map +1 -0
  48. package/dist/src/modules/email/utils/email.helpers.js +25 -0
  49. package/dist/src/modules/email/utils/email.helpers.js.map +1 -0
  50. package/dist/src/modules/error-handler/error-handler.controller.d.ts +4 -0
  51. package/dist/src/modules/error-handler/error-handler.controller.d.ts.map +1 -0
  52. package/dist/src/modules/error-handler/error-handler.controller.js +182 -0
  53. package/dist/src/modules/error-handler/error-handler.controller.js.map +1 -0
  54. package/dist/src/modules/error-handler/utils/app-error.d.ts +11 -0
  55. package/dist/src/modules/error-handler/utils/app-error.d.ts.map +1 -0
  56. package/dist/src/modules/error-handler/utils/app-error.js +23 -0
  57. package/dist/src/modules/error-handler/utils/app-error.js.map +1 -0
  58. package/dist/src/modules/error-handler/utils/catch-async.d.ts +4 -0
  59. package/dist/src/modules/error-handler/utils/catch-async.d.ts.map +1 -0
  60. package/dist/src/modules/error-handler/utils/catch-async.js +9 -0
  61. package/dist/src/modules/error-handler/utils/catch-async.js.map +1 -0
  62. package/dist/src/modules/error-handler/utils/error-handler.helpers.d.ts +43 -0
  63. package/dist/src/modules/error-handler/utils/error-handler.helpers.d.ts.map +1 -0
  64. package/dist/src/modules/error-handler/utils/error-handler.helpers.js +209 -0
  65. package/dist/src/modules/error-handler/utils/error-handler.helpers.js.map +1 -0
  66. package/dist/src/modules/file-uploader/file-uploader.service.d.ts +20 -0
  67. package/dist/src/modules/file-uploader/file-uploader.service.d.ts.map +1 -0
  68. package/dist/src/modules/file-uploader/file-uploader.service.js +114 -0
  69. package/dist/src/modules/file-uploader/file-uploader.service.js.map +1 -0
  70. package/dist/src/paths.d.ts +2 -0
  71. package/dist/src/paths.d.ts.map +1 -0
  72. package/dist/src/paths.js +9 -0
  73. package/dist/src/paths.js.map +1 -0
  74. package/dist/src/utils/features/api.features.d.ts +20 -0
  75. package/dist/src/utils/features/api.features.d.ts.map +1 -0
  76. package/dist/src/utils/features/api.features.js +177 -0
  77. package/dist/src/utils/features/api.features.js.map +1 -0
  78. package/dist/src/utils/features/prisma.helpers.d.ts +3 -0
  79. package/dist/src/utils/features/prisma.helpers.d.ts.map +1 -0
  80. package/dist/src/utils/features/prisma.helpers.js +20 -0
  81. package/dist/src/utils/features/prisma.helpers.js.map +1 -0
  82. package/dist/src/utils/helpers/api.features.helpers.d.ts +41 -0
  83. package/dist/src/utils/helpers/api.features.helpers.d.ts.map +1 -0
  84. package/dist/src/utils/helpers/api.features.helpers.js +161 -0
  85. package/dist/src/utils/helpers/api.features.helpers.js.map +1 -0
  86. package/dist/src/utils/helpers/models.helpers.d.ts +21 -0
  87. package/dist/src/utils/helpers/models.helpers.d.ts.map +1 -0
  88. package/dist/src/utils/helpers/models.helpers.js +195 -0
  89. package/dist/src/utils/helpers/models.helpers.js.map +1 -0
  90. package/dist/src/utils/helpers/text.helpers.d.ts +2 -0
  91. package/dist/src/utils/helpers/text.helpers.d.ts.map +1 -0
  92. package/dist/src/utils/helpers/text.helpers.js +12 -0
  93. package/dist/src/utils/helpers/text.helpers.js.map +1 -0
  94. package/dist/src/utils/permissions/index.d.ts +3 -0
  95. package/dist/src/utils/permissions/index.d.ts.map +1 -0
  96. package/dist/src/utils/permissions/index.js +17 -0
  97. package/dist/src/utils/permissions/index.js.map +1 -0
  98. package/dist/src/utils/scripts/export-prisma-types.d.ts +2 -0
  99. package/dist/src/utils/scripts/export-prisma-types.d.ts.map +1 -0
  100. package/dist/src/utils/scripts/export-prisma-types.js +152 -0
  101. package/dist/src/utils/scripts/export-prisma-types.js.map +1 -0
  102. package/dist/src/utils/scripts/generate-zod-schemas.d.ts +2 -0
  103. package/dist/src/utils/scripts/generate-zod-schemas.d.ts.map +1 -0
  104. package/dist/src/utils/scripts/generate-zod-schemas.js +121 -0
  105. package/dist/src/utils/scripts/generate-zod-schemas.js.map +1 -0
  106. package/dist/src/utils/scripts/prisma-db-push.d.ts +2 -0
  107. package/dist/src/utils/scripts/prisma-db-push.d.ts.map +1 -0
  108. package/dist/src/utils/scripts/prisma-db-push.js +24 -0
  109. package/dist/src/utils/scripts/prisma-db-push.js.map +1 -0
  110. package/dist/src/utils/validate-dto.d.ts +3 -0
  111. package/dist/src/utils/validate-dto.d.ts.map +1 -0
  112. package/dist/src/utils/validate-dto.js +17 -0
  113. package/dist/src/utils/validate-dto.js.map +1 -0
  114. 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,3 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare const checkDatabaseConnection: (prisma: any) => (req: Request, res: Response, next: NextFunction) => void;
3
+ //# sourceMappingURL=prisma.helpers.d.ts.map
@@ -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