shuttlepro-shared 1.3.19 → 1.3.20

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 (65) hide show
  1. package/common/repositories/chatMember.repository.js +9 -0
  2. package/common/repositories/customerProfile.repository.js +147 -0
  3. package/common/repositories/customerTimeline.repository.js +78 -0
  4. package/common/repositories/descriptionTemplates.repository.js +229 -0
  5. package/common/repositories/index.js +34 -0
  6. package/common/repositories/integration.repository.js +210 -0
  7. package/common/repositories/label.repository.js +95 -0
  8. package/common/repositories/notificationSettings.repository.js +95 -0
  9. package/common/repositories/role.repository.js +333 -0
  10. package/common/repositories/settings.repository.js +32 -0
  11. package/common/repositories/shipper.repository.js +77 -0
  12. package/common/repositories/socialMediaSetting.repository.js +33 -0
  13. package/common/repositories/user.repository.js +150 -0
  14. package/common/repositories/userPermission.repository.js +228 -0
  15. package/common/repositories/userRepository.js +31 -0
  16. package/common/repositories/userRole.repository.js +235 -0
  17. package/common/repositories/userRolePermission.repository.js +59 -0
  18. package/common/repositories/workspace.repository.js +147 -0
  19. package/config/bull.js +78 -0
  20. package/config/config.js +14 -0
  21. package/config/database.js +4 -0
  22. package/config/index.js +13 -0
  23. package/config/redis.js +196 -0
  24. package/config/socket.js +172 -0
  25. package/constants/index.js +15 -0
  26. package/index.js +8 -0
  27. package/models/AgentActivity.js +192 -0
  28. package/models/Assignment.js +23 -0
  29. package/models/BusinessDistribution.js +23 -0
  30. package/models/Card.js +144 -0
  31. package/models/CardComments.js +33 -0
  32. package/models/ChatMember.js +17 -0
  33. package/models/Chatbot.js +20 -0
  34. package/models/Checkpoint.js +50 -0
  35. package/models/City.js +17 -0
  36. package/models/Column.js +28 -0
  37. package/models/Conversation.js +87 -0
  38. package/models/Customer.js +36 -0
  39. package/models/CustomerProfile.js +30 -0
  40. package/models/CustomerTimeline.js +28 -0
  41. package/models/DefaultRolePermission.js +34 -0
  42. package/models/DescriptionTemplate.js +22 -0
  43. package/models/Integration.js +51 -0
  44. package/models/Label.js +42 -0
  45. package/models/Message.js +47 -0
  46. package/models/NewProduct.js +71 -0
  47. package/models/NotificationSettings.js +130 -0
  48. package/models/Order.js +254 -0
  49. package/models/OrderProduct.js +37 -0
  50. package/models/Profile.js +127 -0
  51. package/models/Report.js +27 -0
  52. package/models/Setting.js +18 -0
  53. package/models/Shipper.js +62 -0
  54. package/models/SocialMediaSetting.js +28 -0
  55. package/models/Status.js +58 -0
  56. package/models/StatusType.js +10 -0
  57. package/models/Step.js +50 -0
  58. package/models/Type.js +25 -0
  59. package/models/UserRole.js +1 -119
  60. package/models/UserWorkflow.js +46 -0
  61. package/models/Workspace.js +308 -0
  62. package/models.js +62 -1
  63. package/package.json +13 -2
  64. package/utils/decorator-factory.js +264 -0
  65. package/utils/logger.js +41 -0
@@ -0,0 +1,264 @@
1
+ const express = require("express");
2
+ const logger = require("./logger");
3
+ const cors = require("cors");
4
+ const helmet = require("helmet");
5
+
6
+ // Controller Decorator
7
+ function Controller(basePath) {
8
+ return function (target) {
9
+ target.prototype.basePath = basePath;
10
+ };
11
+ }
12
+
13
+ // Modified method decorator factory to handle pending middlewares
14
+ function createMethodDecorator(method) {
15
+ return function (path = "") {
16
+ return function (target, key, descriptor) {
17
+ if (!target.constructor.prototype.routes) {
18
+ target.constructor.prototype.routes = [];
19
+ }
20
+
21
+ // Create route object
22
+ const route = {
23
+ method,
24
+ path,
25
+ handlerName: key,
26
+ handler: descriptor.value,
27
+ middlewares: [],
28
+ guards: [],
29
+ interceptors: [],
30
+ pipes: [],
31
+ auth: null,
32
+ };
33
+
34
+ // Check if there are any pending middlewares for this route
35
+ if (
36
+ target.constructor.prototype._pendingMiddlewares &&
37
+ target.constructor.prototype._pendingMiddlewares[key]
38
+ ) {
39
+ route.middlewares.push(
40
+ ...target.constructor.prototype._pendingMiddlewares[key]
41
+ );
42
+ // Clear the pending middlewares
43
+ delete target.constructor.prototype._pendingMiddlewares[key];
44
+ }
45
+
46
+ target.constructor.prototype.routes.push(route);
47
+
48
+ return descriptor;
49
+ };
50
+ };
51
+ }
52
+
53
+ // HTTP Method Decorators
54
+ const Get = createMethodDecorator("get");
55
+ const Post = createMethodDecorator("post");
56
+ const Put = createMethodDecorator("put");
57
+ const Delete = createMethodDecorator("delete");
58
+ const Patch = createMethodDecorator("patch");
59
+
60
+ function formatResponse(data, code = 200, message = "Success") {
61
+ return { code, message, data };
62
+ }
63
+
64
+ function Middleware(middlewares = []) {
65
+ return function (target) {
66
+ if (!target.prototype.middlewares) {
67
+ target.prototype.middlewares = [];
68
+ }
69
+ target.prototype.middlewares = [
70
+ ...target.prototype.middlewares,
71
+ ...middlewares,
72
+ ]; // Append instead of overwrite
73
+ };
74
+ }
75
+
76
+ function UseMiddleware(...middlewares) {
77
+ return function (target, key, descriptor) {
78
+ // Initialize routes array if it doesn't exist
79
+ if (!target.constructor.prototype.routes) {
80
+ target.constructor.prototype.routes = [];
81
+ }
82
+
83
+ // Find the route by handlerName
84
+ const route = target.constructor.prototype.routes.find(
85
+ (r) => r.handlerName === key
86
+ );
87
+
88
+ if (route) {
89
+ // Ensure route.middlewares is initialized
90
+ if (!route.middlewares) {
91
+ route.middlewares = [];
92
+ }
93
+ // Add the middlewares to the route
94
+ route.middlewares.push(...middlewares);
95
+ } else {
96
+ // If the route doesn't exist yet (decorator order issue),
97
+ // we need to create a route object that will be used later
98
+ target.constructor.prototype._pendingMiddlewares =
99
+ target.constructor.prototype._pendingMiddlewares || {};
100
+
101
+ if (!target.constructor.prototype._pendingMiddlewares[key]) {
102
+ target.constructor.prototype._pendingMiddlewares[key] = [];
103
+ }
104
+
105
+ target.constructor.prototype._pendingMiddlewares[key].push(
106
+ ...middlewares
107
+ );
108
+ }
109
+
110
+ return descriptor;
111
+ };
112
+ }
113
+
114
+ // Guard Decorator
115
+ function Guard(...guards) {
116
+ return function (target, key, descriptor) {
117
+ const route = target.constructor.prototype.routes.find(
118
+ (r) => r.handlerName === key
119
+ );
120
+ if (route) {
121
+ route.guards = [...(route.guards || []), ...guards];
122
+ }
123
+ return descriptor;
124
+ };
125
+ }
126
+
127
+ // Auth Decorator
128
+ function Auth(authConfig) {
129
+ return function (target, key, descriptor) {
130
+ const route = target.constructor.prototype.routes.find(
131
+ (r) => r.handlerName === key
132
+ );
133
+ if (route) {
134
+ route.auth = authConfig;
135
+ }
136
+ return descriptor;
137
+ };
138
+ }
139
+
140
+ // Pipe Decorator
141
+ function Pipe(...pipes) {
142
+ return function (target, key, descriptor) {
143
+ const route = target.constructor.prototype.routes.find(
144
+ (r) => r.handlerName === key
145
+ );
146
+ if (route) {
147
+ route.pipes = [...(route.pipes || []), ...pipes];
148
+ }
149
+ return descriptor;
150
+ };
151
+ }
152
+
153
+ // Error Handling Middleware
154
+ function asyncHandler(fn) {
155
+ return async (req, res, next) => {
156
+ try {
157
+ const result = await fn(req, res, next);
158
+ res.status(result.code || 200).json(result);
159
+ } catch (error) {
160
+ next(error);
161
+ }
162
+ };
163
+ }
164
+
165
+ function createRouterFromController(ControllerClass) {
166
+ const controller = new ControllerClass();
167
+ const router = express.Router();
168
+ const basePath = controller.constructor.prototype.basePath || "";
169
+ const globalMiddlewares = controller.constructor.prototype.middlewares || []; // Retrieve global middlewares
170
+
171
+ if (controller.constructor.prototype.routes) {
172
+ controller.constructor.prototype.routes.forEach((route) => {
173
+ const { method, path, handler, middlewares, guards, pipes, auth } = route;
174
+
175
+ const middlewareChain = [
176
+ ...(auth ? [createAuthMiddleware(auth)] : []),
177
+ ...globalMiddlewares, // Apply global middlewares first
178
+ ...guards.map((guard) => createGuardMiddleware(guard)),
179
+ ...middlewares, // Then apply route-specific middlewares
180
+ asyncHandler(async (req) => {
181
+ if (pipes.length > 0) {
182
+ req.body = pipes.reduce(
183
+ (data, pipe) => pipe.transform(data),
184
+ req.body
185
+ );
186
+ }
187
+ return await handler.call(controller, req);
188
+ }),
189
+ ];
190
+
191
+ router[method](path, ...middlewareChain);
192
+ });
193
+ }
194
+
195
+ router.use((error, req, res, next) => {
196
+ console.error("Route error:", error);
197
+ res
198
+ .status(500)
199
+ .json({ code: 500, message: error.message || "Internal Server Error" });
200
+ });
201
+
202
+ return { basePath, router };
203
+ }
204
+
205
+ /**
206
+ * Configure Express middleware and settings
207
+ * @param {Express.Application} app - Express application instance
208
+ */
209
+
210
+ function configureMiddleware(app, config) {
211
+ // Request parsing middleware
212
+ app.use(express.json({ limit: config?.limit || "10mb" }));
213
+ app.use(
214
+ express.urlencoded({ limit: config?.limit || "10mb", extended: true })
215
+ );
216
+
217
+ // Security middleware
218
+ app.use(
219
+ cors({
220
+ origin: config?.ALLOWED_URLS,
221
+ credentials: true,
222
+ })
223
+ );
224
+ app.use(helmet());
225
+
226
+ // Request logging
227
+ app.use((req, res, next) => {
228
+ logger.info(`${req.method} ${req.originalUrl}`);
229
+ if (req.method !== "GET") {
230
+ logger.debug("Request Body:", req.body);
231
+ }
232
+ next();
233
+ });
234
+ }
235
+
236
+ // App Initialization
237
+ function createApp(controllers, config) {
238
+ const app = express(); // Ensure express is initialized
239
+ configureMiddleware(app, config);
240
+
241
+ controllers.forEach((ControllerClass) => {
242
+ const { basePath, router } = createRouterFromController(ControllerClass);
243
+ app.use(`${config?.globalPrefix}${basePath}`, router); // Apply global prefix
244
+ });
245
+
246
+ return app; // Return a properly configured express app
247
+ }
248
+
249
+ module.exports = {
250
+ Controller,
251
+ Get,
252
+ Post,
253
+ Put,
254
+ Delete,
255
+ Patch,
256
+ UseMiddleware,
257
+ Guard,
258
+ Auth,
259
+ Pipe,
260
+ createRouterFromController,
261
+ createApp,
262
+ formatResponse,
263
+ Middleware,
264
+ };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Simple logger utility for consistent logging
3
+ * Can be replaced with a more robust solution like Winston or Pino
4
+ */
5
+ const logger = {
6
+ /**
7
+ * Log info level messages
8
+ * @param {...any} args - Arguments to log
9
+ */
10
+ info: (...args) => {
11
+ console.log(`[${new Date().toISOString()}] [INFO]`, ...args);
12
+ },
13
+
14
+ /**
15
+ * Log debug level messages
16
+ * @param {...any} args - Arguments to log
17
+ */
18
+ debug: (...args) => {
19
+ if (process.env.NODE_ENV !== "production") {
20
+ console.log(`[${new Date().toISOString()}] [DEBUG]`, ...args);
21
+ }
22
+ },
23
+
24
+ /**
25
+ * Log error level messages
26
+ * @param {...any} args - Arguments to log
27
+ */
28
+ error: (...args) => {
29
+ console.error(`[${new Date().toISOString()}] [ERROR]`, ...args);
30
+ },
31
+
32
+ /**
33
+ * Log warning level messages
34
+ * @param {...any} args - Arguments to log
35
+ */
36
+ warn: (...args) => {
37
+ console.warn(`[${new Date().toISOString()}] [WARN]`, ...args);
38
+ },
39
+ };
40
+
41
+ module.exports = logger;