@fdm-monster/server 2.0.11 → 2.1.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 (244) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/.yarn/releases/{yarn-4.13.0.cjs → yarn-4.14.1.cjs} +288 -288
  3. package/.yarnrc.yml +5 -1
  4. package/README.md +2 -1
  5. package/RELEASE_NOTES.MD +153 -2
  6. package/dist/_virtual/{_@oxc-project_runtime@0.127.0 → _@oxc-project_runtime@0.129.0}/helpers/decorate.js +1 -1
  7. package/dist/_virtual/{_@oxc-project_runtime@0.127.0 → _@oxc-project_runtime@0.129.0}/helpers/decorateMetadata.js +1 -1
  8. package/dist/_virtual/_virtual_controllers.js +2 -0
  9. package/dist/consoles/typeorm-create.js.map +1 -1
  10. package/dist/consoles/typeorm-generate.js.map +1 -1
  11. package/dist/consoles/typeorm-migrate.js.map +1 -1
  12. package/dist/constants/authorization.constants.js.map +1 -1
  13. package/dist/container.js +2 -0
  14. package/dist/container.js.map +1 -1
  15. package/dist/container.tokens.js +1 -0
  16. package/dist/container.tokens.js.map +1 -1
  17. package/dist/controllers/api-key.controller.js +72 -0
  18. package/dist/controllers/api-key.controller.js.map +1 -0
  19. package/dist/controllers/auth.controller.js +6 -4
  20. package/dist/controllers/auth.controller.js.map +1 -1
  21. package/dist/controllers/batch-call.controller.js +2 -2
  22. package/dist/controllers/batch-call.controller.js.map +1 -1
  23. package/dist/controllers/camera-stream.controller.js +2 -2
  24. package/dist/controllers/camera-stream.controller.js.map +1 -1
  25. package/dist/controllers/file-storage.controller.js +2 -2
  26. package/dist/controllers/file-storage.controller.js.map +1 -1
  27. package/dist/controllers/first-time-setup.controller.js +2 -2
  28. package/dist/controllers/first-time-setup.controller.js.map +1 -1
  29. package/dist/controllers/floor.controller.js +2 -2
  30. package/dist/controllers/floor.controller.js.map +1 -1
  31. package/dist/controllers/metrics.controller.js +2 -2
  32. package/dist/controllers/metrics.controller.js.map +1 -1
  33. package/dist/controllers/print-job.controller.js +2 -2
  34. package/dist/controllers/print-job.controller.js.map +1 -1
  35. package/dist/controllers/print-queue.controller.js +2 -2
  36. package/dist/controllers/print-queue.controller.js.map +1 -1
  37. package/dist/controllers/printer-files.controller.js +2 -2
  38. package/dist/controllers/printer-files.controller.js.map +1 -1
  39. package/dist/controllers/printer-maintenance-log.controller.js +2 -2
  40. package/dist/controllers/printer-maintenance-log.controller.js.map +1 -1
  41. package/dist/controllers/printer-settings.controller.js +2 -2
  42. package/dist/controllers/printer-settings.controller.js.map +1 -1
  43. package/dist/controllers/printer-tag.controller.js +2 -2
  44. package/dist/controllers/printer-tag.controller.js.map +1 -1
  45. package/dist/controllers/printer.controller.js +2 -2
  46. package/dist/controllers/printer.controller.js.map +1 -1
  47. package/dist/controllers/server-private.controller.js +2 -2
  48. package/dist/controllers/server-private.controller.js.map +1 -1
  49. package/dist/controllers/server-public.controller.js +2 -2
  50. package/dist/controllers/server-public.controller.js.map +1 -1
  51. package/dist/controllers/settings.controller.js +2 -2
  52. package/dist/controllers/settings.controller.js.map +1 -1
  53. package/dist/controllers/slicer-compat.controller.js +2 -2
  54. package/dist/controllers/slicer-compat.controller.js.map +1 -1
  55. package/dist/controllers/user.controller.js +2 -2
  56. package/dist/controllers/user.controller.js.map +1 -1
  57. package/dist/controllers/validation/api-key-controller.validation.js +11 -0
  58. package/dist/controllers/validation/api-key-controller.validation.js.map +1 -0
  59. package/dist/data-source.js +6 -2
  60. package/dist/data-source.js.map +1 -1
  61. package/dist/entities/api-key.entity.js +60 -0
  62. package/dist/entities/api-key.entity.js.map +1 -0
  63. package/dist/entities/camera-stream.entity.js +2 -2
  64. package/dist/entities/floor-position.entity.js +2 -2
  65. package/dist/entities/floor.entity.js +2 -2
  66. package/dist/entities/index.js +2 -1
  67. package/dist/entities/print-job.entity.js +2 -2
  68. package/dist/entities/printer-maintenance-log.entity.js +2 -2
  69. package/dist/entities/printer-tag.entity.js +2 -2
  70. package/dist/entities/printer.entity.js +2 -2
  71. package/dist/entities/refresh-token.entity.js +2 -2
  72. package/dist/entities/role.entity.js +2 -2
  73. package/dist/entities/settings.entity.js +2 -2
  74. package/dist/entities/tag.entity.js +2 -2
  75. package/dist/entities/user-role.entity.js +2 -2
  76. package/dist/entities/user.entity.js +2 -2
  77. package/dist/exceptions/failed-dependency.exception.js.map +1 -1
  78. package/dist/exceptions/job.exceptions.js.map +1 -1
  79. package/dist/exceptions/runtime.exceptions.js.map +1 -1
  80. package/dist/handlers/event-emitter.js.map +1 -1
  81. package/dist/handlers/logger-factory.js.map +1 -1
  82. package/dist/handlers/logger.js.map +1 -1
  83. package/dist/handlers/logging/file-logging.transport.js +1 -2
  84. package/dist/handlers/logging/file-logging.transport.js.map +1 -1
  85. package/dist/handlers/logging/loki-logging.transport.js.map +1 -1
  86. package/dist/handlers/logging/static.logger.js.map +1 -1
  87. package/dist/handlers/validators.js.map +1 -1
  88. package/dist/index.js.map +1 -1
  89. package/dist/middleware/api-key.strategy.js +45 -0
  90. package/dist/middleware/api-key.strategy.js.map +1 -0
  91. package/dist/middleware/authenticate.js.map +1 -1
  92. package/dist/middleware/database.js.map +1 -1
  93. package/dist/middleware/demo.middleware.js.map +1 -1
  94. package/dist/middleware/exception.filter.js.map +1 -1
  95. package/dist/middleware/global.middleware.js.map +1 -1
  96. package/dist/middleware/param-converter.middleware.js.map +1 -1
  97. package/dist/middleware/passport.js +3 -0
  98. package/dist/middleware/passport.js.map +1 -1
  99. package/dist/middleware/printer-resolver.js.map +1 -1
  100. package/dist/middleware/printer.js.map +1 -1
  101. package/dist/middleware/slicer-api-key.middleware.js.map +1 -1
  102. package/dist/middleware/socketio.middleware.js.map +1 -1
  103. package/dist/migrations/1706829146617-InitSqlite.js.map +1 -1
  104. package/dist/migrations/1707494762198-PrinterGroup.js.map +1 -1
  105. package/dist/migrations/1708465930665-ChangePrintCompletionDeletePrinterCascade.js.map +1 -1
  106. package/dist/migrations/1713300747465-ChangeRoleNameUnique.js.map +1 -1
  107. package/dist/migrations/1713897879622-AddPrinterType.js.map +1 -1
  108. package/dist/migrations/1720338804844-RemovePrinterFile.js.map +1 -1
  109. package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js.map +1 -1
  110. package/dist/migrations/1766576698569-DropPermissions.js.map +1 -1
  111. package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js.map +1 -1
  112. package/dist/migrations/1767279607392-DropCustomGcode.js.map +1 -1
  113. package/dist/migrations/1767291804417-DropPrintCompletions.js.map +1 -1
  114. package/dist/migrations/1767352862576-DropSettingsFileClean.js.map +1 -1
  115. package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js.map +1 -1
  116. package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js.map +1 -1
  117. package/dist/migrations/1767432108916-RenameGroupToTag.js.map +1 -1
  118. package/dist/migrations/1767451444137-AddPrintJob.js.map +1 -1
  119. package/dist/migrations/1767909428129-AddPrinterMaintenanceLog.js.map +1 -1
  120. package/dist/migrations/1778446203015-AddApiKey.js +49 -0
  121. package/dist/migrations/1778446203015-AddApiKey.js.map +1 -0
  122. package/dist/plugins/controllers-plugin.js.map +1 -1
  123. package/dist/server.constants.js +2 -1
  124. package/dist/server.constants.js.map +1 -1
  125. package/dist/server.core.js +6 -2
  126. package/dist/server.core.js.map +1 -1
  127. package/dist/server.env.js.map +1 -1
  128. package/dist/server.host.js.map +1 -1
  129. package/dist/services/authentication/auth.service.js.map +1 -1
  130. package/dist/services/authentication/jwt.service.js.map +1 -1
  131. package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
  132. package/dist/services/bambu/bambu-mqtt.adapter.js.map +1 -1
  133. package/dist/services/bambu/bambu.client.js.map +1 -1
  134. package/dist/services/bambu.api.js.map +1 -1
  135. package/dist/services/core/batch-call.service.js.map +1 -1
  136. package/dist/services/core/client-bundle.service.js.map +1 -1
  137. package/dist/services/core/config.service.js +4 -0
  138. package/dist/services/core/config.service.js.map +1 -1
  139. package/dist/services/core/cradle.service.js.map +1 -1
  140. package/dist/services/core/github.service.js.map +1 -1
  141. package/dist/services/core/http-client.factory.js.map +1 -1
  142. package/dist/services/core/logs-manager.service.js.map +1 -1
  143. package/dist/services/core/monsterpi.service.js.map +1 -1
  144. package/dist/services/core/multer.service.js.map +1 -1
  145. package/dist/services/core/server-release.service.js.map +1 -1
  146. package/dist/services/core/yaml.service.js.map +1 -1
  147. package/dist/services/file-analysis.service.js.map +1 -1
  148. package/dist/services/file-storage.service.js.map +1 -1
  149. package/dist/services/interfaces/api-key.dto.js +19 -0
  150. package/dist/services/interfaces/api-key.dto.js.map +1 -0
  151. package/dist/services/interfaces/api-key.service.interface.js +1 -0
  152. package/dist/services/interfaces/user.dto.js +2 -0
  153. package/dist/services/interfaces/user.dto.js.map +1 -1
  154. package/dist/services/moonraker/moonraker-websocket.adapter.js.map +1 -1
  155. package/dist/services/moonraker/moonraker.client.js.map +1 -1
  156. package/dist/services/moonraker.api.js.map +1 -1
  157. package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
  158. package/dist/services/octoprint/octoprint-websocket.adapter.js.map +1 -1
  159. package/dist/services/octoprint/octoprint.client.js.map +1 -1
  160. package/dist/services/octoprint/utils/api.utils.js.map +1 -1
  161. package/dist/services/octoprint/utils/file.utils.js.map +1 -1
  162. package/dist/services/octoprint/utils/octoprint-http-client.builder.js.map +1 -1
  163. package/dist/services/octoprint.api.js.map +1 -1
  164. package/dist/services/orm/api-key.service.js +90 -0
  165. package/dist/services/orm/api-key.service.js.map +1 -0
  166. package/dist/services/orm/base.service.js.map +1 -1
  167. package/dist/services/orm/camera-stream.service.js.map +1 -1
  168. package/dist/services/orm/floor-position.service.js.map +1 -1
  169. package/dist/services/orm/floor.service.js.map +1 -1
  170. package/dist/services/orm/permission.service.js.map +1 -1
  171. package/dist/services/orm/print-job.service.js.map +1 -1
  172. package/dist/services/orm/printer-maintenance-log.service.js.map +1 -1
  173. package/dist/services/orm/printer-tag.service.js.map +1 -1
  174. package/dist/services/orm/printer.service.js.map +1 -1
  175. package/dist/services/orm/refresh-token.service.js.map +1 -1
  176. package/dist/services/orm/role.service.js.map +1 -1
  177. package/dist/services/orm/settings.service.js.map +1 -1
  178. package/dist/services/orm/user-role.service.js.map +1 -1
  179. package/dist/services/orm/user.service.js.map +1 -1
  180. package/dist/services/print-file-downloader.service.js.map +1 -1
  181. package/dist/services/print-queue.service.js.map +1 -1
  182. package/dist/services/printer-api.factory.js.map +1 -1
  183. package/dist/services/printer-api.interface.js.map +1 -1
  184. package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -1
  185. package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
  186. package/dist/services/prusa-link/utils/digest-auth.util.js +19 -12
  187. package/dist/services/prusa-link/utils/digest-auth.util.js.map +1 -1
  188. package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js +45 -11
  189. package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js.map +1 -1
  190. package/dist/services/socket.factory.js.map +1 -1
  191. package/dist/services/task-manager.service.js.map +1 -1
  192. package/dist/services/typeorm/typeorm.service.js.map +1 -1
  193. package/dist/services/validators/printer-service.validation.js.map +1 -1
  194. package/dist/shared/default-http-client.builder.js.map +1 -1
  195. package/dist/shared/load-controllers.js.map +1 -1
  196. package/dist/shared/runtime-settings.migration.js.map +1 -1
  197. package/dist/shared/websocket-rpc-extended.adapter.js.map +1 -1
  198. package/dist/shared/websocket.adapter.js.map +1 -1
  199. package/dist/state/file-upload-tracker.cache.js.map +1 -1
  200. package/dist/state/floor.store.js.map +1 -1
  201. package/dist/state/printer-events.cache.js.map +1 -1
  202. package/dist/state/printer-socket.store.js.map +1 -1
  203. package/dist/state/printer-thumbnail.cache.js.map +1 -1
  204. package/dist/state/printer.cache.js.map +1 -1
  205. package/dist/state/settings.store.js.map +1 -1
  206. package/dist/state/socket-io.gateway.js.map +1 -1
  207. package/dist/state/test-printer-socket.store.js.map +1 -1
  208. package/dist/tasks/boot.task.js.map +1 -1
  209. package/dist/tasks/client-bundle.task.js.map +1 -1
  210. package/dist/tasks/print-job-analysis.task.js.map +1 -1
  211. package/dist/tasks/printer-websocket-restore.task.js.map +1 -1
  212. package/dist/tasks/printer-websocket.task.js.map +1 -1
  213. package/dist/tasks/socketio.task.js.map +1 -1
  214. package/dist/tasks/software-update.task.js.map +1 -1
  215. package/dist/tasks.js.map +1 -1
  216. package/dist/utils/array.util.js.map +1 -1
  217. package/dist/utils/bgcode/bgcode-thumbnail.parser.js.map +1 -1
  218. package/dist/utils/bgcode/bgcode.utils.js.map +1 -1
  219. package/dist/utils/bgcode/heatshrink-decoder.js.map +1 -1
  220. package/dist/utils/bgcode/png-encoder.js.map +1 -1
  221. package/dist/utils/bgcode/qoi-decoder.js.map +1 -1
  222. package/dist/utils/cache/key-diff.cache.js.map +1 -1
  223. package/dist/utils/correlation-token.util.js.map +1 -1
  224. package/dist/utils/crypto.utils.js.map +1 -1
  225. package/dist/utils/env.utils.js.map +1 -1
  226. package/dist/utils/error.utils.js.map +1 -1
  227. package/dist/utils/fs.utils.js.map +1 -1
  228. package/dist/utils/gcode.utils.js.map +1 -1
  229. package/dist/utils/image-dimensions.js.map +1 -1
  230. package/dist/utils/job-stats.util.js.map +1 -1
  231. package/dist/utils/normalize-url.js.map +1 -1
  232. package/dist/utils/parsers/3mf.parser.js.map +1 -1
  233. package/dist/utils/parsers/bgcode.parser.js.map +1 -1
  234. package/dist/utils/parsers/gcode.parser.js.map +1 -1
  235. package/dist/utils/pretty-print.utils.js.map +1 -1
  236. package/dist/utils/semver.utils.js.map +1 -1
  237. package/dist/utils/swagger/decorators.js.map +1 -1
  238. package/dist/utils/swagger/generator.js.map +1 -1
  239. package/dist/utils/swagger/swagger.js.map +1 -1
  240. package/dist/utils/thumbnail.util.js.map +1 -1
  241. package/dist/utils/time.utils.js.map +1 -1
  242. package/dist/utils/url.utils.js.map +1 -1
  243. package/package.json +17 -14
  244. package/packages/consoles/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"1745141688926-AddPrinterUsernamePassword.js","names":[],"sources":["../../src/migrations/1745141688926-AddPrinterUsernamePassword.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class AddPrinterUsernamePassword1745141688926 implements MigrationInterface {\n name = \"AddPrinterUsernamePassword1745141688926\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"temporary_printer\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerURL\" varchar NOT NULL,\n \"apiKey\" varchar NOT NULL,\n \"enabled\" boolean NOT NULL DEFAULT (1),\n \"disabledReason\" varchar,\n \"assignee\" varchar,\n \"dateAdded\" integer NOT NULL DEFAULT (datetime('now')),\n \"feedRate\" integer,\n \"flowRate\" integer,\n \"printerType\" integer NOT NULL DEFAULT (0),\n \"username\" varchar DEFAULT (''),\n \"password\" varchar DEFAULT ('')\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_printer\"(\n \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\"\n )\n SELECT \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\"\n FROM \"printer\"\n `);\n await queryRunner.query(`\n DROP TABLE \"printer\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_printer\"\n RENAME TO \"printer\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"temporary_printer\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerURL\" varchar NOT NULL,\n \"apiKey\" varchar DEFAULT (''),\n \"enabled\" boolean NOT NULL DEFAULT (1),\n \"disabledReason\" varchar,\n \"assignee\" varchar,\n \"dateAdded\" integer NOT NULL DEFAULT (datetime('now')),\n \"feedRate\" integer,\n \"flowRate\" integer,\n \"printerType\" integer NOT NULL DEFAULT (0),\n \"username\" varchar DEFAULT (''),\n \"password\" varchar DEFAULT ('')\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_printer\"(\n \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\",\n \"username\",\n \"password\"\n )\n SELECT \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\",\n \"username\",\n \"password\"\n FROM \"printer\"\n `);\n await queryRunner.query(`\n DROP TABLE \"printer\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_printer\"\n RENAME TO \"printer\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"printer\"\n RENAME TO \"temporary_printer\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"printer\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerURL\" varchar NOT NULL,\n \"apiKey\" varchar NOT NULL,\n \"enabled\" boolean NOT NULL DEFAULT (1),\n \"disabledReason\" varchar,\n \"assignee\" varchar,\n \"dateAdded\" integer NOT NULL DEFAULT (datetime('now')),\n \"feedRate\" integer,\n \"flowRate\" integer,\n \"printerType\" integer NOT NULL DEFAULT (0),\n \"username\" varchar DEFAULT (''),\n \"password\" varchar DEFAULT ('')\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"printer\"(\n \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\",\n \"username\",\n \"password\"\n )\n SELECT \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\",\n \"username\",\n \"password\"\n FROM \"temporary_printer\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_printer\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"printer\"\n RENAME TO \"temporary_printer\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"printer\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerURL\" varchar NOT NULL,\n \"apiKey\" varchar NOT NULL,\n \"enabled\" boolean NOT NULL DEFAULT (1),\n \"disabledReason\" varchar,\n \"assignee\" varchar,\n \"dateAdded\" integer NOT NULL DEFAULT (datetime('now')),\n \"feedRate\" integer,\n \"flowRate\" integer,\n \"printerType\" integer NOT NULL DEFAULT (0)\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"printer\"(\n \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\"\n )\n SELECT \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\"\n FROM \"temporary_printer\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_printer\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,0CAAb,MAAmF;CACjF,OAAO;CAEP,MAAa,GAAG,aAAyC;AACvD,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;MAgBtB;AACF,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;MA0BtB;AACF,QAAM,YAAY,MAAM;;MAEtB;AACF,QAAM,YAAY,MAAM;;;MAGtB;AACF,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;MAgBtB;AACF,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8BtB;AACF,QAAM,YAAY,MAAM;;UAElB;AACN,QAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;AACzD,QAAM,YAAY,MAAM;;;MAGtB;AACF,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;MAgBtB;AACF,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8BtB;AACF,QAAM,YAAY,MAAM;;MAEtB;AACF,QAAM,YAAY,MAAM;;;UAGlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;UAclB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;UA0BlB;AACN,QAAM,YAAY,MAAM;;UAElB"}
1
+ {"version":3,"file":"1745141688926-AddPrinterUsernamePassword.js","names":[],"sources":["../../src/migrations/1745141688926-AddPrinterUsernamePassword.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class AddPrinterUsernamePassword1745141688926 implements MigrationInterface {\n name = \"AddPrinterUsernamePassword1745141688926\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"temporary_printer\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerURL\" varchar NOT NULL,\n \"apiKey\" varchar NOT NULL,\n \"enabled\" boolean NOT NULL DEFAULT (1),\n \"disabledReason\" varchar,\n \"assignee\" varchar,\n \"dateAdded\" integer NOT NULL DEFAULT (datetime('now')),\n \"feedRate\" integer,\n \"flowRate\" integer,\n \"printerType\" integer NOT NULL DEFAULT (0),\n \"username\" varchar DEFAULT (''),\n \"password\" varchar DEFAULT ('')\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_printer\"(\n \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\"\n )\n SELECT \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\"\n FROM \"printer\"\n `);\n await queryRunner.query(`\n DROP TABLE \"printer\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_printer\"\n RENAME TO \"printer\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"temporary_printer\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerURL\" varchar NOT NULL,\n \"apiKey\" varchar DEFAULT (''),\n \"enabled\" boolean NOT NULL DEFAULT (1),\n \"disabledReason\" varchar,\n \"assignee\" varchar,\n \"dateAdded\" integer NOT NULL DEFAULT (datetime('now')),\n \"feedRate\" integer,\n \"flowRate\" integer,\n \"printerType\" integer NOT NULL DEFAULT (0),\n \"username\" varchar DEFAULT (''),\n \"password\" varchar DEFAULT ('')\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_printer\"(\n \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\",\n \"username\",\n \"password\"\n )\n SELECT \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\",\n \"username\",\n \"password\"\n FROM \"printer\"\n `);\n await queryRunner.query(`\n DROP TABLE \"printer\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_printer\"\n RENAME TO \"printer\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"printer\"\n RENAME TO \"temporary_printer\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"printer\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerURL\" varchar NOT NULL,\n \"apiKey\" varchar NOT NULL,\n \"enabled\" boolean NOT NULL DEFAULT (1),\n \"disabledReason\" varchar,\n \"assignee\" varchar,\n \"dateAdded\" integer NOT NULL DEFAULT (datetime('now')),\n \"feedRate\" integer,\n \"flowRate\" integer,\n \"printerType\" integer NOT NULL DEFAULT (0),\n \"username\" varchar DEFAULT (''),\n \"password\" varchar DEFAULT ('')\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"printer\"(\n \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\",\n \"username\",\n \"password\"\n )\n SELECT \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\",\n \"username\",\n \"password\"\n FROM \"temporary_printer\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_printer\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"printer\"\n RENAME TO \"temporary_printer\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"printer\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerURL\" varchar NOT NULL,\n \"apiKey\" varchar NOT NULL,\n \"enabled\" boolean NOT NULL DEFAULT (1),\n \"disabledReason\" varchar,\n \"assignee\" varchar,\n \"dateAdded\" integer NOT NULL DEFAULT (datetime('now')),\n \"feedRate\" integer,\n \"flowRate\" integer,\n \"printerType\" integer NOT NULL DEFAULT (0)\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"printer\"(\n \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\"\n )\n SELECT \"id\",\n \"name\",\n \"printerURL\",\n \"apiKey\",\n \"enabled\",\n \"disabledReason\",\n \"assignee\",\n \"dateAdded\",\n \"feedRate\",\n \"flowRate\",\n \"printerType\"\n FROM \"temporary_printer\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_printer\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,0CAAb,MAAmF;CACjF,OAAO;CAEP,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;MAgBtB;EACF,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;MA0BtB;EACF,MAAM,YAAY,MAAM;;MAEtB;EACF,MAAM,YAAY,MAAM;;;MAGtB;EACF,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;MAgBtB;EACF,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8BtB;EACF,MAAM,YAAY,MAAM;;UAElB;EACN,MAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;EACzD,MAAM,YAAY,MAAM;;;MAGtB;EACF,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;MAgBtB;EACF,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8BtB;EACF,MAAM,YAAY,MAAM;;MAEtB;EACF,MAAM,YAAY,MAAM;;;UAGlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;UAclB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;UA0BlB;EACN,MAAM,YAAY,MAAM;;UAElB"}
@@ -1 +1 @@
1
- {"version":3,"file":"1766576698569-DropPermissions.js","names":[],"sources":["../../src/migrations/1766576698569-DropPermissions.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class DropPermissions1766576698569 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n DROP TABLE permission\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"permission\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL\n )\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,+BAAb,MAAwE;CACtE,MAAa,GAAG,aAAyC;AACvD,QAAM,YAAY,MAAM;;MAEtB;;CAGJ,MAAa,KAAK,aAAyC;AACzD,QAAM,YAAY,MAAM;;;;;;MAMtB"}
1
+ {"version":3,"file":"1766576698569-DropPermissions.js","names":[],"sources":["../../src/migrations/1766576698569-DropPermissions.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class DropPermissions1766576698569 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n DROP TABLE permission\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"permission\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL\n )\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,+BAAb,MAAwE;CACtE,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;MAEtB;;CAGJ,MAAa,KAAK,aAAyC;EACzD,MAAM,YAAY,MAAM;;;;;;MAMtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"1767278216516-ChangeCameraPrinterOnDeleteSetNull.js","names":[],"sources":["../../src/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ChangeCameraPrinterOnDeleteSetNull1767278216516 implements MigrationInterface {\n name = \"ChangeCameraPrinterOnDeleteSetNull1767278216516\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"temporary_camera_stream\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"streamURL\" varchar NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerId\" integer,\n \"aspectRatio\" varchar NOT NULL DEFAULT ('16:9'),\n \"rotationClockwise\" integer NOT NULL DEFAULT (0),\n \"flipHorizontal\" boolean NOT NULL DEFAULT (0),\n \"flipVertical\" boolean NOT NULL DEFAULT (0),\n CONSTRAINT \"UQ_565f1b0713258ce710e9fb48273\" UNIQUE (\"printerId\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_camera_stream\"(\n \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n )\n SELECT \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n FROM \"camera_stream\"\n `);\n await queryRunner.query(`\n DROP TABLE \"camera_stream\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_camera_stream\"\n RENAME TO \"camera_stream\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"temporary_camera_stream\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"streamURL\" varchar NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerId\" integer,\n \"aspectRatio\" varchar NOT NULL DEFAULT ('16:9'),\n \"rotationClockwise\" integer NOT NULL DEFAULT (0),\n \"flipHorizontal\" boolean NOT NULL DEFAULT (0),\n \"flipVertical\" boolean NOT NULL DEFAULT (0),\n CONSTRAINT \"UQ_565f1b0713258ce710e9fb48273\" UNIQUE (\"printerId\"),\n CONSTRAINT \"FK_565f1b0713258ce710e9fb48273\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_camera_stream\"(\n \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n )\n SELECT \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n FROM \"camera_stream\"\n `);\n await queryRunner.query(`\n DROP TABLE \"camera_stream\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_camera_stream\"\n RENAME TO \"camera_stream\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"camera_stream\"\n RENAME TO \"temporary_camera_stream\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"camera_stream\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"streamURL\" varchar NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerId\" integer,\n \"aspectRatio\" varchar NOT NULL DEFAULT ('16:9'),\n \"rotationClockwise\" integer NOT NULL DEFAULT (0),\n \"flipHorizontal\" boolean NOT NULL DEFAULT (0),\n \"flipVertical\" boolean NOT NULL DEFAULT (0),\n CONSTRAINT \"UQ_565f1b0713258ce710e9fb48273\" UNIQUE (\"printerId\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"camera_stream\"(\n \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n )\n SELECT \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n FROM \"temporary_camera_stream\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_camera_stream\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"camera_stream\"\n RENAME TO \"temporary_camera_stream\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"camera_stream\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"streamURL\" varchar NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerId\" integer,\n \"aspectRatio\" varchar NOT NULL DEFAULT ('16:9'),\n \"rotationClockwise\" integer NOT NULL DEFAULT (0),\n \"flipHorizontal\" boolean NOT NULL DEFAULT (0),\n \"flipVertical\" boolean NOT NULL DEFAULT (0),\n CONSTRAINT \"UQ_565f1b0713258ce710e9fb48273\" UNIQUE (\"printerId\"),\n CONSTRAINT \"FK_565f1b0713258ce710e9fb48273\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE NO ACTION ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"camera_stream\"(\n \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n )\n SELECT \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n FROM \"temporary_camera_stream\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_camera_stream\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,kDAAb,MAA2F;CACzF,OAAO;CAEP,MAAa,GAAG,aAAyC;AACvD,QAAM,YAAY,MAAM;;;;;;;;;;;;UAYlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;UAoBlB;AACN,QAAM,YAAY,MAAM;;UAElB;AACN,QAAM,YAAY,MAAM;;;UAGlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;UAclB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;UAoBlB;AACN,QAAM,YAAY,MAAM;;UAElB;AACN,QAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;AACzD,QAAM,YAAY,MAAM;;;UAGlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;UAYlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;UAoBlB;AACN,QAAM,YAAY,MAAM;;UAElB;AACN,QAAM,YAAY,MAAM;;;UAGlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;UAalB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;UAoBlB;AACN,QAAM,YAAY,MAAM;;UAElB"}
1
+ {"version":3,"file":"1767278216516-ChangeCameraPrinterOnDeleteSetNull.js","names":[],"sources":["../../src/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ChangeCameraPrinterOnDeleteSetNull1767278216516 implements MigrationInterface {\n name = \"ChangeCameraPrinterOnDeleteSetNull1767278216516\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"temporary_camera_stream\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"streamURL\" varchar NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerId\" integer,\n \"aspectRatio\" varchar NOT NULL DEFAULT ('16:9'),\n \"rotationClockwise\" integer NOT NULL DEFAULT (0),\n \"flipHorizontal\" boolean NOT NULL DEFAULT (0),\n \"flipVertical\" boolean NOT NULL DEFAULT (0),\n CONSTRAINT \"UQ_565f1b0713258ce710e9fb48273\" UNIQUE (\"printerId\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_camera_stream\"(\n \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n )\n SELECT \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n FROM \"camera_stream\"\n `);\n await queryRunner.query(`\n DROP TABLE \"camera_stream\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_camera_stream\"\n RENAME TO \"camera_stream\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"temporary_camera_stream\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"streamURL\" varchar NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerId\" integer,\n \"aspectRatio\" varchar NOT NULL DEFAULT ('16:9'),\n \"rotationClockwise\" integer NOT NULL DEFAULT (0),\n \"flipHorizontal\" boolean NOT NULL DEFAULT (0),\n \"flipVertical\" boolean NOT NULL DEFAULT (0),\n CONSTRAINT \"UQ_565f1b0713258ce710e9fb48273\" UNIQUE (\"printerId\"),\n CONSTRAINT \"FK_565f1b0713258ce710e9fb48273\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_camera_stream\"(\n \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n )\n SELECT \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n FROM \"camera_stream\"\n `);\n await queryRunner.query(`\n DROP TABLE \"camera_stream\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_camera_stream\"\n RENAME TO \"camera_stream\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"camera_stream\"\n RENAME TO \"temporary_camera_stream\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"camera_stream\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"streamURL\" varchar NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerId\" integer,\n \"aspectRatio\" varchar NOT NULL DEFAULT ('16:9'),\n \"rotationClockwise\" integer NOT NULL DEFAULT (0),\n \"flipHorizontal\" boolean NOT NULL DEFAULT (0),\n \"flipVertical\" boolean NOT NULL DEFAULT (0),\n CONSTRAINT \"UQ_565f1b0713258ce710e9fb48273\" UNIQUE (\"printerId\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"camera_stream\"(\n \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n )\n SELECT \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n FROM \"temporary_camera_stream\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_camera_stream\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"camera_stream\"\n RENAME TO \"temporary_camera_stream\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"camera_stream\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"streamURL\" varchar NOT NULL,\n \"name\" varchar NOT NULL,\n \"printerId\" integer,\n \"aspectRatio\" varchar NOT NULL DEFAULT ('16:9'),\n \"rotationClockwise\" integer NOT NULL DEFAULT (0),\n \"flipHorizontal\" boolean NOT NULL DEFAULT (0),\n \"flipVertical\" boolean NOT NULL DEFAULT (0),\n CONSTRAINT \"UQ_565f1b0713258ce710e9fb48273\" UNIQUE (\"printerId\"),\n CONSTRAINT \"FK_565f1b0713258ce710e9fb48273\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE NO ACTION ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"camera_stream\"(\n \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n )\n SELECT \"id\",\n \"streamURL\",\n \"name\",\n \"printerId\",\n \"aspectRatio\",\n \"rotationClockwise\",\n \"flipHorizontal\",\n \"flipVertical\"\n FROM \"temporary_camera_stream\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_camera_stream\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,kDAAb,MAA2F;CACzF,OAAO;CAEP,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;;;;;;;;;;;UAYlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;UAoBlB;EACN,MAAM,YAAY,MAAM;;UAElB;EACN,MAAM,YAAY,MAAM;;;UAGlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;UAclB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;UAoBlB;EACN,MAAM,YAAY,MAAM;;UAElB;EACN,MAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;EACzD,MAAM,YAAY,MAAM;;;UAGlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;UAYlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;UAoBlB;EACN,MAAM,YAAY,MAAM;;UAElB;EACN,MAAM,YAAY,MAAM;;;UAGlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;UAalB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;UAoBlB;EACN,MAAM,YAAY,MAAM;;UAElB"}
@@ -1 +1 @@
1
- {"version":3,"file":"1767279607392-DropCustomGcode.js","names":[],"sources":["../../src/migrations/1767279607392-DropCustomGcode.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class DropCustomGcode1767279607392 implements MigrationInterface {\n name = \"DropCustomGcode1767279607392\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n DROP TABLE custom_gcode\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"custom_gcode\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"description\" varchar,\n \"gcode\" text NOT NULL\n )\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,+BAAb,MAAwE;CACtE,OAAO;CAEP,MAAa,GAAG,aAAyC;AACvD,QAAM,YAAY,MAAM;;MAEtB;;CAGJ,MAAa,KAAK,aAAyC;AACzD,QAAM,YAAY,MAAM;;;;;;;;MAQtB"}
1
+ {"version":3,"file":"1767279607392-DropCustomGcode.js","names":[],"sources":["../../src/migrations/1767279607392-DropCustomGcode.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class DropCustomGcode1767279607392 implements MigrationInterface {\n name = \"DropCustomGcode1767279607392\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n DROP TABLE custom_gcode\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"custom_gcode\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"description\" varchar,\n \"gcode\" text NOT NULL\n )\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,+BAAb,MAAwE;CACtE,OAAO;CAEP,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;MAEtB;;CAGJ,MAAa,KAAK,aAAyC;EACzD,MAAM,YAAY,MAAM;;;;;;;;MAQtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"1767291804417-DropPrintCompletions.js","names":[],"sources":["../../src/migrations/1767291804417-DropPrintCompletions.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class DropPrintCompletions1767291804417 implements MigrationInterface {\n name = \"DropPrintCompletions1767291804417\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n DROP TABLE print_completion\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"print_completion\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"fileName\" varchar NOT NULL,\n \"createdAt\" integer NOT NULL DEFAULT (datetime('now')),\n \"status\" varchar NOT NULL,\n \"printerId\" integer NOT NULL,\n \"printerReference\" varchar,\n \"completionLog\" varchar,\n \"context\" text,\n CONSTRAINT \"FK_c078b1dfe5f87f79f131520d856\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION\n )\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,oCAAb,MAA6E;CAC3E,OAAO;CAEP,MAAa,GAAG,aAAyC;AACvD,QAAM,YAAY,MAAM;;MAEtB;;CAGJ,MAAa,KAAK,aAAyC;AACzD,QAAM,YAAY,MAAM;;;;;;;;;;;;;;MActB"}
1
+ {"version":3,"file":"1767291804417-DropPrintCompletions.js","names":[],"sources":["../../src/migrations/1767291804417-DropPrintCompletions.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class DropPrintCompletions1767291804417 implements MigrationInterface {\n name = \"DropPrintCompletions1767291804417\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n DROP TABLE print_completion\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"print_completion\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"fileName\" varchar NOT NULL,\n \"createdAt\" integer NOT NULL DEFAULT (datetime('now')),\n \"status\" varchar NOT NULL,\n \"printerId\" integer NOT NULL,\n \"printerReference\" varchar,\n \"completionLog\" varchar,\n \"context\" text,\n CONSTRAINT \"FK_c078b1dfe5f87f79f131520d856\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION\n )\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,oCAAb,MAA6E;CAC3E,OAAO;CAEP,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;MAEtB;;CAGJ,MAAa,KAAK,aAAyC;EACzD,MAAM,YAAY,MAAM;;;;;;;;;;;;;;MActB"}
@@ -1 +1 @@
1
- {"version":3,"file":"1767352862576-DropSettingsFileClean.js","names":[],"sources":["../../src/migrations/1767352862576-DropSettingsFileClean.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class DropSettingsFileClean1767352862576 implements MigrationInterface {\n name = \"DropSettingsFileClean1767352862576\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"temporary_settings\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"server\" text NOT NULL,\n \"credentials\" text NOT NULL,\n \"wizard\" text NOT NULL,\n \"frontend\" text NOT NULL,\n \"timeout\" text NOT NULL\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_settings\"(\n \"id\",\n \"server\",\n \"credentials\",\n \"wizard\",\n \"frontend\",\n \"timeout\"\n )\n SELECT \"id\",\n \"server\",\n \"credentials\",\n \"wizard\",\n \"frontend\",\n \"timeout\"\n FROM \"settings\"\n `);\n await queryRunner.query(`\n DROP TABLE \"settings\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_settings\"\n RENAME TO \"settings\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"settings\"\n RENAME TO \"temporary_settings\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"settings\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"server\" text NOT NULL,\n \"credentials\" text NOT NULL,\n \"wizard\" text NOT NULL,\n \"printerFileClean\" text NOT NULL,\n \"frontend\" text NOT NULL,\n \"timeout\" text NOT NULL\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"settings\"(\n \"id\",\n \"server\",\n \"credentials\",\n \"wizard\",\n \"frontend\",\n \"timeout\"\n )\n SELECT \"id\",\n \"server\",\n \"credentials\",\n \"wizard\",\n \"frontend\",\n \"timeout\"\n FROM \"temporary_settings\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_settings\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,qCAAb,MAA8E;CAC5E,OAAO;CAEP,MAAa,GAAG,aAAyC;AACvD,QAAM,YAAY,MAAM;;;;;;;;;UASlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;UAgBlB;AACN,QAAM,YAAY,MAAM;;UAElB;AACN,QAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;AACzD,QAAM,YAAY,MAAM;;;UAGlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;UAUlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;UAgBlB;AACN,QAAM,YAAY,MAAM;;UAElB"}
1
+ {"version":3,"file":"1767352862576-DropSettingsFileClean.js","names":[],"sources":["../../src/migrations/1767352862576-DropSettingsFileClean.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class DropSettingsFileClean1767352862576 implements MigrationInterface {\n name = \"DropSettingsFileClean1767352862576\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"temporary_settings\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"server\" text NOT NULL,\n \"credentials\" text NOT NULL,\n \"wizard\" text NOT NULL,\n \"frontend\" text NOT NULL,\n \"timeout\" text NOT NULL\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_settings\"(\n \"id\",\n \"server\",\n \"credentials\",\n \"wizard\",\n \"frontend\",\n \"timeout\"\n )\n SELECT \"id\",\n \"server\",\n \"credentials\",\n \"wizard\",\n \"frontend\",\n \"timeout\"\n FROM \"settings\"\n `);\n await queryRunner.query(`\n DROP TABLE \"settings\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_settings\"\n RENAME TO \"settings\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"settings\"\n RENAME TO \"temporary_settings\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"settings\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"server\" text NOT NULL,\n \"credentials\" text NOT NULL,\n \"wizard\" text NOT NULL,\n \"printerFileClean\" text NOT NULL,\n \"frontend\" text NOT NULL,\n \"timeout\" text NOT NULL\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"settings\"(\n \"id\",\n \"server\",\n \"credentials\",\n \"wizard\",\n \"frontend\",\n \"timeout\"\n )\n SELECT \"id\",\n \"server\",\n \"credentials\",\n \"wizard\",\n \"frontend\",\n \"timeout\"\n FROM \"temporary_settings\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_settings\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,qCAAb,MAA8E;CAC5E,OAAO;CAEP,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;;;;;;;;UASlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;UAgBlB;EACN,MAAM,YAAY,MAAM;;UAElB;EACN,MAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;EACzD,MAAM,YAAY,MAAM;;;UAGlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;UAUlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;UAgBlB;EACN,MAAM,YAAY,MAAM;;UAElB"}
@@ -1 +1 @@
1
- {"version":3,"file":"1767355639023-ChangeFloorLevelToOrder.js","names":[],"sources":["../../src/migrations/1767355639023-ChangeFloorLevelToOrder.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ChangeFloorLevelToOrder1767355639023 implements MigrationInterface {\n name = \"ChangeFloorLevelToOrder1767355639023\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"temporary_floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"order\" integer NOT NULL,\n CONSTRAINT \"UQ_d7b1acf0a04943811027f90a4a4\" UNIQUE (\"order\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_floor\"(\"id\", \"name\", \"order\")\n SELECT \"id\",\n \"name\",\n \"floor\"\n FROM \"floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"floor\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_floor\"\n RENAME TO \"floor\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"temporary_floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"order\" integer NOT NULL,\n CONSTRAINT \"UQ_d7b1acf0a04943811027f90a4a4\" UNIQUE (\"order\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_floor\"(\"id\", \"name\", \"order\")\n SELECT \"id\",\n \"name\",\n \"order\"\n FROM \"floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"floor\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_floor\"\n RENAME TO \"floor\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"floor\"\n RENAME TO \"temporary_floor\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"order\" integer NOT NULL,\n CONSTRAINT \"UQ_d7b1acf0a04943811027f90a4a4\" UNIQUE (\"order\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"floor\"(\"id\", \"name\", \"order\")\n SELECT \"id\",\n \"name\",\n \"order\"\n FROM \"temporary_floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_floor\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"floor\"\n RENAME TO \"temporary_floor\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"floor\" integer NOT NULL,\n CONSTRAINT \"UQ_61b83f63f4e2d1f8c1b331aaf67\" UNIQUE (\"floor\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"floor\"(\"id\", \"name\", \"floor\")\n SELECT \"id\",\n \"name\",\n \"order\"\n FROM \"temporary_floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_floor\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,uCAAb,MAAgF;CAC9E,OAAO;CAEP,MAAa,GAAG,aAAyC;AACvD,QAAM,YAAY,MAAM;;;;;;;UAOlB;AACN,QAAM,YAAY,MAAM;;;;;;UAMlB;AACN,QAAM,YAAY,MAAM;;UAElB;AACN,QAAM,YAAY,MAAM;;;UAGlB;AACN,QAAM,YAAY,MAAM;;;;;;;UAOlB;AACN,QAAM,YAAY,MAAM;;;;;;UAMlB;AACN,QAAM,YAAY,MAAM;;UAElB;AACN,QAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;AACzD,QAAM,YAAY,MAAM;;;UAGlB;AACN,QAAM,YAAY,MAAM;;;;;;;UAOlB;AACN,QAAM,YAAY,MAAM;;;;;;UAMlB;AACN,QAAM,YAAY,MAAM;;UAElB;AACN,QAAM,YAAY,MAAM;;;UAGlB;AACN,QAAM,YAAY,MAAM;;;;;;;UAOlB;AACN,QAAM,YAAY,MAAM;;;;;;UAMlB;AACN,QAAM,YAAY,MAAM;;UAElB"}
1
+ {"version":3,"file":"1767355639023-ChangeFloorLevelToOrder.js","names":[],"sources":["../../src/migrations/1767355639023-ChangeFloorLevelToOrder.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ChangeFloorLevelToOrder1767355639023 implements MigrationInterface {\n name = \"ChangeFloorLevelToOrder1767355639023\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"temporary_floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"order\" integer NOT NULL,\n CONSTRAINT \"UQ_d7b1acf0a04943811027f90a4a4\" UNIQUE (\"order\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_floor\"(\"id\", \"name\", \"order\")\n SELECT \"id\",\n \"name\",\n \"floor\"\n FROM \"floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"floor\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_floor\"\n RENAME TO \"floor\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"temporary_floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"order\" integer NOT NULL,\n CONSTRAINT \"UQ_d7b1acf0a04943811027f90a4a4\" UNIQUE (\"order\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_floor\"(\"id\", \"name\", \"order\")\n SELECT \"id\",\n \"name\",\n \"order\"\n FROM \"floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"floor\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_floor\"\n RENAME TO \"floor\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"floor\"\n RENAME TO \"temporary_floor\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"order\" integer NOT NULL,\n CONSTRAINT \"UQ_d7b1acf0a04943811027f90a4a4\" UNIQUE (\"order\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"floor\"(\"id\", \"name\", \"order\")\n SELECT \"id\",\n \"name\",\n \"order\"\n FROM \"temporary_floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_floor\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"floor\"\n RENAME TO \"temporary_floor\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"floor\" integer NOT NULL,\n CONSTRAINT \"UQ_61b83f63f4e2d1f8c1b331aaf67\" UNIQUE (\"floor\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"floor\"(\"id\", \"name\", \"floor\")\n SELECT \"id\",\n \"name\",\n \"order\"\n FROM \"temporary_floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_floor\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,uCAAb,MAAgF;CAC9E,OAAO;CAEP,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;;;;;;UAOlB;EACN,MAAM,YAAY,MAAM;;;;;;UAMlB;EACN,MAAM,YAAY,MAAM;;UAElB;EACN,MAAM,YAAY,MAAM;;;UAGlB;EACN,MAAM,YAAY,MAAM;;;;;;;UAOlB;EACN,MAAM,YAAY,MAAM;;;;;;UAMlB;EACN,MAAM,YAAY,MAAM;;UAElB;EACN,MAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;EACzD,MAAM,YAAY,MAAM;;;UAGlB;EACN,MAAM,YAAY,MAAM;;;;;;;UAOlB;EACN,MAAM,YAAY,MAAM;;;;;;UAMlB;EACN,MAAM,YAAY,MAAM;;UAElB;EACN,MAAM,YAAY,MAAM;;;UAGlB;EACN,MAAM,YAAY,MAAM;;;;;;;UAOlB;EACN,MAAM,YAAY,MAAM;;;;;;UAMlB;EACN,MAAM,YAAY,MAAM;;UAElB"}
@@ -1 +1 @@
1
- {"version":3,"file":"1767370191762-ChangeFloorNonUniqueOrder.js","names":[],"sources":["../../src/migrations/1767370191762-ChangeFloorNonUniqueOrder.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ChangeFloorNonUniqueOrder1767370191762 implements MigrationInterface {\n name = \"ChangeFloorNonUniqueOrder1767370191762\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"temporary_floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"order\" integer NOT NULL\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_floor\"(\"id\", \"name\", \"order\")\n SELECT \"id\",\n \"name\",\n \"floor\"\n FROM \"floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"floor\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_floor\"\n RENAME TO \"floor\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"floor\"\n RENAME TO \"temporary_floor\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"order\" integer NOT NULL,\n CONSTRAINT \"UQ_d7b1acf0a04943811027f90a4a4\" UNIQUE (\"order\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"floor\"(\"id\", \"name\", \"order\")\n SELECT \"id\",\n \"name\",\n \"order\"\n FROM \"temporary_floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_floor\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,yCAAb,MAAkF;CAChF,OAAO;CAEP,MAAa,GAAG,aAAyC;AACvD,QAAM,YAAY,MAAM;;;;;;UAMlB;AACN,QAAM,YAAY,MAAM;;;;;;UAMlB;AACN,QAAM,YAAY,MAAM;;UAElB;AACN,QAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;AACzD,QAAM,YAAY,MAAM;;;UAGlB;AACN,QAAM,YAAY,MAAM;;;;;;;UAOlB;AACN,QAAM,YAAY,MAAM;;;;;;UAMlB;AACN,QAAM,YAAY,MAAM;;UAElB"}
1
+ {"version":3,"file":"1767370191762-ChangeFloorNonUniqueOrder.js","names":[],"sources":["../../src/migrations/1767370191762-ChangeFloorNonUniqueOrder.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ChangeFloorNonUniqueOrder1767370191762 implements MigrationInterface {\n name = \"ChangeFloorNonUniqueOrder1767370191762\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"temporary_floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"order\" integer NOT NULL\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_floor\"(\"id\", \"name\", \"order\")\n SELECT \"id\",\n \"name\",\n \"floor\"\n FROM \"floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"floor\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_floor\"\n RENAME TO \"floor\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"floor\"\n RENAME TO \"temporary_floor\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"floor\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"order\" integer NOT NULL,\n CONSTRAINT \"UQ_d7b1acf0a04943811027f90a4a4\" UNIQUE (\"order\")\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"floor\"(\"id\", \"name\", \"order\")\n SELECT \"id\",\n \"name\",\n \"order\"\n FROM \"temporary_floor\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_floor\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,yCAAb,MAAkF;CAChF,OAAO;CAEP,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;;;;;UAMlB;EACN,MAAM,YAAY,MAAM;;;;;;UAMlB;EACN,MAAM,YAAY,MAAM;;UAElB;EACN,MAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;EACzD,MAAM,YAAY,MAAM;;;UAGlB;EACN,MAAM,YAAY,MAAM;;;;;;;UAOlB;EACN,MAAM,YAAY,MAAM;;;;;;UAMlB;EACN,MAAM,YAAY,MAAM;;UAElB"}
@@ -1 +1 @@
1
- {"version":3,"file":"1767432108916-RenameGroupToTag.js","names":[],"sources":["../../src/migrations/1767432108916-RenameGroupToTag.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class RenameGroupToTag1767432108916 implements MigrationInterface {\n name = \"RenameGroupToTag1767432108916\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"tag\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"color\" varchar\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"tag\"(\"id\", \"name\")\n SELECT \"id\",\n \"name\"\n FROM \"group\"\n `);\n await queryRunner.dropTable(\"group\");\n\n // Printer tag table\n await queryRunner.query(`\n CREATE TABLE \"printer_tag\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"printerId\" integer NOT NULL,\n \"tagId\" integer NOT NULL,\n CONSTRAINT \"UQ_639867dded1e0409225feb6d194\" UNIQUE (\"printerId\", \"tagId\"),\n CONSTRAINT \"FK_9be94fa12549808ee97522c7ec0\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE CASCADE ON UPDATE NO ACTION,\n CONSTRAINT \"FK_f4a342bd378b98caf8727ab88cb\" FOREIGN KEY (\"tagId\") REFERENCES \"tag\" (\"id\") ON DELETE CASCADE ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"printer_tag\"(\"id\", \"printerId\", \"tagId\")\n SELECT \"id\",\n \"printerId\",\n \"groupId\"\n FROM \"printer_group\"\n `);\n\n await queryRunner.dropTable(\"printer_group\");\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n // Recreate group table first (before printer_group because of foreign key)\n await queryRunner.query(`\n CREATE TABLE \"group\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"group\"(\"id\", \"name\")\n SELECT \"id\",\n \"name\"\n FROM \"tag\"\n `);\n await queryRunner.dropTable(\"tag\");\n\n // Recreate printer_group table\n await queryRunner.query(`\n CREATE TABLE \"printer_group\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"printerId\" integer NOT NULL,\n \"groupId\" integer NOT NULL,\n CONSTRAINT \"UQ_639867dded1e0409225feb6d194\" UNIQUE (\"printerId\", \"groupId\"),\n CONSTRAINT \"FK_9be94fa12549808ee97522c7ec0\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE CASCADE ON UPDATE NO ACTION,\n CONSTRAINT \"FK_f4a342bd378b98caf8727ab88cb\" FOREIGN KEY (\"groupId\") REFERENCES \"group\" (\"id\") ON DELETE CASCADE ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"printer_group\"(\"id\", \"printerId\", \"groupId\")\n SELECT \"id\",\n \"printerId\",\n \"tagId\"\n FROM \"printer_tag\"\n `);\n await queryRunner.dropTable(\"printer_tag\");\n }\n}\n"],"mappings":";AAEA,IAAa,gCAAb,MAAyE;CACvE,OAAO;CAEP,MAAa,GAAG,aAAyC;AACvD,QAAM,YAAY,MAAM;;;;;;;MAOtB;AACF,QAAM,YAAY,MAAM;;;;;MAKtB;AACF,QAAM,YAAY,UAAU,QAAQ;AAGpC,QAAM,YAAY,MAAM;;;;;;;;;;MAUtB;AACF,QAAM,YAAY,MAAM;;;;;;MAMtB;AAEF,QAAM,YAAY,UAAU,gBAAgB;;CAG9C,MAAa,KAAK,aAAyC;AAEzD,QAAM,YAAY,MAAM;;;;;;MAMtB;AACF,QAAM,YAAY,MAAM;;;;;MAKtB;AACF,QAAM,YAAY,UAAU,MAAM;AAGlC,QAAM,YAAY,MAAM;;;;;;;;;;MAUtB;AACF,QAAM,YAAY,MAAM;;;;;;MAMtB;AACF,QAAM,YAAY,UAAU,cAAc"}
1
+ {"version":3,"file":"1767432108916-RenameGroupToTag.js","names":[],"sources":["../../src/migrations/1767432108916-RenameGroupToTag.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class RenameGroupToTag1767432108916 implements MigrationInterface {\n name = \"RenameGroupToTag1767432108916\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"tag\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL,\n \"color\" varchar\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"tag\"(\"id\", \"name\")\n SELECT \"id\",\n \"name\"\n FROM \"group\"\n `);\n await queryRunner.dropTable(\"group\");\n\n // Printer tag table\n await queryRunner.query(`\n CREATE TABLE \"printer_tag\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"printerId\" integer NOT NULL,\n \"tagId\" integer NOT NULL,\n CONSTRAINT \"UQ_639867dded1e0409225feb6d194\" UNIQUE (\"printerId\", \"tagId\"),\n CONSTRAINT \"FK_9be94fa12549808ee97522c7ec0\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE CASCADE ON UPDATE NO ACTION,\n CONSTRAINT \"FK_f4a342bd378b98caf8727ab88cb\" FOREIGN KEY (\"tagId\") REFERENCES \"tag\" (\"id\") ON DELETE CASCADE ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"printer_tag\"(\"id\", \"printerId\", \"tagId\")\n SELECT \"id\",\n \"printerId\",\n \"groupId\"\n FROM \"printer_group\"\n `);\n\n await queryRunner.dropTable(\"printer_group\");\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n // Recreate group table first (before printer_group because of foreign key)\n await queryRunner.query(`\n CREATE TABLE \"group\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"name\" varchar NOT NULL\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"group\"(\"id\", \"name\")\n SELECT \"id\",\n \"name\"\n FROM \"tag\"\n `);\n await queryRunner.dropTable(\"tag\");\n\n // Recreate printer_group table\n await queryRunner.query(`\n CREATE TABLE \"printer_group\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"printerId\" integer NOT NULL,\n \"groupId\" integer NOT NULL,\n CONSTRAINT \"UQ_639867dded1e0409225feb6d194\" UNIQUE (\"printerId\", \"groupId\"),\n CONSTRAINT \"FK_9be94fa12549808ee97522c7ec0\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE CASCADE ON UPDATE NO ACTION,\n CONSTRAINT \"FK_f4a342bd378b98caf8727ab88cb\" FOREIGN KEY (\"groupId\") REFERENCES \"group\" (\"id\") ON DELETE CASCADE ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"printer_group\"(\"id\", \"printerId\", \"groupId\")\n SELECT \"id\",\n \"printerId\",\n \"tagId\"\n FROM \"printer_tag\"\n `);\n await queryRunner.dropTable(\"printer_tag\");\n }\n}\n"],"mappings":";AAEA,IAAa,gCAAb,MAAyE;CACvE,OAAO;CAEP,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;;;;;;MAOtB;EACF,MAAM,YAAY,MAAM;;;;;MAKtB;EACF,MAAM,YAAY,UAAU,QAAQ;EAGpC,MAAM,YAAY,MAAM;;;;;;;;;;MAUtB;EACF,MAAM,YAAY,MAAM;;;;;;MAMtB;EAEF,MAAM,YAAY,UAAU,gBAAgB;;CAG9C,MAAa,KAAK,aAAyC;EAEzD,MAAM,YAAY,MAAM;;;;;;MAMtB;EACF,MAAM,YAAY,MAAM;;;;;MAKtB;EACF,MAAM,YAAY,UAAU,MAAM;EAGlC,MAAM,YAAY,MAAM;;;;;;;;;;MAUtB;EACF,MAAM,YAAY,MAAM;;;;;;MAMtB;EACF,MAAM,YAAY,UAAU,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"1767451444137-AddPrintJob.js","names":[],"sources":["../../src/migrations/1767451444137-AddPrintJob.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class AddPrintJob1767451444137 implements MigrationInterface {\n name = \"AddPrintJob1767451444137\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"print_job\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"printerId\" integer,\n \"printerName\" varchar,\n \"fileName\" varchar NOT NULL,\n \"fileStorageId\" varchar,\n \"fileFormat\" varchar,\n \"fileSize\" integer,\n \"fileHash\" varchar,\n \"createdAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"updatedAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"analyzedAt\" datetime,\n \"startedAt\" datetime,\n \"endedAt\" datetime,\n \"status\" varchar NOT NULL DEFAULT ('PENDING'),\n \"analysisState\" varchar NOT NULL DEFAULT ('NOT_ANALYZED'),\n \"statusReason\" varchar,\n \"progress\" float,\n \"metadata\" json,\n \"statistics\" json,\n \"queuePosition\" integer,\n \"queueGroup\" varchar\n )\n `);\n await queryRunner.query(`\n CREATE TABLE \"temporary_print_job\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"printerId\" integer,\n \"printerName\" varchar,\n \"fileName\" varchar NOT NULL,\n \"fileStorageId\" varchar,\n \"fileFormat\" varchar,\n \"fileSize\" integer,\n \"fileHash\" varchar,\n \"createdAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"updatedAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"analyzedAt\" datetime,\n \"startedAt\" datetime,\n \"endedAt\" datetime,\n \"status\" varchar NOT NULL DEFAULT ('PENDING'),\n \"analysisState\" varchar NOT NULL DEFAULT ('NOT_ANALYZED'),\n \"statusReason\" varchar,\n \"progress\" float,\n \"metadata\" json,\n \"statistics\" json,\n \"queuePosition\" integer,\n \"queueGroup\" varchar,\n CONSTRAINT \"FK_12483257f75235517688864f2d0\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_print_job\"(\n \"id\",\n \"printerId\",\n \"printerName\",\n \"fileName\",\n \"fileStorageId\",\n \"fileFormat\",\n \"fileSize\",\n \"fileHash\",\n \"createdAt\",\n \"updatedAt\",\n \"analyzedAt\",\n \"startedAt\",\n \"endedAt\",\n \"status\",\n \"analysisState\",\n \"statusReason\",\n \"progress\",\n \"metadata\",\n \"statistics\",\n \"queuePosition\",\n \"queueGroup\"\n )\n SELECT \"id\",\n \"printerId\",\n \"printerName\",\n \"fileName\",\n \"fileStorageId\",\n \"fileFormat\",\n \"fileSize\",\n \"fileHash\",\n \"createdAt\",\n \"updatedAt\",\n \"analyzedAt\",\n \"startedAt\",\n \"endedAt\",\n \"status\",\n \"analysisState\",\n \"statusReason\",\n \"progress\",\n \"metadata\",\n \"statistics\",\n \"queuePosition\",\n \"queueGroup\"\n FROM \"print_job\"\n `);\n await queryRunner.query(`\n DROP TABLE \"print_job\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_print_job\"\n RENAME TO \"print_job\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"print_job\"\n RENAME TO \"temporary_print_job\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"print_job\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"printerId\" integer,\n \"printerName\" varchar,\n \"fileName\" varchar NOT NULL,\n \"fileStorageId\" varchar,\n \"fileFormat\" varchar,\n \"fileSize\" integer,\n \"fileHash\" varchar,\n \"createdAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"updatedAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"analyzedAt\" datetime,\n \"startedAt\" datetime,\n \"endedAt\" datetime,\n \"status\" varchar NOT NULL DEFAULT ('PENDING'),\n \"analysisState\" varchar NOT NULL DEFAULT ('NOT_ANALYZED'),\n \"statusReason\" varchar,\n \"progress\" float,\n \"metadata\" json,\n \"statistics\" json,\n \"queuePosition\" integer,\n \"queueGroup\" varchar\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"print_job\"(\n \"id\",\n \"printerId\",\n \"printerName\",\n \"fileName\",\n \"fileStorageId\",\n \"fileFormat\",\n \"fileSize\",\n \"fileHash\",\n \"createdAt\",\n \"updatedAt\",\n \"analyzedAt\",\n \"startedAt\",\n \"endedAt\",\n \"status\",\n \"analysisState\",\n \"statusReason\",\n \"progress\",\n \"metadata\",\n \"statistics\",\n \"queuePosition\",\n \"queueGroup\"\n )\n SELECT \"id\",\n \"printerId\",\n \"printerName\",\n \"fileName\",\n \"fileStorageId\",\n \"fileFormat\",\n \"fileSize\",\n \"fileHash\",\n \"createdAt\",\n \"updatedAt\",\n \"analyzedAt\",\n \"startedAt\",\n \"endedAt\",\n \"status\",\n \"analysisState\",\n \"statusReason\",\n \"progress\",\n \"metadata\",\n \"statistics\",\n \"queuePosition\",\n \"queueGroup\"\n FROM \"temporary_print_job\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_print_job\"\n `);\n await queryRunner.query(`\n DROP TABLE \"print_job\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,2BAAb,MAAoE;CAClE,OAAO;CAEP,MAAa,GAAG,aAAyC;AACvD,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;UAwBlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;UA0BlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA8ClB;AACN,QAAM,YAAY,MAAM;;UAElB;AACN,QAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;AACzD,QAAM,YAAY,MAAM;;;UAGlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;UAwBlB;AACN,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA8ClB;AACN,QAAM,YAAY,MAAM;;UAElB;AACN,QAAM,YAAY,MAAM;;UAElB"}
1
+ {"version":3,"file":"1767451444137-AddPrintJob.js","names":[],"sources":["../../src/migrations/1767451444137-AddPrintJob.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class AddPrintJob1767451444137 implements MigrationInterface {\n name = \"AddPrintJob1767451444137\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"print_job\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"printerId\" integer,\n \"printerName\" varchar,\n \"fileName\" varchar NOT NULL,\n \"fileStorageId\" varchar,\n \"fileFormat\" varchar,\n \"fileSize\" integer,\n \"fileHash\" varchar,\n \"createdAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"updatedAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"analyzedAt\" datetime,\n \"startedAt\" datetime,\n \"endedAt\" datetime,\n \"status\" varchar NOT NULL DEFAULT ('PENDING'),\n \"analysisState\" varchar NOT NULL DEFAULT ('NOT_ANALYZED'),\n \"statusReason\" varchar,\n \"progress\" float,\n \"metadata\" json,\n \"statistics\" json,\n \"queuePosition\" integer,\n \"queueGroup\" varchar\n )\n `);\n await queryRunner.query(`\n CREATE TABLE \"temporary_print_job\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"printerId\" integer,\n \"printerName\" varchar,\n \"fileName\" varchar NOT NULL,\n \"fileStorageId\" varchar,\n \"fileFormat\" varchar,\n \"fileSize\" integer,\n \"fileHash\" varchar,\n \"createdAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"updatedAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"analyzedAt\" datetime,\n \"startedAt\" datetime,\n \"endedAt\" datetime,\n \"status\" varchar NOT NULL DEFAULT ('PENDING'),\n \"analysisState\" varchar NOT NULL DEFAULT ('NOT_ANALYZED'),\n \"statusReason\" varchar,\n \"progress\" float,\n \"metadata\" json,\n \"statistics\" json,\n \"queuePosition\" integer,\n \"queueGroup\" varchar,\n CONSTRAINT \"FK_12483257f75235517688864f2d0\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"temporary_print_job\"(\n \"id\",\n \"printerId\",\n \"printerName\",\n \"fileName\",\n \"fileStorageId\",\n \"fileFormat\",\n \"fileSize\",\n \"fileHash\",\n \"createdAt\",\n \"updatedAt\",\n \"analyzedAt\",\n \"startedAt\",\n \"endedAt\",\n \"status\",\n \"analysisState\",\n \"statusReason\",\n \"progress\",\n \"metadata\",\n \"statistics\",\n \"queuePosition\",\n \"queueGroup\"\n )\n SELECT \"id\",\n \"printerId\",\n \"printerName\",\n \"fileName\",\n \"fileStorageId\",\n \"fileFormat\",\n \"fileSize\",\n \"fileHash\",\n \"createdAt\",\n \"updatedAt\",\n \"analyzedAt\",\n \"startedAt\",\n \"endedAt\",\n \"status\",\n \"analysisState\",\n \"statusReason\",\n \"progress\",\n \"metadata\",\n \"statistics\",\n \"queuePosition\",\n \"queueGroup\"\n FROM \"print_job\"\n `);\n await queryRunner.query(`\n DROP TABLE \"print_job\"\n `);\n await queryRunner.query(`\n ALTER TABLE \"temporary_print_job\"\n RENAME TO \"print_job\"\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n ALTER TABLE \"print_job\"\n RENAME TO \"temporary_print_job\"\n `);\n await queryRunner.query(`\n CREATE TABLE \"print_job\" (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"printerId\" integer,\n \"printerName\" varchar,\n \"fileName\" varchar NOT NULL,\n \"fileStorageId\" varchar,\n \"fileFormat\" varchar,\n \"fileSize\" integer,\n \"fileHash\" varchar,\n \"createdAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"updatedAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"analyzedAt\" datetime,\n \"startedAt\" datetime,\n \"endedAt\" datetime,\n \"status\" varchar NOT NULL DEFAULT ('PENDING'),\n \"analysisState\" varchar NOT NULL DEFAULT ('NOT_ANALYZED'),\n \"statusReason\" varchar,\n \"progress\" float,\n \"metadata\" json,\n \"statistics\" json,\n \"queuePosition\" integer,\n \"queueGroup\" varchar\n )\n `);\n await queryRunner.query(`\n INSERT INTO \"print_job\"(\n \"id\",\n \"printerId\",\n \"printerName\",\n \"fileName\",\n \"fileStorageId\",\n \"fileFormat\",\n \"fileSize\",\n \"fileHash\",\n \"createdAt\",\n \"updatedAt\",\n \"analyzedAt\",\n \"startedAt\",\n \"endedAt\",\n \"status\",\n \"analysisState\",\n \"statusReason\",\n \"progress\",\n \"metadata\",\n \"statistics\",\n \"queuePosition\",\n \"queueGroup\"\n )\n SELECT \"id\",\n \"printerId\",\n \"printerName\",\n \"fileName\",\n \"fileStorageId\",\n \"fileFormat\",\n \"fileSize\",\n \"fileHash\",\n \"createdAt\",\n \"updatedAt\",\n \"analyzedAt\",\n \"startedAt\",\n \"endedAt\",\n \"status\",\n \"analysisState\",\n \"statusReason\",\n \"progress\",\n \"metadata\",\n \"statistics\",\n \"queuePosition\",\n \"queueGroup\"\n FROM \"temporary_print_job\"\n `);\n await queryRunner.query(`\n DROP TABLE \"temporary_print_job\"\n `);\n await queryRunner.query(`\n DROP TABLE \"print_job\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,2BAAb,MAAoE;CAClE,OAAO;CAEP,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;UAwBlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;UA0BlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA8ClB;EACN,MAAM,YAAY,MAAM;;UAElB;EACN,MAAM,YAAY,MAAM;;;UAGlB;;CAGR,MAAa,KAAK,aAAyC;EACzD,MAAM,YAAY,MAAM;;;UAGlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;UAwBlB;EACN,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA8ClB;EACN,MAAM,YAAY,MAAM;;UAElB;EACN,MAAM,YAAY,MAAM;;UAElB"}
@@ -1 +1 @@
1
- {"version":3,"file":"1767909428129-AddPrinterMaintenanceLog.js","names":[],"sources":["../../src/migrations/1767909428129-AddPrinterMaintenanceLog.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class AddPrinterMaintenanceLog1767909428129 implements MigrationInterface {\n name = \"AddPrinterMaintenanceLog1767909428129\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"printer_maintenance_log\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"createdAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"createdBy\" varchar NOT NULL,\n \"createdByUserId\" integer,\n \"printerId\" integer,\n \"printerName\" varchar NOT NULL,\n \"printerUrl\" varchar NOT NULL,\n \"metadata\" json NOT NULL DEFAULT ('{}'),\n \"completed\" boolean NOT NULL DEFAULT (0),\n \"completedAt\" datetime,\n \"completedByUserId\" integer,\n \"completedBy\" varchar,\n CONSTRAINT \"FK_d54c05d7dc0cf426afc8175cfdf\" FOREIGN KEY (\"createdByUserId\") REFERENCES \"user\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION,\n CONSTRAINT \"FK_9740e3fd40554a0e40e595ff66d\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION,\n CONSTRAINT \"FK_36c3aa0f9077a6c06e93e7ec79e\" FOREIGN KEY (\"completedByUserId\") REFERENCES \"user\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n CREATE UNIQUE INDEX \"IDX_14acf30ae0f34a69d98bf92064\" ON \"printer_maintenance_log\" (\"printerId\")\n WHERE completed = 0\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n DROP INDEX \"IDX_14acf30ae0f34a69d98bf92064\"\n `);\n await queryRunner.query(`\n DROP TABLE \"printer_maintenance_log\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,wCAAb,MAAiF;CAC/E,OAAO;CAEP,MAAa,GAAG,aAAyC;AACvD,QAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;MAsBtB;AACF,QAAM,YAAY,MAAM;;;MAGtB;;CAGJ,MAAa,KAAK,aAAyC;AACzD,QAAM,YAAY,MAAM;;MAEtB;AACF,QAAM,YAAY,MAAM;;MAEtB"}
1
+ {"version":3,"file":"1767909428129-AddPrinterMaintenanceLog.js","names":[],"sources":["../../src/migrations/1767909428129-AddPrinterMaintenanceLog.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class AddPrinterMaintenanceLog1767909428129 implements MigrationInterface {\n name = \"AddPrinterMaintenanceLog1767909428129\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"printer_maintenance_log\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"createdAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"createdBy\" varchar NOT NULL,\n \"createdByUserId\" integer,\n \"printerId\" integer,\n \"printerName\" varchar NOT NULL,\n \"printerUrl\" varchar NOT NULL,\n \"metadata\" json NOT NULL DEFAULT ('{}'),\n \"completed\" boolean NOT NULL DEFAULT (0),\n \"completedAt\" datetime,\n \"completedByUserId\" integer,\n \"completedBy\" varchar,\n CONSTRAINT \"FK_d54c05d7dc0cf426afc8175cfdf\" FOREIGN KEY (\"createdByUserId\") REFERENCES \"user\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION,\n CONSTRAINT \"FK_9740e3fd40554a0e40e595ff66d\" FOREIGN KEY (\"printerId\") REFERENCES \"printer\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION,\n CONSTRAINT \"FK_36c3aa0f9077a6c06e93e7ec79e\" FOREIGN KEY (\"completedByUserId\") REFERENCES \"user\" (\"id\") ON DELETE\n SET NULL ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n CREATE UNIQUE INDEX \"IDX_14acf30ae0f34a69d98bf92064\" ON \"printer_maintenance_log\" (\"printerId\")\n WHERE completed = 0\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n DROP INDEX \"IDX_14acf30ae0f34a69d98bf92064\"\n `);\n await queryRunner.query(`\n DROP TABLE \"printer_maintenance_log\"\n `);\n }\n}\n"],"mappings":";AAEA,IAAa,wCAAb,MAAiF;CAC/E,OAAO;CAEP,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;;;;;;;;;;;;;;;;;;;;;MAsBtB;EACF,MAAM,YAAY,MAAM;;;MAGtB;;CAGJ,MAAa,KAAK,aAAyC;EACzD,MAAM,YAAY,MAAM;;MAEtB;EACF,MAAM,YAAY,MAAM;;MAEtB"}
@@ -0,0 +1,49 @@
1
+ //#region src/migrations/1778446203015-AddApiKey.ts
2
+ var AddApiKey1778446203015 = class {
3
+ name = "AddApiKey1778446203015";
4
+ async up(queryRunner) {
5
+ await queryRunner.query(`
6
+ CREATE TABLE "api_key"
7
+ (
8
+ "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
9
+ "createdByUserId" integer NOT NULL,
10
+ "label" varchar NOT NULL,
11
+ "prefix" varchar NOT NULL,
12
+ "hashedSecret" varchar NOT NULL,
13
+ "createdAt" datetime NOT NULL DEFAULT (datetime('now')),
14
+ "lastUsedAt" datetime,
15
+ CONSTRAINT "FK_api_key_created_by_user" FOREIGN KEY ("createdByUserId") REFERENCES "user" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
16
+ )
17
+ `);
18
+ await queryRunner.query(`
19
+ CREATE UNIQUE INDEX "IDX_api_key_prefix" ON "api_key" ("prefix")
20
+ `);
21
+ await queryRunner.query(`
22
+ CREATE TABLE "api_key_role"
23
+ (
24
+ "apiKeyId" integer NOT NULL,
25
+ "roleId" integer NOT NULL,
26
+ PRIMARY KEY ("apiKeyId", "roleId"),
27
+ CONSTRAINT "FK_api_key_role_api_key" FOREIGN KEY ("apiKeyId") REFERENCES "api_key" ("id") ON DELETE CASCADE ON UPDATE NO ACTION,
28
+ CONSTRAINT "FK_api_key_role_role" FOREIGN KEY ("roleId") REFERENCES "role" ("id") ON DELETE CASCADE ON UPDATE NO ACTION
29
+ )
30
+ `);
31
+ await queryRunner.query(`
32
+ CREATE INDEX "IDX_api_key_role_apiKeyId" ON "api_key_role" ("apiKeyId")
33
+ `);
34
+ await queryRunner.query(`
35
+ CREATE INDEX "IDX_api_key_role_roleId" ON "api_key_role" ("roleId")
36
+ `);
37
+ }
38
+ async down(queryRunner) {
39
+ await queryRunner.query(`DROP INDEX "IDX_api_key_role_roleId"`);
40
+ await queryRunner.query(`DROP INDEX "IDX_api_key_role_apiKeyId"`);
41
+ await queryRunner.query(`DROP TABLE "api_key_role"`);
42
+ await queryRunner.query(`DROP INDEX "IDX_api_key_prefix"`);
43
+ await queryRunner.query(`DROP TABLE "api_key"`);
44
+ }
45
+ };
46
+ //#endregion
47
+ export { AddApiKey1778446203015 };
48
+
49
+ //# sourceMappingURL=1778446203015-AddApiKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1778446203015-AddApiKey.js","names":[],"sources":["../../src/migrations/1778446203015-AddApiKey.ts"],"sourcesContent":["import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class AddApiKey1778446203015 implements MigrationInterface {\n name = \"AddApiKey1778446203015\";\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`\n CREATE TABLE \"api_key\"\n (\n \"id\" integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n \"createdByUserId\" integer NOT NULL,\n \"label\" varchar NOT NULL,\n \"prefix\" varchar NOT NULL,\n \"hashedSecret\" varchar NOT NULL,\n \"createdAt\" datetime NOT NULL DEFAULT (datetime('now')),\n \"lastUsedAt\" datetime,\n CONSTRAINT \"FK_api_key_created_by_user\" FOREIGN KEY (\"createdByUserId\") REFERENCES \"user\" (\"id\") ON DELETE CASCADE ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n CREATE UNIQUE INDEX \"IDX_api_key_prefix\" ON \"api_key\" (\"prefix\")\n `);\n await queryRunner.query(`\n CREATE TABLE \"api_key_role\"\n (\n \"apiKeyId\" integer NOT NULL,\n \"roleId\" integer NOT NULL,\n PRIMARY KEY (\"apiKeyId\", \"roleId\"),\n CONSTRAINT \"FK_api_key_role_api_key\" FOREIGN KEY (\"apiKeyId\") REFERENCES \"api_key\" (\"id\") ON DELETE CASCADE ON UPDATE NO ACTION,\n CONSTRAINT \"FK_api_key_role_role\" FOREIGN KEY (\"roleId\") REFERENCES \"role\" (\"id\") ON DELETE CASCADE ON UPDATE NO ACTION\n )\n `);\n await queryRunner.query(`\n CREATE INDEX \"IDX_api_key_role_apiKeyId\" ON \"api_key_role\" (\"apiKeyId\")\n `);\n await queryRunner.query(`\n CREATE INDEX \"IDX_api_key_role_roleId\" ON \"api_key_role\" (\"roleId\")\n `);\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n await queryRunner.query(`DROP INDEX \"IDX_api_key_role_roleId\"`);\n await queryRunner.query(`DROP INDEX \"IDX_api_key_role_apiKeyId\"`);\n await queryRunner.query(`DROP TABLE \"api_key_role\"`);\n await queryRunner.query(`DROP INDEX \"IDX_api_key_prefix\"`);\n await queryRunner.query(`DROP TABLE \"api_key\"`);\n }\n}\n"],"mappings":";AAEA,IAAa,yBAAb,MAAkE;CAChE,OAAO;CAEP,MAAa,GAAG,aAAyC;EACvD,MAAM,YAAY,MAAM;;;;;;;;;;;;MAYtB;EACF,MAAM,YAAY,MAAM;;MAEtB;EACF,MAAM,YAAY,MAAM;;;;;;;;;MAStB;EACF,MAAM,YAAY,MAAM;;MAEtB;EACF,MAAM,YAAY,MAAM;;MAEtB;;CAGJ,MAAa,KAAK,aAAyC;EACzD,MAAM,YAAY,MAAM,uCAAuC;EAC/D,MAAM,YAAY,MAAM,yCAAyC;EACjE,MAAM,YAAY,MAAM,4BAA4B;EACpD,MAAM,YAAY,MAAM,kCAAkC;EAC1D,MAAM,YAAY,MAAM,uBAAuB"}
@@ -1 +1 @@
1
- {"version":3,"file":"controllers-plugin.js","names":[],"sources":["../../src/plugins/controllers-plugin.ts"],"sourcesContent":["import glob from \"fast-glob\";\n\nconst VIRTUAL_ID = \"virtual:controllers\";\nconst RESOLVED_ID = \"\\0virtual:controllers\";\n\nexport function controllersPlugin(pattern = \"src/controllers/*.controller.ts\") {\n return {\n name: \"vite-plugin-controllers\",\n resolveId(id: string) {\n if (id === VIRTUAL_ID) return RESOLVED_ID;\n },\n async load(id: string) {\n if (id !== RESOLVED_ID) return;\n\n const files = await glob(pattern, { absolute: true });\n const imports = files.map((f, i) => `import * as m${i} from ${JSON.stringify(f)};`).join(\"\\n\");\n const exports = `export default [${files.map((_, i) => `m${i}`).join(\", \")}];`;\n return `${imports}\\n${exports}`;\n },\n };\n}\n"],"mappings":";;AAEA,MAAM,aAAa;AACnB,MAAM,cAAc;AAEpB,SAAgB,kBAAkB,UAAU,mCAAmC;AAC7E,QAAO;EACL,MAAM;EACN,UAAU,IAAY;AACpB,OAAI,OAAO,WAAY,QAAO;;EAEhC,MAAM,KAAK,IAAY;AACrB,OAAI,OAAO,YAAa;GAExB,MAAM,QAAQ,MAAM,KAAK,SAAS,EAAE,UAAU,MAAM,CAAC;AAGrD,UAAO,GAFS,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,QAAQ,KAAK,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,KAExE,CAAC,IAAI,mBADa,MAAM,KAAK,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;;EAG9E"}
1
+ {"version":3,"file":"controllers-plugin.js","names":[],"sources":["../../src/plugins/controllers-plugin.ts"],"sourcesContent":["import glob from \"fast-glob\";\n\nconst VIRTUAL_ID = \"virtual:controllers\";\nconst RESOLVED_ID = \"\\0virtual:controllers\";\n\nexport function controllersPlugin(pattern = \"src/controllers/*.controller.ts\") {\n return {\n name: \"vite-plugin-controllers\",\n resolveId(id: string) {\n if (id === VIRTUAL_ID) return RESOLVED_ID;\n },\n async load(id: string) {\n if (id !== RESOLVED_ID) return;\n\n const files = await glob(pattern, { absolute: true });\n const imports = files.map((f, i) => `import * as m${i} from ${JSON.stringify(f)};`).join(\"\\n\");\n const exports = `export default [${files.map((_, i) => `m${i}`).join(\", \")}];`;\n return `${imports}\\n${exports}`;\n },\n };\n}\n"],"mappings":";;AAEA,MAAM,aAAa;AACnB,MAAM,cAAc;AAEpB,SAAgB,kBAAkB,UAAU,mCAAmC;CAC7E,OAAO;EACL,MAAM;EACN,UAAU,IAAY;GACpB,IAAI,OAAO,YAAY,OAAO;;EAEhC,MAAM,KAAK,IAAY;GACrB,IAAI,OAAO,aAAa;GAExB,MAAM,QAAQ,MAAM,KAAK,SAAS,EAAE,UAAU,MAAM,CAAC;GAGrD,OAAO,GAFS,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,QAAQ,KAAK,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,KAExE,CAAC,IAAI,mBADa,MAAM,KAAK,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC;;EAG9E"}
@@ -37,6 +37,7 @@ const AppConstants = {
37
37
  OVERRIDE_JWT_AUDIENCE: "OVERRIDE_JWT_AUDIENCE",
38
38
  DEFAULT_JWT_AUDIENCE: "fdm-monster-client-next",
39
39
  OVERRIDE_IS_DEMO_MODE: "OVERRIDE_IS_DEMO_MODE",
40
+ INSTANCE_LABEL: "INSTANCE_LABEL",
40
41
  OVERRIDE_DEMO_USERNAME: "OVERRIDE_DEMO_USERNAME",
41
42
  DEFAULT_DEMO_USERNAME: "demo",
42
43
  OVERRIDE_DEMO_PASSWORD: "OVERRIDE_DEMO_PASSWORD",
@@ -61,7 +62,7 @@ const AppConstants = {
61
62
  docsUrl: "https://docs.fdm-monster.net",
62
63
  orgName: "fdm-monster",
63
64
  currentWizardVersion: 1,
64
- defaultClientMinimum: "2.3.3",
65
+ defaultClientMinimum: "2.4.2",
65
66
  defaultWebsocketHandshakeTimeout: 3e3,
66
67
  defaultSocketThrottleRate: 1,
67
68
  debugSocketStatesKey: "DEBUG_SOCKET_STATES",
@@ -1 +1 @@
1
- {"version":3,"file":"server.constants.js","names":[],"sources":["../src/server.constants.ts"],"sourcesContent":["export const AppConstants = {\n NODE_ENV_KEY: \"NODE_ENV\",\n VERSION_KEY: \"npm_package_version\",\n SERVER_PORT_KEY: \"SERVER_PORT\",\n DATABASE_PATH: \"DATABASE_PATH\",\n defaultDatabasePath: \"./database\",\n DATABASE_FILE: \"DATABASE_FILE\",\n defaultDatabaseFile: \"./fdm-monster.sqlite\",\n\n pm2ServiceName: \"FDM\",\n logAppName: \"fdm-monster\",\n\n MEDIA_PATH: \"MEDIA_PATH\",\n defaultBaseMediaPath: \"./media\",\n defaultLogsFolder: \"logs\",\n defaultLogZipsFolder: \"log-zips\",\n // New place for all downloads, files etc\n defaultClientBundleStorage: \"client-dist\",\n defaultClientBundleZipsStorage: \"client-dist-zips\",\n defaultPrinterThumbnailsStorage: \"printer-thumbnails\",\n defaultFileUploadsStorage: \"file-uploads\",\n defaultPrintFilesStorage: \"files\",\n defaultAcceptedGcodeExtensions: [\".gcode\", \".bgcode\"],\n defaultAcceptedBambuExtensions: [\".3mf\"],\n defaultServerPort: 4000,\n apiRoute: \"/api/v2\",\n enableClientDistAutoUpdateKey: \"ENABLE_CLIENT_DIST_AUTO_UPDATE\",\n\n // Boolean string (true/false), persisted always\n OVERRIDE_LOGIN_REQUIRED: \"OVERRIDE_LOGIN_REQUIRED\",\n // Boolean string (true/false), persisted always\n OVERRIDE_REGISTRATION_ENABLED: \"OVERRIDE_REGISTRATION_ENABLED\",\n // Number\n DEFAULT_USERNAME_MINLEN: 3,\n // Number\n DEFAULT_PASSWORD_MINLEN: 8,\n // String, persisted always\n OVERRIDE_JWT_SECRET: \"OVERRIDE_JWT_SECRET\",\n // Number, Seconds, persisted always\n OVERRIDE_JWT_EXPIRES_IN: \"OVERRIDE_JWT_EXPIRES_IN\",\n DEFAULT_JWT_EXPIRES_IN: 60 * 60, // 1 hour\n // Number\n DEFAULT_REFRESH_TOKEN_ATTEMPTS: -1, // 50 attempts, 50 hours\n // Number, Milli-seconds\n DEFAULT_REFRESH_TOKEN_EXPIRY: 60 * 60 * 24 * 14, // 14 days (in ms)\n // String, not persisted\n OVERRIDE_JWT_ISSUER: \"OVERRIDE_JWT_ISSUER\",\n DEFAULT_JWT_ISSUER: \"fdm-monster-server\",\n // String, not persisted\n OVERRIDE_JWT_AUDIENCE: \"OVERRIDE_JWT_AUDIENCE\",\n DEFAULT_JWT_AUDIENCE: \"fdm-monster-client-next\",\n\n OVERRIDE_IS_DEMO_MODE: \"OVERRIDE_IS_DEMO_MODE\",\n OVERRIDE_DEMO_USERNAME: \"OVERRIDE_DEMO_USERNAME\",\n DEFAULT_DEMO_USERNAME: \"demo\",\n OVERRIDE_DEMO_PASSWORD: \"OVERRIDE_DEMO_PASSWORD\",\n DEFAULT_DEMO_PASSWORD: \"demo2023\",\n OVERRIDE_DEMO_ROLE: \"OVERRIDE_DEMO_ROLE\",\n DEFAULT_DEMO_ROLE: \"ADMIN\",\n\n defaultDevelopmentEnv: \"development\",\n ENABLE_COLORED_LOGS_KEY: \"ENABLE_COLORED_LOGS\",\n defaultTestEnv: \"test\",\n defaultProductionEnv: \"production\",\n knownEnvNames: [\"development\", \"production\", \"test\"],\n GITHUB_PAT: \"GITHUB_PAT\",\n serverPackageName: \"@fdm-monster/server\",\n serverRepoName: \"fdm-monster\",\n clientPackageName: \"@fdm-monster/client-next\",\n clientRepoName: \"fdm-monster-client-next\",\n githubUrl: \"https://github.com/fdm-monster/fdm-monster\",\n docsUrl: \"https://docs.fdm-monster.net\",\n orgName: \"fdm-monster\",\n // Wizard version changes will trigger a re-run of the wizard\n currentWizardVersion: 1,\n defaultClientMinimum: \"2.3.3\",\n\n // Websocket values\n defaultWebsocketHandshakeTimeout: 3000,\n defaultSocketThrottleRate: 1,\n debugSocketStatesKey: \"DEBUG_SOCKET_STATES\",\n defaultDebugSocketStates: \"false\",\n\n // MonsterPi\n monsterPiFilePath: \"/etc/monsterpi_version\",\n\n // Sentry\n sentryCustomDsnToken: \"SENTRY_CUSTOM_DSN\",\n sentryCustomDsnDefault:\n \"https://164b8028a8a745bba3dbcab991b84ae7@o4503975545733120.ingest.sentry.io/4505101598261248\",\n\n ENABLE_PROMETHEUS_METRICS: \"ENABLE_PROMETHEUS_METRICS\",\n ENABLE_LOKI_LOGGING: \"ENABLE_LOKI_LOGGING\",\n LOKI_ADDRESS: \"LOKI_ADDRESS\",\n LOKI_TIMEOUT_SECONDS: \"LOKI_TIMEOUT_SECONDS\",\n LOKI_INTERVAL: \"LOKI_INTERVAL\",\n\n // Swagger/OpenAPI Documentation\n DISABLE_SWAGGER_OPENAPI: \"DISABLE_SWAGGER_OPENAPI\",\n GENERATE_SWAGGER_JSON: \"GENERATE_SWAGGER_JSON\",\n};\n"],"mappings":";AAAA,MAAa,eAAe;CAC1B,cAAc;CACd,aAAa;CACb,iBAAiB;CACjB,eAAe;CACf,qBAAqB;CACrB,eAAe;CACf,qBAAqB;CAErB,gBAAgB;CAChB,YAAY;CAEZ,YAAY;CACZ,sBAAsB;CACtB,mBAAmB;CACnB,sBAAsB;CAEtB,4BAA4B;CAC5B,gCAAgC;CAChC,iCAAiC;CACjC,2BAA2B;CAC3B,0BAA0B;CAC1B,gCAAgC,CAAC,UAAU,UAAU;CACrD,gCAAgC,CAAC,OAAO;CACxC,mBAAmB;CACnB,UAAU;CACV,+BAA+B;CAG/B,yBAAyB;CAEzB,+BAA+B;CAE/B,yBAAyB;CAEzB,yBAAyB;CAEzB,qBAAqB;CAErB,yBAAyB;CACzB,wBAAwB;CAExB,gCAAgC;CAEhC,8BAA8B,OAAU,KAAK;CAE7C,qBAAqB;CACrB,oBAAoB;CAEpB,uBAAuB;CACvB,sBAAsB;CAEtB,uBAAuB;CACvB,wBAAwB;CACxB,uBAAuB;CACvB,wBAAwB;CACxB,uBAAuB;CACvB,oBAAoB;CACpB,mBAAmB;CAEnB,uBAAuB;CACvB,yBAAyB;CACzB,gBAAgB;CAChB,sBAAsB;CACtB,eAAe;EAAC;EAAe;EAAc;EAAO;CACpD,YAAY;CACZ,mBAAmB;CACnB,gBAAgB;CAChB,mBAAmB;CACnB,gBAAgB;CAChB,WAAW;CACX,SAAS;CACT,SAAS;CAET,sBAAsB;CACtB,sBAAsB;CAGtB,kCAAkC;CAClC,2BAA2B;CAC3B,sBAAsB;CACtB,0BAA0B;CAG1B,mBAAmB;CAGnB,sBAAsB;CACtB,wBACE;CAEF,2BAA2B;CAC3B,qBAAqB;CACrB,cAAc;CACd,sBAAsB;CACtB,eAAe;CAGf,yBAAyB;CACzB,uBAAuB;CACxB"}
1
+ {"version":3,"file":"server.constants.js","names":[],"sources":["../src/server.constants.ts"],"sourcesContent":["export const AppConstants = {\n NODE_ENV_KEY: \"NODE_ENV\",\n VERSION_KEY: \"npm_package_version\",\n SERVER_PORT_KEY: \"SERVER_PORT\",\n DATABASE_PATH: \"DATABASE_PATH\",\n defaultDatabasePath: \"./database\",\n DATABASE_FILE: \"DATABASE_FILE\",\n defaultDatabaseFile: \"./fdm-monster.sqlite\",\n\n pm2ServiceName: \"FDM\",\n logAppName: \"fdm-monster\",\n\n MEDIA_PATH: \"MEDIA_PATH\",\n defaultBaseMediaPath: \"./media\",\n defaultLogsFolder: \"logs\",\n defaultLogZipsFolder: \"log-zips\",\n // New place for all downloads, files etc\n defaultClientBundleStorage: \"client-dist\",\n defaultClientBundleZipsStorage: \"client-dist-zips\",\n defaultPrinterThumbnailsStorage: \"printer-thumbnails\",\n defaultFileUploadsStorage: \"file-uploads\",\n defaultPrintFilesStorage: \"files\",\n defaultAcceptedGcodeExtensions: [\".gcode\", \".bgcode\"],\n defaultAcceptedBambuExtensions: [\".3mf\"],\n defaultServerPort: 4000,\n apiRoute: \"/api/v2\",\n enableClientDistAutoUpdateKey: \"ENABLE_CLIENT_DIST_AUTO_UPDATE\",\n\n // Boolean string (true/false), persisted always\n OVERRIDE_LOGIN_REQUIRED: \"OVERRIDE_LOGIN_REQUIRED\",\n // Boolean string (true/false), persisted always\n OVERRIDE_REGISTRATION_ENABLED: \"OVERRIDE_REGISTRATION_ENABLED\",\n // Number\n DEFAULT_USERNAME_MINLEN: 3,\n // Number\n DEFAULT_PASSWORD_MINLEN: 8,\n // String, persisted always\n OVERRIDE_JWT_SECRET: \"OVERRIDE_JWT_SECRET\",\n // Number, Seconds, persisted always\n OVERRIDE_JWT_EXPIRES_IN: \"OVERRIDE_JWT_EXPIRES_IN\",\n DEFAULT_JWT_EXPIRES_IN: 60 * 60, // 1 hour\n // Number\n DEFAULT_REFRESH_TOKEN_ATTEMPTS: -1, // 50 attempts, 50 hours\n // Number, Milli-seconds\n DEFAULT_REFRESH_TOKEN_EXPIRY: 60 * 60 * 24 * 14, // 14 days (in ms)\n // String, not persisted\n OVERRIDE_JWT_ISSUER: \"OVERRIDE_JWT_ISSUER\",\n DEFAULT_JWT_ISSUER: \"fdm-monster-server\",\n // String, not persisted\n OVERRIDE_JWT_AUDIENCE: \"OVERRIDE_JWT_AUDIENCE\",\n DEFAULT_JWT_AUDIENCE: \"fdm-monster-client-next\",\n\n OVERRIDE_IS_DEMO_MODE: \"OVERRIDE_IS_DEMO_MODE\",\n INSTANCE_LABEL: \"INSTANCE_LABEL\",\n OVERRIDE_DEMO_USERNAME: \"OVERRIDE_DEMO_USERNAME\",\n DEFAULT_DEMO_USERNAME: \"demo\",\n OVERRIDE_DEMO_PASSWORD: \"OVERRIDE_DEMO_PASSWORD\",\n DEFAULT_DEMO_PASSWORD: \"demo2023\",\n OVERRIDE_DEMO_ROLE: \"OVERRIDE_DEMO_ROLE\",\n DEFAULT_DEMO_ROLE: \"ADMIN\",\n\n defaultDevelopmentEnv: \"development\",\n ENABLE_COLORED_LOGS_KEY: \"ENABLE_COLORED_LOGS\",\n defaultTestEnv: \"test\",\n defaultProductionEnv: \"production\",\n knownEnvNames: [\"development\", \"production\", \"test\"],\n GITHUB_PAT: \"GITHUB_PAT\",\n serverPackageName: \"@fdm-monster/server\",\n serverRepoName: \"fdm-monster\",\n clientPackageName: \"@fdm-monster/client-next\",\n clientRepoName: \"fdm-monster-client-next\",\n githubUrl: \"https://github.com/fdm-monster/fdm-monster\",\n docsUrl: \"https://docs.fdm-monster.net\",\n orgName: \"fdm-monster\",\n // Wizard version changes will trigger a re-run of the wizard\n currentWizardVersion: 1,\n defaultClientMinimum: \"2.4.2\",\n\n // Websocket values\n defaultWebsocketHandshakeTimeout: 3000,\n defaultSocketThrottleRate: 1,\n debugSocketStatesKey: \"DEBUG_SOCKET_STATES\",\n defaultDebugSocketStates: \"false\",\n\n // MonsterPi\n monsterPiFilePath: \"/etc/monsterpi_version\",\n\n // Sentry\n sentryCustomDsnToken: \"SENTRY_CUSTOM_DSN\",\n sentryCustomDsnDefault:\n \"https://164b8028a8a745bba3dbcab991b84ae7@o4503975545733120.ingest.sentry.io/4505101598261248\",\n\n ENABLE_PROMETHEUS_METRICS: \"ENABLE_PROMETHEUS_METRICS\",\n ENABLE_LOKI_LOGGING: \"ENABLE_LOKI_LOGGING\",\n LOKI_ADDRESS: \"LOKI_ADDRESS\",\n LOKI_TIMEOUT_SECONDS: \"LOKI_TIMEOUT_SECONDS\",\n LOKI_INTERVAL: \"LOKI_INTERVAL\",\n\n // Swagger/OpenAPI Documentation\n DISABLE_SWAGGER_OPENAPI: \"DISABLE_SWAGGER_OPENAPI\",\n GENERATE_SWAGGER_JSON: \"GENERATE_SWAGGER_JSON\",\n};\n"],"mappings":";AAAA,MAAa,eAAe;CAC1B,cAAc;CACd,aAAa;CACb,iBAAiB;CACjB,eAAe;CACf,qBAAqB;CACrB,eAAe;CACf,qBAAqB;CAErB,gBAAgB;CAChB,YAAY;CAEZ,YAAY;CACZ,sBAAsB;CACtB,mBAAmB;CACnB,sBAAsB;CAEtB,4BAA4B;CAC5B,gCAAgC;CAChC,iCAAiC;CACjC,2BAA2B;CAC3B,0BAA0B;CAC1B,gCAAgC,CAAC,UAAU,UAAU;CACrD,gCAAgC,CAAC,OAAO;CACxC,mBAAmB;CACnB,UAAU;CACV,+BAA+B;CAG/B,yBAAyB;CAEzB,+BAA+B;CAE/B,yBAAyB;CAEzB,yBAAyB;CAEzB,qBAAqB;CAErB,yBAAyB;CACzB,wBAAwB;CAExB,gCAAgC;CAEhC,8BAA8B,OAAU,KAAK;CAE7C,qBAAqB;CACrB,oBAAoB;CAEpB,uBAAuB;CACvB,sBAAsB;CAEtB,uBAAuB;CACvB,gBAAgB;CAChB,wBAAwB;CACxB,uBAAuB;CACvB,wBAAwB;CACxB,uBAAuB;CACvB,oBAAoB;CACpB,mBAAmB;CAEnB,uBAAuB;CACvB,yBAAyB;CACzB,gBAAgB;CAChB,sBAAsB;CACtB,eAAe;EAAC;EAAe;EAAc;EAAO;CACpD,YAAY;CACZ,mBAAmB;CACnB,gBAAgB;CAChB,mBAAmB;CACnB,gBAAgB;CAChB,WAAW;CACX,SAAS;CACT,SAAS;CAET,sBAAsB;CACtB,sBAAsB;CAGtB,kCAAkC;CAClC,2BAA2B;CAC3B,sBAAsB;CACtB,0BAA0B;CAG1B,mBAAmB;CAGnB,sBAAsB;CACtB,wBACE;CAEF,2BAA2B;CAC3B,qBAAqB;CACrB,cAAc;CACd,sBAAsB;CACtB,eAAe;CAGf,yBAAyB;CACzB,uBAAuB;CACxB"}
@@ -4,11 +4,11 @@ import { LoggerService } from "./handlers/logger.js";
4
4
  import { configureContainer } from "./container.js";
5
5
  import { interceptDatabaseError } from "./middleware/database.js";
6
6
  import { interceptRoles, validateWizardCompleted } from "./middleware/global.middleware.js";
7
+ import passport from "passport";
7
8
  import { Counter } from "prom-client";
8
9
  import express, { json, urlencoded } from "express";
9
10
  import { scopePerRequest } from "awilix-express";
10
11
  import cookieParser from "cookie-parser";
11
- import passport from "passport";
12
12
  import cors from "cors";
13
13
  import helmet from "helmet";
14
14
  //#region src/server.core.ts
@@ -49,7 +49,11 @@ async function setupServer() {
49
49
  }).use(cors({
50
50
  origin: "*",
51
51
  methods: "GET,HEAD,PUT,PATCH,POST,DELETE"
52
- })).use(helmet({ contentSecurityPolicy: false })).use(json({ limit: "10mb" })).use(cookieParser()).use(urlencoded({ extended: false })).use(passport.initialize()).use(passport.authenticate(["jwt", "anonymous"], { session: false })).use(scopePerRequest(container)).use(interceptDatabaseError).use(validateWizardCompleted).use(interceptRoles);
52
+ })).use(helmet({ contentSecurityPolicy: false })).use(json({ limit: "10mb" })).use(cookieParser()).use(urlencoded({ extended: false })).use(passport.initialize()).use(passport.authenticate([
53
+ "jwt",
54
+ "api-key",
55
+ "anonymous"
56
+ ], { session: false })).use(scopePerRequest(container)).use(interceptDatabaseError).use(validateWizardCompleted).use(interceptRoles);
53
57
  return {
54
58
  httpServer,
55
59
  container
@@ -1 +1 @@
1
- {"version":3,"file":"server.core.js","names":[],"sources":["../src/server.core.ts"],"sourcesContent":["import express, { json, urlencoded } from \"express\";\nimport cookieParser from \"cookie-parser\";\nimport passport from \"passport\";\nimport cors from \"cors\";\nimport helmet from \"helmet\";\nimport { scopePerRequest } from \"awilix-express\";\nimport { configureContainer } from \"./container\";\nimport { interceptDatabaseError } from \"./middleware/database\";\nimport { interceptRoles, validateWizardCompleted } from \"./middleware/global.middleware\";\nimport { initializePassportStrategies } from \"./middleware/passport\";\nimport { ensureDirExists, getDatabaseFolder, getMediaPath } from \"@/utils/fs.utils\";\nimport { Counter } from \"prom-client\";\nimport { LoggerService } from \"@/handlers/logger\";\n\nconst httpRequestsTotal = new Counter({\n name: \"http_requests_total\",\n help: \"HTTP requests executed\",\n});\n\nexport async function setupServer() {\n const logger = new LoggerService(\"FDM-ServerCore\");\n const httpServer = express();\n\n const databasePath = getDatabaseFolder();\n ensureDirExists(databasePath);\n logger.log(`Expecting database at path ${databasePath}`);\n\n const mediaPath = getMediaPath();\n ensureDirExists(mediaPath);\n logger.log(`Expecting media at path ${mediaPath}`);\n\n const container = configureContainer();\n initializePassportStrategies(passport, container);\n\n httpServer\n .use((req, res, next) => {\n const route = req.route?.path ?? req.path ?? \"unknown\";\n\n if (route.includes(\"/api\")) {\n const start = process.hrtime();\n\n res.on(\"finish\", () => {\n httpRequestsTotal.inc();\n\n const delta = process.hrtime(start);\n const duration = delta[0] + delta[1] / 1e9;\n const logger = new LoggerService(\"HttpRequest\");\n logger.newDebug({\n message: `HTTP request ${req.method} ${req.originalUrl} ${res.statusCode}`,\n method: req.method,\n path: req.originalUrl,\n statusCode: res.statusCode,\n responseTimeMs: duration.toFixed(2),\n clientIp: req.ip,\n userAgent: req.get(\"User-Agent\"),\n });\n });\n }\n\n next();\n })\n .use(\n cors({\n origin: \"*\",\n methods: \"GET,HEAD,PUT,PATCH,POST,DELETE\",\n }),\n )\n .use(\n helmet({\n contentSecurityPolicy: false,\n }),\n )\n .use(json({ limit: \"10mb\" }))\n .use(cookieParser())\n .use(urlencoded({ extended: false }))\n .use(passport.initialize())\n .use(passport.authenticate([\"jwt\", \"anonymous\"], { session: false }))\n .use(scopePerRequest(container))\n .use(interceptDatabaseError)\n // Global guards\n .use(validateWizardCompleted)\n .use(interceptRoles);\n\n return {\n httpServer,\n container,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,oBAAoB,IAAI,QAAQ;CACpC,MAAM;CACN,MAAM;CACP,CAAC;AAEF,eAAsB,cAAc;CAClC,MAAM,SAAS,IAAI,cAAc,iBAAiB;CAClD,MAAM,aAAa,SAAS;CAE5B,MAAM,eAAe,mBAAmB;AACxC,iBAAgB,aAAa;AAC7B,QAAO,IAAI,8BAA8B,eAAe;CAExD,MAAM,YAAY,cAAc;AAChC,iBAAgB,UAAU;AAC1B,QAAO,IAAI,2BAA2B,YAAY;CAElD,MAAM,YAAY,oBAAoB;AACtC,8BAA6B,UAAU,UAAU;AAEjD,YACG,KAAK,KAAK,KAAK,SAAS;AAGvB,OAFc,IAAI,OAAO,QAAQ,IAAI,QAAQ,WAEnC,SAAS,OAAO,EAAE;GAC1B,MAAM,QAAQ,QAAQ,QAAQ;AAE9B,OAAI,GAAG,gBAAgB;AACrB,sBAAkB,KAAK;IAEvB,MAAM,QAAQ,QAAQ,OAAO,MAAM;IACnC,MAAM,WAAW,MAAM,KAAK,MAAM,KAAK;AAEvC,QADmB,cAAc,cAC3B,CAAC,SAAS;KACd,SAAS,gBAAgB,IAAI,OAAO,GAAG,IAAI,YAAY,GAAG,IAAI;KAC9D,QAAQ,IAAI;KACZ,MAAM,IAAI;KACV,YAAY,IAAI;KAChB,gBAAgB,SAAS,QAAQ,EAAE;KACnC,UAAU,IAAI;KACd,WAAW,IAAI,IAAI,aAAa;KACjC,CAAC;KACF;;AAGJ,QAAM;GACN,CACD,IACC,KAAK;EACH,QAAQ;EACR,SAAS;EACV,CAAC,CACH,CACA,IACC,OAAO,EACL,uBAAuB,OACxB,CAAC,CACH,CACA,IAAI,KAAK,EAAE,OAAO,QAAQ,CAAC,CAAC,CAC5B,IAAI,cAAc,CAAC,CACnB,IAAI,WAAW,EAAE,UAAU,OAAO,CAAC,CAAC,CACpC,IAAI,SAAS,YAAY,CAAC,CAC1B,IAAI,SAAS,aAAa,CAAC,OAAO,YAAY,EAAE,EAAE,SAAS,OAAO,CAAC,CAAC,CACpE,IAAI,gBAAgB,UAAU,CAAC,CAC/B,IAAI,uBAAuB,CAE3B,IAAI,wBAAwB,CAC5B,IAAI,eAAe;AAEtB,QAAO;EACL;EACA;EACD"}
1
+ {"version":3,"file":"server.core.js","names":[],"sources":["../src/server.core.ts"],"sourcesContent":["import express, { json, urlencoded } from \"express\";\nimport cookieParser from \"cookie-parser\";\nimport passport from \"passport\";\nimport cors from \"cors\";\nimport helmet from \"helmet\";\nimport { scopePerRequest } from \"awilix-express\";\nimport { configureContainer } from \"./container\";\nimport { interceptDatabaseError } from \"./middleware/database\";\nimport { interceptRoles, validateWizardCompleted } from \"./middleware/global.middleware\";\nimport { initializePassportStrategies } from \"./middleware/passport\";\nimport { ensureDirExists, getDatabaseFolder, getMediaPath } from \"@/utils/fs.utils\";\nimport { Counter } from \"prom-client\";\nimport { LoggerService } from \"@/handlers/logger\";\n\nconst httpRequestsTotal = new Counter({\n name: \"http_requests_total\",\n help: \"HTTP requests executed\",\n});\n\nexport async function setupServer() {\n const logger = new LoggerService(\"FDM-ServerCore\");\n const httpServer = express();\n\n const databasePath = getDatabaseFolder();\n ensureDirExists(databasePath);\n logger.log(`Expecting database at path ${databasePath}`);\n\n const mediaPath = getMediaPath();\n ensureDirExists(mediaPath);\n logger.log(`Expecting media at path ${mediaPath}`);\n\n const container = configureContainer();\n initializePassportStrategies(passport, container);\n\n httpServer\n .use((req, res, next) => {\n const route = req.route?.path ?? req.path ?? \"unknown\";\n\n if (route.includes(\"/api\")) {\n const start = process.hrtime();\n\n res.on(\"finish\", () => {\n httpRequestsTotal.inc();\n\n const delta = process.hrtime(start);\n const duration = delta[0] + delta[1] / 1e9;\n const logger = new LoggerService(\"HttpRequest\");\n logger.newDebug({\n message: `HTTP request ${req.method} ${req.originalUrl} ${res.statusCode}`,\n method: req.method,\n path: req.originalUrl,\n statusCode: res.statusCode,\n responseTimeMs: duration.toFixed(2),\n clientIp: req.ip,\n userAgent: req.get(\"User-Agent\"),\n });\n });\n }\n\n next();\n })\n .use(\n cors({\n origin: \"*\",\n methods: \"GET,HEAD,PUT,PATCH,POST,DELETE\",\n }),\n )\n .use(\n helmet({\n contentSecurityPolicy: false,\n }),\n )\n .use(json({ limit: \"10mb\" }))\n .use(cookieParser())\n .use(urlencoded({ extended: false }))\n .use(passport.initialize())\n .use(passport.authenticate([\"jwt\", \"api-key\", \"anonymous\"], { session: false }))\n .use(scopePerRequest(container))\n .use(interceptDatabaseError)\n // Global guards\n .use(validateWizardCompleted)\n .use(interceptRoles);\n\n return {\n httpServer,\n container,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;AAcA,MAAM,oBAAoB,IAAI,QAAQ;CACpC,MAAM;CACN,MAAM;CACP,CAAC;AAEF,eAAsB,cAAc;CAClC,MAAM,SAAS,IAAI,cAAc,iBAAiB;CAClD,MAAM,aAAa,SAAS;CAE5B,MAAM,eAAe,mBAAmB;CACxC,gBAAgB,aAAa;CAC7B,OAAO,IAAI,8BAA8B,eAAe;CAExD,MAAM,YAAY,cAAc;CAChC,gBAAgB,UAAU;CAC1B,OAAO,IAAI,2BAA2B,YAAY;CAElD,MAAM,YAAY,oBAAoB;CACtC,6BAA6B,UAAU,UAAU;CAEjD,WACG,KAAK,KAAK,KAAK,SAAS;EAGvB,KAFc,IAAI,OAAO,QAAQ,IAAI,QAAQ,WAEnC,SAAS,OAAO,EAAE;GAC1B,MAAM,QAAQ,QAAQ,QAAQ;GAE9B,IAAI,GAAG,gBAAgB;IACrB,kBAAkB,KAAK;IAEvB,MAAM,QAAQ,QAAQ,OAAO,MAAM;IACnC,MAAM,WAAW,MAAM,KAAK,MAAM,KAAK;IAEvC,IADmB,cAAc,cAC3B,CAAC,SAAS;KACd,SAAS,gBAAgB,IAAI,OAAO,GAAG,IAAI,YAAY,GAAG,IAAI;KAC9D,QAAQ,IAAI;KACZ,MAAM,IAAI;KACV,YAAY,IAAI;KAChB,gBAAgB,SAAS,QAAQ,EAAE;KACnC,UAAU,IAAI;KACd,WAAW,IAAI,IAAI,aAAa;KACjC,CAAC;KACF;;EAGJ,MAAM;GACN,CACD,IACC,KAAK;EACH,QAAQ;EACR,SAAS;EACV,CAAC,CACH,CACA,IACC,OAAO,EACL,uBAAuB,OACxB,CAAC,CACH,CACA,IAAI,KAAK,EAAE,OAAO,QAAQ,CAAC,CAAC,CAC5B,IAAI,cAAc,CAAC,CACnB,IAAI,WAAW,EAAE,UAAU,OAAO,CAAC,CAAC,CACpC,IAAI,SAAS,YAAY,CAAC,CAC1B,IAAI,SAAS,aAAa;EAAC;EAAO;EAAW;EAAY,EAAE,EAAE,SAAS,OAAO,CAAC,CAAC,CAC/E,IAAI,gBAAgB,UAAU,CAAC,CAC/B,IAAI,uBAAuB,CAE3B,IAAI,wBAAwB,CAC5B,IAAI,eAAe;CAEtB,OAAO;EACL;EACA;EACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.env.js","names":["Logger"],"sources":["../src/server.env.ts"],"sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport { readFileSync } from \"node:fs\";\nimport { AppConstants } from \"./server.constants\";\nimport { LoggerService as Logger } from \"./handlers/logger\";\nimport { getEnvOrDefault, isProductionEnvironment, isTestEnvironment } from \"./utils/env.utils\";\nimport { errorSummary } from \"./utils/error.utils\";\nimport { packageJsonPath } from \"@/utils/fs.utils\";\nimport { collectDefaultMetrics, register } from \"prom-client\";\n\nexport function setupEnvConfig() {\n const logger = new Logger(\"FDM-Environment\");\n const environment = process.env[AppConstants.NODE_ENV_KEY];\n if (!environment || !AppConstants.knownEnvNames.includes(environment)) {\n const newEnvName = AppConstants.defaultProductionEnv;\n process.env[AppConstants.NODE_ENV_KEY] = newEnvName;\n logger.warn(`NODE_ENV=${environment} was not set, or not known. Defaulting to NODE_ENV=${newEnvName}`);\n } else {\n logger.log(`✓ NODE_ENV variable correctly set (${environment})`);\n }\n\n ensurePackageVersionSet();\n setupSentry();\n ensurePortSet();\n\n // Optional: Enable collection of default metrics like memory, CPU, etc.\n if (process.env[AppConstants.ENABLE_PROMETHEUS_METRICS] === \"true\") {\n collectDefaultMetrics({ register });\n register.removeSingleMetric(\"nodejs_version_info\");\n }\n}\n\nfunction ensurePackageVersionSet() {\n const logger = new Logger(\"FDM-Environment\");\n const packageJson = JSON.parse(readFileSync(packageJsonPath(), \"utf-8\"));\n const packageJsonVersion = packageJson.version;\n process.env[AppConstants.VERSION_KEY] ??= packageJsonVersion;\n\n logger.log(`✓ Running server version ${process.env[AppConstants.VERSION_KEY]}`);\n}\n\nexport function fetchServerPort() {\n let port = process.env[AppConstants.SERVER_PORT_KEY];\n if (Number.isNaN(Number.parseInt(port!))) {\n // Update config immediately\n process.env[AppConstants.SERVER_PORT_KEY] = AppConstants.defaultServerPort.toString();\n port = process.env[AppConstants.SERVER_PORT_KEY];\n }\n return port;\n}\n\nexport function setupSentry() {\n const logger = new Logger(\"FDM-Environment\");\n const sentryDsnToken = getEnvOrDefault(AppConstants.sentryCustomDsnToken, AppConstants.sentryCustomDsnDefault);\n\n Sentry.init({\n dsn: sentryDsnToken,\n environment: process.env.NODE_ENV,\n release: process.env.npm_package_version,\n enabled: !isTestEnvironment(),\n tracesSampleRate: isProductionEnvironment() ? 0.25 : 1,\n });\n\n process.on(\"unhandledRejection\", (e) => {\n const message = `Unhandled rejection error - ${errorSummary(e)}`;\n logger.error(message);\n\n // The server must not crash\n Sentry.captureException(e);\n });\n}\n\nexport function ensurePortSet() {\n const logger = new Logger(\"FDM-Environment\");\n fetchServerPort();\n\n if (!process.env[AppConstants.SERVER_PORT_KEY]) {\n logger.log(`~ ${AppConstants.SERVER_PORT_KEY} environment variable is not set`);\n logger.log(`Please make sure to read ${AppConstants.docsUrl} for more information.`);\n process.env[AppConstants.SERVER_PORT_KEY] = AppConstants.defaultServerPort.toString();\n }\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,iBAAiB;CAC/B,MAAM,SAAS,IAAIA,cAAO,kBAAkB;CAC5C,MAAM,cAAc,QAAQ,IAAI,aAAa;AAC7C,KAAI,CAAC,eAAe,CAAC,aAAa,cAAc,SAAS,YAAY,EAAE;EACrE,MAAM,aAAa,aAAa;AAChC,UAAQ,IAAI,aAAa,gBAAgB;AACzC,SAAO,KAAK,YAAY,YAAY,qDAAqD,aAAa;OAEtG,QAAO,IAAI,sCAAsC,YAAY,GAAG;AAGlE,0BAAyB;AACzB,cAAa;AACb,gBAAe;AAGf,KAAI,QAAQ,IAAI,aAAa,+BAA+B,QAAQ;AAClE,wBAAsB,EAAE,UAAU,CAAC;AACnC,WAAS,mBAAmB,sBAAsB;;;AAItD,SAAS,0BAA0B;CACjC,MAAM,SAAS,IAAIA,cAAO,kBAAkB;CAE5C,MAAM,qBADc,KAAK,MAAM,aAAa,iBAAiB,EAAE,QAAQ,CACjC,CAAC;AACvC,SAAQ,IAAI,aAAa,iBAAiB;AAE1C,QAAO,IAAI,4BAA4B,QAAQ,IAAI,aAAa,eAAe;;AAGjF,SAAgB,kBAAkB;CAChC,IAAI,OAAO,QAAQ,IAAI,aAAa;AACpC,KAAI,OAAO,MAAM,OAAO,SAAS,KAAM,CAAC,EAAE;AAExC,UAAQ,IAAI,aAAa,mBAAmB,aAAa,kBAAkB,UAAU;AACrF,SAAO,QAAQ,IAAI,aAAa;;AAElC,QAAO;;AAGT,SAAgB,cAAc;CAC5B,MAAM,SAAS,IAAIA,cAAO,kBAAkB;CAC5C,MAAM,iBAAiB,gBAAgB,aAAa,sBAAsB,aAAa,uBAAuB;AAE9G,QAAO,KAAK;EACV,KAAK;EACL,aAAa,QAAQ,IAAI;EACzB,SAAS,QAAQ,IAAI;EACrB,SAAS,CAAC,mBAAmB;EAC7B,kBAAkB,yBAAyB,GAAG,MAAO;EACtD,CAAC;AAEF,SAAQ,GAAG,uBAAuB,MAAM;EACtC,MAAM,UAAU,+BAA+B,aAAa,EAAE;AAC9D,SAAO,MAAM,QAAQ;AAGrB,SAAO,iBAAiB,EAAE;GAC1B;;AAGJ,SAAgB,gBAAgB;CAC9B,MAAM,SAAS,IAAIA,cAAO,kBAAkB;AAC5C,kBAAiB;AAEjB,KAAI,CAAC,QAAQ,IAAI,aAAa,kBAAkB;AAC9C,SAAO,IAAI,KAAK,aAAa,gBAAgB,kCAAkC;AAC/E,SAAO,IAAI,4BAA4B,aAAa,QAAQ,wBAAwB;AACpF,UAAQ,IAAI,aAAa,mBAAmB,aAAa,kBAAkB,UAAU"}
1
+ {"version":3,"file":"server.env.js","names":["Logger"],"sources":["../src/server.env.ts"],"sourcesContent":["import * as Sentry from \"@sentry/node\";\nimport { readFileSync } from \"node:fs\";\nimport { AppConstants } from \"./server.constants\";\nimport { LoggerService as Logger } from \"./handlers/logger\";\nimport { getEnvOrDefault, isProductionEnvironment, isTestEnvironment } from \"./utils/env.utils\";\nimport { errorSummary } from \"./utils/error.utils\";\nimport { packageJsonPath } from \"@/utils/fs.utils\";\nimport { collectDefaultMetrics, register } from \"prom-client\";\n\nexport function setupEnvConfig() {\n const logger = new Logger(\"FDM-Environment\");\n const environment = process.env[AppConstants.NODE_ENV_KEY];\n if (!environment || !AppConstants.knownEnvNames.includes(environment)) {\n const newEnvName = AppConstants.defaultProductionEnv;\n process.env[AppConstants.NODE_ENV_KEY] = newEnvName;\n logger.warn(`NODE_ENV=${environment} was not set, or not known. Defaulting to NODE_ENV=${newEnvName}`);\n } else {\n logger.log(`✓ NODE_ENV variable correctly set (${environment})`);\n }\n\n ensurePackageVersionSet();\n setupSentry();\n ensurePortSet();\n\n // Optional: Enable collection of default metrics like memory, CPU, etc.\n if (process.env[AppConstants.ENABLE_PROMETHEUS_METRICS] === \"true\") {\n collectDefaultMetrics({ register });\n register.removeSingleMetric(\"nodejs_version_info\");\n }\n}\n\nfunction ensurePackageVersionSet() {\n const logger = new Logger(\"FDM-Environment\");\n const packageJson = JSON.parse(readFileSync(packageJsonPath(), \"utf-8\"));\n const packageJsonVersion = packageJson.version;\n process.env[AppConstants.VERSION_KEY] ??= packageJsonVersion;\n\n logger.log(`✓ Running server version ${process.env[AppConstants.VERSION_KEY]}`);\n}\n\nexport function fetchServerPort() {\n let port = process.env[AppConstants.SERVER_PORT_KEY];\n if (Number.isNaN(Number.parseInt(port!))) {\n // Update config immediately\n process.env[AppConstants.SERVER_PORT_KEY] = AppConstants.defaultServerPort.toString();\n port = process.env[AppConstants.SERVER_PORT_KEY];\n }\n return port;\n}\n\nexport function setupSentry() {\n const logger = new Logger(\"FDM-Environment\");\n const sentryDsnToken = getEnvOrDefault(AppConstants.sentryCustomDsnToken, AppConstants.sentryCustomDsnDefault);\n\n Sentry.init({\n dsn: sentryDsnToken,\n environment: process.env.NODE_ENV,\n release: process.env.npm_package_version,\n enabled: !isTestEnvironment(),\n tracesSampleRate: isProductionEnvironment() ? 0.25 : 1,\n });\n\n process.on(\"unhandledRejection\", (e) => {\n const message = `Unhandled rejection error - ${errorSummary(e)}`;\n logger.error(message);\n\n // The server must not crash\n Sentry.captureException(e);\n });\n}\n\nexport function ensurePortSet() {\n const logger = new Logger(\"FDM-Environment\");\n fetchServerPort();\n\n if (!process.env[AppConstants.SERVER_PORT_KEY]) {\n logger.log(`~ ${AppConstants.SERVER_PORT_KEY} environment variable is not set`);\n logger.log(`Please make sure to read ${AppConstants.docsUrl} for more information.`);\n process.env[AppConstants.SERVER_PORT_KEY] = AppConstants.defaultServerPort.toString();\n }\n}\n"],"mappings":";;;;;;;;;AASA,SAAgB,iBAAiB;CAC/B,MAAM,SAAS,IAAIA,cAAO,kBAAkB;CAC5C,MAAM,cAAc,QAAQ,IAAI,aAAa;CAC7C,IAAI,CAAC,eAAe,CAAC,aAAa,cAAc,SAAS,YAAY,EAAE;EACrE,MAAM,aAAa,aAAa;EAChC,QAAQ,IAAI,aAAa,gBAAgB;EACzC,OAAO,KAAK,YAAY,YAAY,qDAAqD,aAAa;QAEtG,OAAO,IAAI,sCAAsC,YAAY,GAAG;CAGlE,yBAAyB;CACzB,aAAa;CACb,eAAe;CAGf,IAAI,QAAQ,IAAI,aAAa,+BAA+B,QAAQ;EAClE,sBAAsB,EAAE,UAAU,CAAC;EACnC,SAAS,mBAAmB,sBAAsB;;;AAItD,SAAS,0BAA0B;CACjC,MAAM,SAAS,IAAIA,cAAO,kBAAkB;CAE5C,MAAM,qBADc,KAAK,MAAM,aAAa,iBAAiB,EAAE,QAAQ,CACjC,CAAC;CACvC,QAAQ,IAAI,aAAa,iBAAiB;CAE1C,OAAO,IAAI,4BAA4B,QAAQ,IAAI,aAAa,eAAe;;AAGjF,SAAgB,kBAAkB;CAChC,IAAI,OAAO,QAAQ,IAAI,aAAa;CACpC,IAAI,OAAO,MAAM,OAAO,SAAS,KAAM,CAAC,EAAE;EAExC,QAAQ,IAAI,aAAa,mBAAmB,aAAa,kBAAkB,UAAU;EACrF,OAAO,QAAQ,IAAI,aAAa;;CAElC,OAAO;;AAGT,SAAgB,cAAc;CAC5B,MAAM,SAAS,IAAIA,cAAO,kBAAkB;CAC5C,MAAM,iBAAiB,gBAAgB,aAAa,sBAAsB,aAAa,uBAAuB;CAE9G,OAAO,KAAK;EACV,KAAK;EACL,aAAa,QAAQ,IAAI;EACzB,SAAS,QAAQ,IAAI;EACrB,SAAS,CAAC,mBAAmB;EAC7B,kBAAkB,yBAAyB,GAAG,MAAO;EACtD,CAAC;CAEF,QAAQ,GAAG,uBAAuB,MAAM;EACtC,MAAM,UAAU,+BAA+B,aAAa,EAAE;EAC9D,OAAO,MAAM,QAAQ;EAGrB,OAAO,iBAAiB,EAAE;GAC1B;;AAGJ,SAAgB,gBAAgB;CAC9B,MAAM,SAAS,IAAIA,cAAO,kBAAkB;CAC5C,iBAAiB;CAEjB,IAAI,CAAC,QAAQ,IAAI,aAAa,kBAAkB;EAC9C,OAAO,IAAI,KAAK,aAAa,gBAAgB,kCAAkC;EAC/E,OAAO,IAAI,4BAA4B,aAAa,QAAQ,wBAAwB;EACpF,QAAQ,IAAI,aAAa,mBAAmB,aAAa,kBAAkB,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.host.js","names":[],"sources":["../src/server.host.ts"],"sourcesContent":["import express, { Application } from \"express\";\nimport history from \"connect-history-api-fallback\";\nimport { LoggerService } from \"./handlers/logger\";\nimport { join } from \"node:path\";\nimport { ExceptionFilter } from \"./middleware/exception.filter\";\nimport { fetchServerPort } from \"./server.env\";\nimport { NotFoundException } from \"./exceptions/runtime.exceptions\";\nimport { AppConstants } from \"./server.constants\";\nimport { getMediaPath, superRootPath } from \"./utils/fs.utils\";\nimport { SocketIoGateway } from \"@/state/socket-io.gateway\";\nimport { BootTask } from \"./tasks/boot.task\";\nimport type { IConfigService } from \"@/services/core/config.service\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { TypeormService } from \"@/services/typeorm/typeorm.service\";\nimport { loadControllersFunc } from \"@/shared/load-controllers\";\nimport { setupSwagger } from \"@/utils/swagger/swagger\";\n\nexport class ServerHost {\n private readonly logger: LoggerService;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly configService: IConfigService,\n private readonly bootTask: BootTask,\n private readonly socketIoGateway: SocketIoGateway,\n private readonly typeormService: TypeormService,\n private readonly exceptionFilter: ExceptionFilter,\n ) {\n this.logger = loggerFactory(ServerHost.name);\n }\n\n async boot(app: Application, quick_boot = false, listenRequests = true) {\n await this.serveControllerRoutes(app);\n\n if (!quick_boot) {\n await this.bootTask.runOnce();\n }\n\n if (listenRequests) return this.httpListen(app);\n }\n\n hasConnected() {\n return this.typeormService.hasConnected();\n }\n\n async serveControllerRoutes(app: Application) {\n const swaggerDisabled = process.env[AppConstants.DISABLE_SWAGGER_OPENAPI] === \"true\";\n\n // Catches any HTML request to paths like / or file/ as long as its text/html\n app\n .use((req, res, next) => {\n if (\n !req.originalUrl.startsWith(\"/metrics\") &&\n !req.originalUrl.startsWith(\"/api\") &&\n !req.originalUrl.startsWith(\"/api-docs\") &&\n !req.originalUrl.startsWith(\"/socket.io\")\n ) {\n history()(req, res, next);\n } else {\n next();\n }\n })\n .use(await loadControllersFunc());\n\n // Setup Swagger documentation (if enabled)\n if (swaggerDisabled) {\n this.logger.log(\"Swagger/OpenAPI documentation disabled\");\n } else {\n await setupSwagger(app, this.logger);\n this.logger.log(\"Swagger/OpenAPI documentation enabled\");\n }\n\n const bundleDistPath = join(getMediaPath(), AppConstants.defaultClientBundleStorage, \"dist\");\n const backupClientPath = join(superRootPath(), \"node_modules\", AppConstants.clientPackageName, \"dist\");\n\n // Serve the main bundle\n app.use(express.static(bundleDistPath));\n\n // Serve the backup client\n app.use(express.static(backupClientPath));\n\n app.get(\"*\", (req, _) => {\n const path = req.originalUrl;\n\n let resource = \"MVC\";\n if (\n path.startsWith(\"/socket.io\") ||\n path.startsWith(\"/api\") ||\n path.startsWith(\"/metrics\") ||\n path.startsWith(\"/api-docs\")\n ) {\n resource = \"API\";\n } else if (path.endsWith(\".min.js\")) {\n resource = \"client-bundle\";\n }\n\n this.logger.error(`${resource} resource at '${path}' was not found`);\n\n if (!path.startsWith(\"/socket.io\")) {\n throw new NotFoundException(`${resource} resource was not found`, path);\n }\n });\n\n app.use(this.exceptionFilter.handle.bind(this.exceptionFilter));\n }\n\n async httpListen(app: Application) {\n const port = fetchServerPort();\n\n if (!port || Number.isNaN(Number.parseInt(port))) {\n throw new Error(\"The FDM Server requires a numeric port input argument to run\");\n }\n\n const swaggerDisabled = process.env[AppConstants.DISABLE_SWAGGER_OPENAPI] === \"true\";\n const hostOrFqdn = \"0.0.0.0\";\n const server = app.listen(Number.parseInt(port), hostOrFqdn, () => {\n this.logger.log(`Server started... open it at http://127.0.0.1:${port}`);\n if (!swaggerDisabled) {\n this.logger.log(`API Documentation available at http://127.0.0.1:${port}/api-docs`);\n }\n });\n this.socketIoGateway.attachServer(server);\n }\n}\n"],"mappings":";;;;;;;;;;AAiBA,IAAa,aAAb,MAAa,WAAW;CACtB;CAEA,YACE,eACA,eACA,UACA,iBACA,gBACA,iBACA;AALiB,OAAA,gBAAA;AACA,OAAA,WAAA;AACA,OAAA,kBAAA;AACA,OAAA,iBAAA;AACA,OAAA,kBAAA;AAEjB,OAAK,SAAS,cAAc,WAAW,KAAK;;CAG9C,MAAM,KAAK,KAAkB,aAAa,OAAO,iBAAiB,MAAM;AACtE,QAAM,KAAK,sBAAsB,IAAI;AAErC,MAAI,CAAC,WACH,OAAM,KAAK,SAAS,SAAS;AAG/B,MAAI,eAAgB,QAAO,KAAK,WAAW,IAAI;;CAGjD,eAAe;AACb,SAAO,KAAK,eAAe,cAAc;;CAG3C,MAAM,sBAAsB,KAAkB;EAC5C,MAAM,kBAAkB,QAAQ,IAAI,aAAa,6BAA6B;AAG9E,MACG,KAAK,KAAK,KAAK,SAAS;AACvB,OACE,CAAC,IAAI,YAAY,WAAW,WAAW,IACvC,CAAC,IAAI,YAAY,WAAW,OAAO,IACnC,CAAC,IAAI,YAAY,WAAW,YAAY,IACxC,CAAC,IAAI,YAAY,WAAW,aAAa,CAEzC,UAAS,CAAC,KAAK,KAAK,KAAK;OAEzB,OAAM;IAER,CACD,IAAI,MAAM,qBAAqB,CAAC;AAGnC,MAAI,gBACF,MAAK,OAAO,IAAI,yCAAyC;OACpD;AACL,SAAM,aAAa,KAAK,KAAK,OAAO;AACpC,QAAK,OAAO,IAAI,wCAAwC;;EAG1D,MAAM,iBAAiB,KAAK,cAAc,EAAE,aAAa,4BAA4B,OAAO;EAC5F,MAAM,mBAAmB,KAAK,eAAe,EAAE,gBAAgB,aAAa,mBAAmB,OAAO;AAGtG,MAAI,IAAI,QAAQ,OAAO,eAAe,CAAC;AAGvC,MAAI,IAAI,QAAQ,OAAO,iBAAiB,CAAC;AAEzC,MAAI,IAAI,MAAM,KAAK,MAAM;GACvB,MAAM,OAAO,IAAI;GAEjB,IAAI,WAAW;AACf,OACE,KAAK,WAAW,aAAa,IAC7B,KAAK,WAAW,OAAO,IACvB,KAAK,WAAW,WAAW,IAC3B,KAAK,WAAW,YAAY,CAE5B,YAAW;YACF,KAAK,SAAS,UAAU,CACjC,YAAW;AAGb,QAAK,OAAO,MAAM,GAAG,SAAS,gBAAgB,KAAK,iBAAiB;AAEpE,OAAI,CAAC,KAAK,WAAW,aAAa,CAChC,OAAM,IAAI,kBAAkB,GAAG,SAAS,0BAA0B,KAAK;IAEzE;AAEF,MAAI,IAAI,KAAK,gBAAgB,OAAO,KAAK,KAAK,gBAAgB,CAAC;;CAGjE,MAAM,WAAW,KAAkB;EACjC,MAAM,OAAO,iBAAiB;AAE9B,MAAI,CAAC,QAAQ,OAAO,MAAM,OAAO,SAAS,KAAK,CAAC,CAC9C,OAAM,IAAI,MAAM,+DAA+D;EAGjF,MAAM,kBAAkB,QAAQ,IAAI,aAAa,6BAA6B;EAE9E,MAAM,SAAS,IAAI,OAAO,OAAO,SAAS,KAAK,EAAE,iBAAkB;AACjE,QAAK,OAAO,IAAI,iDAAiD,OAAO;AACxE,OAAI,CAAC,gBACH,MAAK,OAAO,IAAI,mDAAmD,KAAK,WAAW;IAErF;AACF,OAAK,gBAAgB,aAAa,OAAO"}
1
+ {"version":3,"file":"server.host.js","names":[],"sources":["../src/server.host.ts"],"sourcesContent":["import express, { Application } from \"express\";\nimport history from \"connect-history-api-fallback\";\nimport { LoggerService } from \"./handlers/logger\";\nimport { join } from \"node:path\";\nimport { ExceptionFilter } from \"./middleware/exception.filter\";\nimport { fetchServerPort } from \"./server.env\";\nimport { NotFoundException } from \"./exceptions/runtime.exceptions\";\nimport { AppConstants } from \"./server.constants\";\nimport { getMediaPath, superRootPath } from \"./utils/fs.utils\";\nimport { SocketIoGateway } from \"@/state/socket-io.gateway\";\nimport { BootTask } from \"./tasks/boot.task\";\nimport type { IConfigService } from \"@/services/core/config.service\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { TypeormService } from \"@/services/typeorm/typeorm.service\";\nimport { loadControllersFunc } from \"@/shared/load-controllers\";\nimport { setupSwagger } from \"@/utils/swagger/swagger\";\n\nexport class ServerHost {\n private readonly logger: LoggerService;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly configService: IConfigService,\n private readonly bootTask: BootTask,\n private readonly socketIoGateway: SocketIoGateway,\n private readonly typeormService: TypeormService,\n private readonly exceptionFilter: ExceptionFilter,\n ) {\n this.logger = loggerFactory(ServerHost.name);\n }\n\n async boot(app: Application, quick_boot = false, listenRequests = true) {\n await this.serveControllerRoutes(app);\n\n if (!quick_boot) {\n await this.bootTask.runOnce();\n }\n\n if (listenRequests) return this.httpListen(app);\n }\n\n hasConnected() {\n return this.typeormService.hasConnected();\n }\n\n async serveControllerRoutes(app: Application) {\n const swaggerDisabled = process.env[AppConstants.DISABLE_SWAGGER_OPENAPI] === \"true\";\n\n // Catches any HTML request to paths like / or file/ as long as its text/html\n app\n .use((req, res, next) => {\n if (\n !req.originalUrl.startsWith(\"/metrics\") &&\n !req.originalUrl.startsWith(\"/api\") &&\n !req.originalUrl.startsWith(\"/api-docs\") &&\n !req.originalUrl.startsWith(\"/socket.io\")\n ) {\n history()(req, res, next);\n } else {\n next();\n }\n })\n .use(await loadControllersFunc());\n\n // Setup Swagger documentation (if enabled)\n if (swaggerDisabled) {\n this.logger.log(\"Swagger/OpenAPI documentation disabled\");\n } else {\n await setupSwagger(app, this.logger);\n this.logger.log(\"Swagger/OpenAPI documentation enabled\");\n }\n\n const bundleDistPath = join(getMediaPath(), AppConstants.defaultClientBundleStorage, \"dist\");\n const backupClientPath = join(superRootPath(), \"node_modules\", AppConstants.clientPackageName, \"dist\");\n\n // Serve the main bundle\n app.use(express.static(bundleDistPath));\n\n // Serve the backup client\n app.use(express.static(backupClientPath));\n\n app.get(\"*\", (req, _) => {\n const path = req.originalUrl;\n\n let resource = \"MVC\";\n if (\n path.startsWith(\"/socket.io\") ||\n path.startsWith(\"/api\") ||\n path.startsWith(\"/metrics\") ||\n path.startsWith(\"/api-docs\")\n ) {\n resource = \"API\";\n } else if (path.endsWith(\".min.js\")) {\n resource = \"client-bundle\";\n }\n\n this.logger.error(`${resource} resource at '${path}' was not found`);\n\n if (!path.startsWith(\"/socket.io\")) {\n throw new NotFoundException(`${resource} resource was not found`, path);\n }\n });\n\n app.use(this.exceptionFilter.handle.bind(this.exceptionFilter));\n }\n\n async httpListen(app: Application) {\n const port = fetchServerPort();\n\n if (!port || Number.isNaN(Number.parseInt(port))) {\n throw new Error(\"The FDM Server requires a numeric port input argument to run\");\n }\n\n const swaggerDisabled = process.env[AppConstants.DISABLE_SWAGGER_OPENAPI] === \"true\";\n const hostOrFqdn = \"0.0.0.0\";\n const server = app.listen(Number.parseInt(port), hostOrFqdn, () => {\n this.logger.log(`Server started... open it at http://127.0.0.1:${port}`);\n if (!swaggerDisabled) {\n this.logger.log(`API Documentation available at http://127.0.0.1:${port}/api-docs`);\n }\n });\n this.socketIoGateway.attachServer(server);\n }\n}\n"],"mappings":";;;;;;;;;;AAiBA,IAAa,aAAb,MAAa,WAAW;CACtB;CAEA,YACE,eACA,eACA,UACA,iBACA,gBACA,iBACA;EALiB,KAAA,gBAAA;EACA,KAAA,WAAA;EACA,KAAA,kBAAA;EACA,KAAA,iBAAA;EACA,KAAA,kBAAA;EAEjB,KAAK,SAAS,cAAc,WAAW,KAAK;;CAG9C,MAAM,KAAK,KAAkB,aAAa,OAAO,iBAAiB,MAAM;EACtE,MAAM,KAAK,sBAAsB,IAAI;EAErC,IAAI,CAAC,YACH,MAAM,KAAK,SAAS,SAAS;EAG/B,IAAI,gBAAgB,OAAO,KAAK,WAAW,IAAI;;CAGjD,eAAe;EACb,OAAO,KAAK,eAAe,cAAc;;CAG3C,MAAM,sBAAsB,KAAkB;EAC5C,MAAM,kBAAkB,QAAQ,IAAI,aAAa,6BAA6B;EAG9E,IACG,KAAK,KAAK,KAAK,SAAS;GACvB,IACE,CAAC,IAAI,YAAY,WAAW,WAAW,IACvC,CAAC,IAAI,YAAY,WAAW,OAAO,IACnC,CAAC,IAAI,YAAY,WAAW,YAAY,IACxC,CAAC,IAAI,YAAY,WAAW,aAAa,EAEzC,SAAS,CAAC,KAAK,KAAK,KAAK;QAEzB,MAAM;IAER,CACD,IAAI,MAAM,qBAAqB,CAAC;EAGnC,IAAI,iBACF,KAAK,OAAO,IAAI,yCAAyC;OACpD;GACL,MAAM,aAAa,KAAK,KAAK,OAAO;GACpC,KAAK,OAAO,IAAI,wCAAwC;;EAG1D,MAAM,iBAAiB,KAAK,cAAc,EAAE,aAAa,4BAA4B,OAAO;EAC5F,MAAM,mBAAmB,KAAK,eAAe,EAAE,gBAAgB,aAAa,mBAAmB,OAAO;EAGtG,IAAI,IAAI,QAAQ,OAAO,eAAe,CAAC;EAGvC,IAAI,IAAI,QAAQ,OAAO,iBAAiB,CAAC;EAEzC,IAAI,IAAI,MAAM,KAAK,MAAM;GACvB,MAAM,OAAO,IAAI;GAEjB,IAAI,WAAW;GACf,IACE,KAAK,WAAW,aAAa,IAC7B,KAAK,WAAW,OAAO,IACvB,KAAK,WAAW,WAAW,IAC3B,KAAK,WAAW,YAAY,EAE5B,WAAW;QACN,IAAI,KAAK,SAAS,UAAU,EACjC,WAAW;GAGb,KAAK,OAAO,MAAM,GAAG,SAAS,gBAAgB,KAAK,iBAAiB;GAEpE,IAAI,CAAC,KAAK,WAAW,aAAa,EAChC,MAAM,IAAI,kBAAkB,GAAG,SAAS,0BAA0B,KAAK;IAEzE;EAEF,IAAI,IAAI,KAAK,gBAAgB,OAAO,KAAK,KAAK,gBAAgB,CAAC;;CAGjE,MAAM,WAAW,KAAkB;EACjC,MAAM,OAAO,iBAAiB;EAE9B,IAAI,CAAC,QAAQ,OAAO,MAAM,OAAO,SAAS,KAAK,CAAC,EAC9C,MAAM,IAAI,MAAM,+DAA+D;EAGjF,MAAM,kBAAkB,QAAQ,IAAI,aAAa,6BAA6B;EAE9E,MAAM,SAAS,IAAI,OAAO,OAAO,SAAS,KAAK,EAAE,iBAAkB;GACjE,KAAK,OAAO,IAAI,iDAAiD,OAAO;GACxE,IAAI,CAAC,iBACH,KAAK,OAAO,IAAI,mDAAmD,KAAK,WAAW;IAErF;EACF,KAAK,gBAAgB,aAAa,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.service.js","names":[],"sources":["../../../src/services/authentication/auth.service.ts"],"sourcesContent":["import { AuthenticationError } from \"@/exceptions/runtime.exceptions\";\nimport { comparePasswordHash } from \"@/utils/crypto.utils\";\nimport { SettingsStore } from \"@/state/settings.store\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport type { IUserService } from \"@/services/interfaces/user-service.interface\";\nimport type { IJwtService } from \"@/services/interfaces/jwt.service.interface\";\nimport type { IAuthService } from \"@/services/interfaces/auth.service.interface\";\nimport type { IRefreshTokenService } from \"@/services/interfaces/refresh-token.service.interface\";\nimport { AUTH_ERROR_REASON } from \"@/constants/authorization.constants\";\nimport { captureException } from \"@sentry/node\";\nimport { User } from \"@/entities\";\n\nexport class AuthService implements IAuthService {\n private readonly logger: LoggerService;\n /**\n * When users are blacklisted at runtime, this cache can make quick work of rejecting them\n */\n private blacklistedJwtCache: Record<string, { userId: number; createdAt: number }> = {};\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly userService: IUserService<User>,\n private readonly jwtService: IJwtService,\n private readonly settingsStore: SettingsStore,\n private readonly refreshTokenService: IRefreshTokenService,\n ) {\n this.logger = loggerFactory(AuthService.name);\n }\n\n async loginUser(username: string, password: string) {\n const userDoc = await this.userService.findRawByUsername(username);\n if (!userDoc) {\n throw new AuthenticationError(\"Login incorrect\", AUTH_ERROR_REASON.IncorrectCredentials);\n }\n const result = comparePasswordHash(password, userDoc.passwordHash);\n if (!result) {\n throw new AuthenticationError(\"Login incorrect\", AUTH_ERROR_REASON.IncorrectCredentials);\n }\n\n const userId = userDoc.id;\n const token = await this.signJwtToken(userId);\n await this.refreshTokenService.purgeOutdatedRefreshTokensByUserId(userId);\n await this.purgeOutdatedBlacklistedJwtCache();\n\n const refreshToken = await this.refreshTokenService.createRefreshTokenForUserId(userId);\n return {\n token,\n refreshToken,\n };\n }\n\n async logoutUserId(userId: number, jwtToken?: string) {\n await this.refreshTokenService.deleteRefreshTokenByUserId(userId);\n if (jwtToken?.length) {\n this.blacklistedJwtCache[jwtToken] = { userId, createdAt: Date.now() };\n await this.purgeOutdatedBlacklistedJwtCache();\n }\n }\n\n async purgeOutdatedBlacklistedJwtCache() {\n try {\n const { jwtExpiresIn } = await this.settingsStore.getCredentialSettings();\n const now = Date.now();\n const keys = Object.keys(this.blacklistedJwtCache);\n for (const key of keys) {\n const { createdAt } = this.blacklistedJwtCache[key];\n if (now - createdAt > jwtExpiresIn) {\n delete this.blacklistedJwtCache[key];\n }\n }\n } catch (err) {\n this.logger.error(\"Failed to purge blacklisted jwt cache\", err);\n captureException(err);\n }\n }\n\n async logoutUserRefreshToken(refreshToken: string) {\n const userRefreshToken = await this.getValidRefreshToken(refreshToken);\n await this.refreshTokenService.deleteRefreshTokenByUserId(userRefreshToken.userId);\n }\n\n async renewLoginByRefreshToken(refreshToken: string): Promise<string> {\n const userRefreshToken = await this.getValidRefreshToken(refreshToken);\n\n const userId = userRefreshToken.userId;\n const user = await this.userService.getUser(userId);\n if (!user) {\n await this.refreshTokenService.deleteRefreshToken(refreshToken);\n throw new AuthenticationError(\"User not found\", AUTH_ERROR_REASON.InvalidOrExpiredRefreshToken);\n }\n\n // If the user is not found at this point, then the user was deleted\n const token = await this.signJwtToken(userId);\n await this.increaseRefreshTokenAttemptsUsed(userRefreshToken.refreshToken);\n return token;\n }\n\n isJwtTokenBlacklisted(jwtToken: string) {\n return this.blacklistedJwtCache[jwtToken];\n }\n\n async getValidRefreshToken(refreshToken: string) {\n const userRefreshToken = await this.refreshTokenService.getRefreshToken(refreshToken);\n if (Date.now() > userRefreshToken.expiresAt) {\n await this.refreshTokenService.deleteRefreshTokenByUserId(userRefreshToken.userId);\n throw new AuthenticationError(\n \"Refresh token expired, login required\",\n AUTH_ERROR_REASON.InvalidOrExpiredRefreshToken,\n );\n }\n return userRefreshToken;\n }\n\n async increaseRefreshTokenAttemptsUsed(refreshToken: string): Promise<void> {\n const { refreshTokenAttempts } = await this.settingsStore.getCredentialSettings();\n const userRefreshToken = await this.getValidRefreshToken(refreshToken);\n const attemptsUsed = userRefreshToken.refreshAttemptsUsed;\n\n // If no attempts are set, then we don't care about attempts\n if (refreshTokenAttempts !== -1) {\n if (attemptsUsed >= refreshTokenAttempts) {\n await this.refreshTokenService.deleteRefreshTokenByUserId(userRefreshToken.userId);\n throw new AuthenticationError(\n \"Refresh token attempts exceeded, login required\",\n AUTH_ERROR_REASON.InvalidOrExpiredRefreshToken,\n );\n }\n }\n\n await this.refreshTokenService.updateRefreshTokenAttempts(refreshToken, attemptsUsed + 1);\n }\n\n async signJwtToken(userId: number) {\n const user = await this.userService.getUser(userId);\n if (!user) {\n throw new AuthenticationError(\"User not found\", AUTH_ERROR_REASON.InvalidOrExpiredRefreshToken);\n }\n if (user.needsPasswordChange) {\n throw new AuthenticationError(\"Password change required\", AUTH_ERROR_REASON.PasswordChangeRequired);\n }\n if (!user.isVerified) {\n throw new AuthenticationError(\"User is not verified yet\", AUTH_ERROR_REASON.AccountNotVerified);\n }\n return this.jwtService.signJwtToken(userId, user.username);\n }\n}\n"],"mappings":";;;;;AAaA,IAAa,cAAb,MAAa,YAAoC;CAC/C;;;;CAIA,sBAAqF,EAAE;CAEvF,YACE,eACA,aACA,YACA,eACA,qBACA;AAJiB,OAAA,cAAA;AACA,OAAA,aAAA;AACA,OAAA,gBAAA;AACA,OAAA,sBAAA;AAEjB,OAAK,SAAS,cAAc,YAAY,KAAK;;CAG/C,MAAM,UAAU,UAAkB,UAAkB;EAClD,MAAM,UAAU,MAAM,KAAK,YAAY,kBAAkB,SAAS;AAClE,MAAI,CAAC,QACH,OAAM,IAAI,oBAAoB,mBAAmB,kBAAkB,qBAAqB;AAG1F,MAAI,CADW,oBAAoB,UAAU,QAAQ,aAC1C,CACT,OAAM,IAAI,oBAAoB,mBAAmB,kBAAkB,qBAAqB;EAG1F,MAAM,SAAS,QAAQ;EACvB,MAAM,QAAQ,MAAM,KAAK,aAAa,OAAO;AAC7C,QAAM,KAAK,oBAAoB,mCAAmC,OAAO;AACzE,QAAM,KAAK,kCAAkC;AAG7C,SAAO;GACL;GACA,cAAA,MAHyB,KAAK,oBAAoB,4BAA4B,OAAO;GAItF;;CAGH,MAAM,aAAa,QAAgB,UAAmB;AACpD,QAAM,KAAK,oBAAoB,2BAA2B,OAAO;AACjE,MAAI,UAAU,QAAQ;AACpB,QAAK,oBAAoB,YAAY;IAAE;IAAQ,WAAW,KAAK,KAAK;IAAE;AACtE,SAAM,KAAK,kCAAkC;;;CAIjD,MAAM,mCAAmC;AACvC,MAAI;GACF,MAAM,EAAE,iBAAiB,MAAM,KAAK,cAAc,uBAAuB;GACzE,MAAM,MAAM,KAAK,KAAK;GACtB,MAAM,OAAO,OAAO,KAAK,KAAK,oBAAoB;AAClD,QAAK,MAAM,OAAO,MAAM;IACtB,MAAM,EAAE,cAAc,KAAK,oBAAoB;AAC/C,QAAI,MAAM,YAAY,aACpB,QAAO,KAAK,oBAAoB;;WAG7B,KAAK;AACZ,QAAK,OAAO,MAAM,yCAAyC,IAAI;AAC/D,oBAAiB,IAAI;;;CAIzB,MAAM,uBAAuB,cAAsB;EACjD,MAAM,mBAAmB,MAAM,KAAK,qBAAqB,aAAa;AACtE,QAAM,KAAK,oBAAoB,2BAA2B,iBAAiB,OAAO;;CAGpF,MAAM,yBAAyB,cAAuC;EACpE,MAAM,mBAAmB,MAAM,KAAK,qBAAqB,aAAa;EAEtE,MAAM,SAAS,iBAAiB;AAEhC,MAAI,CAAC,MADc,KAAK,YAAY,QAAQ,OAAO,EACxC;AACT,SAAM,KAAK,oBAAoB,mBAAmB,aAAa;AAC/D,SAAM,IAAI,oBAAoB,kBAAkB,kBAAkB,6BAA6B;;EAIjG,MAAM,QAAQ,MAAM,KAAK,aAAa,OAAO;AAC7C,QAAM,KAAK,iCAAiC,iBAAiB,aAAa;AAC1E,SAAO;;CAGT,sBAAsB,UAAkB;AACtC,SAAO,KAAK,oBAAoB;;CAGlC,MAAM,qBAAqB,cAAsB;EAC/C,MAAM,mBAAmB,MAAM,KAAK,oBAAoB,gBAAgB,aAAa;AACrF,MAAI,KAAK,KAAK,GAAG,iBAAiB,WAAW;AAC3C,SAAM,KAAK,oBAAoB,2BAA2B,iBAAiB,OAAO;AAClF,SAAM,IAAI,oBACR,yCACA,kBAAkB,6BACnB;;AAEH,SAAO;;CAGT,MAAM,iCAAiC,cAAqC;EAC1E,MAAM,EAAE,yBAAyB,MAAM,KAAK,cAAc,uBAAuB;EACjF,MAAM,mBAAmB,MAAM,KAAK,qBAAqB,aAAa;EACtE,MAAM,eAAe,iBAAiB;AAGtC,MAAI,yBAAyB;OACvB,gBAAgB,sBAAsB;AACxC,UAAM,KAAK,oBAAoB,2BAA2B,iBAAiB,OAAO;AAClF,UAAM,IAAI,oBACR,mDACA,kBAAkB,6BACnB;;;AAIL,QAAM,KAAK,oBAAoB,2BAA2B,cAAc,eAAe,EAAE;;CAG3F,MAAM,aAAa,QAAgB;EACjC,MAAM,OAAO,MAAM,KAAK,YAAY,QAAQ,OAAO;AACnD,MAAI,CAAC,KACH,OAAM,IAAI,oBAAoB,kBAAkB,kBAAkB,6BAA6B;AAEjG,MAAI,KAAK,oBACP,OAAM,IAAI,oBAAoB,4BAA4B,kBAAkB,uBAAuB;AAErG,MAAI,CAAC,KAAK,WACR,OAAM,IAAI,oBAAoB,4BAA4B,kBAAkB,mBAAmB;AAEjG,SAAO,KAAK,WAAW,aAAa,QAAQ,KAAK,SAAS"}
1
+ {"version":3,"file":"auth.service.js","names":[],"sources":["../../../src/services/authentication/auth.service.ts"],"sourcesContent":["import { AuthenticationError } from \"@/exceptions/runtime.exceptions\";\nimport { comparePasswordHash } from \"@/utils/crypto.utils\";\nimport { SettingsStore } from \"@/state/settings.store\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport type { IUserService } from \"@/services/interfaces/user-service.interface\";\nimport type { IJwtService } from \"@/services/interfaces/jwt.service.interface\";\nimport type { IAuthService } from \"@/services/interfaces/auth.service.interface\";\nimport type { IRefreshTokenService } from \"@/services/interfaces/refresh-token.service.interface\";\nimport { AUTH_ERROR_REASON } from \"@/constants/authorization.constants\";\nimport { captureException } from \"@sentry/node\";\nimport { User } from \"@/entities\";\n\nexport class AuthService implements IAuthService {\n private readonly logger: LoggerService;\n /**\n * When users are blacklisted at runtime, this cache can make quick work of rejecting them\n */\n private blacklistedJwtCache: Record<string, { userId: number; createdAt: number }> = {};\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly userService: IUserService<User>,\n private readonly jwtService: IJwtService,\n private readonly settingsStore: SettingsStore,\n private readonly refreshTokenService: IRefreshTokenService,\n ) {\n this.logger = loggerFactory(AuthService.name);\n }\n\n async loginUser(username: string, password: string) {\n const userDoc = await this.userService.findRawByUsername(username);\n if (!userDoc) {\n throw new AuthenticationError(\"Login incorrect\", AUTH_ERROR_REASON.IncorrectCredentials);\n }\n const result = comparePasswordHash(password, userDoc.passwordHash);\n if (!result) {\n throw new AuthenticationError(\"Login incorrect\", AUTH_ERROR_REASON.IncorrectCredentials);\n }\n\n const userId = userDoc.id;\n const token = await this.signJwtToken(userId);\n await this.refreshTokenService.purgeOutdatedRefreshTokensByUserId(userId);\n await this.purgeOutdatedBlacklistedJwtCache();\n\n const refreshToken = await this.refreshTokenService.createRefreshTokenForUserId(userId);\n return {\n token,\n refreshToken,\n };\n }\n\n async logoutUserId(userId: number, jwtToken?: string) {\n await this.refreshTokenService.deleteRefreshTokenByUserId(userId);\n if (jwtToken?.length) {\n this.blacklistedJwtCache[jwtToken] = { userId, createdAt: Date.now() };\n await this.purgeOutdatedBlacklistedJwtCache();\n }\n }\n\n async purgeOutdatedBlacklistedJwtCache() {\n try {\n const { jwtExpiresIn } = await this.settingsStore.getCredentialSettings();\n const now = Date.now();\n const keys = Object.keys(this.blacklistedJwtCache);\n for (const key of keys) {\n const { createdAt } = this.blacklistedJwtCache[key];\n if (now - createdAt > jwtExpiresIn) {\n delete this.blacklistedJwtCache[key];\n }\n }\n } catch (err) {\n this.logger.error(\"Failed to purge blacklisted jwt cache\", err);\n captureException(err);\n }\n }\n\n async logoutUserRefreshToken(refreshToken: string) {\n const userRefreshToken = await this.getValidRefreshToken(refreshToken);\n await this.refreshTokenService.deleteRefreshTokenByUserId(userRefreshToken.userId);\n }\n\n async renewLoginByRefreshToken(refreshToken: string): Promise<string> {\n const userRefreshToken = await this.getValidRefreshToken(refreshToken);\n\n const userId = userRefreshToken.userId;\n const user = await this.userService.getUser(userId);\n if (!user) {\n await this.refreshTokenService.deleteRefreshToken(refreshToken);\n throw new AuthenticationError(\"User not found\", AUTH_ERROR_REASON.InvalidOrExpiredRefreshToken);\n }\n\n // If the user is not found at this point, then the user was deleted\n const token = await this.signJwtToken(userId);\n await this.increaseRefreshTokenAttemptsUsed(userRefreshToken.refreshToken);\n return token;\n }\n\n isJwtTokenBlacklisted(jwtToken: string) {\n return this.blacklistedJwtCache[jwtToken];\n }\n\n async getValidRefreshToken(refreshToken: string) {\n const userRefreshToken = await this.refreshTokenService.getRefreshToken(refreshToken);\n if (Date.now() > userRefreshToken.expiresAt) {\n await this.refreshTokenService.deleteRefreshTokenByUserId(userRefreshToken.userId);\n throw new AuthenticationError(\n \"Refresh token expired, login required\",\n AUTH_ERROR_REASON.InvalidOrExpiredRefreshToken,\n );\n }\n return userRefreshToken;\n }\n\n async increaseRefreshTokenAttemptsUsed(refreshToken: string): Promise<void> {\n const { refreshTokenAttempts } = await this.settingsStore.getCredentialSettings();\n const userRefreshToken = await this.getValidRefreshToken(refreshToken);\n const attemptsUsed = userRefreshToken.refreshAttemptsUsed;\n\n // If no attempts are set, then we don't care about attempts\n if (refreshTokenAttempts !== -1) {\n if (attemptsUsed >= refreshTokenAttempts) {\n await this.refreshTokenService.deleteRefreshTokenByUserId(userRefreshToken.userId);\n throw new AuthenticationError(\n \"Refresh token attempts exceeded, login required\",\n AUTH_ERROR_REASON.InvalidOrExpiredRefreshToken,\n );\n }\n }\n\n await this.refreshTokenService.updateRefreshTokenAttempts(refreshToken, attemptsUsed + 1);\n }\n\n async signJwtToken(userId: number) {\n const user = await this.userService.getUser(userId);\n if (!user) {\n throw new AuthenticationError(\"User not found\", AUTH_ERROR_REASON.InvalidOrExpiredRefreshToken);\n }\n if (user.needsPasswordChange) {\n throw new AuthenticationError(\"Password change required\", AUTH_ERROR_REASON.PasswordChangeRequired);\n }\n if (!user.isVerified) {\n throw new AuthenticationError(\"User is not verified yet\", AUTH_ERROR_REASON.AccountNotVerified);\n }\n return this.jwtService.signJwtToken(userId, user.username);\n }\n}\n"],"mappings":";;;;;AAaA,IAAa,cAAb,MAAa,YAAoC;CAC/C;;;;CAIA,sBAAqF,EAAE;CAEvF,YACE,eACA,aACA,YACA,eACA,qBACA;EAJiB,KAAA,cAAA;EACA,KAAA,aAAA;EACA,KAAA,gBAAA;EACA,KAAA,sBAAA;EAEjB,KAAK,SAAS,cAAc,YAAY,KAAK;;CAG/C,MAAM,UAAU,UAAkB,UAAkB;EAClD,MAAM,UAAU,MAAM,KAAK,YAAY,kBAAkB,SAAS;EAClE,IAAI,CAAC,SACH,MAAM,IAAI,oBAAoB,mBAAmB,kBAAkB,qBAAqB;EAG1F,IAAI,CADW,oBAAoB,UAAU,QAAQ,aAC1C,EACT,MAAM,IAAI,oBAAoB,mBAAmB,kBAAkB,qBAAqB;EAG1F,MAAM,SAAS,QAAQ;EACvB,MAAM,QAAQ,MAAM,KAAK,aAAa,OAAO;EAC7C,MAAM,KAAK,oBAAoB,mCAAmC,OAAO;EACzE,MAAM,KAAK,kCAAkC;EAG7C,OAAO;GACL;GACA,cAAA,MAHyB,KAAK,oBAAoB,4BAA4B,OAAO;GAItF;;CAGH,MAAM,aAAa,QAAgB,UAAmB;EACpD,MAAM,KAAK,oBAAoB,2BAA2B,OAAO;EACjE,IAAI,UAAU,QAAQ;GACpB,KAAK,oBAAoB,YAAY;IAAE;IAAQ,WAAW,KAAK,KAAK;IAAE;GACtE,MAAM,KAAK,kCAAkC;;;CAIjD,MAAM,mCAAmC;EACvC,IAAI;GACF,MAAM,EAAE,iBAAiB,MAAM,KAAK,cAAc,uBAAuB;GACzE,MAAM,MAAM,KAAK,KAAK;GACtB,MAAM,OAAO,OAAO,KAAK,KAAK,oBAAoB;GAClD,KAAK,MAAM,OAAO,MAAM;IACtB,MAAM,EAAE,cAAc,KAAK,oBAAoB;IAC/C,IAAI,MAAM,YAAY,cACpB,OAAO,KAAK,oBAAoB;;WAG7B,KAAK;GACZ,KAAK,OAAO,MAAM,yCAAyC,IAAI;GAC/D,iBAAiB,IAAI;;;CAIzB,MAAM,uBAAuB,cAAsB;EACjD,MAAM,mBAAmB,MAAM,KAAK,qBAAqB,aAAa;EACtE,MAAM,KAAK,oBAAoB,2BAA2B,iBAAiB,OAAO;;CAGpF,MAAM,yBAAyB,cAAuC;EACpE,MAAM,mBAAmB,MAAM,KAAK,qBAAqB,aAAa;EAEtE,MAAM,SAAS,iBAAiB;EAEhC,IAAI,CAAC,MADc,KAAK,YAAY,QAAQ,OAAO,EACxC;GACT,MAAM,KAAK,oBAAoB,mBAAmB,aAAa;GAC/D,MAAM,IAAI,oBAAoB,kBAAkB,kBAAkB,6BAA6B;;EAIjG,MAAM,QAAQ,MAAM,KAAK,aAAa,OAAO;EAC7C,MAAM,KAAK,iCAAiC,iBAAiB,aAAa;EAC1E,OAAO;;CAGT,sBAAsB,UAAkB;EACtC,OAAO,KAAK,oBAAoB;;CAGlC,MAAM,qBAAqB,cAAsB;EAC/C,MAAM,mBAAmB,MAAM,KAAK,oBAAoB,gBAAgB,aAAa;EACrF,IAAI,KAAK,KAAK,GAAG,iBAAiB,WAAW;GAC3C,MAAM,KAAK,oBAAoB,2BAA2B,iBAAiB,OAAO;GAClF,MAAM,IAAI,oBACR,yCACA,kBAAkB,6BACnB;;EAEH,OAAO;;CAGT,MAAM,iCAAiC,cAAqC;EAC1E,MAAM,EAAE,yBAAyB,MAAM,KAAK,cAAc,uBAAuB;EACjF,MAAM,mBAAmB,MAAM,KAAK,qBAAqB,aAAa;EACtE,MAAM,eAAe,iBAAiB;EAGtC,IAAI,yBAAyB;OACvB,gBAAgB,sBAAsB;IACxC,MAAM,KAAK,oBAAoB,2BAA2B,iBAAiB,OAAO;IAClF,MAAM,IAAI,oBACR,mDACA,kBAAkB,6BACnB;;;EAIL,MAAM,KAAK,oBAAoB,2BAA2B,cAAc,eAAe,EAAE;;CAG3F,MAAM,aAAa,QAAgB;EACjC,MAAM,OAAO,MAAM,KAAK,YAAY,QAAQ,OAAO;EACnD,IAAI,CAAC,MACH,MAAM,IAAI,oBAAoB,kBAAkB,kBAAkB,6BAA6B;EAEjG,IAAI,KAAK,qBACP,MAAM,IAAI,oBAAoB,4BAA4B,kBAAkB,uBAAuB;EAErG,IAAI,CAAC,KAAK,YACR,MAAM,IAAI,oBAAoB,4BAA4B,kBAAkB,mBAAmB;EAEjG,OAAO,KAAK,WAAW,aAAa,QAAQ,KAAK,SAAS"}