@servicelabsco/nestjs-utility-services 2.0.6 → 2.0.7

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 (249) hide show
  1. package/CLAUDE.md +96 -0
  2. package/CODEBASE-REVIEW.md +227 -0
  3. package/CODEBASE_REFERENCE.md +568 -0
  4. package/dist/app.controller.d.ts +0 -5
  5. package/dist/app.controller.js +2 -30
  6. package/dist/app.controller.js.map +1 -1
  7. package/dist/app.module.js +37 -4
  8. package/dist/app.module.js.map +1 -1
  9. package/dist/auth/auth.module.js +4 -1
  10. package/dist/auth/auth.module.js.map +1 -1
  11. package/dist/auth/controllers/admin.auth.controller.js +6 -1
  12. package/dist/auth/controllers/admin.auth.controller.js.map +1 -1
  13. package/dist/auth/middlewares/client.connect.middleware.js +0 -2
  14. package/dist/auth/middlewares/client.connect.middleware.js.map +1 -1
  15. package/dist/auth/middlewares/internal.middleware.d.ts +1 -0
  16. package/dist/auth/middlewares/internal.middleware.js +43 -1
  17. package/dist/auth/middlewares/internal.middleware.js.map +1 -1
  18. package/dist/auth/middlewares/jwt.middleware.js +1 -1
  19. package/dist/auth/middlewares/jwt.middleware.js.map +1 -1
  20. package/dist/auth/services/auth.service.js +1 -1
  21. package/dist/auth/services/auth.service.js.map +1 -1
  22. package/dist/auth/services/refresh.token.service.js +35 -1
  23. package/dist/auth/services/refresh.token.service.js.map +1 -1
  24. package/dist/auth/services/user.service.d.ts +6 -0
  25. package/dist/auth/services/user.service.js +41 -2
  26. package/dist/auth/services/user.service.js.map +1 -1
  27. package/dist/common/dtos/capture.record.index.dto.js.map +1 -1
  28. package/dist/common/dtos/index.params.dto.js.map +1 -1
  29. package/dist/common/dtos/record.data.manager.dto.d.ts +2 -2
  30. package/dist/common/dtos/report.data.manager.dto.d.ts +2 -2
  31. package/dist/common/es6.classes.js +10 -1
  32. package/dist/common/es6.classes.js.map +1 -1
  33. package/dist/common/exceptions/index.d.ts +1 -0
  34. package/dist/common/exceptions/index.js +1 -0
  35. package/dist/common/exceptions/index.js.map +1 -1
  36. package/dist/common/exceptions/too.many.attempts.exception.d.ts +4 -0
  37. package/dist/common/exceptions/too.many.attempts.exception.js +11 -0
  38. package/dist/common/exceptions/too.many.attempts.exception.js.map +1 -0
  39. package/dist/common/libraries/auth.js +34 -1
  40. package/dist/common/libraries/auth.js.map +1 -1
  41. package/dist/common/libraries/custom.crypt.js +34 -1
  42. package/dist/common/libraries/custom.crypt.js.map +1 -1
  43. package/dist/common/libraries/custom.logger.d.ts +1 -6
  44. package/dist/common/libraries/custom.logger.js +12 -34
  45. package/dist/common/libraries/custom.logger.js.map +1 -1
  46. package/dist/common/libraries/generic.index.parser.js +8 -2
  47. package/dist/common/libraries/generic.index.parser.js.map +1 -1
  48. package/dist/common/libraries/hash.d.ts +2 -2
  49. package/dist/common/libraries/hash.js +52 -10
  50. package/dist/common/libraries/hash.js.map +1 -1
  51. package/dist/common/libraries/index.d.ts +1 -0
  52. package/dist/common/libraries/index.js +1 -0
  53. package/dist/common/libraries/index.js.map +1 -1
  54. package/dist/common/libraries/list.manager.js +6 -1
  55. package/dist/common/libraries/list.manager.js.map +1 -1
  56. package/dist/common/libraries/platform.utility.d.ts +1 -0
  57. package/dist/common/libraries/platform.utility.js +17 -2
  58. package/dist/common/libraries/platform.utility.js.map +1 -1
  59. package/dist/common/libraries/record.manager.d.ts +2 -2
  60. package/dist/common/libraries/record.manager.js +4 -1
  61. package/dist/common/libraries/record.manager.js.map +1 -1
  62. package/dist/common/libraries/report.list.manager.js +6 -1
  63. package/dist/common/libraries/report.list.manager.js.map +1 -1
  64. package/dist/common/libraries/sql.safety.d.ts +5 -0
  65. package/dist/common/libraries/sql.safety.js +72 -0
  66. package/dist/common/libraries/sql.safety.js.map +1 -0
  67. package/dist/config/cors.config.d.ts +1 -1
  68. package/dist/config/cors.config.js +11 -2
  69. package/dist/config/cors.config.js.map +1 -1
  70. package/dist/config/rate.limiter.config.d.ts +2 -0
  71. package/dist/config/rate.limiter.config.js +2 -0
  72. package/dist/config/rate.limiter.config.js.map +1 -1
  73. package/dist/config/read.typeorm.config.js +34 -1
  74. package/dist/config/read.typeorm.config.js.map +1 -1
  75. package/dist/config/typeorm.config.js +34 -1
  76. package/dist/config/typeorm.config.js.map +1 -1
  77. package/dist/main.js +61 -10
  78. package/dist/main.js.map +1 -1
  79. package/dist/migrations/1619296224563-AddMasterSeedersDataSeederTable.js +35 -2
  80. package/dist/migrations/1619296224563-AddMasterSeedersDataSeederTable.js.map +1 -1
  81. package/dist/migrations/1778754675764-AlterColumnValueTypeSysPropertiesTable.d.ts +5 -0
  82. package/dist/migrations/1778754675764-AlterColumnValueTypeSysPropertiesTable.js +13 -0
  83. package/dist/migrations/1778754675764-AlterColumnValueTypeSysPropertiesTable.js.map +1 -0
  84. package/dist/platformUtility/consumers/job.consumer.js +4 -1
  85. package/dist/platformUtility/consumers/job.consumer.js.map +1 -1
  86. package/dist/platformUtility/dtos/index.d.ts +1 -0
  87. package/dist/platformUtility/dtos/index.js +1 -0
  88. package/dist/platformUtility/dtos/index.js.map +1 -1
  89. package/dist/platformUtility/dtos/r2.config.dto.d.ts +7 -0
  90. package/dist/platformUtility/dtos/r2.config.dto.js +7 -0
  91. package/dist/platformUtility/dtos/r2.config.dto.js.map +1 -0
  92. package/dist/platformUtility/dtos/set.sms.payload.dto.d.ts +1 -1
  93. package/dist/platformUtility/dtos/set.sms.payload.dto.js.map +1 -1
  94. package/dist/platformUtility/es6.classes.d.ts +4 -2
  95. package/dist/platformUtility/es6.classes.js +4 -0
  96. package/dist/platformUtility/es6.classes.js.map +1 -1
  97. package/dist/platformUtility/jobs/process.tracking.webhook.job.js +1 -1
  98. package/dist/platformUtility/jobs/process.tracking.webhook.job.js.map +1 -1
  99. package/dist/platformUtility/libraries/common.sqs.polling.js +34 -1
  100. package/dist/platformUtility/libraries/common.sqs.polling.js.map +1 -1
  101. package/dist/platformUtility/libraries/create.entity.constants.file.js +34 -1
  102. package/dist/platformUtility/libraries/create.entity.constants.file.js.map +1 -1
  103. package/dist/platformUtility/libraries/create.es6.classes.file.js +34 -1
  104. package/dist/platformUtility/libraries/create.es6.classes.file.js.map +1 -1
  105. package/dist/platformUtility/libraries/create.es6.jobs.file.js +34 -1
  106. package/dist/platformUtility/libraries/create.es6.jobs.file.js.map +1 -1
  107. package/dist/platformUtility/libraries/create.es6.service.file.js +34 -1
  108. package/dist/platformUtility/libraries/create.es6.service.file.js.map +1 -1
  109. package/dist/platformUtility/libraries/create.index.file.js +34 -1
  110. package/dist/platformUtility/libraries/create.index.file.js.map +1 -1
  111. package/dist/platformUtility/libraries/file.system.utility.js +34 -1
  112. package/dist/platformUtility/libraries/file.system.utility.js.map +1 -1
  113. package/dist/platformUtility/libraries/process.common.mail.js +4 -1
  114. package/dist/platformUtility/libraries/process.common.mail.js.map +1 -1
  115. package/dist/platformUtility/libraries/process.kaleyra.sms.js +34 -1
  116. package/dist/platformUtility/libraries/process.kaleyra.sms.js.map +1 -1
  117. package/dist/platformUtility/libraries/process.ses.raw.mail.js +18 -12
  118. package/dist/platformUtility/libraries/process.ses.raw.mail.js.map +1 -1
  119. package/dist/platformUtility/libraries/process.smtp.mail.js +36 -3
  120. package/dist/platformUtility/libraries/process.smtp.mail.js.map +1 -1
  121. package/dist/platformUtility/platform.utility.module.js +4 -1
  122. package/dist/platformUtility/platform.utility.module.js.map +1 -1
  123. package/dist/platformUtility/services/index.d.ts +1 -0
  124. package/dist/platformUtility/services/index.js +1 -0
  125. package/dist/platformUtility/services/index.js.map +1 -1
  126. package/dist/platformUtility/services/local.property.service.js +4 -1
  127. package/dist/platformUtility/services/local.property.service.js.map +1 -1
  128. package/dist/platformUtility/services/mail.service.js +1 -1
  129. package/dist/platformUtility/services/mail.service.js.map +1 -1
  130. package/dist/platformUtility/services/maintenance.service.js +35 -2
  131. package/dist/platformUtility/services/maintenance.service.js.map +1 -1
  132. package/dist/platformUtility/services/r2.config.service.d.ts +11 -0
  133. package/dist/platformUtility/services/r2.config.service.js +51 -0
  134. package/dist/platformUtility/services/r2.config.service.js.map +1 -0
  135. package/dist/platformUtility/services/redis.service.js +4 -1
  136. package/dist/platformUtility/services/redis.service.js.map +1 -1
  137. package/dist/platformUtility/services/remote.request.service.js +4 -1
  138. package/dist/platformUtility/services/remote.request.service.js.map +1 -1
  139. package/dist/platformUtility/services/s3.service.js +34 -1
  140. package/dist/platformUtility/services/s3.service.js.map +1 -1
  141. package/dist/platformUtility/services/ses.mail.notification.service.js +1 -1
  142. package/dist/platformUtility/services/ses.mail.notification.service.js.map +1 -1
  143. package/dist/platformUtility/services/sql.service.d.ts +4 -0
  144. package/dist/platformUtility/services/sql.service.js +88 -27
  145. package/dist/platformUtility/services/sql.service.js.map +1 -1
  146. package/dist/security/security.module.js +4 -1
  147. package/dist/security/security.module.js.map +1 -1
  148. package/dist/system/constants/index.d.ts +1 -0
  149. package/dist/system/constants/index.js +18 -0
  150. package/dist/system/constants/index.js.map +1 -0
  151. package/dist/system/constants/storage.constants.d.ts +3 -0
  152. package/dist/system/constants/storage.constants.js +7 -0
  153. package/dist/system/constants/storage.constants.js.map +1 -0
  154. package/dist/system/controllers/upload.controller.d.ts +0 -1
  155. package/dist/system/controllers/upload.controller.js +6 -12
  156. package/dist/system/controllers/upload.controller.js.map +1 -1
  157. package/dist/system/dtos/engine.feature.support.dto.d.ts +8 -0
  158. package/dist/system/dtos/engine.feature.support.dto.js +3 -0
  159. package/dist/system/dtos/engine.feature.support.dto.js.map +1 -0
  160. package/dist/system/dtos/index.d.ts +3 -0
  161. package/dist/system/dtos/index.js +3 -0
  162. package/dist/system/dtos/index.js.map +1 -1
  163. package/dist/system/dtos/s3.upload.options.dto.d.ts +2 -7
  164. package/dist/system/dtos/s3.upload.options.dto.js +2 -43
  165. package/dist/system/dtos/s3.upload.options.dto.js.map +1 -1
  166. package/dist/system/dtos/storage.ref.dto.d.ts +37 -0
  167. package/dist/system/dtos/storage.ref.dto.js +3 -0
  168. package/dist/system/dtos/storage.ref.dto.js.map +1 -0
  169. package/dist/system/dtos/storage.upload.options.dto.d.ts +22 -0
  170. package/dist/system/dtos/storage.upload.options.dto.js +113 -0
  171. package/dist/system/dtos/storage.upload.options.dto.js.map +1 -0
  172. package/dist/system/es6.classes.d.ts +4 -2
  173. package/dist/system/es6.classes.js +4 -0
  174. package/dist/system/es6.classes.js.map +1 -1
  175. package/dist/system/index.d.ts +1 -0
  176. package/dist/system/index.js +1 -0
  177. package/dist/system/index.js.map +1 -1
  178. package/dist/system/interceptors/sentry.interceptor.js +34 -1
  179. package/dist/system/interceptors/sentry.interceptor.js.map +1 -1
  180. package/dist/system/jobs/sqs.polling.job.js +4 -1
  181. package/dist/system/jobs/sqs.polling.job.js.map +1 -1
  182. package/dist/system/jobs/sync.all.code.job.js +4 -1
  183. package/dist/system/jobs/sync.all.code.job.js.map +1 -1
  184. package/dist/system/libraries/business.rule.filter.validator.js +1 -1
  185. package/dist/system/libraries/business.rule.filter.validator.js.map +1 -1
  186. package/dist/system/libraries/business.rule.query.evaluator.js +1 -1
  187. package/dist/system/libraries/business.rule.query.evaluator.js.map +1 -1
  188. package/dist/system/libraries/column.manager.d.ts +1 -1
  189. package/dist/system/libraries/column.manager.js.map +1 -1
  190. package/dist/system/libraries/common.storage.service.d.ts +26 -2
  191. package/dist/system/libraries/common.storage.service.js +88 -1
  192. package/dist/system/libraries/common.storage.service.js.map +1 -1
  193. package/dist/system/libraries/execute.code.fix.js +1 -1
  194. package/dist/system/libraries/execute.code.fix.js.map +1 -1
  195. package/dist/system/libraries/file.type.detector.d.ts +7 -0
  196. package/dist/system/libraries/file.type.detector.js +113 -0
  197. package/dist/system/libraries/file.type.detector.js.map +1 -0
  198. package/dist/system/libraries/generate.downloadable.report.file.js +36 -3
  199. package/dist/system/libraries/generate.downloadable.report.file.js.map +1 -1
  200. package/dist/system/libraries/get.report.query.d.ts +1 -0
  201. package/dist/system/libraries/get.report.query.js +28 -6
  202. package/dist/system/libraries/get.report.query.js.map +1 -1
  203. package/dist/system/libraries/index.d.ts +1 -0
  204. package/dist/system/libraries/index.js +1 -0
  205. package/dist/system/libraries/index.js.map +1 -1
  206. package/dist/system/libraries/model.sync.js +4 -1
  207. package/dist/system/libraries/model.sync.js.map +1 -1
  208. package/dist/system/libraries/security.rule.evaluator.js +1 -1
  209. package/dist/system/libraries/security.rule.evaluator.js.map +1 -1
  210. package/dist/system/services/aws.s3.service.d.ts +16 -1
  211. package/dist/system/services/aws.s3.service.js +56 -2
  212. package/dist/system/services/aws.s3.service.js.map +1 -1
  213. package/dist/system/services/base.service.js +4 -1
  214. package/dist/system/services/base.service.js.map +1 -1
  215. package/dist/system/services/client.credential.service.js.map +1 -1
  216. package/dist/system/services/cloudflare.r2.service.d.ts +22 -8
  217. package/dist/system/services/cloudflare.r2.service.js +76 -38
  218. package/dist/system/services/cloudflare.r2.service.js.map +1 -1
  219. package/dist/system/services/document.service.js +38 -2
  220. package/dist/system/services/document.service.js.map +1 -1
  221. package/dist/system/services/event.detail.service.js +4 -1
  222. package/dist/system/services/event.detail.service.js.map +1 -1
  223. package/dist/system/services/index.d.ts +1 -0
  224. package/dist/system/services/index.js +1 -0
  225. package/dist/system/services/index.js.map +1 -1
  226. package/dist/system/services/internal.server.connect.service.d.ts +1 -1
  227. package/dist/system/services/list.service.d.ts +2 -2
  228. package/dist/system/services/storage.service.d.ts +65 -0
  229. package/dist/system/services/storage.service.js +342 -0
  230. package/dist/system/services/storage.service.js.map +1 -0
  231. package/dist/system/services/upload.service.d.ts +6 -22
  232. package/dist/system/services/upload.service.js +71 -243
  233. package/dist/system/services/upload.service.js.map +1 -1
  234. package/dist/system/services/user.preference.service.js.map +1 -1
  235. package/dist/system/subscribers/code.fix.script.subscriber.d.ts +1 -0
  236. package/dist/system/subscribers/code.fix.script.subscriber.js +10 -1
  237. package/dist/system/subscribers/code.fix.script.subscriber.js.map +1 -1
  238. package/dist/system/subscribers/material.view.subscriber.d.ts +1 -0
  239. package/dist/system/subscribers/material.view.subscriber.js +9 -0
  240. package/dist/system/subscribers/material.view.subscriber.js.map +1 -1
  241. package/dist/system/subscribers/recurring.query.subscriber.d.ts +1 -0
  242. package/dist/system/subscribers/recurring.query.subscriber.js +9 -0
  243. package/dist/system/subscribers/recurring.query.subscriber.js.map +1 -1
  244. package/dist/system/subscribers/scheduled.event.subscriber.d.ts +1 -0
  245. package/dist/system/subscribers/scheduled.event.subscriber.js +9 -0
  246. package/dist/system/subscribers/scheduled.event.subscriber.js.map +1 -1
  247. package/dist/system/system.module.js +18 -3
  248. package/dist/system/system.module.js.map +1 -1
  249. package/package.json +9 -13
@@ -0,0 +1,568 @@
1
+ # CODEBASE_REFERENCE.md
2
+
3
+ **Single-source reference for `@servicelabsco/nestjs-utility-services`. Read this before scanning the repo.**
4
+
5
+ This file catalogs every service, controller, entity, DTO, job, subscriber, library, middleware, exception, config, and env var with its path. If you need to know what's in this codebase, read this. If a section is wrong or stale because of changes you just made, update it here as part of the change.
6
+
7
+ For higher-level architecture and conventions, see `CLAUDE.md`.
8
+
9
+ ---
10
+
11
+ ## Repo orientation
12
+
13
+ - **Type**: Publishable npm library (`main: dist/index.js`); also runnable as standalone NestJS app (`main.ts`) and worker (`worker.ts`).
14
+ - **Public API barrel** (`dist/index.js`): re-exports `auth`, `common`, `platformUtility`, `security`, `system`, `worker.service`.
15
+ - **DI registration**: every module folder has `es6.classes.ts` aggregating its classes — register here or DI ignores them. The `slnu syncClassess` step in `commit.sh` regenerates these.
16
+ - **Three TypeORM connections**: `default` (postgres write), `read` (postgres read replica), `mongodb`. Entity globs include `node_modules/@servicelabsco/**` so sibling packages contribute entities and migrations.
17
+ - **Filename suffix rules**: `*.entity.ts` (postgres), `*.mentity.ts` (mongo), `*.subscriber.ts` (postgres), `*.mongo.subscriber.ts` (mongo), `*.spec.ts` (jest), `*.dto.ts` (DTO), `*.job.ts` (BullMQ job).
18
+
19
+ ---
20
+
21
+ ## Top-level `src/` files
22
+
23
+ - `src/main.ts` — HTTP entrypoint. Bootstraps `AppModule`, sets up `express.json()`, `httpContext.middleware`, `helmet`, CORS (`cors.config`), `rateLimit` (`rate.limiter.config`), `compression`, `trust proxy=1`. Optional graceful shutdown via `SERVER_COOL_DOWN_PERIOD`. Optional Sentry init via `SENTRY_DSN` + global `SentryInterceptor`. Global `ValidationPipe({ whitelist: true, transform: true })`. Listens on `SERVER_PORT` or 4000.
24
+ - `src/worker.ts` — Worker entrypoint. Same `AppModule`, no `listen()`, just `init()` + `enableShutdownHooks()`. Requires `BULL_QUEUE_WORKER=true` for `JobConsumer` to register.
25
+ - `src/worker.service.ts` — `WorkerService` (OnModuleInit). Calls `MaintenanceService.disableQueueIfRequired()` before processing starts.
26
+ - `src/app.module.ts` — Root module. Imports `TypeOrmModule.forRoot` x3 (write+read+mongo), `BullModule.forRoot(queueConfig)`, `ConfigModule.forRoot({ isGlobal: true })`, `TerminusModule`, and the five module folders. Registers controllers `AppController`, `AdminAuthController`, `MenuController`, `HealthCheckController`. Middleware chain: `Maintenance → JWT → BasicAuth` for all routes; `Restricted` for `api/*`; `Internal` for `internal/*`.
27
+ - `src/app.controller.ts` — `AppController`. Routes: `GET /` (hello), `GET api/auth` (current user), `GET api/test` (current user), `GET un-set` (placeholder), `GET queue` (queue data), `GET queue/:id` (job details), `POST sets` (zip-service test). Constructor injects most platform services for ad-hoc testing.
28
+ - `src/app.service.ts` — `AppService` placeholder.
29
+ - `src/health.check.controller.ts` — `HealthCheckController` at `/health`. Routes: `GET /health` (full check: pg-master + pg-read + redis + filesystem), `GET /health/detailed` (full + nodeVersion/platform/uptime), `GET /health/quick` (master + redis + fs only), `GET /health/runtime-check` (validates `cron-parser v5` next-fire + `CacheService` set/get/delete round-trip). Uses `tmpDir = process.env.TMP_DIR || '/tmp'`. The runtime-check is what `yarn runtime-check` curls.
30
+
31
+ ---
32
+
33
+ ## `src/config/`
34
+
35
+ | File | Purpose | Env vars |
36
+ |---|---|---|
37
+ | `cors.config.ts` | CORS for `app.enableCors()`: methods POST/GET/PUT/PATCH/DELETE/HEAD, `credentials: true`, `maxAge: 3600`, `origin: true` | — |
38
+ | `entity.constants.ts` | Maps `<EntityName> → EntityClass` for all entities across auth/security/system/platformUtility (used by `PlatformUtility.setEntities`) | — |
39
+ | `jwt.config.ts` | `JwtModule.register(jwtConfig)`: `secret`, `signOptions.expiresIn` | `JWT_SECRET`, `JWT_EXPIRY` |
40
+ | `mongo.config.ts` | TypeORM mongo connection (`name: 'mongodb'`); entities `*.mentity.{ts,js}`, subscribers `*.mongo.subscriber.{ts,js}`; `synchronize: false`, logging on | `MONGO_URL`, `MONGO_DATABASE` |
41
+ | `orm.config.ts` | DataSource for typeorm-cli (used by `yarn m:*` commands). Same shape as `typeorm.config.ts` | `PG_DB_HOST`, `PG_DB_PORT`, `PG_DB_USERNAME`, `PG_DB_PASSWORD`, `PG_DB_DATABASE`, `PG_DB_LOGGING` |
42
+ | `platform.constants.ts` | Default-export `{ queue, entities, jobs, services, mails, whoColumns }`. **`whoColumns = ['id','created_at','updated_at','deleted_at','created_by','updated_by']`** — used by class mapper to strip audit cols | `BULL_QUEUE_NAME` |
43
+ | `queue.config.ts` | `BullModule.forRoot()` connection URL | `REDIS_HOST`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD` |
44
+ | `rate.limiter.config.ts` | `express-rate-limit` window+max | `THROTTLE_WINDOW` (default 60000), `THROTTLE_RATE` (default 10000) |
45
+ | `read.typeorm.config.ts` | TypeORM read replica (`name: 'read'`); pg type parsers for bigint/decimal | `PG_DB_READ_HOST`, `PG_DB_PORT`, `PG_DB_USERNAME`, `PG_DB_PASSWORD`, `PG_DB_DATABASE`, `PG_DB_LOGGING` |
46
+ | `redis.config.ts` | Redis URL for `RedisModule.forRoot` (used by `PlatformUtilityModule`) | `REDIS_HOST`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD` |
47
+ | `role.mapping.ts` | `{ super_admin: 1, public: 2, internal: 3 }`. **User id `2` is logged in by `InternalMiddleware`.** | — |
48
+ | `sentry.config.ts` | `Sentry.init` config: `dsn`, `includeLocalVariables: true`, `attachStacktrace: true` | `SENTRY_DSN` |
49
+ | `source.hash.ts` | Map of `<sourceName> → md5 hash` (e.g. `scheduledEvent: 'c2b08dc02f...'`). Used by source-type lookups | — |
50
+ | `typeorm.config.ts` | TypeORM postgres write (`name: 'default'`); SnakeNamingStrategy; `migrationsTableName: 'sys_migrations'`; entity glob includes `node_modules/@servicelabsco/**`; pg type parsers cast bigint→int and decimal→float | `PG_DB_HOST`, `PG_DB_PORT`, `PG_DB_USERNAME`, `PG_DB_PASSWORD`, `PG_DB_DATABASE`, `PG_DB_LOGGING` |
51
+
52
+ ### All env vars referenced in `src/`
53
+
54
+ ```
55
+ APP_KEY AUDIT_DISABLED BULL_LOG_DISABLE BULL_MAX_METRIC_POINTS_WEEKS
56
+ BULL_QUEUE_COMPLETE_LIMIT BULL_QUEUE_FAILURE_LIMIT BULL_QUEUE_NAME
57
+ BULL_QUEUE_WORKER ENABLE_SQL_LOG JWT_EXPIRY JWT_SECRET
58
+ MONGO_DATABASE MONGO_URL NOTIFICATION_DISABLED PG_DB_DATABASE
59
+ PG_DB_HOST PG_DB_LOGGING PG_DB_PASSWORD PG_DB_PORT PG_DB_READ_HOST
60
+ PG_DB_USERNAME REDIS_HOST REDIS_PASSWORD REDIS_PORT REDIS_PREFIX
61
+ REDIS_SLUG REDIS_USERNAME SENTRY_DSN SERVER_COOL_DOWN_PERIOD
62
+ SERVER_ENV SERVER_PORT SHOW_CONSOLE_LOGS STORAGE_ENGINE
63
+ THROTTLE_RATE THROTTLE_WINDOW TMP_DIR
64
+ ```
65
+
66
+ `SERVER_COOL_DOWN_PERIOD` (truthy) toggles `enableShutdownHooks`. `BULL_QUEUE_WORKER=true` registers consumers. `SHOW_CONSOLE_LOGS` (comma-separated levels: `log,info,warn,error,debug`) gates `CustomLogger`. `STORAGE_ENGINE` selects `s3` vs `r2` in `UploadService`.
67
+
68
+ ---
69
+
70
+ ## `src/auth/`
71
+
72
+ ### Services (`src/auth/services/`)
73
+
74
+ | File | Class | Key methods |
75
+ |---|---|---|
76
+ | `auth.service.ts` | `AuthService` | `getUserLoginInfo`, `getUserInfo`, `getUserObject`, `generateAuthJwtToken`, `signJwtToken`, `verifyJwtToken` |
77
+ | `user.service.ts` | `UserService` | `findUserByEmail`, `createUser`, `validateUser`, `findOrCreate`, `setRolesCache` |
78
+ | `access.service.ts` | `AccessService` | `getUser`, `validateRoleId`, `validateRoleIdentifier`, `hasRoleId`, `hasRoleIds`, `hasRoleIdentifiers`, `hasRoleAssignments`, `hasPermissionAssignments` |
79
+ | `refresh.token.service.ts` | `RefreshTokenService` | `setRefreshToken`, `generateRefreshToken` |
80
+ | `device.token.service.ts` | `DeviceTokenService` | `setDeviceToken`, `attachUserDevice`, `getDeviceIdentifier` |
81
+ | `social.service.ts` | `SocialService` | `fbLogin`, `googleLogin` |
82
+ | `es6.service.ts` | `Es6Service` | `alignServices`, `setServices` (registry locator by hash) |
83
+ | `es6.jobs.service.ts` | `Es6JobsService` | `alignJobs`, `setJobs` (registry locator by hash) |
84
+
85
+ ### Controllers (`src/auth/controllers/`)
86
+
87
+ | File | Class | Routes |
88
+ |---|---|---|
89
+ | `admin.auth.controller.ts` | `AdminAuthController` | `GET /user-auth`, `POST /user-auth/login`, `POST /user-auth/verify-token`, `POST /user-auth/refresh-token`, `POST /user-auth/attach-device`, `POST /user-auth/set-device-token` |
90
+ | `user.controller.ts` | `UserController` | `POST /user` |
91
+ | `social.controller.ts` | `SocialController` | `POST /social/fb`, `POST /social/google` |
92
+
93
+ ### Middlewares (`src/auth/middlewares/`)
94
+
95
+ | File | Class | What it does |
96
+ |---|---|---|
97
+ | `jwt.middleware.ts` | `JwtMiddleware` | Parses `Authorization: Bearer <token>`, decodes, sets `Auth.login()`. Skips if already logged in or no token |
98
+ | `basic.auth.middleware.ts` | `BasicAuthMiddleware` | HTTP Basic; validates against `SERVER_PASSWORD` |
99
+ | `restricted.middleware.ts` | `RestrictedMiddleware` | Throws `NoLoggedUserException` if `Auth.check()` is false. Mounted on `api/*` |
100
+ | `internal.middleware.ts` | `InternalMiddleware` | Reads `x-internal-token` header, compares to `internal.server.key` property, calls `Auth.login(getUserObject(2))` (id 2 = `public` role from `role.mapping.ts`). Mounted on `internal/*` |
101
+ | `client.connect.middleware.ts` | `ClientConnectMiddleware` | Validates `X-Client-ID`/`X-Client-Secret` via `ClientCredentialService.validate` |
102
+
103
+ ### Entities (`src/auth/entities/`)
104
+
105
+ | File | Entity | Table |
106
+ |---|---|---|
107
+ | `user.entity.ts` | `UserEntity` | `sys_users` (name, email, password, mobile, dialing_code, attempts, image_url, mobile_verified_at, roles, permissions) |
108
+ | `creator.entity.ts` | `CreatorEntity` | `sys_users` (audit lookup mirror) |
109
+ | `refresh.token.entity.ts` | `RefreshTokenEntity` | `sys_refresh_tokens` |
110
+ | `device.token.entity.ts` | `DeviceTokenEntity` | `sys_device_tokens` |
111
+ | `country.entity.ts` | `CountryEntity` | `sys_countries` |
112
+ | `session.identifier.entity.ts` | `SessionIdentifierEntity` | `sys_session_identifiers` |
113
+ | `user.referral.entity.ts` | `UserReferralEntity` | `sys_user_referrals` |
114
+
115
+ ### DTOs (`src/auth/dtos/`)
116
+
117
+ `create.user.dto.ts`, `offline.user.dto.ts`, `update.user.dto.ts`, `user.access.dto.ts` (current user shape with roles/permissions/access_token/refresh_token), `user.login.dto.ts`, `user.roles.access.object.dto.ts`, `permission.assignment.dto.ts`, `role.assignment.dto.ts`, `session.identifier.attributes.dto.ts`.
118
+
119
+ ### Jobs / Subscribers
120
+
121
+ - `src/auth/jobs/session.identifier.job.ts` — `SessionIdentifierJob` extends `CommonJob`. Handles SessionIdentifier insert/update.
122
+ - `src/auth/subscribers/session.identifier.subscriber.ts` — `SessionIdentifierSubscriber` listens to `SessionIdentifierEntity` events, dispatches to `SessionIdentifierJob`.
123
+
124
+ ### Module file
125
+
126
+ - `src/auth/auth.module.ts` — Imports `TypeOrmModule.forFeature(es6Classes.entities)`, `JwtModule.register(jwtConfig)`, `forwardRef(() => PlatformUtilityModule)`. Provides+exports services and jobs (no controllers — those are mounted via `app.module.ts`).
127
+ - `src/auth/es6.classes.ts` — Aggregates all auth classes for DI registration.
128
+
129
+ ---
130
+
131
+ ## `src/common/`
132
+
133
+ The module is empty (`@Module({})`); its exports are pure helpers and base classes consumed throughout the codebase and by sibling packages.
134
+
135
+ ### Libraries (`src/common/libraries/`)
136
+
137
+ | File | Class | Purpose / key methods |
138
+ |---|---|---|
139
+ | `auth.ts` | `Auth` | Static-only request user accessor over `express-http-context2`. `Auth.user()` → `UserAccessDto`, `Auth.check()`, `Auth.id()`, `Auth.login(user)` |
140
+ | `common.entity.ts` | `CommonEntity` | Postgres base. Adds id/uuid/created_at/updated_at/deleted_at/created_by/updated_by + `firstOrNew`, `firstOrCreate`, `first`, `softDelete`, `destroy` (static). All postgres entities extend this |
141
+ | `common.mongo.entity.ts` | `CommonMongoEntity` | Mongo equivalent of `CommonEntity` with same static API |
142
+ | `common.service.ts` | `CommonService` | Base for services; `protected publicExposed = false` |
143
+ | `common.subscriber.ts` | `CommonSubscriber<T>` | Generic base subscriber with `afterInsert`/`afterUpdate`/`afterRemove` that dispatch to an `entityJob` (BullMQ). All subscribers extend this |
144
+ | `common.job.ts` | `CommonJob` | Base BullMQ job: `dispatch(data?)`, `delayedDispatch(data, ms)`, `handle(data)` |
145
+ | `common.consumer.ts` | `CommonConsumer` | Base BullMQ consumer (used by `JobConsumer`) |
146
+ | `common.mapper.job.ts` | `CommonMapperJob` | Mapping job pattern: `handle`, `addMapping`, `removeMapping` |
147
+ | `base.job.interface.ts` | (interface) | Two-method contract for jobs |
148
+ | `base.migration.utility.ts` | `BaseMigrationUtility` | Migration DSL: `primary()`, `uuid()`, `boolean()`, `string()`, `bigString()`, `text()`, `float()`, `column()`, `number()`, `bigNumber()`, `renameColumn()`, `foreign()`, `dropForeign()`. Subclassed by `MigrationUtility` |
149
+ | `migration.utility.ts` | `MigrationUtility` | Wraps `BaseMigrationUtility` to flip up/down on `reverseMigration` flag |
150
+ | `reverse.migration.utility.ts` | `ReverseMigrationUtility` | Migration that runs in reverse direction by default |
151
+ | `seeder.utility.ts` | `SeederUtility` | Seeder migration with `addRecord()` |
152
+ | `class.mapper.ts` | `ClassMapper` | Static plain-object/dto helpers: `extract`, `extractNumber`, `removeWhoColumns`, `removeArrayWhoColumns`, `getUniqueEntities`, `castToDto` |
153
+ | `custom.crypt.ts` | `CustomCrypt` | AES via `crypto`. `encrypt(data)`, `decrypt(cipherText)` |
154
+ | `custom.logger.ts` | `CustomLogger` | Console wrapper gated by `SHOW_CONSOLE_LOGS`. Static `log/info/warn/error/debug` |
155
+ | `data.manager.ts` | `DataManager` | Generic single-record fetch/build pipeline: `handle`, `setBaseModelObjects`, `setBase`, `setReadDictionary`, `setQueryRestrictions`, `setupColumnJoins`, `setRequestCache`, `loadFromCache`, `checkForCache` |
156
+ | `database.event.evaluator.ts` | `DatabaseEventEvaluator<Entity>` | extends `EntityEvaluator`. Evaluates DB event payloads against rules |
157
+ | `entity.evaluator.ts` | `EntityEvaluator` | Base entity evaluator; column null/undefined checks |
158
+ | `date.util.ts` | `DateUtil` | `getDateTime`, `getDateTimeInFormat`, `getDateInFormat`, `getMonthInFormat`, `getFutureDateTime(min)`, `getPastDateTime(min)`, `getMonday`, `getDateFromDateString`, `getDateFromDatetimeString`, `now`, `getTimezoneDate`, `getUtcDate`, `addMonths`, `subMonths`, `subDays` |
159
+ | `generic.index.parser.ts` | `GenericIndexParser` | Parses raw query → `GenericIndexParamDto` (filters/sort/pagination) |
160
+ | `generic.show.parser.ts` | `GenericShowParser` | Parses raw query for show endpoints |
161
+ | `hash.ts` | `Hash` | `hash(str)` (bcrypt), `compare(str, hash)`, `hashMD5`, `generateSalt`, `easyHash` (xxhash-wasm async) |
162
+ | `json.evaluator.ts` | `JsonEvaluator` | Evaluates `JsonConditionSettingsDto` against reference data |
163
+ | `list.manager.ts` | `ListManager` | List endpoint pipeline: `process`, `handleRequest`, `listData`, `aggregationData`, `processIncludes`, `getAggregationData`, `loadListData` |
164
+ | `record.manager.ts` | `RecordManager` | Single-record build pipeline: `process(id)`, `segregateIncludes` |
165
+ | `report.body.parser.ts` | `ReportBodyParser` | Parses raw report body → `ReportBodyDto` |
166
+ | `report.data.manager.ts` | `ReportDataManager` | Report-specific equivalent of `DataManager` |
167
+ | `report.list.manager.ts` | `ReportListManager` | Report-specific equivalent of `ListManager` |
168
+ | `platform.utility.ts` | `PlatformUtility` | `getConstantInstance`, `ucwords`, `generateRandomNumber/Alpha/AlphaNumeric/Base32/Chars`, `getEntity(hash)`, `setEntity`, `setEntities`, `initObject(data)`, `getService(hash)`, `setService`, `setServices`, `getJob(hash)`, `getIpFromRequest`, `isValidUrl` |
169
+
170
+ ### Exceptions (`src/common/exceptions/`)
171
+
172
+ All extend `HttpException`. Throw these instead of raw `Error`/`HttpException`.
173
+
174
+ | Class | HTTP status | Default message / shape |
175
+ |---|---|---|
176
+ | `OperationException` | 401 | `string \| any`; falls back to `'Invalid Operation'`. Generic operation failure |
177
+ | `AccessException` | 403 | `'You donot have access for this operation'` |
178
+ | `FormException` | 403 | `{ column, err }` → wraps as `{ columns: { [column]: err } }` |
179
+ | `MaintenanceException` | 410 | `'System is down for maintenance'` |
180
+ | `NoLoggedUserException` | 401 | `'No logged user record'` |
181
+ | `SubscriptionException` | 409 | `'No active Subscription!'` |
182
+
183
+ ### DTOs (`src/common/dtos/`)
184
+
185
+ `aggregation.param.dto.ts`, `capture.record.index.dto.ts`, `capture.record.show.dto.ts`, `database.event.dto.ts`, `foreign.migration.dto.ts`, `generic.index.param.dto.ts`, `generic.show.param.dto.ts`, `group.param.dto.ts`, `index.column.dto.ts`, `index.params.dto.ts`, `json.condition.settings.dto.ts`, `json.field.condition.dto.ts`, `json.field.rule.dto.ts`, `key.value.param.dto.ts`, `layout.column.db.dto.ts`, `meta.data.dto.ts`, `record.data.manager.dto.ts`, `record.tab.dto.ts`, `rename.column.dto.ts`, `report.body.dto.ts`, `report.data.manager.dto.ts`.
186
+
187
+ ### Adapters
188
+
189
+ - `src/common/adapters/redis.io.adapter.ts` — `RedisIoAdapter` extends `IoAdapter`. Wires socket.io to `@socket.io/redis-adapter` for multi-instance pub/sub.
190
+
191
+ ### Module file
192
+
193
+ - `src/common/common.module.ts` — `@Module({})` (empty; exports are direct imports).
194
+ - `src/common/es6.classes.ts` — Aggregator (adapters/dtos/exceptions/libraries) but unused by `CommonModule` itself; provided for downstream consumption.
195
+
196
+ ---
197
+
198
+ ## `src/security/`
199
+
200
+ Tiny module that registers role/permission entities for TypeORM `forFeature`. No services, controllers, or jobs.
201
+
202
+ ### Entities (`src/security/entities/`)
203
+
204
+ | File | Entity | Table |
205
+ |---|---|---|
206
+ | `role.entity.ts` | `RoleEntity` | `sys_roles` |
207
+ | `permission.entity.ts` | `PermissionEntity` | `sys_permissions` |
208
+ | `user.role.entity.ts` | `UserRoleEntity` | `sys_user_roles` |
209
+ | `user.permission.entity.ts` | `UserPermissionEntity` | `sys_user_permissions` |
210
+
211
+ ### Module file
212
+
213
+ - `src/security/security.module.ts` — `imports: [TypeOrmModule.forFeature(es6Classes.entities)]`. Nothing else.
214
+ - `src/security/es6.classes.ts` — Aggregates the four entities.
215
+
216
+ ---
217
+
218
+ ## `src/platformUtility/`
219
+
220
+ Infrastructure-adjacent module: queue, AWS, Redis, mail, sms, FCM, HTTP, file storage, audit, maintenance.
221
+
222
+ Module-specific behavior: `platform.utility.module.ts` reads `BULL_QUEUE_WORKER`; if not `'true'`, sets `es6Classes.consumers = []` so the worker `JobConsumer` does NOT register on API instances. Imports `RedisModule.forRoot({ type: 'single', ...redisConfig })`, `BullModule.registerQueue({ name: BULL_QUEUE_NAME })`, `forwardRef(() => AuthModule)`, `forwardRef(() => SystemModule)`.
223
+
224
+ ### Services (`src/platformUtility/services/`)
225
+
226
+ | File | Class | Key methods |
227
+ |---|---|---|
228
+ | `queue.service.ts` | `QueueService` | `addJob`, `getCompletedJobs`, `getFailedJobs`, `getStats`, `getWorkers`, `pauseQueue`, `resumeQueue`, `getJobDetails`, `data` (queue instance) |
229
+ | `mail.service.ts` | `MailService` | `send` (single-gateway), `processMail`, `getBody` (handlebars), `setRecipients`. Multi-gateway via SMTP/SES libraries below |
230
+ | `sms.service.ts` | `SmsService` | `sendWithoutMessage`, `setAndSendMessage`, `sendMessage`, `handleTestEnvironment`. Uses Kaleyra |
231
+ | `cache.service.ts` | `CacheService` | `set`, `get`, `delete`, `remember(key, ttl, fn)`, `forget`. Redis-backed |
232
+ | `redis.service.ts` | `RedisService` | `lpush`, `lrange`, `del`, `get`, `set`, `hset`, `hget`, `sadd`, `smembers`, `exists`, `expire` |
233
+ | `s3.service.ts` | `S3Service` | `uploadFile`, `uploadContent`, `getFile`, `deleteFile`, `getSignedUrl` |
234
+ | `sqs.service.ts` | `SqsService` | `sendMessage`, `sendMessageBatch`, `receiveMessage`, `deleteMessage` |
235
+ | `dynamo.service.ts` | `DynamoService` | `createTable`, `describeTable`, `getItem`, `setItem`, `queryItems`, `listTables` |
236
+ | `audit.service.ts` | `AuditService` | `setAuditRecord`, `getAuditHistory`, `getAuditTable` (DynamoDB-backed, gated by `AUDIT_DISABLED`) |
237
+ | `fcm.notification.service.ts` | `FcmNotificationService` | `sendNotification`, `sendNotificationToDevices`, `deactivateInactiveDevices`. Gated by `NOTIFICATION_DISABLED` |
238
+ | `sql.service.ts` | `SqlService` | `sql(...)` (write connection), `read(...)` (read replica). Gated logging by `ENABLE_SQL_LOG` |
239
+ | `remote.request.service.ts` | `RemoteRequestService` | `sendThroughAxios`, `getRawResponse`, `getProxyResponse`, `saveLog` |
240
+ | `maintenance.service.ts` | `MaintenanceService` | `isInMaintenance`, `putOnMaintenance`, `removeFromMaintenance`, `setRuntimeLock`, `disableQueueIfRequired` |
241
+ | `zip.service.ts` | `ZipService` | `zip(files)`, `unzip`, `getZipToken`, `getUnzipToken`. Lambda-backed |
242
+ | `startup.service.ts` | `StartupService` | `onModuleInit`, `checkForWorkerQueue` |
243
+ | `shutdown.service.ts` | `ShutdownService` | `onModuleDestroy`, `closeAllRunningQueues` |
244
+ | `local.property.service.ts` | `LocalPropertyService` | In-memory store: `set`, `get`, `setEntities`, `setServices`, `setJobs` |
245
+ | `aws.config.service.ts` | `AwsConfigService` | `getConfig`, `validateConfig` |
246
+ | `aws.secret.service.ts` | `AwsSecretService` | `getSecret`, `getSecretValue`, `cacheSecret` |
247
+ | `ses.mail.notification.service.ts` | `SesMailNotificationService` | `getNotificationPayload`, `processSesDeliveryData`, `processSesBouncedData`, `processSesBounceData` |
248
+
249
+ ### Controllers (`src/platformUtility/controllers/`)
250
+
251
+ | File | Class | Routes |
252
+ |---|---|---|
253
+ | `bull.job.controller.ts` | `BullJobController` | `GET /api/admin/bull-job/completed`, `GET /api/admin/bull-job/failed`, `GET /api/admin/bull-job/waiting`, `GET /api/admin/bull-job/delayed`, `DELETE /api/admin/bull-job/:id` |
254
+ | `queue.controller.ts` | `QueueController` | `GET /api/admin/queue` (stats), `GET /api/admin/queue/workers` |
255
+
256
+ ### Consumer
257
+
258
+ - `src/platformUtility/consumers/job.consumer.ts` — `JobConsumer` (BullMQ). Generic processor for all job types; failure tracking, draining logic, metrics. **Only registered when `BULL_QUEUE_WORKER=true`**.
259
+
260
+ ### Middlewares
261
+
262
+ - `src/platformUtility/middlewares/maintenance.middleware.ts` — `MaintenanceMiddleware`. Throws `MaintenanceException` if system in maintenance mode (checked via `MaintenanceService`).
263
+ - `src/platformUtility/middlewares/trim.pipe.ts` — `TrimPipe` validation pipe. Trims whitespace from request body strings (excludes `password` field).
264
+
265
+ ### Entities
266
+
267
+ | File | Entity | Table |
268
+ |---|---|---|
269
+ | `failed.bull.job.entity.ts` | `FailedBullJobEntity` | `sys_failed_bull_jobs` |
270
+ | `pending.bull.job.entity.ts` | `PendingBullJobEntity` | `sys_pending_bull_jobs` |
271
+ | `remote.request.log.entity.ts` | `RemoteRequestLogEntity` | `utl_remote_request_logs` |
272
+
273
+ ### Jobs
274
+
275
+ | File | Class | Purpose |
276
+ |---|---|---|
277
+ | `test.job.ts` | `TestJob` | Dummy queue test |
278
+ | `remote.request.log.job.ts` | `RemoteRequestLogJob` | Persist remote request log on insert/update |
279
+ | `reload.pending.bull.job.ts` | `ReloadPendingBullJob` | Reprocess pending jobs in batches of 500 |
280
+ | `load.failed.bull.job.ts` | `LoadFailedBullJob` | Requeue failed jobs from DB |
281
+ | `process.ses.delivery.webhook.job.ts` | `ProcessSesDeliveryWebhookJob` | Handle SES Delivery/Bounce/Complaint notifications |
282
+ | `process.tracking.webhook.job.ts` | `ProcessTrackingWebhookJob` | Email open/click tracking events |
283
+ | `record.watcher.job.ts` | `RecordWatcherJob` | **Hub for all DB change events** — triggers audit logging + observers |
284
+
285
+ ### Subscribers
286
+
287
+ - `src/platformUtility/subscribers/base.subscriber.ts` — `BaseSubscriber`. Listens to all entities; injects `created_at`/`updated_at`/`created_by`/`updated_by`; dispatches `RecordWatcherJob` for audit + observers.
288
+ - `src/platformUtility/subscribers/remote.request.log.subscriber.ts` — Listens to `RemoteRequestLogEntity` insert; dispatches `RemoteRequestLogJob`.
289
+
290
+ ### Libraries (`src/platformUtility/libraries/`)
291
+
292
+ | File | Class | Purpose |
293
+ |---|---|---|
294
+ | `file.system.utility.ts` | `FileSystemUtility` | FS scanning: `getModules`, `getAllDirectories`, `getAllFiles`, `getClassName`, `isPackage` |
295
+ | `process.common.mail.ts` | `ProcessCommonMail` | Shared mail send pipeline |
296
+ | `process.common.ses.mail.ts` | `ProcessCommonSesMail` | SES mail processing |
297
+ | `process.common.smtp.mail.ts` | `ProcessCommonSmtpMail` | SMTP mail processing |
298
+ | `process.ses.mail.ts` | `ProcessSesMail` | SES `SendEmailCommand` send |
299
+ | `process.ses.raw.mail.ts` | `ProcessSesRawMail` | SES `SendRawEmailCommand` (with attachments) |
300
+ | `process.smtp.mail.ts` | `ProcessSmtpMail` | Nodemailer SMTP send |
301
+ | `process.kaleyra.sms.ts` | `ProcessKaleyraSms` | Kaleyra SMS API send |
302
+ | `process.kaleyra.callback.response.ts` | `ProcessKaleyraCallbackResponse` | Kaleyra webhook parser |
303
+ | `set.sms.message.ts` | `SetSmsMessage` | SMS entity creation/validation |
304
+ | `process.audit.log.data.ts` | `ProcessAuditLogData` | DynamoDB audit record formatter |
305
+ | `common.sqs.polling.ts` | `CommonSqsPolling` | SQS polling base loop with maintenance checks |
306
+ | `create.es6.classes.file.ts` | `CreateEs6ClassesFile` | Generates module `es6.classes.ts` files |
307
+ | `create.es6.service.file.ts` | `CreateEs6ServiceFile` | Generates service registry file |
308
+ | `create.es6.jobs.file.ts` | `CreateEs6JobsFile` | Generates job registry file |
309
+ | `create.entity.constants.file.ts` | `CreateEntityConstantsFile` | Generates entity constants mappings |
310
+ | `create.index.file.ts` | `CreateIndexFile` | Generates barrel `index.ts` files |
311
+
312
+ ### DTOs (`src/platformUtility/dtos/`)
313
+
314
+ `aws.config.dto.ts`, `common.attributes.dto.ts`, `failed.bull.job.attributes.dto.ts`, `pending.bull.job.attributes.dto.ts`, `fcm.response.dto.ts`, `job.payload.dto.ts`, `kaleyra.callback.payload.dto.ts`, `lambda.zip.dto.ts`, `mail.options.dto.ts` (to/cc/bcc/subject/html/text/attachments/gateway/track_pairs), `push.notification.response.dto.ts`, `push.notification.template.dto.ts`, `queue.options.dto.ts` (delay/priority/attempts/backoff/removeOnComplete), `remote.raw.response.dto.ts`, `remote.request.config.dto.ts`, `remote.request.log.attributes.dto.ts`, `set.sms.payload.dto.ts`, `sms.payload.dto.ts`, `smtp.config.dto.ts`, `source.column.dto.ts`, `string.search.dto.ts`.
315
+
316
+ ---
317
+
318
+ ## `src/system/`
319
+
320
+ The largest module: ~70 entities for menus, roles, models, columns, relationships, properties, lookups, forms, reports, charts, scripts, scheduled events, mail/sms/whatsapp templates, document storage. Imports `forwardRef(() => AuthModule)`, `forwardRef(() => PlatformUtilityModule)`, `TypeOrmModule.forFeature(es6Classes.entities)`. Provides+exports services and jobs; controllers from this module are mounted via the controllers array.
321
+
322
+ ### Services (`src/system/services/`)
323
+
324
+ | File | Class | Key methods |
325
+ |---|---|---|
326
+ | `aws.s3.service.ts` | `AwsS3Service` | `getBucket`, `getS3BucketKeyFromUrl`, `upload`. **Different from `platformUtility/s3.service.ts`** — this is the upload-engine impl chosen by `UploadService` |
327
+ | `cloudflare.r2.service.ts` | `CloudflareR2Service` | Same shape as AwsS3Service for R2 |
328
+ | `base.service.ts` | `BaseService` | `checkOrSetRecord(hash)`, `getServiceInstance(identifier)`, `getEntityInstance(identifier)` |
329
+ | `business.rule.service.ts` | `BusinessRuleService` | `getQueryRestrictions(modelId, action)`, `validateRoleCheck(role)`. Restricts list queries based on rules |
330
+ | `client.credential.service.ts` | `ClientCredentialService` | `validate(payload)` (client_id/secret + IP allowlist), `setCredentialCache(key)` |
331
+ | `client.script.service.ts` | `ClientScriptService` | `getClientScripts(identifier)` |
332
+ | `column.service.ts` | `ColumnService` | `getModelColumns(id)` |
333
+ | `comment.service.ts` | `CommentService` | `getComments(query)`, `setComment(body)` (handles attachments) |
334
+ | `document.service.ts` | `DocumentService` | `getDocuments(query)`, `setDocument(source)`, `setDocuments(source)` |
335
+ | `event.detail.service.ts` | `EventDetailService` | `checkOrSetRecord(identifier)` |
336
+ | `event.queue.service.ts` | `EventQueueService` | `getActiveEvents`, `setEvent(identifier)`, `trigger(event)`, `triggerById(id)` |
337
+ | `executable.script.service.ts` | `ExecutableScriptService` | `execute(data)` — runs stored scripts via `ProcessScriptExecution` |
338
+ | `form.service.ts` | `FormService` | `getDictionary(form)` |
339
+ | `internal.server.connect.service.ts` | `InternalServerConnectService` | `post(type, ...)`, `get(type, ...)`. Handles outbound calls to other internal servers using `internal.server.key` and credential expiry |
340
+ | `list.service.ts` | `ListService` | `index(param)`, `show(id)`, `getLayoutDefinition(layoutId)`, `getBaseFromModel(model)` |
341
+ | `logger.service.ts` | `LoggerService` | `set(message)`, `log`, `info`, `warn`, `error`. Persists to `SystemLogEntity` (writes via `SystemLogJob`) |
342
+ | `mail.validation.service.ts` | `MailValidationService` | `generate(email)` (OTP), `validate(payload)` |
343
+ | `mobile.validation.service.ts` | `MobileValidationService` | `generate(mobile)`, `validate(payload)` |
344
+ | `menu.service.ts` | `MenuService` | `getMenus`, `getMenuDetails(id)` |
345
+ | `model.service.ts` | `ModelService` | `getUiActions(model)`, `validateHashAccess(hash)`, `validateModelAccess(model, action)`, `getModelFromHash` |
346
+ | `preference.service.ts` | `PreferenceService` | `getMenuListPreferences`, `getTabListPreferences`, `getTabFormPreferences`, `getListPreferences`, `getFormPreferences`, `getModelFormPreferences` |
347
+ | `property.service.ts` | `PropertyService` | `get(key, default?)`, `getFromDb(key, default?)`. Handles encryption via `CustomCrypt` and caching. **Use this to read `internal.server.key` and other system properties** |
348
+ | `report.service.ts` | `ReportService` | `hasAccess(id)`, `getReportDetails(id)` |
349
+ | `scheduled.event.service.ts` | `ScheduledEventService` | `getActiveEventsSummary(source)`, `deleteActiveEvents(source)`, `getSchedules(source)` (cron-parser based; respects `inQueueCount`/`maxCount`) |
350
+ | `security.rule.service.ts` | `SecurityRuleService` | `getModelSecurityRules(model)`, `getFormSecurityRules(form)`, `getSecurityObjectNotation(identifier)`, `getScript(id)`, `getSecurityRules(id)` |
351
+ | `ui.action.service.ts` | `UiActionService` | `getUiActions(source_type)`, role/permission gate via `accessService.hasRoleAssignments`/`hasPermissionAssignments` |
352
+ | `upload.service.ts` | `UploadService` | `upload(file, options)`, `uploadWithStats`, `uploadFile(param)`, `saveLocalFileOnS3(option)`. Selects engine via `STORAGE_ENGINE` env (`s3`/`r2`) |
353
+ | `user.preference.service.ts` | `UserPreferenceService` | `getUserPreferences`, `getUserPreference(key)`, `setUserPreference(name)`, `setGlobalPreference(key)`, `revokeUserSpecificPreferences(name)` |
354
+ | `es6.service.ts` | `Es6Service` | Service registry locator |
355
+ | `es6.jobs.service.ts` | `Es6JobsService` | Job registry locator |
356
+
357
+ ### Controllers (`src/system/controllers/`)
358
+
359
+ | File | Class | Routes |
360
+ |---|---|---|
361
+ | `base.controller.ts` | `BaseController` (`api/record/:hash`) | `GET /` (list), `GET /create` (form metadata), `GET /:id` (show), `POST /` (create), `GET /:id/edit` (edit form), `GET /:id/audit-log`, `PUT /:id` (update), `DELETE /:id` |
362
+ | `data.controller.ts` | `DataController` (`api/data/:hash`) | `GET /` (data list), `GET /:id` |
363
+ | `form.controller.ts` | `FormController` (`api/admin/form`) | `GET /:id` |
364
+ | `menu.controller.ts` | `MenuController` (`api/admin/menu`) | `GET /`, `GET /:id`, `POST /` |
365
+ | `preference.controller.ts` | `PreferenceController` (`api/admin/`) | `GET preferences`, `POST list-preference`, `POST menu-list-preference/:id`, `POST model-form-preference/:id`, `POST form-preference`, `DELETE list-preference/:id`, `DELETE form-preference/:id` |
366
+ | `report.controller.ts` | `ReportController` (`api/admin`) | `POST report/:id/sync`, `GET report/:id`, `POST get-chart-data/:id`, `POST get-report-data/:id` |
367
+ | `upload.controller.ts` | `UploadController` (no prefix) | `POST uploads`, `POST api/admin/uploads` |
368
+ | `user.preference.controller.ts` | `UserPreferenceController` (`api/admin/user-preference`) | `GET /`, `POST /` |
369
+
370
+ ### Entities (`src/system/entities/`)
371
+
372
+ All extend `CommonEntity`. Tables:
373
+
374
+ | Domain | Entity → Table |
375
+ |---|---|
376
+ | Models | `model` → `sys_model_details`, `model.column` → `sys_model_columns`, `model.relationship` → `sys_model_relationships`, `model.role` → `sys_model_roles`, `column` → `sys_column_details`, `column.definition` → `sys_column_definitions`, `relationship` → `sys_relationship_details` |
377
+ | Menus | `menu` → `sys_menu_details`, `menu.role` → `sys_menu_roles`, `module` → `sys_module_details`, `module.menu` → `sys_module_menus`, `parent.menu` → `sys_parent_menus` |
378
+ | Forms | `form` → `sys_form_details`, `form.column` → `sys_form_columns`, `form.preference` → `sys_form_preferences`, `list.preference` → `sys_list_preferences` |
379
+ | Reports | `report` → `sys_report_details`, `report.column` → `sys_report_columns`, `report.filter` → `sys_report_filters`, `report.param` → `sys_report_params`, `report.relationship` → `sys_report_relationships`, `report.role` → `sys_report_roles`, `report.sheet` → `sys_report_sheets` |
380
+ | Charts | `chart` → `sys_chart_details`, `primary.axis` → `sys_chart_primary_axis`, `secondary.axis` → `sys_chart_secondary_axis` |
381
+ | Properties | `property` → `sys_properties`, `open.property` → `sys_open_properties`, `lookup.type` → `sys_lookup_types`, `lookup.value` → `sys_lookup_values` |
382
+ | Mail | `mail.event` → `sys_mail_events`, `mail.recipient` → `sys_mail_recipients`, `mail.log` → `sys_mail_logs`, `mail.validation` → `sys_mail_validations`, `email.template` → `sys_email_templates` |
383
+ | SMS | `sms.message` → `sys_sms_messages`, `sms.template` → `sys_sms_templates`, `mobile.validation` → `sys_mobile_validations`, `whatsapp.template` → `sys_whatsapp_templates` |
384
+ | Scripts | `system.script` → `sys_system_scripts`, `executable.script` → `sys_executable_scripts`, `client.script` → `sys_client_scripts`, `code.fix.script` → `sys_codefix_scripts`, `code.fix.log` → `sys_codefix_logs` |
385
+ | Events | `event.detail` → `sys_event_details`, `event.log` → `sys_event_logs`, `event.queue` → `sys_event_queues`, `scheduled.event` → `sys_scheduled_events`, `recurring.query` → `sys_recurring_queries` |
386
+ | Clients | `client` → `sys_client_details`, `client.credential` → `sys_client_credentials`, `credential.ip` → `sys_credential_ips`, `service` → `sys_service_details` |
387
+ | Users/Groups | `user.group` → `sys_user_groups`, `user.group.member` → `sys_user_group_members`, `user.group.permission` → `sys_user_group_permissions`, `user.group.role` → `sys_user_group_roles`, `user.preference` → `sys_user_preferences` |
388
+ | Misc | `business.rule` → `sys_business_rules`, `business.rule.role` → `sys_business_rule_roles`, `security.rule` → `sys_security_rules`, `ui.action` → `sys_ui_actions`, `ui.action.permission` → `sys_ui_action_permissions`, `ui.action.role` → `sys_ui_action_roles`, `comment` → `sys_comments`, `document` → `sys_documents`, `data.log` → `sys_data_logs`, `system.log` → `sys_system_logs`, `dynamo.table` → `sys_dynamo_tables`, `material.view` → `sys_material_views`, `page.definition` → `sys_page_definitions` |
389
+
390
+ ### Mongo entities (`src/system/mentities/`)
391
+
392
+ - `test.mentity.ts` — `TestMentity` (mongo collection, used by `TestMongoJob`).
393
+
394
+ ### DTOs (`src/system/dtos/`)
395
+
396
+ `add.comment.dto.ts`, `add.direct.menu.dto.ts`, `client.attributes.dto.ts`, `client.credential.attributes.dto.ts`, `client.credential.dto.ts`, `code.fix.log.attributes.dto.ts`, `code.fix.script.attributes.dto.ts`, `comment.attributes.dto.ts`, `credential.ip.attributes.dto.ts`, `data.log.attributes.dto.ts`, `document.attributes.dto.ts`, `event.log.attributes.dto.ts`, `executable.script.attributes.dto.ts`, `executable.script.payload.dto.ts`, `file.upload.dto.ts`, `file.upload.spec.dto.ts`, `job.record.param.dto.ts`, `local.file.s3.upload.dto.ts`, `mail.event.attributes.dto.ts`, `mail.recipient.attributes.dto.ts`, `mail.validation.dto.ts`, `material.view.attributes.dto.ts`, `menu.list.preference.creation.dto.ts`, `mobile.validation.dto.ts`, `model.allowed.column.dto.ts`, `model.form.preference.creation.dto.ts`, `otp.generation.dto.ts`, `recurring.query.attributes.dto.ts`, `report.sheet.attributes.dto.ts`, `s3.object.info.dto.ts`, `s3.upload.options.dto.ts`, `sms.message.attributes.dto.ts`, `system.log.attributes.dto.ts`, `user.preference.creation.dto.ts`, `validation.options.dto.ts`.
397
+
398
+ ### Jobs (`src/system/jobs/`)
399
+
400
+ 39 BullMQ jobs. All extend `CommonJob`. Naming convention `<entity>.job.ts` for entity-event jobs, `set.<thing>.job.ts` for event-queue scheduling jobs, `execute.<thing>.job.ts` / `refresh.<thing>.job.ts` for direct execution jobs.
401
+
402
+ | File | Class | What it does |
403
+ |---|---|---|
404
+ | `client.credential.job.ts` | `ClientCredentialJob` | ClientCredential entity insert/update side effects |
405
+ | `client.job.ts` | `ClientJob` | Client entity changes |
406
+ | `code.fix.log.job.ts` | `CodeFixLogJob` | CodeFixLog persist |
407
+ | `code.fix.script.job.ts` | `CodeFixScriptJob` | CodeFixScript changes |
408
+ | `column.mapper.job.ts` | `ColumnMapperJob` | Map column metadata to ModelColumn rows |
409
+ | `comment.job.ts` | `CommentJob` | Comment persist + notifications |
410
+ | `credential.ip.job.ts` | `CredentialIpJob` | CredentialIp changes |
411
+ | `data.log.job.ts` | `DataLogJob` | DataLog persist |
412
+ | `document.job.ts` | `DocumentJob` | Document persist + S3 hash |
413
+ | `event.log.job.ts` | `EventLogJob` | EventLog persist |
414
+ | `executable.script.job.ts` | `ExecutableScriptJob` | ExecutableScript changes |
415
+ | `execute.code.fix.job.ts` | `ExecuteCodeFixJob` | Run a code fix script via `ExecuteCodeFix` library |
416
+ | `execute.material.view.job.ts` | `ExecuteMaterialViewJob` | Refresh material view query |
417
+ | `execute.recurring.query.job.ts` | `ExecuteRecurringQueryJob` | Run recurring query |
418
+ | `mail.event.job.ts` | `MailEventJob` | Mail event creation → recipients |
419
+ | `mail.recipient.job.ts` | `MailRecipientJob` | Per-recipient mail send |
420
+ | `mail.validation.job.ts` | `MailValidationJob` | Email OTP validation event |
421
+ | `material.view.job.ts` | `MaterialViewJob` | MaterialView changes |
422
+ | `mobile.validation.job.ts` | `MobileValidationJob` | Mobile OTP validation event |
423
+ | `model.scanner.job.ts` | `ModelScannerJob` | Sync TypeORM entity metadata to Model rows |
424
+ | `property.job.ts` | `PropertyJob` | Property entity → cache refresh |
425
+ | `recurring.query.job.ts` | `RecurringQueryJob` | RecurringQuery changes |
426
+ | `refresh.material.view.job.ts` | `RefreshMaterialViewJob` | Trigger material view refresh schedule |
427
+ | `refresh.property.cache.job.ts` | `RefreshPropertyCacheJob` | Reload property cache |
428
+ | `relationship.mapper.job.ts` | `RelationshipMapperJob` | Map ModelRelationships from typeorm metadata |
429
+ | `report.column.sync.job.ts` | `ReportColumnSyncJob` | Sync ReportColumn rows |
430
+ | `report.sheet.job.ts` | `ReportSheetJob` | ReportSheet changes |
431
+ | `scheduled.event.job.ts` | `ScheduledEventJob` | ScheduledEvent persist + queue scheduling |
432
+ | `set.codefix.script.event.job.ts` | `SetCodefixScriptEventJob` | Schedule code fix execution event |
433
+ | `set.event.queue.job.ts` | `SetEventQueueJob` | Insert into EventQueue |
434
+ | `set.recurring.query.event.job.ts` | `SetRecurringQueryEventJob` | Schedule recurring query event |
435
+ | `set.scheduled.event.job.ts` | `SetScheduledEventJob` | Persist scheduled event metadata |
436
+ | `sms.message.job.ts` | `SmsMessageJob` | SmsMessage persist + send |
437
+ | `sqs.polling.job.ts` | `SqsPollingJob` | Drives `CommonSqsPolling` polling loop |
438
+ | `sync.all.code.job.ts` | `SyncAllCodeJob` | Full code sync (models, columns, relationships, menus...) |
439
+ | `system.log.job.ts` | `SystemLogJob` | Persist SystemLog |
440
+ | `test.mongo.job.ts` | `TestMongoJob` | Mongo connectivity test |
441
+ | `user.group.member.job.ts` | `UserGroupMemberJob` | Group membership change |
442
+ | `user.group.permission.job.ts` | `UserGroupPermissionJob` | Group permission change |
443
+ | `user.group.role.job.ts` | `UserGroupRoleJob` | Group role change |
444
+
445
+ ### Subscribers (`src/system/subscribers/`)
446
+
447
+ All 27 subscribers follow the same pattern:
448
+
449
+ ```ts
450
+ @EventSubscriber()
451
+ export class XSubscriber extends CommonSubscriber<XEntity> {
452
+ constructor(private readonly dataSource: DataSource, protected readonly entityJob: XJob) {
453
+ super();
454
+ dataSource.subscribers.push(this);
455
+ }
456
+ listenTo() { return XEntity; }
457
+ }
458
+ ```
459
+
460
+ Mappings (subscriber file → entity → triggered job): `client.credential` → `ClientCredentialEntity` → `ClientCredentialJob`; `client` → `ClientEntity` → `ClientJob`; `code.fix.log` → `CodeFixLogEntity` → `CodeFixLogJob`; `code.fix.script` → `CodeFixScriptEntity` → `CodeFixScriptJob`; `column` → `ColumnEntity` → `ColumnMapperJob`; `comment` → `CommentEntity` → `CommentJob`; `credential.ip` → `CredentialIpEntity` → `CredentialIpJob`; `data.log` → `DataLogEntity` → `DataLogJob`; `document` → `DocumentEntity` → `DocumentJob`; `event.log` → `EventLogEntity` → `EventLogJob`; `executable.script` → `ExecutableScriptEntity` → `ExecutableScriptJob`; `mail.event` → `MailEventEntity` → `MailEventJob`; `mail.recipient` → `MailRecipientEntity` → `MailRecipientJob`; `mail.validation` → `MailValidationEntity` → `MailValidationJob`; `material.view` → `MaterialViewEntity` → `MaterialViewJob`; `mobile.validation` → `MobileValidationEntity` → `MobileValidationJob`; `property` → `PropertyEntity` → `PropertyJob`; `recurring.query` → `RecurringQueryEntity` → `RecurringQueryJob`; `relationship` → `RelationshipEntity` → `RelationshipMapperJob`; `report.sheet` → `ReportSheetEntity` → `ReportSheetJob`; `scheduled.event` → `ScheduledEventEntity` → `ScheduledEventJob`; `sms.message` → `SmsMessageEntity` → `SmsMessageJob`; `system.log` → `SystemLogEntity` → `SystemLogJob`; `user.group.member` → `UserGroupMemberEntity` → `UserGroupMemberJob`; `user.group.permission` → `UserGroupPermissionEntity` → `UserGroupPermissionJob`; `user.group.role` → `UserGroupRoleEntity` → `UserGroupRoleJob`; `test.mongo.subscriber.ts` is the only mongo subscriber (listens to `TestMentity`).
461
+
462
+ ### Libraries (`src/system/libraries/`)
463
+
464
+ | File | Class | Purpose |
465
+ |---|---|---|
466
+ | `business.rule.filter.validator.ts` | `BusinessRuleFilterValidator` | Validates business rule filter conditions in an isolated script context |
467
+ | `business.rule.query.evaluator.ts` | `BusinessRuleQueryEvaluator` | Evaluates business rule query scripts in isolated execution |
468
+ | `code.evaluator.ts` | `CodeEvaluator` | Executes arbitrary code-fix scripts within a controlled context |
469
+ | `column.manager.ts` | `ColumnManager` | Column dictionary with security rule filtering |
470
+ | `common.storage.service.ts` | `CommonStorageService` | S3 upload param interface |
471
+ | `execute.code.fix.ts` | `ExecuteCodeFix` | Executes stored code fix scripts and records execution logs |
472
+ | `generate.downloadable.report.file.ts` | `GenerateDownloadableReportFile` | Builds report file (xlsx via `exceljs`) |
473
+ | `get.report.query.ts` | `GetReportQuery` | Builds report SQL query with parameter substitutions and filter restrictions |
474
+ | `model.sync.ts` | `ModelSync` | Syncs TypeORM entity metadata with model+column definitions |
475
+ | `process.menu.creation.ts` | `ProcessMenuCreation` | Creates menu structures (list/detail) and links to modules |
476
+ | `process.script.execution.ts` | `ProcessScriptExecution` | Processes/executes scripts dynamically |
477
+ | `security.rule.evaluator.ts` | `SecurityRuleEvaluator` | Evaluates security rule scripts for access validation |
478
+ | `sync.dynamo.tables.ts` | `SyncDynamoTables` | Syncs DynamoDB metadata between remote tables and local definitions |
479
+
480
+ ### Modifiers (`src/system/modifiers/`)
481
+
482
+ - `menu.list.modifier.ts` — `MenuListModifier`. `class-transformer` shape applied via `plainToClass` in `MenuService.getMenuDetails`.
483
+ - `module.list.modifier.ts` — `ModuleListModifier`. Shape for module list responses.
484
+
485
+ ### Interceptors
486
+
487
+ - `src/system/interceptors/sentry.interceptor.ts` — `SentryInterceptor`. Captures unhandled exceptions to Sentry. Applied globally in `main.ts` when `SENTRY_DSN` is set.
488
+
489
+ ---
490
+
491
+ ## `src/migrations/`
492
+
493
+ 136 TypeORM migrations + a `seeders/` subdirectory. Filename convention: `<unix-millis-timestamp>-<PascalCaseDescription>.ts`. Migrations from sibling `@servicelabsco/*` packages also run against this DB (via the glob in `typeorm.config.ts`). Migrations table: `sys_migrations`.
494
+
495
+ Migration files use `MigrationUtility` / `BaseMigrationUtility` / `ReverseMigrationUtility` / `SeederUtility` from `common/libraries/`. The `up`/`down` semantics flip when the `reverseMigration` flag is set so a single class can run forward or backward depending on context.
496
+
497
+ The `seeders/` directory contains data-only migrations (e.g. `sys_user_roles.json` is gitignored and seeded from there).
498
+
499
+ ---
500
+
501
+ ## `src/views/`
502
+
503
+ Handlebars (`hbs`) templates for emails. Used by `MailService.getBody()` via `handlebars` package.
504
+
505
+ ---
506
+
507
+ ## Patterns / how-to recipes
508
+
509
+ **Add a new postgres entity:**
510
+ 1. Create `src/<module>/entities/<name>.entity.ts`, extend `CommonEntity`, decorate with `@Entity('<table>')`. Use snake_case is auto-applied — write camelCase fields.
511
+ 2. Add the import + array entry to `src/<module>/es6.classes.ts` under `entities`.
512
+ 3. Generate migration: `yarn m:g <Name>`. Inside, instantiate `MigrationUtility` so `reverseMigration` works.
513
+ 4. If you want change events, add a subscriber + job (next recipe).
514
+
515
+ **Add a subscriber + job for an entity:**
516
+ 1. Create `src/<module>/jobs/<name>.job.ts` extending `CommonJob` with a `handle(data)` method.
517
+ 2. Create `src/<module>/subscribers/<name>.subscriber.ts` matching the template above.
518
+ 3. Register both in `es6.classes.ts` (`jobs`, `subscribers`).
519
+
520
+ **Add a new service:**
521
+ 1. Create `src/<module>/services/<name>.service.ts`, `@Injectable()`, extend `CommonService`.
522
+ 2. Register in `es6.classes.ts` under `services`.
523
+
524
+ **Read a system property:**
525
+ - `await propertyService.get('property.key', defaultValue)` — handles caching + decryption.
526
+
527
+ **Throw a domain error:** use one of the six exception classes in `common/exceptions/` (see table above) — never bare `HttpException`.
528
+
529
+ **Get current user:** `Auth.user()` (or `Auth.id()`, `Auth.check()`) from `common/libraries/auth.ts`. Never read `req.user` directly.
530
+
531
+ **Add a queue job at runtime:** `queueService.addJob(jobName, payload, options?)`. The `JobConsumer` (worker only) processes it.
532
+
533
+ **Internal-server-to-internal-server call:** `internalServerConnectService.post(type, payload)` / `.get(...)` — handles credential lookup/expiry.
534
+
535
+ **Generate `es6.classes.ts` files automatically:** `slnu syncClassess` (the `commit.sh` integration). Otherwise update by hand.
536
+
537
+ ---
538
+
539
+ ## Top-level files
540
+
541
+ - `package.json` — `main: dist/index.js`, scripts (build/start/test/lint/m:*/console/runtime-check/save). Jest config rootDir=src. Dependencies pinned to NestJS 11.
542
+ - `tsconfig.json` — target ES2021, commonjs, decorators on, strict off (no `strict: true`; types: `["node","jest"]`).
543
+ - `tsconfig.build.json` — build excludes (extends base).
544
+ - `nest-cli.json` — `sourceRoot: src`, `deleteOutDir: true`.
545
+ - `.eslintrc.js` — `@typescript-eslint/recommended` + `plugin:prettier/recommended`. Disables `interface-name-prefix`, `explicit-function-return-type`, `no-explicit-any`, `camelcase`.
546
+ - `.prettierrc` — `singleQuote`, `trailingComma: es5`, `tabWidth: 4`, `printWidth: 150`.
547
+ - `commit.sh` — `yarn save` flow: pull, optional build, optional `slnu syncClassess`, prettier, git add, JIRA-prefixed commit, push.
548
+ - `Procfile` — `web: npm run start:prod` (Heroku).
549
+ - `.circleci/config.yml` — entirely commented out (CI not active).
550
+ - `tslint.json` — legacy, ignored (eslint is the linter).
551
+
552
+ ---
553
+
554
+ ## Tests (`*.spec.ts` under `src/`)
555
+
556
+ Jest config inline in `package.json` (`rootDir: src`, `testRegex: .*\.spec\.ts$`, `ts-jest`). Run a single: `yarn test -- path/to/file.spec.ts` or `yarn test -- -t "name"`.
557
+
558
+ Test files present:
559
+ - `src/config/source.hash.spec.ts`
560
+ - `src/auth/middlewares/jwt.middleware.spec.ts`, `basic.auth.middleware.spec.ts`
561
+ - `src/auth/services/auth.service.spec.ts`
562
+ - `src/system/services/scheduled.event.service.spec.ts`
563
+ - `src/common/libraries/{auth,class.mapper,custom.crypt,custom.logger,database.event.evaluator,date.util,entity.evaluator,generic.index.parser,generic.show.parser,hash,json.evaluator,platform.utility,report.body.parser}.spec.ts`
564
+ - `src/common/exceptions/*.spec.ts` (every exception)
565
+ - `src/platformUtility/middlewares/{maintenance.middleware,trim.pipe}.spec.ts`
566
+ - `src/platformUtility/services/{cache.service,zip.service}.spec.ts`
567
+
568
+ E2E config in `test/jest-e2e.json` (no `*.e2e-spec.ts` files present yet).
@@ -1,4 +1,3 @@
1
- import { Request } from 'express';
2
1
  import { TestJob } from './platformUtility/jobs/test.job';
3
2
  import { AuditService } from './platformUtility/services/audit.service';
4
3
  import { CacheService } from './platformUtility/services/cache.service';
@@ -34,10 +33,6 @@ export declare class AppController {
34
33
  }>;
35
34
  getUserAuthObject(): Promise<any>;
36
35
  testOne(): Promise<any>;
37
- unset(query: any): Promise<any>;
38
36
  getQueueInstance(): Promise<any>;
39
37
  queue(id: string): Promise<any>;
40
- set(req: Request): Promise<{
41
- url: any;
42
- }>;
43
38
  }