@fdm-monster/server 2.1.0 → 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 (223) 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/RELEASE_NOTES.MD +14 -0
  5. package/dist/_virtual/{_@oxc-project_runtime@0.127.0 → _@oxc-project_runtime@0.129.0}/helpers/decorate.js +1 -1
  6. package/dist/_virtual/{_@oxc-project_runtime@0.127.0 → _@oxc-project_runtime@0.129.0}/helpers/decorateMetadata.js +1 -1
  7. package/dist/consoles/typeorm-create.js.map +1 -1
  8. package/dist/consoles/typeorm-generate.js.map +1 -1
  9. package/dist/consoles/typeorm-migrate.js.map +1 -1
  10. package/dist/constants/authorization.constants.js.map +1 -1
  11. package/dist/container.js.map +1 -1
  12. package/dist/controllers/api-key.controller.js +2 -2
  13. package/dist/controllers/api-key.controller.js.map +1 -1
  14. package/dist/controllers/auth.controller.js +5 -3
  15. package/dist/controllers/auth.controller.js.map +1 -1
  16. package/dist/controllers/batch-call.controller.js +2 -2
  17. package/dist/controllers/batch-call.controller.js.map +1 -1
  18. package/dist/controllers/camera-stream.controller.js +2 -2
  19. package/dist/controllers/camera-stream.controller.js.map +1 -1
  20. package/dist/controllers/file-storage.controller.js +2 -2
  21. package/dist/controllers/file-storage.controller.js.map +1 -1
  22. package/dist/controllers/first-time-setup.controller.js +2 -2
  23. package/dist/controllers/first-time-setup.controller.js.map +1 -1
  24. package/dist/controllers/floor.controller.js +2 -2
  25. package/dist/controllers/floor.controller.js.map +1 -1
  26. package/dist/controllers/metrics.controller.js +2 -2
  27. package/dist/controllers/metrics.controller.js.map +1 -1
  28. package/dist/controllers/print-job.controller.js +2 -2
  29. package/dist/controllers/print-job.controller.js.map +1 -1
  30. package/dist/controllers/print-queue.controller.js +2 -2
  31. package/dist/controllers/print-queue.controller.js.map +1 -1
  32. package/dist/controllers/printer-files.controller.js +2 -2
  33. package/dist/controllers/printer-files.controller.js.map +1 -1
  34. package/dist/controllers/printer-maintenance-log.controller.js +2 -2
  35. package/dist/controllers/printer-maintenance-log.controller.js.map +1 -1
  36. package/dist/controllers/printer-settings.controller.js +2 -2
  37. package/dist/controllers/printer-settings.controller.js.map +1 -1
  38. package/dist/controllers/printer-tag.controller.js +2 -2
  39. package/dist/controllers/printer-tag.controller.js.map +1 -1
  40. package/dist/controllers/printer.controller.js +2 -2
  41. package/dist/controllers/printer.controller.js.map +1 -1
  42. package/dist/controllers/server-private.controller.js +2 -2
  43. package/dist/controllers/server-private.controller.js.map +1 -1
  44. package/dist/controllers/server-public.controller.js +2 -2
  45. package/dist/controllers/server-public.controller.js.map +1 -1
  46. package/dist/controllers/settings.controller.js +2 -2
  47. package/dist/controllers/settings.controller.js.map +1 -1
  48. package/dist/controllers/slicer-compat.controller.js +2 -2
  49. package/dist/controllers/slicer-compat.controller.js.map +1 -1
  50. package/dist/controllers/user.controller.js +2 -2
  51. package/dist/controllers/user.controller.js.map +1 -1
  52. package/dist/entities/api-key.entity.js +2 -2
  53. package/dist/entities/camera-stream.entity.js +2 -2
  54. package/dist/entities/floor-position.entity.js +2 -2
  55. package/dist/entities/floor.entity.js +2 -2
  56. package/dist/entities/print-job.entity.js +2 -2
  57. package/dist/entities/printer-maintenance-log.entity.js +2 -2
  58. package/dist/entities/printer-tag.entity.js +2 -2
  59. package/dist/entities/printer.entity.js +2 -2
  60. package/dist/entities/refresh-token.entity.js +2 -2
  61. package/dist/entities/role.entity.js +2 -2
  62. package/dist/entities/settings.entity.js +2 -2
  63. package/dist/entities/tag.entity.js +2 -2
  64. package/dist/entities/user-role.entity.js +2 -2
  65. package/dist/entities/user.entity.js +2 -2
  66. package/dist/exceptions/failed-dependency.exception.js.map +1 -1
  67. package/dist/exceptions/job.exceptions.js.map +1 -1
  68. package/dist/exceptions/runtime.exceptions.js.map +1 -1
  69. package/dist/handlers/event-emitter.js.map +1 -1
  70. package/dist/handlers/logger-factory.js.map +1 -1
  71. package/dist/handlers/logger.js.map +1 -1
  72. package/dist/handlers/logging/file-logging.transport.js +1 -2
  73. package/dist/handlers/logging/file-logging.transport.js.map +1 -1
  74. package/dist/handlers/logging/loki-logging.transport.js.map +1 -1
  75. package/dist/handlers/logging/static.logger.js.map +1 -1
  76. package/dist/handlers/validators.js.map +1 -1
  77. package/dist/index.js.map +1 -1
  78. package/dist/middleware/api-key.strategy.js.map +1 -1
  79. package/dist/middleware/authenticate.js.map +1 -1
  80. package/dist/middleware/database.js.map +1 -1
  81. package/dist/middleware/demo.middleware.js.map +1 -1
  82. package/dist/middleware/exception.filter.js.map +1 -1
  83. package/dist/middleware/global.middleware.js.map +1 -1
  84. package/dist/middleware/param-converter.middleware.js.map +1 -1
  85. package/dist/middleware/passport.js.map +1 -1
  86. package/dist/middleware/printer-resolver.js.map +1 -1
  87. package/dist/middleware/printer.js.map +1 -1
  88. package/dist/middleware/slicer-api-key.middleware.js.map +1 -1
  89. package/dist/middleware/socketio.middleware.js.map +1 -1
  90. package/dist/migrations/1706829146617-InitSqlite.js.map +1 -1
  91. package/dist/migrations/1707494762198-PrinterGroup.js.map +1 -1
  92. package/dist/migrations/1708465930665-ChangePrintCompletionDeletePrinterCascade.js.map +1 -1
  93. package/dist/migrations/1713300747465-ChangeRoleNameUnique.js.map +1 -1
  94. package/dist/migrations/1713897879622-AddPrinterType.js.map +1 -1
  95. package/dist/migrations/1720338804844-RemovePrinterFile.js.map +1 -1
  96. package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js.map +1 -1
  97. package/dist/migrations/1766576698569-DropPermissions.js.map +1 -1
  98. package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js.map +1 -1
  99. package/dist/migrations/1767279607392-DropCustomGcode.js.map +1 -1
  100. package/dist/migrations/1767291804417-DropPrintCompletions.js.map +1 -1
  101. package/dist/migrations/1767352862576-DropSettingsFileClean.js.map +1 -1
  102. package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js.map +1 -1
  103. package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js.map +1 -1
  104. package/dist/migrations/1767432108916-RenameGroupToTag.js.map +1 -1
  105. package/dist/migrations/1767451444137-AddPrintJob.js.map +1 -1
  106. package/dist/migrations/1767909428129-AddPrinterMaintenanceLog.js.map +1 -1
  107. package/dist/migrations/1778446203015-AddApiKey.js.map +1 -1
  108. package/dist/plugins/controllers-plugin.js.map +1 -1
  109. package/dist/server.constants.js +2 -1
  110. package/dist/server.constants.js.map +1 -1
  111. package/dist/server.core.js.map +1 -1
  112. package/dist/server.env.js.map +1 -1
  113. package/dist/server.host.js.map +1 -1
  114. package/dist/services/authentication/auth.service.js.map +1 -1
  115. package/dist/services/authentication/jwt.service.js.map +1 -1
  116. package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
  117. package/dist/services/bambu/bambu-mqtt.adapter.js.map +1 -1
  118. package/dist/services/bambu/bambu.client.js.map +1 -1
  119. package/dist/services/bambu.api.js.map +1 -1
  120. package/dist/services/core/batch-call.service.js.map +1 -1
  121. package/dist/services/core/client-bundle.service.js.map +1 -1
  122. package/dist/services/core/config.service.js +4 -0
  123. package/dist/services/core/config.service.js.map +1 -1
  124. package/dist/services/core/cradle.service.js.map +1 -1
  125. package/dist/services/core/github.service.js.map +1 -1
  126. package/dist/services/core/http-client.factory.js.map +1 -1
  127. package/dist/services/core/logs-manager.service.js.map +1 -1
  128. package/dist/services/core/monsterpi.service.js.map +1 -1
  129. package/dist/services/core/multer.service.js.map +1 -1
  130. package/dist/services/core/server-release.service.js.map +1 -1
  131. package/dist/services/core/yaml.service.js.map +1 -1
  132. package/dist/services/file-analysis.service.js.map +1 -1
  133. package/dist/services/file-storage.service.js.map +1 -1
  134. package/dist/services/moonraker/moonraker-websocket.adapter.js.map +1 -1
  135. package/dist/services/moonraker/moonraker.client.js.map +1 -1
  136. package/dist/services/moonraker.api.js.map +1 -1
  137. package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
  138. package/dist/services/octoprint/octoprint-websocket.adapter.js.map +1 -1
  139. package/dist/services/octoprint/octoprint.client.js.map +1 -1
  140. package/dist/services/octoprint/utils/api.utils.js.map +1 -1
  141. package/dist/services/octoprint/utils/file.utils.js.map +1 -1
  142. package/dist/services/octoprint/utils/octoprint-http-client.builder.js.map +1 -1
  143. package/dist/services/octoprint.api.js.map +1 -1
  144. package/dist/services/orm/api-key.service.js.map +1 -1
  145. package/dist/services/orm/base.service.js.map +1 -1
  146. package/dist/services/orm/camera-stream.service.js.map +1 -1
  147. package/dist/services/orm/floor-position.service.js.map +1 -1
  148. package/dist/services/orm/floor.service.js.map +1 -1
  149. package/dist/services/orm/permission.service.js.map +1 -1
  150. package/dist/services/orm/print-job.service.js.map +1 -1
  151. package/dist/services/orm/printer-maintenance-log.service.js.map +1 -1
  152. package/dist/services/orm/printer-tag.service.js.map +1 -1
  153. package/dist/services/orm/printer.service.js.map +1 -1
  154. package/dist/services/orm/refresh-token.service.js.map +1 -1
  155. package/dist/services/orm/role.service.js.map +1 -1
  156. package/dist/services/orm/settings.service.js.map +1 -1
  157. package/dist/services/orm/user-role.service.js.map +1 -1
  158. package/dist/services/orm/user.service.js.map +1 -1
  159. package/dist/services/print-file-downloader.service.js.map +1 -1
  160. package/dist/services/print-queue.service.js.map +1 -1
  161. package/dist/services/printer-api.factory.js.map +1 -1
  162. package/dist/services/printer-api.interface.js.map +1 -1
  163. package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -1
  164. package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
  165. package/dist/services/prusa-link/utils/digest-auth.util.js +19 -12
  166. package/dist/services/prusa-link/utils/digest-auth.util.js.map +1 -1
  167. package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js +45 -11
  168. package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js.map +1 -1
  169. package/dist/services/socket.factory.js.map +1 -1
  170. package/dist/services/task-manager.service.js.map +1 -1
  171. package/dist/services/typeorm/typeorm.service.js.map +1 -1
  172. package/dist/services/validators/printer-service.validation.js.map +1 -1
  173. package/dist/shared/default-http-client.builder.js.map +1 -1
  174. package/dist/shared/load-controllers.js.map +1 -1
  175. package/dist/shared/runtime-settings.migration.js.map +1 -1
  176. package/dist/shared/websocket-rpc-extended.adapter.js.map +1 -1
  177. package/dist/shared/websocket.adapter.js.map +1 -1
  178. package/dist/state/file-upload-tracker.cache.js.map +1 -1
  179. package/dist/state/floor.store.js.map +1 -1
  180. package/dist/state/printer-events.cache.js.map +1 -1
  181. package/dist/state/printer-socket.store.js.map +1 -1
  182. package/dist/state/printer-thumbnail.cache.js.map +1 -1
  183. package/dist/state/printer.cache.js.map +1 -1
  184. package/dist/state/settings.store.js.map +1 -1
  185. package/dist/state/socket-io.gateway.js.map +1 -1
  186. package/dist/state/test-printer-socket.store.js.map +1 -1
  187. package/dist/tasks/boot.task.js.map +1 -1
  188. package/dist/tasks/client-bundle.task.js.map +1 -1
  189. package/dist/tasks/print-job-analysis.task.js.map +1 -1
  190. package/dist/tasks/printer-websocket-restore.task.js.map +1 -1
  191. package/dist/tasks/printer-websocket.task.js.map +1 -1
  192. package/dist/tasks/socketio.task.js.map +1 -1
  193. package/dist/tasks/software-update.task.js.map +1 -1
  194. package/dist/tasks.js.map +1 -1
  195. package/dist/utils/array.util.js.map +1 -1
  196. package/dist/utils/bgcode/bgcode-thumbnail.parser.js.map +1 -1
  197. package/dist/utils/bgcode/bgcode.utils.js.map +1 -1
  198. package/dist/utils/bgcode/heatshrink-decoder.js.map +1 -1
  199. package/dist/utils/bgcode/png-encoder.js.map +1 -1
  200. package/dist/utils/bgcode/qoi-decoder.js.map +1 -1
  201. package/dist/utils/cache/key-diff.cache.js.map +1 -1
  202. package/dist/utils/correlation-token.util.js.map +1 -1
  203. package/dist/utils/crypto.utils.js.map +1 -1
  204. package/dist/utils/env.utils.js.map +1 -1
  205. package/dist/utils/error.utils.js.map +1 -1
  206. package/dist/utils/fs.utils.js.map +1 -1
  207. package/dist/utils/gcode.utils.js.map +1 -1
  208. package/dist/utils/image-dimensions.js.map +1 -1
  209. package/dist/utils/job-stats.util.js.map +1 -1
  210. package/dist/utils/normalize-url.js.map +1 -1
  211. package/dist/utils/parsers/3mf.parser.js.map +1 -1
  212. package/dist/utils/parsers/bgcode.parser.js.map +1 -1
  213. package/dist/utils/parsers/gcode.parser.js.map +1 -1
  214. package/dist/utils/pretty-print.utils.js.map +1 -1
  215. package/dist/utils/semver.utils.js.map +1 -1
  216. package/dist/utils/swagger/decorators.js.map +1 -1
  217. package/dist/utils/swagger/generator.js.map +1 -1
  218. package/dist/utils/swagger/swagger.js.map +1 -1
  219. package/dist/utils/thumbnail.util.js.map +1 -1
  220. package/dist/utils/time.utils.js.map +1 -1
  221. package/dist/utils/url.utils.js.map +1 -1
  222. package/package.json +10 -7
  223. package/packages/consoles/package.json +1 -1
package/.yarnrc.yml CHANGED
@@ -1,4 +1,8 @@
1
1
  nodeLinker: node-modules
2
2
 
3
- yarnPath: .yarn/releases/yarn-4.13.0.cjs
3
+ yarnPath: .yarn/releases/yarn-4.14.1.cjs
4
4
  httpTimeout: 1000000
5
+
6
+ # Make the default explicit:
7
+ # Disable scripts since we don't want to run any postinstall scripts in this project
8
+ enableScripts: false
package/RELEASE_NOTES.MD CHANGED
@@ -1,3 +1,17 @@
1
+ # FDM Monster 15/05/2026 2.1.1
2
+
3
+ ## Features
4
+
5
+ - feat(auth): expose INSTANCE_LABEL env var on /auth/login-required response for better client-side handling of multi-instance setups
6
+
7
+ ## Fixes
8
+
9
+ - Extends Digest auth for broader PrusaLink support (especially for MK2/MK3 printers with PrusaLink extension on Raspberry Pi)
10
+
11
+ ## Chores
12
+
13
+ - Remove unused package Luxon, moved chalk to devDependencies
14
+
1
15
  # FDM Monster 13/05/2026 2.1.0
2
16
 
3
17
  ## Features
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.127.0/helpers/decorate.js
1
+ //#region \0@oxc-project+runtime@0.129.0/helpers/decorate.js
2
2
  function __decorate(decorators, target, key, desc) {
3
3
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
4
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.127.0/helpers/decorateMetadata.js
1
+ //#region \0@oxc-project+runtime@0.129.0/helpers/decorateMetadata.js
2
2
  function __decorateMetadata(k, v) {
3
3
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
4
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"typeorm-create.js","names":[],"sources":["../../src/consoles/typeorm-create.ts"],"sourcesContent":["import { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { camelCase } from \"typeorm/util/StringUtils\";\nimport * as readline from \"node:readline\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\n\n/**\n * Gets contents of the migration file.\n */\nfunction getTemplate(name: string, timestamp: number): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${migrationName} implements MigrationInterface {\n name = '${migrationName}'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n // TODO: Add migration queries here\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n // TODO: Add rollback queries here\n }\n\n}\n`;\n}\n\n/**\n * Gets contents of the migration file in Javascript.\n */\nfunction getJavascriptTemplate(name: string, timestamp: number): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `const { MigrationInterface, QueryRunner } = require(\"typeorm\");\n\nmodule.exports = class ${migrationName} {\n name = '${migrationName}'\n\n async up(queryRunner) {\n // TODO: Add migration queries here\n }\n\n async down(queryRunner) {\n // TODO: Add rollback queries here\n }\n}\n`;\n}\n\nasync function confirm(question: string, hint: string) {\n const line = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise<string>((resolve) => {\n line.question(question, (response) => {\n line.close();\n resolve(response);\n });\n line.write(hint);\n });\n}\n\nasync function main() {\n const timestamp = CommandUtils.getTimestamp(Date.now());\n const extension = \".ts\"; // args.outputJs ? \".js\" : \".ts\";\n\n try {\n console.log(chalk.green(`Creating empty migration file...`));\n\n let name;\n while (!name) {\n name = (await confirm(\"Please provide a name for the migration: \", \"NewMigration\"))?.trim();\n if (name) break;\n console.log(chalk.red(`Name is required, try again`));\n process.exit(1);\n }\n\n const fullPath = path.resolve(process.cwd(), `src/migrations/${name}`);\n const filename = timestamp + \"-\" + path.basename(fullPath) + extension;\n\n const fileContent = false\n ? getJavascriptTemplate(path.basename(fullPath), timestamp)\n : getTemplate(path.basename(fullPath), timestamp);\n\n const migrationFileName = path.dirname(fullPath) + \"/\" + filename;\n await CommandUtils.createFile(migrationFileName, fileContent);\n\n console.log(chalk.green(`Migration ${chalk.blue(migrationFileName)} has been generated successfully.`));\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration creation:\", err);\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":";;;;;;;;;;AAUA,SAAS,YAAY,MAAc,WAA2B;CAC5D,MAAM,gBAAgB,GAAG,UAAU,MAAM,KAAK,GAAG;AAEjD,QAAO;;eAEM,cAAc;cACf,cAAc;;;;;;;;;;;;;AAoC5B,eAAe,QAAQ,UAAkB,MAAc;CACrD,MAAM,OAAO,SAAS,gBAAgB;EACpC,OAAO,QAAQ;EACf,QAAQ,QAAQ;EACjB,CAAC;AAEF,QAAO,IAAI,SAAiB,YAAY;AACtC,OAAK,SAAS,WAAW,aAAa;AACpC,QAAK,OAAO;AACZ,WAAQ,SAAS;IACjB;AACF,OAAK,MAAM,KAAK;GAChB;;AAGJ,eAAe,OAAO;CACpB,MAAM,YAAY,aAAa,aAAa,KAAK,KAAK,CAAC;CACvD,MAAM,YAAY;AAElB,KAAI;AACF,UAAQ,IAAI,MAAM,MAAM,mCAAmC,CAAC;EAE5D,IAAI;AACJ,SAAO,CAAC,MAAM;AACZ,WAAQ,MAAM,QAAQ,6CAA6C,eAAe,GAAG,MAAM;AAC3F,OAAI,KAAM;AACV,WAAQ,IAAI,MAAM,IAAI,8BAA8B,CAAC;AACrD,WAAQ,KAAK,EAAE;;EAGjB,MAAM,WAAW,KAAK,QAAQ,QAAQ,KAAK,EAAE,kBAAkB,OAAO;EACtE,MAAM,WAAW,YAAY,MAAM,KAAK,SAAS,SAAS,GAAG;EAE7D,MAAM,cAEF,YAAY,KAAK,SAAS,SAAS,EAAE,UAAU;EAEnD,MAAM,oBAAoB,KAAK,QAAQ,SAAS,GAAG,MAAM;AACzD,QAAM,aAAa,WAAW,mBAAmB,YAAY;AAE7D,UAAQ,IAAI,MAAM,MAAM,aAAa,MAAM,KAAK,kBAAkB,CAAC,mCAAmC,CAAC;UAChG,KAAK;AACZ,gBAAc,UAAU,oCAAoC,IAAI;AAChE,UAAQ,KAAK,EAAE;;;AAInB,IAAI,yBAAQ,IAAI,MAAM,EAAC,SAAS;AAChC,MAAM,CAAC,WAAW;CAChB,IAAI,uBAAM,IAAI,MAAM,EAAC,SAAS;AAC9B,SAAQ,IAAI,QAAQ,MAAM,OAAO,KAAK;AAGtC,SAAQ,KAAK,EAAE;EACf"}
1
+ {"version":3,"file":"typeorm-create.js","names":[],"sources":["../../src/consoles/typeorm-create.ts"],"sourcesContent":["import { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { camelCase } from \"typeorm/util/StringUtils\";\nimport * as readline from \"node:readline\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\n\n/**\n * Gets contents of the migration file.\n */\nfunction getTemplate(name: string, timestamp: number): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${migrationName} implements MigrationInterface {\n name = '${migrationName}'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n // TODO: Add migration queries here\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n // TODO: Add rollback queries here\n }\n\n}\n`;\n}\n\n/**\n * Gets contents of the migration file in Javascript.\n */\nfunction getJavascriptTemplate(name: string, timestamp: number): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `const { MigrationInterface, QueryRunner } = require(\"typeorm\");\n\nmodule.exports = class ${migrationName} {\n name = '${migrationName}'\n\n async up(queryRunner) {\n // TODO: Add migration queries here\n }\n\n async down(queryRunner) {\n // TODO: Add rollback queries here\n }\n}\n`;\n}\n\nasync function confirm(question: string, hint: string) {\n const line = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise<string>((resolve) => {\n line.question(question, (response) => {\n line.close();\n resolve(response);\n });\n line.write(hint);\n });\n}\n\nasync function main() {\n const timestamp = CommandUtils.getTimestamp(Date.now());\n const extension = \".ts\"; // args.outputJs ? \".js\" : \".ts\";\n\n try {\n console.log(chalk.green(`Creating empty migration file...`));\n\n let name;\n while (!name) {\n name = (await confirm(\"Please provide a name for the migration: \", \"NewMigration\"))?.trim();\n if (name) break;\n console.log(chalk.red(`Name is required, try again`));\n process.exit(1);\n }\n\n const fullPath = path.resolve(process.cwd(), `src/migrations/${name}`);\n const filename = timestamp + \"-\" + path.basename(fullPath) + extension;\n\n const fileContent = false\n ? getJavascriptTemplate(path.basename(fullPath), timestamp)\n : getTemplate(path.basename(fullPath), timestamp);\n\n const migrationFileName = path.dirname(fullPath) + \"/\" + filename;\n await CommandUtils.createFile(migrationFileName, fileContent);\n\n console.log(chalk.green(`Migration ${chalk.blue(migrationFileName)} has been generated successfully.`));\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration creation:\", err);\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":";;;;;;;;;;AAUA,SAAS,YAAY,MAAc,WAA2B;CAC5D,MAAM,gBAAgB,GAAG,UAAU,MAAM,KAAK,GAAG;CAEjD,OAAO;;eAEM,cAAc;cACf,cAAc;;;;;;;;;;;;;AAoC5B,eAAe,QAAQ,UAAkB,MAAc;CACrD,MAAM,OAAO,SAAS,gBAAgB;EACpC,OAAO,QAAQ;EACf,QAAQ,QAAQ;EACjB,CAAC;CAEF,OAAO,IAAI,SAAiB,YAAY;EACtC,KAAK,SAAS,WAAW,aAAa;GACpC,KAAK,OAAO;GACZ,QAAQ,SAAS;IACjB;EACF,KAAK,MAAM,KAAK;GAChB;;AAGJ,eAAe,OAAO;CACpB,MAAM,YAAY,aAAa,aAAa,KAAK,KAAK,CAAC;CACvD,MAAM,YAAY;CAElB,IAAI;EACF,QAAQ,IAAI,MAAM,MAAM,mCAAmC,CAAC;EAE5D,IAAI;EACJ,OAAO,CAAC,MAAM;GACZ,QAAQ,MAAM,QAAQ,6CAA6C,eAAe,GAAG,MAAM;GAC3F,IAAI,MAAM;GACV,QAAQ,IAAI,MAAM,IAAI,8BAA8B,CAAC;GACrD,QAAQ,KAAK,EAAE;;EAGjB,MAAM,WAAW,KAAK,QAAQ,QAAQ,KAAK,EAAE,kBAAkB,OAAO;EACtE,MAAM,WAAW,YAAY,MAAM,KAAK,SAAS,SAAS,GAAG;EAE7D,MAAM,cAEF,YAAY,KAAK,SAAS,SAAS,EAAE,UAAU;EAEnD,MAAM,oBAAoB,KAAK,QAAQ,SAAS,GAAG,MAAM;EACzD,MAAM,aAAa,WAAW,mBAAmB,YAAY;EAE7D,QAAQ,IAAI,MAAM,MAAM,aAAa,MAAM,KAAK,kBAAkB,CAAC,mCAAmC,CAAC;UAChG,KAAK;EACZ,cAAc,UAAU,oCAAoC,IAAI;EAChE,QAAQ,KAAK,EAAE;;;AAInB,IAAI,yBAAQ,IAAI,MAAM,EAAC,SAAS;AAChC,MAAM,CAAC,WAAW;CAChB,IAAI,uBAAM,IAAI,MAAM,EAAC,SAAS;CAC9B,QAAQ,IAAI,QAAQ,MAAM,OAAO,KAAK;CAGtC,QAAQ,KAAK,EAAE;EACf"}
@@ -1 +1 @@
1
- {"version":3,"file":"typeorm-generate.js","names":[],"sources":["../../src/consoles/typeorm-generate.ts"],"sourcesContent":["import { DataSource } from \"typeorm\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\nimport { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { camelCase } from \"typeorm/util/StringUtils\";\nimport { format } from \"@sqltools/formatter/lib/sqlFormatter\";\nimport * as readline from \"node:readline\";\n\n/**\n * Formats query parameters for migration queries if parameters actually exist\n */\nfunction queryParams(parameters: any[] | undefined): string {\n if (!parameters || !parameters.length) {\n return \"\";\n }\n\n return `, ${JSON.stringify(parameters)}`;\n}\n\n/**\n * Gets contents of the migration file.\n */\nfunction getTemplate(name: string, timestamp: number, upSqls: string[], downSqls: string[]): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${migrationName} implements MigrationInterface {\n name = '${migrationName}'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n${upSqls.join(`\n`)}\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n${downSqls.join(`\n`)}\n }\n\n}\n`;\n}\n\n/**\n * Gets contents of the migration file in Javascript.\n */\nfunction getJavascriptTemplate(name: string, timestamp: number, upSqls: string[], downSqls: string[]): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `const { MigrationInterface, QueryRunner } = require(\"typeorm\");\n\nmodule.exports = class ${migrationName} {\n name = '${migrationName}'\n\n async up(queryRunner) {\n${upSqls.join(`\n`)}\n }\n\n async down(queryRunner) {\n${downSqls.join(`\n`)}\n }\n}\n`;\n}\n\n/**\n *\n */\nfunction prettifyQuery(query: string) {\n const formattedQuery = format(query, { indent: \" \" });\n return \"\\n\" + formattedQuery.replace(/^/gm, \" \") + \"\\n \";\n}\n\nasync function confirm(question: string, hint: string) {\n const line = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise<string>((resolve) => {\n line.question(question, (response) => {\n line.close();\n resolve(response);\n });\n line.write(hint);\n });\n}\n\nasync function main() {\n const timestamp = CommandUtils.getTimestamp(Date.now());\n const extension = \".ts\"; // args.outputJs ? \".js\" : \".ts\";\n\n let dataSource: DataSource | undefined = undefined;\n try {\n dataSource = await CommandUtils.loadDataSource(path.resolve(process.cwd(), \"dist/data-source.js\"));\n dataSource.setOptions({\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n logging: false,\n });\n await dataSource.initialize();\n\n const hasPendingMigrations = await dataSource.showMigrations();\n if (hasPendingMigrations) {\n console.log(\n chalk.yellow(\n `ATTENTION: you have pending migrations (${chalk.blue(\n hasPendingMigrations,\n )}). Running those first, before generating a new migration.`,\n ),\n );\n\n await dataSource.runMigrations({ transaction: \"each\" });\n\n console.log(chalk.green(`Migrations successfully executed.`));\n }\n\n const upSqls: string[] = [],\n downSqls: string[] = [];\n\n try {\n const sqlInMemory = await dataSource.driver.createSchemaBuilder().log();\n\n if (true) {\n sqlInMemory.upQueries.forEach((upQuery) => {\n upQuery.query = prettifyQuery(upQuery.query);\n });\n sqlInMemory.downQueries.forEach((downQuery) => {\n downQuery.query = prettifyQuery(downQuery.query);\n });\n }\n\n sqlInMemory.upQueries.forEach((upQuery) => {\n upSqls.push(\n \" await queryRunner.query(`\" +\n upQuery.query.replace(new RegExp(\"`\", \"g\"), \"\\\\`\") +\n \"`\" +\n queryParams(upQuery.parameters) +\n \");\",\n );\n });\n sqlInMemory.downQueries.forEach((downQuery) => {\n downSqls.push(\n \" await queryRunner.query(`\" +\n downQuery.query.replace(new RegExp(\"`\", \"g\"), \"\\\\`\") +\n \"`\" +\n queryParams(downQuery.parameters) +\n \");\",\n );\n });\n } finally {\n await dataSource.destroy();\n }\n\n if (!upSqls.length) {\n console.log(chalk.green(`No changes in database schema were found`));\n process.exit(0);\n }\n\n console.log(chalk.green(`Migration ready to be saved...`));\n\n console.log(chalk.blue(upSqls.map((s) => s).join(\"\\n\")));\n\n let name;\n while (!name) {\n name = (await confirm(\"Please provide a name for the migration: \", \"Change\"))?.trim();\n if (name) break;\n console.log(chalk.red(`Name is required, try again`));\n process.exit(1);\n }\n\n const fullPath = path.resolve(process.cwd(), `src/migrations/${name}`);\n const filename = timestamp + \"-\" + path.basename(fullPath) + extension;\n\n const fileContent = false\n ? getJavascriptTemplate(path.basename(fullPath), timestamp, upSqls, downSqls.reverse())\n : getTemplate(path.basename(fullPath), timestamp, upSqls, downSqls.reverse());\n\n const migrationFileName = path.dirname(fullPath) + \"/\" + filename;\n await CommandUtils.createFile(migrationFileName, fileContent);\n\n console.log(chalk.green(`Migration ${chalk.blue(migrationFileName)} has been generated successfully.`));\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration generation:\", err);\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"typeorm-generate.js","names":[],"sources":["../../src/consoles/typeorm-generate.ts"],"sourcesContent":["import { DataSource } from \"typeorm\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\nimport { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { camelCase } from \"typeorm/util/StringUtils\";\nimport { format } from \"@sqltools/formatter/lib/sqlFormatter\";\nimport * as readline from \"node:readline\";\n\n/**\n * Formats query parameters for migration queries if parameters actually exist\n */\nfunction queryParams(parameters: any[] | undefined): string {\n if (!parameters || !parameters.length) {\n return \"\";\n }\n\n return `, ${JSON.stringify(parameters)}`;\n}\n\n/**\n * Gets contents of the migration file.\n */\nfunction getTemplate(name: string, timestamp: number, upSqls: string[], downSqls: string[]): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${migrationName} implements MigrationInterface {\n name = '${migrationName}'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n${upSqls.join(`\n`)}\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n${downSqls.join(`\n`)}\n }\n\n}\n`;\n}\n\n/**\n * Gets contents of the migration file in Javascript.\n */\nfunction getJavascriptTemplate(name: string, timestamp: number, upSqls: string[], downSqls: string[]): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `const { MigrationInterface, QueryRunner } = require(\"typeorm\");\n\nmodule.exports = class ${migrationName} {\n name = '${migrationName}'\n\n async up(queryRunner) {\n${upSqls.join(`\n`)}\n }\n\n async down(queryRunner) {\n${downSqls.join(`\n`)}\n }\n}\n`;\n}\n\n/**\n *\n */\nfunction prettifyQuery(query: string) {\n const formattedQuery = format(query, { indent: \" \" });\n return \"\\n\" + formattedQuery.replace(/^/gm, \" \") + \"\\n \";\n}\n\nasync function confirm(question: string, hint: string) {\n const line = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise<string>((resolve) => {\n line.question(question, (response) => {\n line.close();\n resolve(response);\n });\n line.write(hint);\n });\n}\n\nasync function main() {\n const timestamp = CommandUtils.getTimestamp(Date.now());\n const extension = \".ts\"; // args.outputJs ? \".js\" : \".ts\";\n\n let dataSource: DataSource | undefined = undefined;\n try {\n dataSource = await CommandUtils.loadDataSource(path.resolve(process.cwd(), \"dist/data-source.js\"));\n dataSource.setOptions({\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n logging: false,\n });\n await dataSource.initialize();\n\n const hasPendingMigrations = await dataSource.showMigrations();\n if (hasPendingMigrations) {\n console.log(\n chalk.yellow(\n `ATTENTION: you have pending migrations (${chalk.blue(\n hasPendingMigrations,\n )}). Running those first, before generating a new migration.`,\n ),\n );\n\n await dataSource.runMigrations({ transaction: \"each\" });\n\n console.log(chalk.green(`Migrations successfully executed.`));\n }\n\n const upSqls: string[] = [],\n downSqls: string[] = [];\n\n try {\n const sqlInMemory = await dataSource.driver.createSchemaBuilder().log();\n\n if (true) {\n sqlInMemory.upQueries.forEach((upQuery) => {\n upQuery.query = prettifyQuery(upQuery.query);\n });\n sqlInMemory.downQueries.forEach((downQuery) => {\n downQuery.query = prettifyQuery(downQuery.query);\n });\n }\n\n sqlInMemory.upQueries.forEach((upQuery) => {\n upSqls.push(\n \" await queryRunner.query(`\" +\n upQuery.query.replace(new RegExp(\"`\", \"g\"), \"\\\\`\") +\n \"`\" +\n queryParams(upQuery.parameters) +\n \");\",\n );\n });\n sqlInMemory.downQueries.forEach((downQuery) => {\n downSqls.push(\n \" await queryRunner.query(`\" +\n downQuery.query.replace(new RegExp(\"`\", \"g\"), \"\\\\`\") +\n \"`\" +\n queryParams(downQuery.parameters) +\n \");\",\n );\n });\n } finally {\n await dataSource.destroy();\n }\n\n if (!upSqls.length) {\n console.log(chalk.green(`No changes in database schema were found`));\n process.exit(0);\n }\n\n console.log(chalk.green(`Migration ready to be saved...`));\n\n console.log(chalk.blue(upSqls.map((s) => s).join(\"\\n\")));\n\n let name;\n while (!name) {\n name = (await confirm(\"Please provide a name for the migration: \", \"Change\"))?.trim();\n if (name) break;\n console.log(chalk.red(`Name is required, try again`));\n process.exit(1);\n }\n\n const fullPath = path.resolve(process.cwd(), `src/migrations/${name}`);\n const filename = timestamp + \"-\" + path.basename(fullPath) + extension;\n\n const fileContent = false\n ? getJavascriptTemplate(path.basename(fullPath), timestamp, upSqls, downSqls.reverse())\n : getTemplate(path.basename(fullPath), timestamp, upSqls, downSqls.reverse());\n\n const migrationFileName = path.dirname(fullPath) + \"/\" + filename;\n await CommandUtils.createFile(migrationFileName, fileContent);\n\n console.log(chalk.green(`Migration ${chalk.blue(migrationFileName)} has been generated successfully.`));\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration generation:\", err);\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"typeorm-migrate.js","names":[],"sources":["../../src/consoles/typeorm-migrate.ts"],"sourcesContent":["import { DataSource } from \"typeorm\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\nimport { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"path\";\n\nasync function main() {\n let dataSource: DataSource | undefined = undefined;\n try {\n dataSource = await CommandUtils.loadDataSource(path.resolve(process.cwd(), \"dist/data-source.js\"));\n dataSource.setOptions({\n subscribers: [],\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n logging: [\"query\", \"error\", \"schema\"],\n });\n await dataSource.initialize();\n\n const options = {\n transaction: dataSource.options.migrationsTransactionMode ?? (\"all\" as \"all\" | \"none\" | \"each\"),\n // fake: !!args.f,\n };\n options.transaction = \"all\";\n\n await dataSource.runMigrations(options);\n await dataSource.destroy();\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration run:\", err);\n\n if (dataSource && dataSource.isInitialized) await dataSource.destroy();\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":";;;;AAKA,eAAe,OAAO;CACpB,IAAI,aAAqC,KAAA;AACzC,KAAI;AACF,eAAa,MAAM,aAAa,eAAe,KAAK,QAAQ,QAAQ,KAAK,EAAE,sBAAsB,CAAC;AAClG,aAAW,WAAW;GACpB,aAAa,EAAE;GACf,aAAa;GACb,eAAe;GACf,YAAY;GACZ,SAAS;IAAC;IAAS;IAAS;IAAS;GACtC,CAAC;AACF,QAAM,WAAW,YAAY;EAE7B,MAAM,UAAU,EACd,aAAa,WAAW,QAAQ,6BAA8B,OAE/D;AACD,UAAQ,cAAc;AAEtB,QAAM,WAAW,cAAc,QAAQ;AACvC,QAAM,WAAW,SAAS;UACnB,KAAK;AACZ,gBAAc,UAAU,+BAA+B,IAAI;AAE3D,MAAI,cAAc,WAAW,cAAe,OAAM,WAAW,SAAS;AACtE,UAAQ,KAAK,EAAE;;;AAInB,IAAI,yBAAQ,IAAI,MAAM,EAAC,SAAS;AAChC,MAAM,CAAC,WAAW;CAChB,IAAI,uBAAM,IAAI,MAAM,EAAC,SAAS;AAC9B,SAAQ,IAAI,QAAQ,MAAM,OAAO,KAAK;AAGtC,SAAQ,KAAK,EAAE;EACf"}
1
+ {"version":3,"file":"typeorm-migrate.js","names":[],"sources":["../../src/consoles/typeorm-migrate.ts"],"sourcesContent":["import { DataSource } from \"typeorm\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\nimport { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"path\";\n\nasync function main() {\n let dataSource: DataSource | undefined = undefined;\n try {\n dataSource = await CommandUtils.loadDataSource(path.resolve(process.cwd(), \"dist/data-source.js\"));\n dataSource.setOptions({\n subscribers: [],\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n logging: [\"query\", \"error\", \"schema\"],\n });\n await dataSource.initialize();\n\n const options = {\n transaction: dataSource.options.migrationsTransactionMode ?? (\"all\" as \"all\" | \"none\" | \"each\"),\n // fake: !!args.f,\n };\n options.transaction = \"all\";\n\n await dataSource.runMigrations(options);\n await dataSource.destroy();\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration run:\", err);\n\n if (dataSource && dataSource.isInitialized) await dataSource.destroy();\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":";;;;AAKA,eAAe,OAAO;CACpB,IAAI,aAAqC,KAAA;CACzC,IAAI;EACF,aAAa,MAAM,aAAa,eAAe,KAAK,QAAQ,QAAQ,KAAK,EAAE,sBAAsB,CAAC;EAClG,WAAW,WAAW;GACpB,aAAa,EAAE;GACf,aAAa;GACb,eAAe;GACf,YAAY;GACZ,SAAS;IAAC;IAAS;IAAS;IAAS;GACtC,CAAC;EACF,MAAM,WAAW,YAAY;EAE7B,MAAM,UAAU,EACd,aAAa,WAAW,QAAQ,6BAA8B,OAE/D;EACD,QAAQ,cAAc;EAEtB,MAAM,WAAW,cAAc,QAAQ;EACvC,MAAM,WAAW,SAAS;UACnB,KAAK;EACZ,cAAc,UAAU,+BAA+B,IAAI;EAE3D,IAAI,cAAc,WAAW,eAAe,MAAM,WAAW,SAAS;EACtE,QAAQ,KAAK,EAAE;;;AAInB,IAAI,yBAAQ,IAAI,MAAM,EAAC,SAAS;AAChC,MAAM,CAAC,WAAW;CAChB,IAAI,uBAAM,IAAI,MAAM,EAAC,SAAS;CAC9B,QAAQ,IAAI,QAAQ,MAAM,OAAO,KAAK;CAGtC,QAAQ,KAAK,EAAE;EACf"}
@@ -1 +1 @@
1
- {"version":3,"file":"authorization.constants.js","names":[],"sources":["../../src/constants/authorization.constants.ts"],"sourcesContent":["export const AUTH_ERROR_REASON = {\n // Before login\n IncorrectCredentials: \"IncorrectCredentials\",\n InvalidOrExpiredRefreshToken: \"InvalidOrExpiredRefreshToken\",\n InvalidOrExpiredAuthToken: \"InvalidOrExpiredAuthToken\",\n PasswordChangeRequired: \"PasswordChangeRequired\",\n LoginRequired: \"LoginRequired\",\n AccountNotVerified: \"AccountNotVerified\",\n};\n\nexport const PERM_GROUP = {\n PrinterFiles: \"PrinterFiles\",\n PrinterSettings: \"PrinterSettings\",\n Jobs: \"Jobs\",\n Floors: \"Floors\",\n ServerInfo: \"ServerInfo\",\n PrinterMaintenanceLog: \"PrinterMaintenanceLog\",\n} as const;\n\nexport type PermissionGroup = (typeof PERM_GROUP)[keyof typeof PERM_GROUP];\n\nexport const PERMS = {\n [PERM_GROUP.PrinterFiles]: {\n Default: \"PrinterFiles.Default\",\n Get: \"PrinterFiles.Get\",\n Delete: \"PrinterFiles.Delete\",\n Clear: \"PrinterFiles.Clear\",\n Upload: \"PrinterFiles.Upload\",\n Actions: \"PrinterFiles.Actions\",\n },\n [PERM_GROUP.Jobs]: {\n Default: \"Jobs.Default\",\n List: \"Jobs.List\",\n },\n [PERM_GROUP.Floors]: {\n Default: \"Floors.Default\",\n List: \"Floors.List\",\n Get: \"Floors.Get\",\n Create: \"Floors.Create\",\n Update: \"Floors.Update\",\n Delete: \"Floors.Delete\",\n },\n [PERM_GROUP.PrinterSettings]: {\n Default: \"PrinterSettings.Default\",\n Get: \"PrinterSettings.Get\",\n },\n [PERM_GROUP.ServerInfo]: {\n Default: \"ServerInfo.Default\",\n Get: \"ServerInfo.Get\",\n },\n [PERM_GROUP.PrinterMaintenanceLog]: {\n Default: \"PrinterMaintenanceLog.Default\",\n List: \"PrinterMaintenanceLog.List\",\n Get: \"PrinterMaintenanceLog.Get\",\n Create: \"PrinterMaintenanceLog.Create\",\n Complete: \"PrinterMaintenanceLog.Complete\",\n Delete: \"PrinterMaintenanceLog.Delete\",\n },\n} as const;\n\ntype ExtractPerms<T> = T extends Record<string, string> ? T[keyof T] : never;\ntype PermsType = typeof PERMS;\nexport type PermissionName = ExtractPerms<PermsType[keyof PermsType]>;\n\nexport function flattenPermissionDefinition(): PermissionName[] {\n const permissions: PermissionName[] = [];\n for (const key of Object.values(PERM_GROUP)) {\n for (const permissionName of Object.values(PERMS[key])) {\n permissions.push(permissionName);\n }\n }\n return permissions;\n}\n\nexport function allPerms(group: PermissionGroup): PermissionName[] {\n if (!group || !PERMS[group]) throw new Error(`Permission group name '${group}' was not found`);\n return Object.values(PERMS[group]) as PermissionName[];\n}\n\nexport const ROLES = {\n ADMIN: \"ADMIN\",\n OPERATOR: \"OPERATOR\",\n GUEST: \"GUEST\",\n} as const;\n\nexport type RoleName = (typeof ROLES)[keyof typeof ROLES];\n\nexport const ROLE_PERMS: Record<RoleName, PermissionName[]> = {\n [ROLES.ADMIN]: [\n ...new Set([\n ...allPerms(PERM_GROUP.Jobs),\n ...allPerms(PERM_GROUP.Floors),\n ...allPerms(PERM_GROUP.PrinterFiles),\n ...allPerms(PERM_GROUP.PrinterSettings),\n ...allPerms(PERM_GROUP.ServerInfo),\n ...allPerms(PERM_GROUP.PrinterMaintenanceLog),\n ]),\n ],\n [ROLES.OPERATOR]: [\n ...new Set([\n ...allPerms(PERM_GROUP.Jobs),\n ...allPerms(PERM_GROUP.Floors),\n ...allPerms(PERM_GROUP.PrinterFiles),\n ...allPerms(PERM_GROUP.PrinterSettings),\n ...allPerms(PERM_GROUP.PrinterMaintenanceLog),\n ]),\n ],\n [ROLES.GUEST]: [],\n};\n"],"mappings":";AAAA,MAAa,oBAAoB;CAE/B,sBAAsB;CACtB,8BAA8B;CAC9B,2BAA2B;CAC3B,wBAAwB;CACxB,eAAe;CACf,oBAAoB;CACrB;AAED,MAAa,aAAa;CACxB,cAAc;CACd,iBAAiB;CACjB,MAAM;CACN,QAAQ;CACR,YAAY;CACZ,uBAAuB;CACxB;AAID,MAAa,QAAQ;EAClB,WAAW,eAAe;EACzB,SAAS;EACT,KAAK;EACL,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,SAAS;EACV;EACA,WAAW,OAAO;EACjB,SAAS;EACT,MAAM;EACP;EACA,WAAW,SAAS;EACnB,SAAS;EACT,MAAM;EACN,KAAK;EACL,QAAQ;EACR,QAAQ;EACR,QAAQ;EACT;EACA,WAAW,kBAAkB;EAC5B,SAAS;EACT,KAAK;EACN;EACA,WAAW,aAAa;EACvB,SAAS;EACT,KAAK;EACN;EACA,WAAW,wBAAwB;EAClC,SAAS;EACT,MAAM;EACN,KAAK;EACL,QAAQ;EACR,UAAU;EACV,QAAQ;EACT;CACF;AAMD,SAAgB,8BAAgD;CAC9D,MAAM,cAAgC,EAAE;AACxC,MAAK,MAAM,OAAO,OAAO,OAAO,WAAW,CACzC,MAAK,MAAM,kBAAkB,OAAO,OAAO,MAAM,KAAK,CACpD,aAAY,KAAK,eAAe;AAGpC,QAAO;;AAGT,SAAgB,SAAS,OAA0C;AACjE,KAAI,CAAC,SAAS,CAAC,MAAM,OAAQ,OAAM,IAAI,MAAM,0BAA0B,MAAM,iBAAiB;AAC9F,QAAO,OAAO,OAAO,MAAM,OAAO;;AAGpC,MAAa,QAAQ;CACnB,OAAO;CACP,UAAU;CACV,OAAO;CACR;AAID,MAAa,aAAiD;EAC3D,MAAM,QAAQ,CACb,GAAG,IAAI,IAAI;EACT,GAAG,SAAS,WAAW,KAAK;EAC5B,GAAG,SAAS,WAAW,OAAO;EAC9B,GAAG,SAAS,WAAW,aAAa;EACpC,GAAG,SAAS,WAAW,gBAAgB;EACvC,GAAG,SAAS,WAAW,WAAW;EAClC,GAAG,SAAS,WAAW,sBAAsB;EAC9C,CAAC,CACH;EACA,MAAM,WAAW,CAChB,GAAG,IAAI,IAAI;EACT,GAAG,SAAS,WAAW,KAAK;EAC5B,GAAG,SAAS,WAAW,OAAO;EAC9B,GAAG,SAAS,WAAW,aAAa;EACpC,GAAG,SAAS,WAAW,gBAAgB;EACvC,GAAG,SAAS,WAAW,sBAAsB;EAC9C,CAAC,CACH;EACA,MAAM,QAAQ,EAAE;CAClB"}
1
+ {"version":3,"file":"authorization.constants.js","names":[],"sources":["../../src/constants/authorization.constants.ts"],"sourcesContent":["export const AUTH_ERROR_REASON = {\n // Before login\n IncorrectCredentials: \"IncorrectCredentials\",\n InvalidOrExpiredRefreshToken: \"InvalidOrExpiredRefreshToken\",\n InvalidOrExpiredAuthToken: \"InvalidOrExpiredAuthToken\",\n PasswordChangeRequired: \"PasswordChangeRequired\",\n LoginRequired: \"LoginRequired\",\n AccountNotVerified: \"AccountNotVerified\",\n};\n\nexport const PERM_GROUP = {\n PrinterFiles: \"PrinterFiles\",\n PrinterSettings: \"PrinterSettings\",\n Jobs: \"Jobs\",\n Floors: \"Floors\",\n ServerInfo: \"ServerInfo\",\n PrinterMaintenanceLog: \"PrinterMaintenanceLog\",\n} as const;\n\nexport type PermissionGroup = (typeof PERM_GROUP)[keyof typeof PERM_GROUP];\n\nexport const PERMS = {\n [PERM_GROUP.PrinterFiles]: {\n Default: \"PrinterFiles.Default\",\n Get: \"PrinterFiles.Get\",\n Delete: \"PrinterFiles.Delete\",\n Clear: \"PrinterFiles.Clear\",\n Upload: \"PrinterFiles.Upload\",\n Actions: \"PrinterFiles.Actions\",\n },\n [PERM_GROUP.Jobs]: {\n Default: \"Jobs.Default\",\n List: \"Jobs.List\",\n },\n [PERM_GROUP.Floors]: {\n Default: \"Floors.Default\",\n List: \"Floors.List\",\n Get: \"Floors.Get\",\n Create: \"Floors.Create\",\n Update: \"Floors.Update\",\n Delete: \"Floors.Delete\",\n },\n [PERM_GROUP.PrinterSettings]: {\n Default: \"PrinterSettings.Default\",\n Get: \"PrinterSettings.Get\",\n },\n [PERM_GROUP.ServerInfo]: {\n Default: \"ServerInfo.Default\",\n Get: \"ServerInfo.Get\",\n },\n [PERM_GROUP.PrinterMaintenanceLog]: {\n Default: \"PrinterMaintenanceLog.Default\",\n List: \"PrinterMaintenanceLog.List\",\n Get: \"PrinterMaintenanceLog.Get\",\n Create: \"PrinterMaintenanceLog.Create\",\n Complete: \"PrinterMaintenanceLog.Complete\",\n Delete: \"PrinterMaintenanceLog.Delete\",\n },\n} as const;\n\ntype ExtractPerms<T> = T extends Record<string, string> ? T[keyof T] : never;\ntype PermsType = typeof PERMS;\nexport type PermissionName = ExtractPerms<PermsType[keyof PermsType]>;\n\nexport function flattenPermissionDefinition(): PermissionName[] {\n const permissions: PermissionName[] = [];\n for (const key of Object.values(PERM_GROUP)) {\n for (const permissionName of Object.values(PERMS[key])) {\n permissions.push(permissionName);\n }\n }\n return permissions;\n}\n\nexport function allPerms(group: PermissionGroup): PermissionName[] {\n if (!group || !PERMS[group]) throw new Error(`Permission group name '${group}' was not found`);\n return Object.values(PERMS[group]) as PermissionName[];\n}\n\nexport const ROLES = {\n ADMIN: \"ADMIN\",\n OPERATOR: \"OPERATOR\",\n GUEST: \"GUEST\",\n} as const;\n\nexport type RoleName = (typeof ROLES)[keyof typeof ROLES];\n\nexport const ROLE_PERMS: Record<RoleName, PermissionName[]> = {\n [ROLES.ADMIN]: [\n ...new Set([\n ...allPerms(PERM_GROUP.Jobs),\n ...allPerms(PERM_GROUP.Floors),\n ...allPerms(PERM_GROUP.PrinterFiles),\n ...allPerms(PERM_GROUP.PrinterSettings),\n ...allPerms(PERM_GROUP.ServerInfo),\n ...allPerms(PERM_GROUP.PrinterMaintenanceLog),\n ]),\n ],\n [ROLES.OPERATOR]: [\n ...new Set([\n ...allPerms(PERM_GROUP.Jobs),\n ...allPerms(PERM_GROUP.Floors),\n ...allPerms(PERM_GROUP.PrinterFiles),\n ...allPerms(PERM_GROUP.PrinterSettings),\n ...allPerms(PERM_GROUP.PrinterMaintenanceLog),\n ]),\n ],\n [ROLES.GUEST]: [],\n};\n"],"mappings":";AAAA,MAAa,oBAAoB;CAE/B,sBAAsB;CACtB,8BAA8B;CAC9B,2BAA2B;CAC3B,wBAAwB;CACxB,eAAe;CACf,oBAAoB;CACrB;AAED,MAAa,aAAa;CACxB,cAAc;CACd,iBAAiB;CACjB,MAAM;CACN,QAAQ;CACR,YAAY;CACZ,uBAAuB;CACxB;AAID,MAAa,QAAQ;EAClB,WAAW,eAAe;EACzB,SAAS;EACT,KAAK;EACL,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,SAAS;EACV;EACA,WAAW,OAAO;EACjB,SAAS;EACT,MAAM;EACP;EACA,WAAW,SAAS;EACnB,SAAS;EACT,MAAM;EACN,KAAK;EACL,QAAQ;EACR,QAAQ;EACR,QAAQ;EACT;EACA,WAAW,kBAAkB;EAC5B,SAAS;EACT,KAAK;EACN;EACA,WAAW,aAAa;EACvB,SAAS;EACT,KAAK;EACN;EACA,WAAW,wBAAwB;EAClC,SAAS;EACT,MAAM;EACN,KAAK;EACL,QAAQ;EACR,UAAU;EACV,QAAQ;EACT;CACF;AAMD,SAAgB,8BAAgD;CAC9D,MAAM,cAAgC,EAAE;CACxC,KAAK,MAAM,OAAO,OAAO,OAAO,WAAW,EACzC,KAAK,MAAM,kBAAkB,OAAO,OAAO,MAAM,KAAK,EACpD,YAAY,KAAK,eAAe;CAGpC,OAAO;;AAGT,SAAgB,SAAS,OAA0C;CACjE,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,MAAM,IAAI,MAAM,0BAA0B,MAAM,iBAAiB;CAC9F,OAAO,OAAO,OAAO,MAAM,OAAO;;AAGpC,MAAa,QAAQ;CACnB,OAAO;CACP,UAAU;CACV,OAAO;CACR;AAID,MAAa,aAAiD;EAC3D,MAAM,QAAQ,CACb,GAAG,IAAI,IAAI;EACT,GAAG,SAAS,WAAW,KAAK;EAC5B,GAAG,SAAS,WAAW,OAAO;EAC9B,GAAG,SAAS,WAAW,aAAa;EACpC,GAAG,SAAS,WAAW,gBAAgB;EACvC,GAAG,SAAS,WAAW,WAAW;EAClC,GAAG,SAAS,WAAW,sBAAsB;EAC9C,CAAC,CACH;EACA,MAAM,WAAW,CAChB,GAAG,IAAI,IAAI;EACT,GAAG,SAAS,WAAW,KAAK;EAC5B,GAAG,SAAS,WAAW,OAAO;EAC9B,GAAG,SAAS,WAAW,aAAa;EACpC,GAAG,SAAS,WAAW,gBAAgB;EACvC,GAAG,SAAS,WAAW,sBAAsB;EAC9C,CAAC,CACH;EACA,MAAM,QAAQ,EAAE;CAClB"}
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","names":[],"sources":["../src/container.ts"],"sourcesContent":["import { Octokit } from \"octokit\";\nimport { asClass, asFunction, asValue, createContainer, InjectionMode } from \"awilix\";\nimport { ToadScheduler } from \"toad-scheduler\";\nimport { DITokens } from \"./container.tokens\";\nimport { PrinterService } from \"./services/orm/printer.service\";\nimport { PrinterMaintenanceLogService } from \"./services/orm/printer-maintenance-log.service\";\nimport { SettingsStore } from \"./state/settings.store\";\nimport { ServerReleaseService } from \"./services/core/server-release.service\";\nimport { TaskManagerService } from \"./services/task-manager.service\";\nimport { GithubService } from \"./services/core/github.service\";\nimport { PrinterWebsocketTask } from \"./tasks/printer-websocket.task\";\nimport { SocketIoTask } from \"./tasks/socketio.task\";\nimport { SocketFactory } from \"./services/socket.factory\";\nimport { configureEventEmitter } from \"./handlers/event-emitter\";\nimport { AppConstants } from \"./server.constants\";\nimport { SoftwareUpdateTask } from \"./tasks/software-update.task\";\nimport { LoggerFactory } from \"./handlers/logger-factory\";\nimport { MulterService } from \"./services/core/multer.service\";\nimport { FileUploadTrackerCache } from \"./state/file-upload-tracker.cache\";\nimport { ServerHost } from \"./server.host\";\nimport { BootTask } from \"./tasks/boot.task\";\nimport { UserService } from \"./services/orm/user.service\";\nimport { RoleService } from \"./services/orm/role.service\";\nimport { PermissionService } from \"./services/orm/permission.service\";\nimport { ROLES } from \"./constants/authorization.constants\";\nimport { PrinterWebsocketRestoreTask } from \"./tasks/printer-websocket-restore.task\";\nimport { ConfigService, type IConfigService } from \"./services/core/config.service\";\nimport { SocketIoGateway } from \"./state/socket-io.gateway\";\nimport { ClientBundleService } from \"./services/core/client-bundle.service\";\nimport { FloorStore } from \"./state/floor.store\";\nimport { YamlService } from \"./services/core/yaml.service\";\nimport { MonsterPiService } from \"./services/core/monsterpi.service\";\nimport { BatchCallService } from \"./services/core/batch-call.service\";\nimport { ClientDistDownloadTask } from \"./tasks/client-bundle.task\";\nimport { OctoprintWebsocketAdapter } from \"./services/octoprint/octoprint-websocket.adapter\";\nimport { PrinterCache } from \"./state/printer.cache\";\nimport { PrinterSocketStore } from \"./state/printer-socket.store\";\nimport { TestPrinterSocketStore } from \"./state/test-printer-socket.store\";\nimport { PrinterEventsCache } from \"./state/printer-events.cache\";\nimport { LogDumpService } from \"./services/core/logs-manager.service\";\nimport { CameraStreamService } from \"./services/orm/camera-stream.service\";\nimport { JwtService } from \"./services/authentication/jwt.service\";\nimport { AuthService } from \"./services/authentication/auth.service\";\nimport { throttling, ThrottlingOptions } from \"@octokit/plugin-throttling\";\nimport { RefreshTokenService } from \"@/services/orm/refresh-token.service\";\nimport { ApiKeyService } from \"@/services/orm/api-key.service\";\nimport { SettingsService } from \"@/services/orm/settings.service\";\nimport { FloorService } from \"@/services/orm/floor.service\";\nimport { FloorPositionService } from \"@/services/orm/floor-position.service\";\nimport { ExceptionFilter } from \"@/middleware/exception.filter\";\nimport { TypeormService } from \"@/services/typeorm/typeorm.service\";\nimport { UserRoleService } from \"@/services/orm/user-role.service\";\nimport { PrinterTagService } from \"@/services/orm/printer-tag.service\";\nimport { MoonrakerClient } from \"@/services/moonraker/moonraker.client\";\nimport { MoonrakerWebsocketAdapter } from \"@/services/moonraker/moonraker-websocket.adapter\";\nimport { OctoprintApi } from \"@/services/octoprint.api\";\nimport { OctoprintClient } from \"@/services/octoprint/octoprint.client\";\nimport { MoonrakerApi } from \"@/services/moonraker.api\";\nimport { PrinterApiFactory } from \"@/services/printer-api.factory\";\nimport { PrinterThumbnailCache } from \"@/state/printer-thumbnail.cache\";\nimport { HttpClientFactory } from \"@/services/core/http-client.factory\";\nimport { CradleService } from \"@/services/core/cradle.service\";\nimport { PrusaLinkApi } from \"@/services/prusa-link/prusa-link.api\";\nimport { PrusaLinkHttpPollingAdapter } from \"@/services/prusa-link/prusa-link-http-polling.adapter\";\nimport { BambuClient } from \"@/services/bambu/bambu.client\";\nimport { BambuMqttAdapter } from \"@/services/bambu/bambu-mqtt.adapter\";\nimport { BambuFtpAdapter } from \"@/services/bambu/bambu-ftp.adapter\";\nimport { BambuApi } from \"@/services/bambu.api\";\nimport { PrintQueueService } from \"@/services/print-queue.service\";\nimport { FileStorageService } from \"@/services/file-storage.service\";\nimport { PrintJobService } from \"@/services/orm/print-job.service\";\nimport { FileAnalysisService } from \"@/services/file-analysis.service\";\nimport { PrintJobAnalysisTask } from \"@/tasks/print-job-analysis.task\";\nimport { PrintFileDownloaderService } from \"@/services/print-file-downloader.service\";\n\nexport function configureContainer() {\n const container = createContainer({\n injectionMode: InjectionMode.CLASSIC,\n });\n\n const di = DITokens;\n\n container.register({\n // -- asValue/asFunction constants --\n [di.appDefaultRole]: asValue(ROLES.GUEST),\n [di.appDefaultRoleNoLogin]: asValue(ROLES.ADMIN),\n [di.serverVersion]: asFunction(() => {\n return process.env[AppConstants.VERSION_KEY];\n }),\n [di.cradleService]: asClass(CradleService).inject((container) => ({ container })),\n [di.socketFactory]: asClass(SocketFactory).transient(), // Factory function, transient on purpose!\n\n // V1.6.0 capable services\n [di.typeormService]: asClass(TypeormService).singleton(),\n [di.settingsService]: asClass(SettingsService),\n [di.floorService]: asClass(FloorService).singleton(),\n [di.floorPositionService]: asClass(FloorPositionService).singleton(),\n [di.cameraStreamService]: asClass(CameraStreamService).singleton(),\n [di.printerService]: asClass(PrinterService),\n [di.printerMaintenanceLogService]: asClass(PrinterMaintenanceLogService),\n [di.printerTagService]: asClass(PrinterTagService),\n [di.refreshTokenService]: asClass(RefreshTokenService).singleton(),\n [di.apiKeyService]: asClass(ApiKeyService).singleton(),\n [di.userService]: asClass(UserService).singleton(),\n [di.userRoleService]: asClass(UserRoleService).singleton(),\n [di.roleService]: asClass(RoleService).singleton(),\n [di.permissionService]: asClass(PermissionService).singleton(),\n // -- asClass --\n [di.serverHost]: asClass(ServerHost).singleton(),\n [di.exceptionFilter]: asClass(ExceptionFilter).singleton(),\n [di.settingsStore]: asClass(SettingsStore).singleton(),\n [di.configService]: asClass(ConfigService),\n [di.authService]: asClass(AuthService).singleton(),\n [di.jwtService]: asClass(JwtService).singleton(),\n\n [di.loggerFactory]: asFunction(LoggerFactory).transient(),\n [di.taskManagerService]: asClass(TaskManagerService).singleton(),\n [di.toadScheduler]: asClass(ToadScheduler).singleton(),\n [di.eventEmitter2]: asFunction(configureEventEmitter).singleton(),\n [di.serverReleaseService]: asClass(ServerReleaseService).singleton(),\n [di.monsterPiService]: asClass(MonsterPiService).singleton(),\n [di.githubService]: asClass(GithubService),\n [di.octokitService]: asFunction((configService: IConfigService) => {\n const CustomOctoKit = Octokit.plugin(throttling);\n return new CustomOctoKit({\n auth: configService.get(AppConstants.GITHUB_PAT),\n throttle: {\n onRateLimit: (_retryAfter, options, _octokit, _retryCount) => {\n const logger = LoggerFactory()(\"OctoKitThrottle\");\n logger.warn(`Request quota exhausted for request ${options.method} ${options.url}`);\n },\n onSecondaryRateLimit: (_retryAfter, options, _octokit) => {\n const logger = LoggerFactory()(\"OctoKitThrottle\");\n // does not retry, only logs a warning\n logger.warn(`SecondaryRateLimit detected for request ${options.method} ${options.url}`);\n },\n } satisfies ThrottlingOptions,\n });\n }),\n [di.clientBundleService]: asClass(ClientBundleService),\n [di.logDumpService]: asClass(LogDumpService),\n [di.httpClientFactory]: asClass(HttpClientFactory),\n [di.socketIoGateway]: asClass(SocketIoGateway).singleton(),\n [di.multerService]: asClass(MulterService).singleton(),\n [di.yamlService]: asClass(YamlService),\n [di.printerLogin]: asValue(null), // Fallback when no scope is provided\n [di.printerApiFactory]: asClass(PrinterApiFactory).transient(), // Factory function, transient on purpose!\n [di.prusaLinkApi]: asClass(PrusaLinkApi).transient(), // Transient on purpose\n [di.prusaLinkPollingAdapter]: asClass(PrusaLinkHttpPollingAdapter).transient(), // Transient on purpose\n [di.octoprintApi]: asClass(OctoprintApi).transient(), // Transient on purpose\n [di.octoprintClient]: asClass(OctoprintClient).singleton(),\n [di.octoPrintSockIoAdapter]: asClass(OctoprintWebsocketAdapter).transient(), // Transient on purpose\n [di.moonrakerApi]: asClass(MoonrakerApi).transient(), // Transient on purpose\n [di.moonrakerClient]: asClass(MoonrakerClient).singleton(),\n [di.moonrakerWebsocketAdapter]: asClass(MoonrakerWebsocketAdapter).transient(), // Transient on purpose\n [di.bambuApi]: asClass(BambuApi).transient(),\n [di.bambuClient]: asClass(BambuClient).transient(), // Transient for multi-printer support\n [di.bambuFtpAdapter]: asClass(BambuFtpAdapter).transient(),\n [di.bambuMqttAdapter]: asClass(BambuMqttAdapter).transient(),\n [di.batchCallService]: asClass(BatchCallService).singleton(),\n\n [di.floorStore]: asClass(FloorStore).singleton(),\n [di.printerThumbnailCache]: asClass(PrinterThumbnailCache).singleton(),\n [di.fileUploadTrackerCache]: asClass(FileUploadTrackerCache).singleton(),\n [di.printerCache]: asClass(PrinterCache).singleton(),\n [di.printerEventsCache]: asClass(PrinterEventsCache).singleton(),\n [di.printerSocketStore]: asClass(PrinterSocketStore).singleton(),\n [di.testPrinterSocketStore]: asClass(TestPrinterSocketStore).singleton(),\n [di.printJobService]: asClass(PrintJobService).singleton(),\n [di.printQueueService]: asClass(PrintQueueService).singleton(),\n [di.fileStorageService]: asClass(FileStorageService).singleton(),\n [di.fileAnalysisService]: asClass(FileAnalysisService).singleton(),\n [di.printFileDownloaderService]: asClass(PrintFileDownloaderService).singleton(),\n\n [di.bootTask]: asClass(BootTask),\n [di.softwareUpdateTask]: asClass(SoftwareUpdateTask), // Provided SSE handlers (couplers) shared with controllers\n [di.socketIoTask]: asClass(SocketIoTask).singleton(), // This task is a quick task (~100ms per printer)\n [di.clientDistDownloadTask]: asClass(ClientDistDownloadTask).singleton(),\n [di.printerWebsocketTask]: asClass(PrinterWebsocketTask).singleton(), // This task is a recurring heartbeat task\n [di.printerWebsocketRestoreTask]: asClass(PrinterWebsocketRestoreTask).singleton(), // Task aimed at testing the printer API\n [di.printJobAnalysisTask]: asClass(PrintJobAnalysisTask).singleton(),\n });\n\n return container;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"container.js","names":[],"sources":["../src/container.ts"],"sourcesContent":["import { Octokit } from \"octokit\";\nimport { asClass, asFunction, asValue, createContainer, InjectionMode } from \"awilix\";\nimport { ToadScheduler } from \"toad-scheduler\";\nimport { DITokens } from \"./container.tokens\";\nimport { PrinterService } from \"./services/orm/printer.service\";\nimport { PrinterMaintenanceLogService } from \"./services/orm/printer-maintenance-log.service\";\nimport { SettingsStore } from \"./state/settings.store\";\nimport { ServerReleaseService } from \"./services/core/server-release.service\";\nimport { TaskManagerService } from \"./services/task-manager.service\";\nimport { GithubService } from \"./services/core/github.service\";\nimport { PrinterWebsocketTask } from \"./tasks/printer-websocket.task\";\nimport { SocketIoTask } from \"./tasks/socketio.task\";\nimport { SocketFactory } from \"./services/socket.factory\";\nimport { configureEventEmitter } from \"./handlers/event-emitter\";\nimport { AppConstants } from \"./server.constants\";\nimport { SoftwareUpdateTask } from \"./tasks/software-update.task\";\nimport { LoggerFactory } from \"./handlers/logger-factory\";\nimport { MulterService } from \"./services/core/multer.service\";\nimport { FileUploadTrackerCache } from \"./state/file-upload-tracker.cache\";\nimport { ServerHost } from \"./server.host\";\nimport { BootTask } from \"./tasks/boot.task\";\nimport { UserService } from \"./services/orm/user.service\";\nimport { RoleService } from \"./services/orm/role.service\";\nimport { PermissionService } from \"./services/orm/permission.service\";\nimport { ROLES } from \"./constants/authorization.constants\";\nimport { PrinterWebsocketRestoreTask } from \"./tasks/printer-websocket-restore.task\";\nimport { ConfigService, type IConfigService } from \"./services/core/config.service\";\nimport { SocketIoGateway } from \"./state/socket-io.gateway\";\nimport { ClientBundleService } from \"./services/core/client-bundle.service\";\nimport { FloorStore } from \"./state/floor.store\";\nimport { YamlService } from \"./services/core/yaml.service\";\nimport { MonsterPiService } from \"./services/core/monsterpi.service\";\nimport { BatchCallService } from \"./services/core/batch-call.service\";\nimport { ClientDistDownloadTask } from \"./tasks/client-bundle.task\";\nimport { OctoprintWebsocketAdapter } from \"./services/octoprint/octoprint-websocket.adapter\";\nimport { PrinterCache } from \"./state/printer.cache\";\nimport { PrinterSocketStore } from \"./state/printer-socket.store\";\nimport { TestPrinterSocketStore } from \"./state/test-printer-socket.store\";\nimport { PrinterEventsCache } from \"./state/printer-events.cache\";\nimport { LogDumpService } from \"./services/core/logs-manager.service\";\nimport { CameraStreamService } from \"./services/orm/camera-stream.service\";\nimport { JwtService } from \"./services/authentication/jwt.service\";\nimport { AuthService } from \"./services/authentication/auth.service\";\nimport { throttling, ThrottlingOptions } from \"@octokit/plugin-throttling\";\nimport { RefreshTokenService } from \"@/services/orm/refresh-token.service\";\nimport { ApiKeyService } from \"@/services/orm/api-key.service\";\nimport { SettingsService } from \"@/services/orm/settings.service\";\nimport { FloorService } from \"@/services/orm/floor.service\";\nimport { FloorPositionService } from \"@/services/orm/floor-position.service\";\nimport { ExceptionFilter } from \"@/middleware/exception.filter\";\nimport { TypeormService } from \"@/services/typeorm/typeorm.service\";\nimport { UserRoleService } from \"@/services/orm/user-role.service\";\nimport { PrinterTagService } from \"@/services/orm/printer-tag.service\";\nimport { MoonrakerClient } from \"@/services/moonraker/moonraker.client\";\nimport { MoonrakerWebsocketAdapter } from \"@/services/moonraker/moonraker-websocket.adapter\";\nimport { OctoprintApi } from \"@/services/octoprint.api\";\nimport { OctoprintClient } from \"@/services/octoprint/octoprint.client\";\nimport { MoonrakerApi } from \"@/services/moonraker.api\";\nimport { PrinterApiFactory } from \"@/services/printer-api.factory\";\nimport { PrinterThumbnailCache } from \"@/state/printer-thumbnail.cache\";\nimport { HttpClientFactory } from \"@/services/core/http-client.factory\";\nimport { CradleService } from \"@/services/core/cradle.service\";\nimport { PrusaLinkApi } from \"@/services/prusa-link/prusa-link.api\";\nimport { PrusaLinkHttpPollingAdapter } from \"@/services/prusa-link/prusa-link-http-polling.adapter\";\nimport { BambuClient } from \"@/services/bambu/bambu.client\";\nimport { BambuMqttAdapter } from \"@/services/bambu/bambu-mqtt.adapter\";\nimport { BambuFtpAdapter } from \"@/services/bambu/bambu-ftp.adapter\";\nimport { BambuApi } from \"@/services/bambu.api\";\nimport { PrintQueueService } from \"@/services/print-queue.service\";\nimport { FileStorageService } from \"@/services/file-storage.service\";\nimport { PrintJobService } from \"@/services/orm/print-job.service\";\nimport { FileAnalysisService } from \"@/services/file-analysis.service\";\nimport { PrintJobAnalysisTask } from \"@/tasks/print-job-analysis.task\";\nimport { PrintFileDownloaderService } from \"@/services/print-file-downloader.service\";\n\nexport function configureContainer() {\n const container = createContainer({\n injectionMode: InjectionMode.CLASSIC,\n });\n\n const di = DITokens;\n\n container.register({\n // -- asValue/asFunction constants --\n [di.appDefaultRole]: asValue(ROLES.GUEST),\n [di.appDefaultRoleNoLogin]: asValue(ROLES.ADMIN),\n [di.serverVersion]: asFunction(() => {\n return process.env[AppConstants.VERSION_KEY];\n }),\n [di.cradleService]: asClass(CradleService).inject((container) => ({ container })),\n [di.socketFactory]: asClass(SocketFactory).transient(), // Factory function, transient on purpose!\n\n // V1.6.0 capable services\n [di.typeormService]: asClass(TypeormService).singleton(),\n [di.settingsService]: asClass(SettingsService),\n [di.floorService]: asClass(FloorService).singleton(),\n [di.floorPositionService]: asClass(FloorPositionService).singleton(),\n [di.cameraStreamService]: asClass(CameraStreamService).singleton(),\n [di.printerService]: asClass(PrinterService),\n [di.printerMaintenanceLogService]: asClass(PrinterMaintenanceLogService),\n [di.printerTagService]: asClass(PrinterTagService),\n [di.refreshTokenService]: asClass(RefreshTokenService).singleton(),\n [di.apiKeyService]: asClass(ApiKeyService).singleton(),\n [di.userService]: asClass(UserService).singleton(),\n [di.userRoleService]: asClass(UserRoleService).singleton(),\n [di.roleService]: asClass(RoleService).singleton(),\n [di.permissionService]: asClass(PermissionService).singleton(),\n // -- asClass --\n [di.serverHost]: asClass(ServerHost).singleton(),\n [di.exceptionFilter]: asClass(ExceptionFilter).singleton(),\n [di.settingsStore]: asClass(SettingsStore).singleton(),\n [di.configService]: asClass(ConfigService),\n [di.authService]: asClass(AuthService).singleton(),\n [di.jwtService]: asClass(JwtService).singleton(),\n\n [di.loggerFactory]: asFunction(LoggerFactory).transient(),\n [di.taskManagerService]: asClass(TaskManagerService).singleton(),\n [di.toadScheduler]: asClass(ToadScheduler).singleton(),\n [di.eventEmitter2]: asFunction(configureEventEmitter).singleton(),\n [di.serverReleaseService]: asClass(ServerReleaseService).singleton(),\n [di.monsterPiService]: asClass(MonsterPiService).singleton(),\n [di.githubService]: asClass(GithubService),\n [di.octokitService]: asFunction((configService: IConfigService) => {\n const CustomOctoKit = Octokit.plugin(throttling);\n return new CustomOctoKit({\n auth: configService.get(AppConstants.GITHUB_PAT),\n throttle: {\n onRateLimit: (_retryAfter, options, _octokit, _retryCount) => {\n const logger = LoggerFactory()(\"OctoKitThrottle\");\n logger.warn(`Request quota exhausted for request ${options.method} ${options.url}`);\n },\n onSecondaryRateLimit: (_retryAfter, options, _octokit) => {\n const logger = LoggerFactory()(\"OctoKitThrottle\");\n // does not retry, only logs a warning\n logger.warn(`SecondaryRateLimit detected for request ${options.method} ${options.url}`);\n },\n } satisfies ThrottlingOptions,\n });\n }),\n [di.clientBundleService]: asClass(ClientBundleService),\n [di.logDumpService]: asClass(LogDumpService),\n [di.httpClientFactory]: asClass(HttpClientFactory),\n [di.socketIoGateway]: asClass(SocketIoGateway).singleton(),\n [di.multerService]: asClass(MulterService).singleton(),\n [di.yamlService]: asClass(YamlService),\n [di.printerLogin]: asValue(null), // Fallback when no scope is provided\n [di.printerApiFactory]: asClass(PrinterApiFactory).transient(), // Factory function, transient on purpose!\n [di.prusaLinkApi]: asClass(PrusaLinkApi).transient(), // Transient on purpose\n [di.prusaLinkPollingAdapter]: asClass(PrusaLinkHttpPollingAdapter).transient(), // Transient on purpose\n [di.octoprintApi]: asClass(OctoprintApi).transient(), // Transient on purpose\n [di.octoprintClient]: asClass(OctoprintClient).singleton(),\n [di.octoPrintSockIoAdapter]: asClass(OctoprintWebsocketAdapter).transient(), // Transient on purpose\n [di.moonrakerApi]: asClass(MoonrakerApi).transient(), // Transient on purpose\n [di.moonrakerClient]: asClass(MoonrakerClient).singleton(),\n [di.moonrakerWebsocketAdapter]: asClass(MoonrakerWebsocketAdapter).transient(), // Transient on purpose\n [di.bambuApi]: asClass(BambuApi).transient(),\n [di.bambuClient]: asClass(BambuClient).transient(), // Transient for multi-printer support\n [di.bambuFtpAdapter]: asClass(BambuFtpAdapter).transient(),\n [di.bambuMqttAdapter]: asClass(BambuMqttAdapter).transient(),\n [di.batchCallService]: asClass(BatchCallService).singleton(),\n\n [di.floorStore]: asClass(FloorStore).singleton(),\n [di.printerThumbnailCache]: asClass(PrinterThumbnailCache).singleton(),\n [di.fileUploadTrackerCache]: asClass(FileUploadTrackerCache).singleton(),\n [di.printerCache]: asClass(PrinterCache).singleton(),\n [di.printerEventsCache]: asClass(PrinterEventsCache).singleton(),\n [di.printerSocketStore]: asClass(PrinterSocketStore).singleton(),\n [di.testPrinterSocketStore]: asClass(TestPrinterSocketStore).singleton(),\n [di.printJobService]: asClass(PrintJobService).singleton(),\n [di.printQueueService]: asClass(PrintQueueService).singleton(),\n [di.fileStorageService]: asClass(FileStorageService).singleton(),\n [di.fileAnalysisService]: asClass(FileAnalysisService).singleton(),\n [di.printFileDownloaderService]: asClass(PrintFileDownloaderService).singleton(),\n\n [di.bootTask]: asClass(BootTask),\n [di.softwareUpdateTask]: asClass(SoftwareUpdateTask), // Provided SSE handlers (couplers) shared with controllers\n [di.socketIoTask]: asClass(SocketIoTask).singleton(), // This task is a quick task (~100ms per printer)\n [di.clientDistDownloadTask]: asClass(ClientDistDownloadTask).singleton(),\n [di.printerWebsocketTask]: asClass(PrinterWebsocketTask).singleton(), // This task is a recurring heartbeat task\n [di.printerWebsocketRestoreTask]: asClass(PrinterWebsocketRestoreTask).singleton(), // Task aimed at testing the printer API\n [di.printJobAnalysisTask]: asClass(PrintJobAnalysisTask).singleton(),\n });\n\n return container;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2EA,SAAgB,qBAAqB;CACnC,MAAM,YAAY,gBAAgB,EAChC,eAAe,cAAc,SAC9B,CAAC;CAEF,MAAM,KAAK;CAEX,UAAU,SAAS;GAEhB,GAAG,iBAAiB,QAAQ,MAAM,MAAM;GACxC,GAAG,wBAAwB,QAAQ,MAAM,MAAM;GAC/C,GAAG,gBAAgB,iBAAiB;GACnC,OAAO,QAAQ,IAAI,aAAa;IAChC;GACD,GAAG,gBAAgB,QAAQ,cAAc,CAAC,QAAQ,eAAe,EAAE,WAAW,EAAE;GAChF,GAAG,gBAAgB,QAAQ,cAAc,CAAC,WAAW;GAGrD,GAAG,iBAAiB,QAAQ,eAAe,CAAC,WAAW;GACvD,GAAG,kBAAkB,QAAQ,gBAAgB;GAC7C,GAAG,eAAe,QAAQ,aAAa,CAAC,WAAW;GACnD,GAAG,uBAAuB,QAAQ,qBAAqB,CAAC,WAAW;GACnE,GAAG,sBAAsB,QAAQ,oBAAoB,CAAC,WAAW;GACjE,GAAG,iBAAiB,QAAQ,eAAe;GAC3C,GAAG,+BAA+B,QAAQ,6BAA6B;GACvE,GAAG,oBAAoB,QAAQ,kBAAkB;GACjD,GAAG,sBAAsB,QAAQ,oBAAoB,CAAC,WAAW;GACjE,GAAG,gBAAgB,QAAQ,cAAc,CAAC,WAAW;GACrD,GAAG,cAAc,QAAQ,YAAY,CAAC,WAAW;GACjD,GAAG,kBAAkB,QAAQ,gBAAgB,CAAC,WAAW;GACzD,GAAG,cAAc,QAAQ,YAAY,CAAC,WAAW;GACjD,GAAG,oBAAoB,QAAQ,kBAAkB,CAAC,WAAW;GAE7D,GAAG,aAAa,QAAQ,WAAW,CAAC,WAAW;GAC/C,GAAG,kBAAkB,QAAQ,gBAAgB,CAAC,WAAW;GACzD,GAAG,gBAAgB,QAAQ,cAAc,CAAC,WAAW;GACrD,GAAG,gBAAgB,QAAQ,cAAc;GACzC,GAAG,cAAc,QAAQ,YAAY,CAAC,WAAW;GACjD,GAAG,aAAa,QAAQ,WAAW,CAAC,WAAW;GAE/C,GAAG,gBAAgB,WAAW,cAAc,CAAC,WAAW;GACxD,GAAG,qBAAqB,QAAQ,mBAAmB,CAAC,WAAW;GAC/D,GAAG,gBAAgB,QAAQ,cAAc,CAAC,WAAW;GACrD,GAAG,gBAAgB,WAAW,sBAAsB,CAAC,WAAW;GAChE,GAAG,uBAAuB,QAAQ,qBAAqB,CAAC,WAAW;GACnE,GAAG,mBAAmB,QAAQ,iBAAiB,CAAC,WAAW;GAC3D,GAAG,gBAAgB,QAAQ,cAAc;GACzC,GAAG,iBAAiB,YAAY,kBAAkC;GAEjE,OAAO,KADe,QAAQ,OAAO,WACb,EAAC;IACvB,MAAM,cAAc,IAAI,aAAa,WAAW;IAChD,UAAU;KACR,cAAc,aAAa,SAAS,UAAU,gBAAgB;MAE5D,eAD8B,CAAC,kBACzB,CAAC,KAAK,uCAAuC,QAAQ,OAAO,GAAG,QAAQ,MAAM;;KAErF,uBAAuB,aAAa,SAAS,aAAa;MAGxD,eAF8B,CAAC,kBAEzB,CAAC,KAAK,2CAA2C,QAAQ,OAAO,GAAG,QAAQ,MAAM;;KAE1F;IACF,CAAC;IACF;GACD,GAAG,sBAAsB,QAAQ,oBAAoB;GACrD,GAAG,iBAAiB,QAAQ,eAAe;GAC3C,GAAG,oBAAoB,QAAQ,kBAAkB;GACjD,GAAG,kBAAkB,QAAQ,gBAAgB,CAAC,WAAW;GACzD,GAAG,gBAAgB,QAAQ,cAAc,CAAC,WAAW;GACrD,GAAG,cAAc,QAAQ,YAAY;GACrC,GAAG,eAAe,QAAQ,KAAK;GAC/B,GAAG,oBAAoB,QAAQ,kBAAkB,CAAC,WAAW;GAC7D,GAAG,eAAe,QAAQ,aAAa,CAAC,WAAW;GACnD,GAAG,0BAA0B,QAAQ,4BAA4B,CAAC,WAAW;GAC7E,GAAG,eAAe,QAAQ,aAAa,CAAC,WAAW;GACnD,GAAG,kBAAkB,QAAQ,gBAAgB,CAAC,WAAW;GACzD,GAAG,yBAAyB,QAAQ,0BAA0B,CAAC,WAAW;GAC1E,GAAG,eAAe,QAAQ,aAAa,CAAC,WAAW;GACnD,GAAG,kBAAkB,QAAQ,gBAAgB,CAAC,WAAW;GACzD,GAAG,4BAA4B,QAAQ,0BAA0B,CAAC,WAAW;GAC7E,GAAG,WAAW,QAAQ,SAAS,CAAC,WAAW;GAC3C,GAAG,cAAc,QAAQ,YAAY,CAAC,WAAW;GACjD,GAAG,kBAAkB,QAAQ,gBAAgB,CAAC,WAAW;GACzD,GAAG,mBAAmB,QAAQ,iBAAiB,CAAC,WAAW;GAC3D,GAAG,mBAAmB,QAAQ,iBAAiB,CAAC,WAAW;GAE3D,GAAG,aAAa,QAAQ,WAAW,CAAC,WAAW;GAC/C,GAAG,wBAAwB,QAAQ,sBAAsB,CAAC,WAAW;GACrE,GAAG,yBAAyB,QAAQ,uBAAuB,CAAC,WAAW;GACvE,GAAG,eAAe,QAAQ,aAAa,CAAC,WAAW;GACnD,GAAG,qBAAqB,QAAQ,mBAAmB,CAAC,WAAW;GAC/D,GAAG,qBAAqB,QAAQ,mBAAmB,CAAC,WAAW;GAC/D,GAAG,yBAAyB,QAAQ,uBAAuB,CAAC,WAAW;GACvE,GAAG,kBAAkB,QAAQ,gBAAgB,CAAC,WAAW;GACzD,GAAG,oBAAoB,QAAQ,kBAAkB,CAAC,WAAW;GAC7D,GAAG,qBAAqB,QAAQ,mBAAmB,CAAC,WAAW;GAC/D,GAAG,sBAAsB,QAAQ,oBAAoB,CAAC,WAAW;GACjE,GAAG,6BAA6B,QAAQ,2BAA2B,CAAC,WAAW;GAE/E,GAAG,WAAW,QAAQ,SAAS;GAC/B,GAAG,qBAAqB,QAAQ,mBAAmB;GACnD,GAAG,eAAe,QAAQ,aAAa,CAAC,WAAW;GACnD,GAAG,yBAAyB,QAAQ,uBAAuB,CAAC,WAAW;GACvE,GAAG,uBAAuB,QAAQ,qBAAqB,CAAC,WAAW;GACnE,GAAG,8BAA8B,QAAQ,4BAA4B,CAAC,WAAW;GACjF,GAAG,uBAAuB,QAAQ,qBAAqB,CAAC,WAAW;EACrE,CAAC;CAEF,OAAO"}
@@ -1,6 +1,6 @@
1
1
  import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
- import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.js";
3
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.js";
2
+ import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorateMetadata.js";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorate.js";
4
4
  import { AuthenticationError } from "../exceptions/runtime.exceptions.js";
5
5
  import { validateInput, validateMiddleware } from "../handlers/validators.js";
6
6
  import { AppConstants } from "../server.constants.js";
@@ -1 +1 @@
1
- {"version":3,"file":"api-key.controller.js","names":[],"sources":["../../src/controllers/api-key.controller.ts"],"sourcesContent":["import { before, DELETE, GET, POST, route } from \"awilix-express\";\nimport { authenticate, authorizeRoles } from \"@/middleware/authenticate\";\nimport { demoUserNotAllowed } from \"@/middleware/demo.middleware\";\nimport { ROLES } from \"@/constants/authorization.constants\";\nimport { AppConstants } from \"@/server.constants\";\nimport { validateInput, validateMiddleware } from \"@/handlers/validators\";\nimport { apiKeyIdParamSchema, createApiKeySchema } from \"@/controllers/validation/api-key-controller.validation\";\nimport type { Request, Response } from \"express\";\nimport type { IApiKeyService } from \"@/services/interfaces/api-key.service.interface\";\nimport { AuthenticationError } from \"@/exceptions/runtime.exceptions\";\n\n/**\n * Admin-only API key management. Keys are m2m credentials with their own\n * role assignment (stored in the `api_key_role` join table); they are NOT\n * user impersonation tokens. `createdByUserId` is audit-only — it records\n * who minted the key, not whose permissions the key holds.\n */\n@route(AppConstants.apiRoute + \"/api-keys\")\n@before([authenticate(), authorizeRoles([ROLES.ADMIN]), demoUserNotAllowed])\nexport class ApiKeyController {\n constructor(private readonly apiKeyService: IApiKeyService) {}\n\n @GET()\n @route(\"/\")\n async list(_req: Request, res: Response) {\n const keys = await this.apiKeyService.list();\n res.send(keys);\n }\n\n @POST()\n @route(\"/\")\n async create(req: Request, res: Response) {\n const createdByUserId = this.requireUserId(req);\n const { label, roleIds } = await validateMiddleware(req, createApiKeySchema);\n const created = await this.apiKeyService.create(createdByUserId, label, roleIds);\n res.send(created);\n }\n\n @DELETE()\n @route(\"/:id\")\n async delete(req: Request, res: Response) {\n const { id } = await validateInput(req.params, apiKeyIdParamSchema);\n await this.apiKeyService.delete(id);\n res.status(204).send();\n }\n\n private requireUserId(req: Request): number {\n // Reachable when loginRequired=false (passport-anonymous falls through\n // without setting req.user); the @before authorizeRoles guard then\n // refuses, but defend the boundary anyway in case the chain is changed.\n const id = req.user?.id;\n if (!id || id < 0) {\n throw new AuthenticationError(\"Authenticated user is required\");\n }\n return id;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAmBO,IAAA,mBAAA,MAAM,iBAAiB;CAC5B,YAAY,eAAgD;AAA/B,OAAA,gBAAA;;CAE7B,MAEM,KAAK,MAAe,KAAe;EACvC,MAAM,OAAO,MAAM,KAAK,cAAc,MAAM;AAC5C,MAAI,KAAK,KAAK;;CAGhB,MAEM,OAAO,KAAc,KAAe;EACxC,MAAM,kBAAkB,KAAK,cAAc,IAAI;EAC/C,MAAM,EAAE,OAAO,YAAY,MAAM,mBAAmB,KAAK,mBAAmB;EAC5E,MAAM,UAAU,MAAM,KAAK,cAAc,OAAO,iBAAiB,OAAO,QAAQ;AAChF,MAAI,KAAK,QAAQ;;CAGnB,MAEM,OAAO,KAAc,KAAe;EACxC,MAAM,EAAE,OAAO,MAAM,cAAc,IAAI,QAAQ,oBAAoB;AACnE,QAAM,KAAK,cAAc,OAAO,GAAG;AACnC,MAAI,OAAO,IAAI,CAAC,MAAM;;CAGxB,cAAsB,KAAsB;EAI1C,MAAM,KAAK,IAAI,MAAM;AACrB,MAAI,CAAC,MAAM,KAAK,EACd,OAAM,IAAI,oBAAoB,iCAAiC;AAEjE,SAAO;;;;CAhCR,KAAK;CACL,MAAM,IAAI;;;;;;CAMV,MAAM;CACN,MAAM,IAAI;;;;;;CAQV,QAAQ;CACR,MAAM,OAAO;;;;;;CAtBf,MAAM,aAAa,WAAW,YAAY;CAC1C,OAAO;EAAC,cAAc;EAAE,eAAe,CAAC,MAAM,MAAM,CAAC;EAAE;EAAmB,CAAC"}
1
+ {"version":3,"file":"api-key.controller.js","names":[],"sources":["../../src/controllers/api-key.controller.ts"],"sourcesContent":["import { before, DELETE, GET, POST, route } from \"awilix-express\";\nimport { authenticate, authorizeRoles } from \"@/middleware/authenticate\";\nimport { demoUserNotAllowed } from \"@/middleware/demo.middleware\";\nimport { ROLES } from \"@/constants/authorization.constants\";\nimport { AppConstants } from \"@/server.constants\";\nimport { validateInput, validateMiddleware } from \"@/handlers/validators\";\nimport { apiKeyIdParamSchema, createApiKeySchema } from \"@/controllers/validation/api-key-controller.validation\";\nimport type { Request, Response } from \"express\";\nimport type { IApiKeyService } from \"@/services/interfaces/api-key.service.interface\";\nimport { AuthenticationError } from \"@/exceptions/runtime.exceptions\";\n\n/**\n * Admin-only API key management. Keys are m2m credentials with their own\n * role assignment (stored in the `api_key_role` join table); they are NOT\n * user impersonation tokens. `createdByUserId` is audit-only — it records\n * who minted the key, not whose permissions the key holds.\n */\n@route(AppConstants.apiRoute + \"/api-keys\")\n@before([authenticate(), authorizeRoles([ROLES.ADMIN]), demoUserNotAllowed])\nexport class ApiKeyController {\n constructor(private readonly apiKeyService: IApiKeyService) {}\n\n @GET()\n @route(\"/\")\n async list(_req: Request, res: Response) {\n const keys = await this.apiKeyService.list();\n res.send(keys);\n }\n\n @POST()\n @route(\"/\")\n async create(req: Request, res: Response) {\n const createdByUserId = this.requireUserId(req);\n const { label, roleIds } = await validateMiddleware(req, createApiKeySchema);\n const created = await this.apiKeyService.create(createdByUserId, label, roleIds);\n res.send(created);\n }\n\n @DELETE()\n @route(\"/:id\")\n async delete(req: Request, res: Response) {\n const { id } = await validateInput(req.params, apiKeyIdParamSchema);\n await this.apiKeyService.delete(id);\n res.status(204).send();\n }\n\n private requireUserId(req: Request): number {\n // Reachable when loginRequired=false (passport-anonymous falls through\n // without setting req.user); the @before authorizeRoles guard then\n // refuses, but defend the boundary anyway in case the chain is changed.\n const id = req.user?.id;\n if (!id || id < 0) {\n throw new AuthenticationError(\"Authenticated user is required\");\n }\n return id;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAmBO,IAAA,mBAAA,MAAM,iBAAiB;CAC5B,YAAY,eAAgD;EAA/B,KAAA,gBAAA;;CAE7B,MAEM,KAAK,MAAe,KAAe;EACvC,MAAM,OAAO,MAAM,KAAK,cAAc,MAAM;EAC5C,IAAI,KAAK,KAAK;;CAGhB,MAEM,OAAO,KAAc,KAAe;EACxC,MAAM,kBAAkB,KAAK,cAAc,IAAI;EAC/C,MAAM,EAAE,OAAO,YAAY,MAAM,mBAAmB,KAAK,mBAAmB;EAC5E,MAAM,UAAU,MAAM,KAAK,cAAc,OAAO,iBAAiB,OAAO,QAAQ;EAChF,IAAI,KAAK,QAAQ;;CAGnB,MAEM,OAAO,KAAc,KAAe;EACxC,MAAM,EAAE,OAAO,MAAM,cAAc,IAAI,QAAQ,oBAAoB;EACnE,MAAM,KAAK,cAAc,OAAO,GAAG;EACnC,IAAI,OAAO,IAAI,CAAC,MAAM;;CAGxB,cAAsB,KAAsB;EAI1C,MAAM,KAAK,IAAI,MAAM;EACrB,IAAI,CAAC,MAAM,KAAK,GACd,MAAM,IAAI,oBAAoB,iCAAiC;EAEjE,OAAO;;;;CAhCR,KAAK;CACL,MAAM,IAAI;;;;;;CAMV,MAAM;CACN,MAAM,IAAI;;;;;;CAQV,QAAQ;CACR,MAAM,OAAO;;;;;;CAtBf,MAAM,aAAa,WAAW,YAAY;CAC1C,OAAO;EAAC,cAAc;EAAE,eAAe,CAAC,MAAM,MAAM,CAAC;EAAE;EAAmB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
- import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.js";
3
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.js";
2
+ import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorateMetadata.js";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorate.js";
4
4
  import { BadRequestException } from "../exceptions/runtime.exceptions.js";
5
5
  import { validateMiddleware } from "../handlers/validators.js";
6
6
  import { AppConstants } from "../server.constants.js";
@@ -33,6 +33,7 @@ let AuthController = _AuthController = class AuthController {
33
33
  const registration = this.settingsStore.isRegistrationEnabled();
34
34
  let wizardState = this.settingsStore.getWizardState();
35
35
  const isDemoMode = this.configService.isDemoMode();
36
+ const instanceLabel = this.configService.instanceLabel();
36
37
  wizardState = {
37
38
  ...wizardState,
38
39
  wizardCompleted: isDemoMode ? true : wizardState.wizardCompleted
@@ -41,7 +42,8 @@ let AuthController = _AuthController = class AuthController {
41
42
  loginRequired,
42
43
  registration,
43
44
  wizardState,
44
- isDemoMode
45
+ isDemoMode,
46
+ instanceLabel
45
47
  });
46
48
  }
47
49
  async verifyLogin(req, res) {
@@ -1 +1 @@
1
- {"version":3,"file":"auth.controller.js","names":[],"sources":["../../src/controllers/auth.controller.ts"],"sourcesContent":["import { before, GET, POST, route } from \"awilix-express\";\nimport { BadRequestException } from \"@/exceptions/runtime.exceptions\";\nimport { AppConstants } from \"@/server.constants\";\nimport { refreshTokenSchema } from \"./validation/auth-controller.validation\";\nimport { authenticate } from \"@/middleware/authenticate\";\nimport { SettingsStore } from \"@/state/settings.store\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport type { Request, Response } from \"express\";\nimport type { IUserService } from \"@/services/interfaces/user-service.interface\";\nimport type { IAuthService } from \"@/services/interfaces/auth.service.interface\";\nimport type { IRoleService } from \"@/services/interfaces/role-service.interface\";\nimport { demoUserNotAllowed } from \"@/middleware/demo.middleware\";\nimport type { IConfigService } from \"@/services/core/config.service\";\nimport { registerUserSchema } from \"@/controllers/validation/user-controller.validation\";\nimport { validateMiddleware } from \"@/handlers/validators\";\n\n@route(AppConstants.apiRoute + \"/auth\")\nexport class AuthController {\n logger: LoggerService;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly authService: IAuthService,\n private readonly settingsStore: SettingsStore,\n private readonly userService: IUserService,\n private readonly roleService: IRoleService,\n private readonly configService: IConfigService,\n ) {\n this.logger = loggerFactory(AuthController.name);\n }\n\n @POST()\n @route(\"/login\")\n async login(req: Request, res: Response) {\n this.logger.debug(`Login attempt from IP ${req.ip} and user-agent ${req.headers[\"user-agent\"]}`);\n const tokens = await this.authService.loginUser(req.body.username, req.body.password);\n return res.send(tokens);\n }\n\n @GET()\n @route(\"/login-required\")\n async getLoginRequired(req: Request, res: Response) {\n const loginRequired = await this.settingsStore.getLoginRequired();\n const registration = this.settingsStore.isRegistrationEnabled();\n let wizardState = this.settingsStore.getWizardState();\n const isDemoMode = this.configService.isDemoMode();\n wizardState = {\n ...wizardState,\n wizardCompleted: isDemoMode ? true : wizardState.wizardCompleted,\n };\n res.send({ loginRequired, registration, wizardState, isDemoMode });\n }\n\n @POST()\n @route(\"/verify\")\n @before([authenticate()])\n async verifyLogin(req: Request, res: Response) {\n return res.send({ success: true });\n }\n\n @POST()\n @route(\"/needs-password-change\")\n async needsPasswordChange(req: Request, res: Response) {\n const registration = this.settingsStore.isRegistrationEnabled();\n const isLoginRequired = await this.settingsStore.getLoginRequired();\n if (!isLoginRequired) {\n return res.send({\n loginRequired: isLoginRequired,\n registration,\n needsPasswordChange: false,\n authenticated: true,\n });\n }\n\n if (req.isAuthenticated()) {\n return res.send({\n loginRequired: isLoginRequired,\n registration,\n needsPasswordChange: req.user?.needsPasswordChange,\n authenticated: true,\n });\n }\n\n return res.send({\n loginRequired: isLoginRequired,\n needsPasswordChange: null,\n authenticated: false,\n });\n }\n\n @POST()\n @route(\"/refresh\")\n async refreshLogin(req: Request, res: Response) {\n const { refreshToken } = await validateMiddleware(req, refreshTokenSchema);\n this.logger.debug(`Refresh login attempt from IP ${req.ip} and user-agent ${req.headers[\"user-agent\"]}`);\n const idToken = await this.authService.renewLoginByRefreshToken(refreshToken);\n return res.send({ token: idToken });\n }\n\n @POST()\n @route(\"/logout\")\n @before([authenticate()])\n async logout(req: Request, res: Response) {\n const isLoginRequired = await this.settingsStore.getLoginRequired();\n if (!isLoginRequired) {\n return res.end();\n }\n\n // Get token from header\n const jwtToken = req.headers.authorization?.replace(\"Bearer \", \"\") || undefined;\n const userId = req.user!.id;\n await this.authService.logoutUserId(userId, jwtToken);\n res.end();\n }\n\n @POST()\n @route(\"/register\")\n @before([demoUserNotAllowed])\n async register(req: Request, res: Response) {\n let registrationEnabled = this.settingsStore.isRegistrationEnabled();\n if (!registrationEnabled) {\n throw new BadRequestException(\"Registration is disabled. Cant register user\");\n }\n const { username, password } = await validateMiddleware(req, registerUserSchema);\n if (\n username.toLowerCase().includes(\"admin\") ||\n username.toLowerCase().includes(\"root\") ||\n username.toLowerCase() === \"demo\"\n ) {\n throw new BadRequestException(\"Username is not allowed\");\n }\n\n const roles = await this.roleService.getAppDefaultRoleNames();\n const result = await this.userService.register({\n username,\n password,\n roles,\n needsPasswordChange: false,\n isDemoUser: false,\n isRootUser: false,\n // An admin needs to verify the user first\n isVerified: false,\n });\n const userDto = this.userService.toDto(result);\n res.send(userDto);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auth.controller.js","names":[],"sources":["../../src/controllers/auth.controller.ts"],"sourcesContent":["import { before, GET, POST, route } from \"awilix-express\";\nimport { BadRequestException } from \"@/exceptions/runtime.exceptions\";\nimport { AppConstants } from \"@/server.constants\";\nimport { refreshTokenSchema } from \"./validation/auth-controller.validation\";\nimport { authenticate } from \"@/middleware/authenticate\";\nimport { SettingsStore } from \"@/state/settings.store\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport type { Request, Response } from \"express\";\nimport type { IUserService } from \"@/services/interfaces/user-service.interface\";\nimport type { IAuthService } from \"@/services/interfaces/auth.service.interface\";\nimport type { IRoleService } from \"@/services/interfaces/role-service.interface\";\nimport { demoUserNotAllowed } from \"@/middleware/demo.middleware\";\nimport type { IConfigService } from \"@/services/core/config.service\";\nimport { registerUserSchema } from \"@/controllers/validation/user-controller.validation\";\nimport { validateMiddleware } from \"@/handlers/validators\";\n\n@route(AppConstants.apiRoute + \"/auth\")\nexport class AuthController {\n logger: LoggerService;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly authService: IAuthService,\n private readonly settingsStore: SettingsStore,\n private readonly userService: IUserService,\n private readonly roleService: IRoleService,\n private readonly configService: IConfigService,\n ) {\n this.logger = loggerFactory(AuthController.name);\n }\n\n @POST()\n @route(\"/login\")\n async login(req: Request, res: Response) {\n this.logger.debug(`Login attempt from IP ${req.ip} and user-agent ${req.headers[\"user-agent\"]}`);\n const tokens = await this.authService.loginUser(req.body.username, req.body.password);\n return res.send(tokens);\n }\n\n @GET()\n @route(\"/login-required\")\n async getLoginRequired(req: Request, res: Response) {\n const loginRequired = await this.settingsStore.getLoginRequired();\n const registration = this.settingsStore.isRegistrationEnabled();\n let wizardState = this.settingsStore.getWizardState();\n const isDemoMode = this.configService.isDemoMode();\n const instanceLabel = this.configService.instanceLabel();\n wizardState = {\n ...wizardState,\n wizardCompleted: isDemoMode ? true : wizardState.wizardCompleted,\n };\n res.send({ loginRequired, registration, wizardState, isDemoMode, instanceLabel });\n }\n\n @POST()\n @route(\"/verify\")\n @before([authenticate()])\n async verifyLogin(req: Request, res: Response) {\n return res.send({ success: true });\n }\n\n @POST()\n @route(\"/needs-password-change\")\n async needsPasswordChange(req: Request, res: Response) {\n const registration = this.settingsStore.isRegistrationEnabled();\n const isLoginRequired = await this.settingsStore.getLoginRequired();\n if (!isLoginRequired) {\n return res.send({\n loginRequired: isLoginRequired,\n registration,\n needsPasswordChange: false,\n authenticated: true,\n });\n }\n\n if (req.isAuthenticated()) {\n return res.send({\n loginRequired: isLoginRequired,\n registration,\n needsPasswordChange: req.user?.needsPasswordChange,\n authenticated: true,\n });\n }\n\n return res.send({\n loginRequired: isLoginRequired,\n needsPasswordChange: null,\n authenticated: false,\n });\n }\n\n @POST()\n @route(\"/refresh\")\n async refreshLogin(req: Request, res: Response) {\n const { refreshToken } = await validateMiddleware(req, refreshTokenSchema);\n this.logger.debug(`Refresh login attempt from IP ${req.ip} and user-agent ${req.headers[\"user-agent\"]}`);\n const idToken = await this.authService.renewLoginByRefreshToken(refreshToken);\n return res.send({ token: idToken });\n }\n\n @POST()\n @route(\"/logout\")\n @before([authenticate()])\n async logout(req: Request, res: Response) {\n const isLoginRequired = await this.settingsStore.getLoginRequired();\n if (!isLoginRequired) {\n return res.end();\n }\n\n // Get token from header\n const jwtToken = req.headers.authorization?.replace(\"Bearer \", \"\") || undefined;\n const userId = req.user!.id;\n await this.authService.logoutUserId(userId, jwtToken);\n res.end();\n }\n\n @POST()\n @route(\"/register\")\n @before([demoUserNotAllowed])\n async register(req: Request, res: Response) {\n let registrationEnabled = this.settingsStore.isRegistrationEnabled();\n if (!registrationEnabled) {\n throw new BadRequestException(\"Registration is disabled. Cant register user\");\n }\n const { username, password } = await validateMiddleware(req, registerUserSchema);\n if (\n username.toLowerCase().includes(\"admin\") ||\n username.toLowerCase().includes(\"root\") ||\n username.toLowerCase() === \"demo\"\n ) {\n throw new BadRequestException(\"Username is not allowed\");\n }\n\n const roles = await this.roleService.getAppDefaultRoleNames();\n const result = await this.userService.register({\n username,\n password,\n roles,\n needsPasswordChange: false,\n isDemoUser: false,\n isRootUser: false,\n // An admin needs to verify the user first\n isVerified: false,\n });\n const userDto = this.userService.toDto(result);\n res.send(userDto);\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
- import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.js";
3
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.js";
2
+ import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorateMetadata.js";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorate.js";
4
4
  import { validateInput } from "../handlers/validators.js";
5
5
  import { AppConstants } from "../server.constants.js";
6
6
  import { ROLES } from "../constants/authorization.constants.js";
@@ -1 +1 @@
1
- {"version":3,"file":"batch-call.controller.js","names":[],"sources":["../../src/controllers/batch-call.controller.ts"],"sourcesContent":["import { before, POST, route } from \"awilix-express\";\nimport { validateInput } from \"@/handlers/validators\";\nimport {\n batchPrinterSchema,\n batchPrintersEnabledSchema,\n executeBatchRePrinterSchema,\n} from \"./validation/batch-controller.validation\";\nimport { AppConstants } from \"@/server.constants\";\nimport { authenticate, authorizeRoles } from \"@/middleware/authenticate\";\nimport { ROLES } from \"@/constants/authorization.constants\";\nimport { BatchCallService } from \"@/services/core/batch-call.service\";\nimport type { Request, Response } from \"express\";\n\n@route(AppConstants.apiRoute + \"/batch\")\n@before([authenticate(), authorizeRoles([ROLES.ADMIN, ROLES.OPERATOR])])\nexport class BatchCallController {\n constructor(private readonly batchCallService: BatchCallService) {}\n\n @POST()\n @route(\"/connect/usb\")\n async batchConnectUsb(req: Request, res: Response) {\n const { printerIds } = await validateInput(req.body, batchPrinterSchema);\n const results = await this.batchCallService.batchConnectUsb(printerIds);\n res.send(results);\n }\n\n @POST()\n @route(\"/connect/socket\")\n async batchConnectSocket(req: Request, res: Response) {\n const { printerIds } = await validateInput(req.body, batchPrinterSchema);\n this.batchCallService.batchConnectSocket(printerIds);\n res.send({});\n }\n\n @POST()\n @route(\"/reprint/list\")\n async getLastPrintedFiles(req: Request, res: Response) {\n const { printerIds } = await validateInput(req.body, batchPrinterSchema);\n const files = await this.batchCallService.getBatchPrinterReprintFile(printerIds);\n res.send(files);\n }\n\n @POST()\n @route(\"/reprint/execute\")\n async batchReprintFiles(req: Request, res: Response) {\n const { prints } = await validateInput(req.body, executeBatchRePrinterSchema);\n const files = await this.batchCallService.batchReprintCalls(prints);\n res.send(files);\n }\n\n @POST()\n @route(\"/toggle-enabled\")\n async batchTogglePrintersEnabled(req: Request, res: Response) {\n const { printerIds, enabled } = await validateInput(req.body, batchPrintersEnabledSchema);\n const results = await this.batchCallService.batchTogglePrintersEnabled(printerIds, enabled);\n res.send(results);\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAeO,IAAA,sBAAA,MAAM,oBAAoB;CAC/B,YAAY,kBAAqD;AAApC,OAAA,mBAAA;;CAE7B,MAEM,gBAAgB,KAAc,KAAe;EACjD,MAAM,EAAE,eAAe,MAAM,cAAc,IAAI,MAAM,mBAAmB;EACxE,MAAM,UAAU,MAAM,KAAK,iBAAiB,gBAAgB,WAAW;AACvE,MAAI,KAAK,QAAQ;;CAGnB,MAEM,mBAAmB,KAAc,KAAe;EACpD,MAAM,EAAE,eAAe,MAAM,cAAc,IAAI,MAAM,mBAAmB;AACxE,OAAK,iBAAiB,mBAAmB,WAAW;AACpD,MAAI,KAAK,EAAE,CAAC;;CAGd,MAEM,oBAAoB,KAAc,KAAe;EACrD,MAAM,EAAE,eAAe,MAAM,cAAc,IAAI,MAAM,mBAAmB;EACxE,MAAM,QAAQ,MAAM,KAAK,iBAAiB,2BAA2B,WAAW;AAChF,MAAI,KAAK,MAAM;;CAGjB,MAEM,kBAAkB,KAAc,KAAe;EACnD,MAAM,EAAE,WAAW,MAAM,cAAc,IAAI,MAAM,4BAA4B;EAC7E,MAAM,QAAQ,MAAM,KAAK,iBAAiB,kBAAkB,OAAO;AACnE,MAAI,KAAK,MAAM;;CAGjB,MAEM,2BAA2B,KAAc,KAAe;EAC5D,MAAM,EAAE,YAAY,YAAY,MAAM,cAAc,IAAI,MAAM,2BAA2B;EACzF,MAAM,UAAU,MAAM,KAAK,iBAAiB,2BAA2B,YAAY,QAAQ;AAC3F,MAAI,KAAK,QAAQ;;;;CArClB,MAAM;CACN,MAAM,eAAe;;;;;;CAOrB,MAAM;CACN,MAAM,kBAAkB;;;;;;CAOxB,MAAM;CACN,MAAM,gBAAgB;;;;;;CAOtB,MAAM;CACN,MAAM,mBAAmB;;;;;;CAOzB,MAAM;CACN,MAAM,kBAAkB;;;;;;CAtC1B,MAAM,aAAa,WAAW,SAAS;CACvC,OAAO,CAAC,cAAc,EAAE,eAAe,CAAC,MAAM,OAAO,MAAM,SAAS,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"batch-call.controller.js","names":[],"sources":["../../src/controllers/batch-call.controller.ts"],"sourcesContent":["import { before, POST, route } from \"awilix-express\";\nimport { validateInput } from \"@/handlers/validators\";\nimport {\n batchPrinterSchema,\n batchPrintersEnabledSchema,\n executeBatchRePrinterSchema,\n} from \"./validation/batch-controller.validation\";\nimport { AppConstants } from \"@/server.constants\";\nimport { authenticate, authorizeRoles } from \"@/middleware/authenticate\";\nimport { ROLES } from \"@/constants/authorization.constants\";\nimport { BatchCallService } from \"@/services/core/batch-call.service\";\nimport type { Request, Response } from \"express\";\n\n@route(AppConstants.apiRoute + \"/batch\")\n@before([authenticate(), authorizeRoles([ROLES.ADMIN, ROLES.OPERATOR])])\nexport class BatchCallController {\n constructor(private readonly batchCallService: BatchCallService) {}\n\n @POST()\n @route(\"/connect/usb\")\n async batchConnectUsb(req: Request, res: Response) {\n const { printerIds } = await validateInput(req.body, batchPrinterSchema);\n const results = await this.batchCallService.batchConnectUsb(printerIds);\n res.send(results);\n }\n\n @POST()\n @route(\"/connect/socket\")\n async batchConnectSocket(req: Request, res: Response) {\n const { printerIds } = await validateInput(req.body, batchPrinterSchema);\n this.batchCallService.batchConnectSocket(printerIds);\n res.send({});\n }\n\n @POST()\n @route(\"/reprint/list\")\n async getLastPrintedFiles(req: Request, res: Response) {\n const { printerIds } = await validateInput(req.body, batchPrinterSchema);\n const files = await this.batchCallService.getBatchPrinterReprintFile(printerIds);\n res.send(files);\n }\n\n @POST()\n @route(\"/reprint/execute\")\n async batchReprintFiles(req: Request, res: Response) {\n const { prints } = await validateInput(req.body, executeBatchRePrinterSchema);\n const files = await this.batchCallService.batchReprintCalls(prints);\n res.send(files);\n }\n\n @POST()\n @route(\"/toggle-enabled\")\n async batchTogglePrintersEnabled(req: Request, res: Response) {\n const { printerIds, enabled } = await validateInput(req.body, batchPrintersEnabledSchema);\n const results = await this.batchCallService.batchTogglePrintersEnabled(printerIds, enabled);\n res.send(results);\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAeO,IAAA,sBAAA,MAAM,oBAAoB;CAC/B,YAAY,kBAAqD;EAApC,KAAA,mBAAA;;CAE7B,MAEM,gBAAgB,KAAc,KAAe;EACjD,MAAM,EAAE,eAAe,MAAM,cAAc,IAAI,MAAM,mBAAmB;EACxE,MAAM,UAAU,MAAM,KAAK,iBAAiB,gBAAgB,WAAW;EACvE,IAAI,KAAK,QAAQ;;CAGnB,MAEM,mBAAmB,KAAc,KAAe;EACpD,MAAM,EAAE,eAAe,MAAM,cAAc,IAAI,MAAM,mBAAmB;EACxE,KAAK,iBAAiB,mBAAmB,WAAW;EACpD,IAAI,KAAK,EAAE,CAAC;;CAGd,MAEM,oBAAoB,KAAc,KAAe;EACrD,MAAM,EAAE,eAAe,MAAM,cAAc,IAAI,MAAM,mBAAmB;EACxE,MAAM,QAAQ,MAAM,KAAK,iBAAiB,2BAA2B,WAAW;EAChF,IAAI,KAAK,MAAM;;CAGjB,MAEM,kBAAkB,KAAc,KAAe;EACnD,MAAM,EAAE,WAAW,MAAM,cAAc,IAAI,MAAM,4BAA4B;EAC7E,MAAM,QAAQ,MAAM,KAAK,iBAAiB,kBAAkB,OAAO;EACnE,IAAI,KAAK,MAAM;;CAGjB,MAEM,2BAA2B,KAAc,KAAe;EAC5D,MAAM,EAAE,YAAY,YAAY,MAAM,cAAc,IAAI,MAAM,2BAA2B;EACzF,MAAM,UAAU,MAAM,KAAK,iBAAiB,2BAA2B,YAAY,QAAQ;EAC3F,IAAI,KAAK,QAAQ;;;;CArClB,MAAM;CACN,MAAM,eAAe;;;;;;CAOrB,MAAM;CACN,MAAM,kBAAkB;;;;;;CAOxB,MAAM;CACN,MAAM,gBAAgB;;;;;;CAOtB,MAAM;CACN,MAAM,mBAAmB;;;;;;CAOzB,MAAM;CACN,MAAM,kBAAkB;;;;;;CAtC1B,MAAM,aAAa,WAAW,SAAS;CACvC,OAAO,CAAC,cAAc,EAAE,eAAe,CAAC,MAAM,OAAO,MAAM,SAAS,CAAC,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
- import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.js";
3
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.js";
2
+ import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorateMetadata.js";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorate.js";
4
4
  import { AppConstants } from "../server.constants.js";
5
5
  import { ROLES } from "../constants/authorization.constants.js";
6
6
  import { authenticate, authorizeRoles } from "../middleware/authenticate.js";
@@ -1 +1 @@
1
- {"version":3,"file":"camera-stream.controller.js","names":[],"sources":["../../src/controllers/camera-stream.controller.ts"],"sourcesContent":["import { route, GET, POST, PUT, DELETE, before } from \"awilix-express\";\nimport { AppConstants } from \"@/server.constants\";\nimport { authenticate, authorizeRoles } from \"@/middleware/authenticate\";\nimport type { Request, Response } from \"express\";\nimport type { ICameraStreamService } from \"@/services/interfaces/camera-stream.service.interface\";\nimport { ROLES } from \"@/constants/authorization.constants\";\nimport { ParamId } from \"@/middleware/param-converter.middleware\";\n\n@route(`${AppConstants.apiRoute}/camera-stream`)\n@before([authenticate(), authorizeRoles([ROLES.OPERATOR, ROLES.ADMIN])])\nexport class CameraStreamController {\n constructor(private readonly cameraStreamService: ICameraStreamService) {}\n @GET()\n @route(\"/\")\n async list(req: Request, res: Response) {\n const result = await this.cameraStreamService.list();\n res.send(result.map((item) => this.cameraStreamService.toDto(item)));\n }\n\n @GET()\n @route(\"/:id\")\n @before([ParamId(\"id\")])\n async get(req: Request, res: Response) {\n const result = await this.cameraStreamService.get(req.local.id);\n res.send(this.cameraStreamService.toDto(result));\n }\n\n @POST()\n @route(\"/\")\n async create(req: Request, res: Response) {\n const result = await this.cameraStreamService.create(req.body);\n res.send(this.cameraStreamService.toDto(result));\n }\n\n @PUT()\n @route(\"/:id\")\n @before([ParamId(\"id\")])\n async update(req: Request, res: Response) {\n const result = await this.cameraStreamService.update(req.local.id, req.body);\n res.send(this.cameraStreamService.toDto(result));\n }\n\n @DELETE()\n @route(\"/:id\")\n @before([ParamId(\"id\")])\n async delete(req: Request, res: Response) {\n await this.cameraStreamService.delete(req.local.id);\n res.send();\n }\n}\n"],"mappings":";;;;;;;;;;AAUO,IAAA,yBAAA,MAAM,uBAAuB;CAClC,YAAY,qBAA4D;AAA3C,OAAA,sBAAA;;CAC7B,MAEM,KAAK,KAAc,KAAe;EACtC,MAAM,SAAS,MAAM,KAAK,oBAAoB,MAAM;AACpD,MAAI,KAAK,OAAO,KAAK,SAAS,KAAK,oBAAoB,MAAM,KAAK,CAAC,CAAC;;CAGtE,MAGM,IAAI,KAAc,KAAe;EACrC,MAAM,SAAS,MAAM,KAAK,oBAAoB,IAAI,IAAI,MAAM,GAAG;AAC/D,MAAI,KAAK,KAAK,oBAAoB,MAAM,OAAO,CAAC;;CAGlD,MAEM,OAAO,KAAc,KAAe;EACxC,MAAM,SAAS,MAAM,KAAK,oBAAoB,OAAO,IAAI,KAAK;AAC9D,MAAI,KAAK,KAAK,oBAAoB,MAAM,OAAO,CAAC;;CAGlD,MAGM,OAAO,KAAc,KAAe;EACxC,MAAM,SAAS,MAAM,KAAK,oBAAoB,OAAO,IAAI,MAAM,IAAI,IAAI,KAAK;AAC5E,MAAI,KAAK,KAAK,oBAAoB,MAAM,OAAO,CAAC;;CAGlD,MAGM,OAAO,KAAc,KAAe;AACxC,QAAM,KAAK,oBAAoB,OAAO,IAAI,MAAM,GAAG;AACnD,MAAI,MAAM;;;;CAnCX,KAAK;CACL,MAAM,IAAI;;;;;;CAMV,KAAK;CACL,MAAM,OAAO;CACb,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMvB,MAAM;CACN,MAAM,IAAI;;;;;;CAMV,KAAK;CACL,MAAM,OAAO;CACb,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMvB,QAAQ;CACR,MAAM,OAAO;CACb,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC;;;;;;CApCzB,MAAM,GAAG,aAAa,SAAS,gBAAgB;CAC/C,OAAO,CAAC,cAAc,EAAE,eAAe,CAAC,MAAM,UAAU,MAAM,MAAM,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"camera-stream.controller.js","names":[],"sources":["../../src/controllers/camera-stream.controller.ts"],"sourcesContent":["import { route, GET, POST, PUT, DELETE, before } from \"awilix-express\";\nimport { AppConstants } from \"@/server.constants\";\nimport { authenticate, authorizeRoles } from \"@/middleware/authenticate\";\nimport type { Request, Response } from \"express\";\nimport type { ICameraStreamService } from \"@/services/interfaces/camera-stream.service.interface\";\nimport { ROLES } from \"@/constants/authorization.constants\";\nimport { ParamId } from \"@/middleware/param-converter.middleware\";\n\n@route(`${AppConstants.apiRoute}/camera-stream`)\n@before([authenticate(), authorizeRoles([ROLES.OPERATOR, ROLES.ADMIN])])\nexport class CameraStreamController {\n constructor(private readonly cameraStreamService: ICameraStreamService) {}\n @GET()\n @route(\"/\")\n async list(req: Request, res: Response) {\n const result = await this.cameraStreamService.list();\n res.send(result.map((item) => this.cameraStreamService.toDto(item)));\n }\n\n @GET()\n @route(\"/:id\")\n @before([ParamId(\"id\")])\n async get(req: Request, res: Response) {\n const result = await this.cameraStreamService.get(req.local.id);\n res.send(this.cameraStreamService.toDto(result));\n }\n\n @POST()\n @route(\"/\")\n async create(req: Request, res: Response) {\n const result = await this.cameraStreamService.create(req.body);\n res.send(this.cameraStreamService.toDto(result));\n }\n\n @PUT()\n @route(\"/:id\")\n @before([ParamId(\"id\")])\n async update(req: Request, res: Response) {\n const result = await this.cameraStreamService.update(req.local.id, req.body);\n res.send(this.cameraStreamService.toDto(result));\n }\n\n @DELETE()\n @route(\"/:id\")\n @before([ParamId(\"id\")])\n async delete(req: Request, res: Response) {\n await this.cameraStreamService.delete(req.local.id);\n res.send();\n }\n}\n"],"mappings":";;;;;;;;;;AAUO,IAAA,yBAAA,MAAM,uBAAuB;CAClC,YAAY,qBAA4D;EAA3C,KAAA,sBAAA;;CAC7B,MAEM,KAAK,KAAc,KAAe;EACtC,MAAM,SAAS,MAAM,KAAK,oBAAoB,MAAM;EACpD,IAAI,KAAK,OAAO,KAAK,SAAS,KAAK,oBAAoB,MAAM,KAAK,CAAC,CAAC;;CAGtE,MAGM,IAAI,KAAc,KAAe;EACrC,MAAM,SAAS,MAAM,KAAK,oBAAoB,IAAI,IAAI,MAAM,GAAG;EAC/D,IAAI,KAAK,KAAK,oBAAoB,MAAM,OAAO,CAAC;;CAGlD,MAEM,OAAO,KAAc,KAAe;EACxC,MAAM,SAAS,MAAM,KAAK,oBAAoB,OAAO,IAAI,KAAK;EAC9D,IAAI,KAAK,KAAK,oBAAoB,MAAM,OAAO,CAAC;;CAGlD,MAGM,OAAO,KAAc,KAAe;EACxC,MAAM,SAAS,MAAM,KAAK,oBAAoB,OAAO,IAAI,MAAM,IAAI,IAAI,KAAK;EAC5E,IAAI,KAAK,KAAK,oBAAoB,MAAM,OAAO,CAAC;;CAGlD,MAGM,OAAO,KAAc,KAAe;EACxC,MAAM,KAAK,oBAAoB,OAAO,IAAI,MAAM,GAAG;EACnD,IAAI,MAAM;;;;CAnCX,KAAK;CACL,MAAM,IAAI;;;;;;CAMV,KAAK;CACL,MAAM,OAAO;CACb,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMvB,MAAM;CACN,MAAM,IAAI;;;;;;CAMV,KAAK;CACL,MAAM,OAAO;CACb,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMvB,QAAQ;CACR,MAAM,OAAO;CACb,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC;;;;;;CApCzB,MAAM,GAAG,aAAa,SAAS,gBAAgB;CAC/C,OAAO,CAAC,cAAc,EAAE,eAAe,CAAC,MAAM,UAAU,MAAM,MAAM,CAAC,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
- import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.js";
3
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.js";
2
+ import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorateMetadata.js";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorate.js";
4
4
  import { BadRequestException } from "../exceptions/runtime.exceptions.js";
5
5
  import { AppConstants } from "../server.constants.js";
6
6
  import { ROLES } from "../constants/authorization.constants.js";
@@ -1 +1 @@
1
- {"version":3,"file":"file-storage.controller.js","names":[],"sources":["../../src/controllers/file-storage.controller.ts"],"sourcesContent":["import { before, DELETE, GET, POST, route } from \"awilix-express\";\nimport { AppConstants } from \"@/server.constants\";\nimport type { Request, Response } from \"express\";\nimport { authorizeRoles, authenticate } from \"@/middleware/authenticate\";\nimport { ROLES } from \"@/constants/authorization.constants\";\nimport { FileStorageService } from \"@/services/file-storage.service\";\nimport { MulterService } from \"@/services/core/multer.service\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport { FileAnalysisService } from \"@/services/file-analysis.service\";\nimport { BadRequestException } from \"@/exceptions/runtime.exceptions\";\nimport { copyFileSync, existsSync, unlinkSync } from \"node:fs\";\nimport { extname } from \"node:path\";\n\n@route(AppConstants.apiRoute + \"/file-storage\")\n@before([authenticate(), authorizeRoles([ROLES.ADMIN, ROLES.OPERATOR])])\nexport class FileStorageController {\n private readonly logger: LoggerService;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly fileStorageService: FileStorageService,\n private readonly multerService: MulterService,\n private readonly fileAnalysisService: FileAnalysisService,\n ) {\n this.logger = loggerFactory(FileStorageController.name);\n }\n\n @GET()\n async listFiles(req: Request, res: Response) {\n try {\n const files = await this.fileStorageService.listAllFiles();\n\n res.send({\n files: files.map((file) => {\n const thumbnails = (file.metadata?._thumbnails || []).map((thumb: any) => ({\n index: thumb.index,\n width: thumb.width,\n height: thumb.height,\n format: thumb.format,\n size: thumb.size,\n }));\n return {\n fileStorageId: file.fileStorageId,\n fileName: file.fileName,\n fileFormat: file.fileFormat,\n fileSize: file.fileSize,\n fileHash: file.fileHash,\n createdAt: file.createdAt,\n thumbnails,\n metadata: file.metadata,\n };\n }),\n totalCount: files.length,\n });\n } catch (error) {\n this.logger.error(`Failed to list files: ${error}`);\n res.status(500).send({ error: \"Failed to list files\" });\n }\n }\n\n /**\n * Get file metadata\n * GET /api/file-storage/:fileStorageId\n */\n @GET()\n @route(\"/:fileStorageId\")\n async getFileMetadata(req: Request, res: Response) {\n const { fileStorageId } = req.params as { fileStorageId: string };\n\n try {\n const file = await this.fileStorageService.getFileInfo(fileStorageId);\n\n if (!file) {\n res.status(404).send({ error: \"File not found\" });\n return;\n }\n\n const thumbnails = (file.metadata?._thumbnails || []).map((thumb: any) => ({\n index: thumb.index,\n width: thumb.width,\n height: thumb.height,\n format: thumb.format,\n size: thumb.size,\n }));\n\n res.send({\n fileStorageId: file.fileStorageId,\n fileName: file.fileName,\n fileFormat: file.fileFormat,\n fileSize: file.fileSize,\n fileHash: file.fileHash,\n createdAt: file.createdAt,\n thumbnails,\n metadata: file.metadata,\n });\n } catch (error) {\n this.logger.error(`Failed to get file metadata for ${fileStorageId}: ${error}`);\n res.status(500).send({ error: \"Failed to get file metadata\" });\n }\n }\n\n /**\n * Delete a stored file and its thumbnails\n * DELETE /api/file-storage/:fileStorageId\n */\n @DELETE()\n @route(\"/:fileStorageId\")\n async deleteFile(req: Request, res: Response) {\n const { fileStorageId } = req.params as { fileStorageId: string };\n\n try {\n await this.fileStorageService.deleteFile(fileStorageId);\n\n this.logger.log(`Deleted file ${fileStorageId}`);\n res.send({ message: \"File deleted successfully\", fileStorageId });\n } catch (error) {\n this.logger.error(`Failed to delete file ${fileStorageId}: ${error}`);\n res.status(500).send({ error: \"Failed to delete file\" });\n }\n }\n\n @POST()\n @route(\"/:fileStorageId/analyze\")\n async analyzeFile(req: Request, res: Response) {\n const { fileStorageId } = req.params as { fileStorageId: string };\n\n try {\n const filePath = this.fileStorageService.getFilePath(fileStorageId);\n const fileExists = await this.fileStorageService.fileExists(fileStorageId);\n if (!fileExists) {\n res.status(404).send({ error: \"File not found\" });\n return;\n }\n this.logger.log(`Analyzing file: ${fileStorageId}`);\n\n // Load existing metadata to preserve original filename\n const existingMetadata = await this.fileStorageService.loadMetadata(fileStorageId);\n\n const analysisResult = await this.fileAnalysisService.analyzeFile(filePath);\n const metadata = analysisResult.metadata;\n const thumbnails = analysisResult.thumbnails;\n\n this.logger.log(\n `Analysis complete for ${fileStorageId}: format=${metadata.fileFormat}, layers=${metadata.totalLayers}, time=${metadata.gcodePrintTimeSeconds}s, thumbnails=${thumbnails.length}`,\n );\n\n const fileHash = await this.fileStorageService.calculateFileHash(filePath);\n const originalFileName = existingMetadata?._originalFileName || fileStorageId;\n\n metadata.fileName = originalFileName;\n\n let thumbnailMetadata: any[] = [];\n if (thumbnails.length > 0) {\n thumbnailMetadata = await this.fileStorageService.saveThumbnails(fileStorageId, thumbnails);\n this.logger.log(`Saved ${thumbnailMetadata.length} thumbnails for ${fileStorageId}`);\n }\n\n await this.fileStorageService.saveMetadata(\n fileStorageId,\n metadata,\n fileHash,\n originalFileName,\n thumbnailMetadata,\n );\n\n res.send({\n message: \"File analyzed successfully\",\n fileStorageId,\n metadata,\n thumbnailCount: thumbnails.length,\n });\n } catch (error) {\n this.logger.error(`Failed to analyze file ${fileStorageId}: ${error}`);\n res.status(500).send({ error: `Failed to analyze file: ${error}` });\n }\n }\n\n @GET()\n @route(\"/:fileStorageId/thumbnail/:index\")\n async getThumbnailByIndex(req: Request, res: Response) {\n const { fileStorageId, index } = req.params as { fileStorageId: string; index: string };\n const thumbnailIndex = Number.parseInt(index);\n\n if (Number.isNaN(thumbnailIndex)) {\n res.status(400).send({ error: \"Invalid thumbnail index\" });\n return;\n }\n\n try {\n const thumbnail = await this.fileStorageService.getThumbnail(fileStorageId, thumbnailIndex);\n\n if (!thumbnail) {\n res.status(404).send({ error: \"Thumbnail not found\" });\n return;\n }\n\n // Determine content type from magic bytes\n const isJPG = thumbnail[0] === 0xff && thumbnail[1] === 0xd8;\n const isQOI = thumbnail[0] === 0x71 && thumbnail[1] === 0x6f && thumbnail[2] === 0x69 && thumbnail[3] === 0x66;\n\n // QOI format not supported by browser\n if (isQOI) {\n res.status(404).send({ error: \"Thumbnail format not supported (QOI)\" });\n return;\n }\n\n const mimeType = isJPG ? \"image/jpeg\" : \"image/png\";\n const base64 = thumbnail.toString(\"base64\");\n res.send({\n thumbnailBase64: `data:${mimeType};base64,${base64}`,\n });\n } catch (error) {\n this.logger.error(`Failed to get thumbnail ${thumbnailIndex} for ${fileStorageId}: ${error}`);\n res.status(500).send({ error: \"Failed to get thumbnail\" });\n }\n }\n\n /**\n * Upload a file to storage and analyze it\n * POST /api/file-storage/upload\n */\n @POST()\n @route(\"/upload\")\n async uploadFile(req: Request, res: Response) {\n const acceptedExtensions = [\".gcode\", \".3mf\", \".bgcode\"];\n const files = await this.multerService.multerLoadFileAsync(req, res, acceptedExtensions, true);\n\n if (!files?.length) {\n throw new BadRequestException(\"No file uploaded\");\n }\n\n if (files.length > 1) {\n throw new BadRequestException(\"Only 1 file can be uploaded at a time\");\n }\n\n const file = files[0];\n await this.fileStorageService.validateUniqueFilename(file.originalname);\n\n const ext = extname(file.originalname);\n const tempPathWithExt = file.path + ext;\n\n try {\n copyFileSync(file.path, tempPathWithExt);\n\n const fileHash = await this.fileStorageService.calculateFileHash(tempPathWithExt);\n this.logger.log(`Analyzing ${file.originalname}`);\n const analysisResult = await this.fileAnalysisService.analyzeFile(tempPathWithExt);\n const { metadata, thumbnails } = analysisResult;\n\n const fileStorageId = await this.fileStorageService.saveFile(file, fileHash);\n this.logger.log(`Saved ${file.originalname} as ${fileStorageId}`);\n\n const thumbnailMetadata =\n thumbnails.length > 0 ? await this.fileStorageService.saveThumbnails(fileStorageId, thumbnails) : [];\n\n await this.fileStorageService.saveMetadata(\n fileStorageId,\n metadata,\n fileHash,\n file.originalname,\n thumbnailMetadata,\n );\n\n res.send({\n message: \"File uploaded successfully\",\n fileStorageId,\n fileName: file.originalname,\n fileSize: file.size,\n fileHash,\n metadata,\n thumbnailCount: thumbnails.length,\n });\n } finally {\n if (existsSync(tempPathWithExt)) {\n unlinkSync(tempPathWithExt);\n }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"file-storage.controller.js","names":[],"sources":["../../src/controllers/file-storage.controller.ts"],"sourcesContent":["import { before, DELETE, GET, POST, route } from \"awilix-express\";\nimport { AppConstants } from \"@/server.constants\";\nimport type { Request, Response } from \"express\";\nimport { authorizeRoles, authenticate } from \"@/middleware/authenticate\";\nimport { ROLES } from \"@/constants/authorization.constants\";\nimport { FileStorageService } from \"@/services/file-storage.service\";\nimport { MulterService } from \"@/services/core/multer.service\";\nimport type { ILoggerFactory } from \"@/handlers/logger-factory\";\nimport { LoggerService } from \"@/handlers/logger\";\nimport { FileAnalysisService } from \"@/services/file-analysis.service\";\nimport { BadRequestException } from \"@/exceptions/runtime.exceptions\";\nimport { copyFileSync, existsSync, unlinkSync } from \"node:fs\";\nimport { extname } from \"node:path\";\n\n@route(AppConstants.apiRoute + \"/file-storage\")\n@before([authenticate(), authorizeRoles([ROLES.ADMIN, ROLES.OPERATOR])])\nexport class FileStorageController {\n private readonly logger: LoggerService;\n\n constructor(\n loggerFactory: ILoggerFactory,\n private readonly fileStorageService: FileStorageService,\n private readonly multerService: MulterService,\n private readonly fileAnalysisService: FileAnalysisService,\n ) {\n this.logger = loggerFactory(FileStorageController.name);\n }\n\n @GET()\n async listFiles(req: Request, res: Response) {\n try {\n const files = await this.fileStorageService.listAllFiles();\n\n res.send({\n files: files.map((file) => {\n const thumbnails = (file.metadata?._thumbnails || []).map((thumb: any) => ({\n index: thumb.index,\n width: thumb.width,\n height: thumb.height,\n format: thumb.format,\n size: thumb.size,\n }));\n return {\n fileStorageId: file.fileStorageId,\n fileName: file.fileName,\n fileFormat: file.fileFormat,\n fileSize: file.fileSize,\n fileHash: file.fileHash,\n createdAt: file.createdAt,\n thumbnails,\n metadata: file.metadata,\n };\n }),\n totalCount: files.length,\n });\n } catch (error) {\n this.logger.error(`Failed to list files: ${error}`);\n res.status(500).send({ error: \"Failed to list files\" });\n }\n }\n\n /**\n * Get file metadata\n * GET /api/file-storage/:fileStorageId\n */\n @GET()\n @route(\"/:fileStorageId\")\n async getFileMetadata(req: Request, res: Response) {\n const { fileStorageId } = req.params as { fileStorageId: string };\n\n try {\n const file = await this.fileStorageService.getFileInfo(fileStorageId);\n\n if (!file) {\n res.status(404).send({ error: \"File not found\" });\n return;\n }\n\n const thumbnails = (file.metadata?._thumbnails || []).map((thumb: any) => ({\n index: thumb.index,\n width: thumb.width,\n height: thumb.height,\n format: thumb.format,\n size: thumb.size,\n }));\n\n res.send({\n fileStorageId: file.fileStorageId,\n fileName: file.fileName,\n fileFormat: file.fileFormat,\n fileSize: file.fileSize,\n fileHash: file.fileHash,\n createdAt: file.createdAt,\n thumbnails,\n metadata: file.metadata,\n });\n } catch (error) {\n this.logger.error(`Failed to get file metadata for ${fileStorageId}: ${error}`);\n res.status(500).send({ error: \"Failed to get file metadata\" });\n }\n }\n\n /**\n * Delete a stored file and its thumbnails\n * DELETE /api/file-storage/:fileStorageId\n */\n @DELETE()\n @route(\"/:fileStorageId\")\n async deleteFile(req: Request, res: Response) {\n const { fileStorageId } = req.params as { fileStorageId: string };\n\n try {\n await this.fileStorageService.deleteFile(fileStorageId);\n\n this.logger.log(`Deleted file ${fileStorageId}`);\n res.send({ message: \"File deleted successfully\", fileStorageId });\n } catch (error) {\n this.logger.error(`Failed to delete file ${fileStorageId}: ${error}`);\n res.status(500).send({ error: \"Failed to delete file\" });\n }\n }\n\n @POST()\n @route(\"/:fileStorageId/analyze\")\n async analyzeFile(req: Request, res: Response) {\n const { fileStorageId } = req.params as { fileStorageId: string };\n\n try {\n const filePath = this.fileStorageService.getFilePath(fileStorageId);\n const fileExists = await this.fileStorageService.fileExists(fileStorageId);\n if (!fileExists) {\n res.status(404).send({ error: \"File not found\" });\n return;\n }\n this.logger.log(`Analyzing file: ${fileStorageId}`);\n\n // Load existing metadata to preserve original filename\n const existingMetadata = await this.fileStorageService.loadMetadata(fileStorageId);\n\n const analysisResult = await this.fileAnalysisService.analyzeFile(filePath);\n const metadata = analysisResult.metadata;\n const thumbnails = analysisResult.thumbnails;\n\n this.logger.log(\n `Analysis complete for ${fileStorageId}: format=${metadata.fileFormat}, layers=${metadata.totalLayers}, time=${metadata.gcodePrintTimeSeconds}s, thumbnails=${thumbnails.length}`,\n );\n\n const fileHash = await this.fileStorageService.calculateFileHash(filePath);\n const originalFileName = existingMetadata?._originalFileName || fileStorageId;\n\n metadata.fileName = originalFileName;\n\n let thumbnailMetadata: any[] = [];\n if (thumbnails.length > 0) {\n thumbnailMetadata = await this.fileStorageService.saveThumbnails(fileStorageId, thumbnails);\n this.logger.log(`Saved ${thumbnailMetadata.length} thumbnails for ${fileStorageId}`);\n }\n\n await this.fileStorageService.saveMetadata(\n fileStorageId,\n metadata,\n fileHash,\n originalFileName,\n thumbnailMetadata,\n );\n\n res.send({\n message: \"File analyzed successfully\",\n fileStorageId,\n metadata,\n thumbnailCount: thumbnails.length,\n });\n } catch (error) {\n this.logger.error(`Failed to analyze file ${fileStorageId}: ${error}`);\n res.status(500).send({ error: `Failed to analyze file: ${error}` });\n }\n }\n\n @GET()\n @route(\"/:fileStorageId/thumbnail/:index\")\n async getThumbnailByIndex(req: Request, res: Response) {\n const { fileStorageId, index } = req.params as { fileStorageId: string; index: string };\n const thumbnailIndex = Number.parseInt(index);\n\n if (Number.isNaN(thumbnailIndex)) {\n res.status(400).send({ error: \"Invalid thumbnail index\" });\n return;\n }\n\n try {\n const thumbnail = await this.fileStorageService.getThumbnail(fileStorageId, thumbnailIndex);\n\n if (!thumbnail) {\n res.status(404).send({ error: \"Thumbnail not found\" });\n return;\n }\n\n // Determine content type from magic bytes\n const isJPG = thumbnail[0] === 0xff && thumbnail[1] === 0xd8;\n const isQOI = thumbnail[0] === 0x71 && thumbnail[1] === 0x6f && thumbnail[2] === 0x69 && thumbnail[3] === 0x66;\n\n // QOI format not supported by browser\n if (isQOI) {\n res.status(404).send({ error: \"Thumbnail format not supported (QOI)\" });\n return;\n }\n\n const mimeType = isJPG ? \"image/jpeg\" : \"image/png\";\n const base64 = thumbnail.toString(\"base64\");\n res.send({\n thumbnailBase64: `data:${mimeType};base64,${base64}`,\n });\n } catch (error) {\n this.logger.error(`Failed to get thumbnail ${thumbnailIndex} for ${fileStorageId}: ${error}`);\n res.status(500).send({ error: \"Failed to get thumbnail\" });\n }\n }\n\n /**\n * Upload a file to storage and analyze it\n * POST /api/file-storage/upload\n */\n @POST()\n @route(\"/upload\")\n async uploadFile(req: Request, res: Response) {\n const acceptedExtensions = [\".gcode\", \".3mf\", \".bgcode\"];\n const files = await this.multerService.multerLoadFileAsync(req, res, acceptedExtensions, true);\n\n if (!files?.length) {\n throw new BadRequestException(\"No file uploaded\");\n }\n\n if (files.length > 1) {\n throw new BadRequestException(\"Only 1 file can be uploaded at a time\");\n }\n\n const file = files[0];\n await this.fileStorageService.validateUniqueFilename(file.originalname);\n\n const ext = extname(file.originalname);\n const tempPathWithExt = file.path + ext;\n\n try {\n copyFileSync(file.path, tempPathWithExt);\n\n const fileHash = await this.fileStorageService.calculateFileHash(tempPathWithExt);\n this.logger.log(`Analyzing ${file.originalname}`);\n const analysisResult = await this.fileAnalysisService.analyzeFile(tempPathWithExt);\n const { metadata, thumbnails } = analysisResult;\n\n const fileStorageId = await this.fileStorageService.saveFile(file, fileHash);\n this.logger.log(`Saved ${file.originalname} as ${fileStorageId}`);\n\n const thumbnailMetadata =\n thumbnails.length > 0 ? await this.fileStorageService.saveThumbnails(fileStorageId, thumbnails) : [];\n\n await this.fileStorageService.saveMetadata(\n fileStorageId,\n metadata,\n fileHash,\n file.originalname,\n thumbnailMetadata,\n );\n\n res.send({\n message: \"File uploaded successfully\",\n fileStorageId,\n fileName: file.originalname,\n fileSize: file.size,\n fileHash,\n metadata,\n thumbnailCount: thumbnails.length,\n });\n } finally {\n if (existsSync(tempPathWithExt)) {\n unlinkSync(tempPathWithExt);\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
- import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.js";
3
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.js";
2
+ import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorateMetadata.js";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorate.js";
4
4
  import { BadRequestException, ForbiddenError } from "../exceptions/runtime.exceptions.js";
5
5
  import { validateMiddleware } from "../handlers/validators.js";
6
6
  import { AppConstants } from "../server.constants.js";
@@ -1 +1 @@
1
- {"version":3,"file":"first-time-setup.controller.js","names":[],"sources":["../../src/controllers/first-time-setup.controller.ts"],"sourcesContent":["import { POST, route } from \"awilix-express\";\nimport { AppConstants } from \"@/server.constants\";\nimport { validateMiddleware } from \"@/handlers/validators\";\nimport { wizardSettingsSchema } from \"./validation/setting.validation\";\nimport { BadRequestException, ForbiddenError } from \"@/exceptions/runtime.exceptions\";\nimport { ROLES } from \"@/constants/authorization.constants\";\nimport { SettingsStore } from \"@/state/settings.store\";\nimport type { Request, Response } from \"express\";\nimport type { IUserService } from \"@/services/interfaces/user-service.interface\";\nimport type { IRoleService } from \"@/services/interfaces/role-service.interface\";\nimport { YamlService } from \"@/services/core/yaml.service\";\nimport { MulterService } from \"@/services/core/multer.service\";\n\n@route(AppConstants.apiRoute + \"/first-time-setup\")\nexport class FirstTimeSetupController {\n constructor(\n private readonly settingsStore: SettingsStore,\n private readonly roleService: IRoleService,\n private readonly userService: IUserService,\n private readonly yamlService: YamlService,\n private readonly multerService: MulterService,\n ) {}\n\n @POST()\n @route(\"/validate\")\n async validateWizard(req: Request, res: Response) {\n const { rootUsername } = await validateMiddleware(req, wizardSettingsSchema);\n await this.roleService.getSynchronizedRoleByName(ROLES.ADMIN);\n\n if (this.settingsStore.isWizardCompleted()) {\n throw new ForbiddenError(\"Wizard already completed\");\n }\n\n const user = await this.userService.findRawByUsername(rootUsername?.toLowerCase());\n if (user) {\n throw new BadRequestException(\"This user already exists\");\n }\n\n return res.send();\n }\n\n @POST()\n @route(\"/complete\")\n async completeWizard(req: Request, res: Response) {\n const { loginRequired, registration, rootUsername, rootPassword } = await validateMiddleware(\n req,\n wizardSettingsSchema,\n );\n\n if (this.settingsStore.isWizardCompleted()) {\n throw new ForbiddenError(\"Wizard already completed\");\n }\n\n await this.roleService.getSynchronizedRoleByName(ROLES.ADMIN);\n const user = await this.userService.findRawByUsername(rootUsername?.toLowerCase());\n if (user) {\n throw new BadRequestException(\"This user already exists\");\n }\n\n await this.userService.register({\n username: rootUsername,\n password: rootPassword,\n roles: [ROLES.ADMIN],\n isRootUser: true,\n isVerified: true,\n isDemoUser: false,\n needsPasswordChange: false,\n });\n await this.settingsStore.setLoginRequired(loginRequired);\n await this.settingsStore.setRegistrationEnabled(registration);\n await this.settingsStore.setWizardCompleted(AppConstants.currentWizardVersion);\n\n return res.send();\n }\n\n @POST()\n @route(\"/yaml-import\")\n async importYamlFile(req: Request, res: Response) {\n if (this.settingsStore.isWizardCompleted()) {\n throw new ForbiddenError(\n \"Wizard already completed. Cannot import during first-time setup once wizard is complete.\",\n );\n }\n\n const files = await this.multerService.multerLoadFileAsync(req, res, [\".yaml\", \".yml\"], false);\n const firstFile = files[0];\n\n await this.yamlService.importYaml(firstFile.buffer.toString());\n\n return res.send({\n success: true,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAcO,IAAA,2BAAA,MAAM,yBAAyB;CACpC,YACE,eACA,aACA,aACA,aACA,eACA;AALiB,OAAA,gBAAA;AACA,OAAA,cAAA;AACA,OAAA,cAAA;AACA,OAAA,cAAA;AACA,OAAA,gBAAA;;CAGnB,MAEM,eAAe,KAAc,KAAe;EAChD,MAAM,EAAE,iBAAiB,MAAM,mBAAmB,KAAK,qBAAqB;AAC5E,QAAM,KAAK,YAAY,0BAA0B,MAAM,MAAM;AAE7D,MAAI,KAAK,cAAc,mBAAmB,CACxC,OAAM,IAAI,eAAe,2BAA2B;AAItD,MAAI,MADe,KAAK,YAAY,kBAAkB,cAAc,aAAa,CAAC,CAEhF,OAAM,IAAI,oBAAoB,2BAA2B;AAG3D,SAAO,IAAI,MAAM;;CAGnB,MAEM,eAAe,KAAc,KAAe;EAChD,MAAM,EAAE,eAAe,cAAc,cAAc,iBAAiB,MAAM,mBACxE,KACA,qBACD;AAED,MAAI,KAAK,cAAc,mBAAmB,CACxC,OAAM,IAAI,eAAe,2BAA2B;AAGtD,QAAM,KAAK,YAAY,0BAA0B,MAAM,MAAM;AAE7D,MAAI,MADe,KAAK,YAAY,kBAAkB,cAAc,aAAa,CAAC,CAEhF,OAAM,IAAI,oBAAoB,2BAA2B;AAG3D,QAAM,KAAK,YAAY,SAAS;GAC9B,UAAU;GACV,UAAU;GACV,OAAO,CAAC,MAAM,MAAM;GACpB,YAAY;GACZ,YAAY;GACZ,YAAY;GACZ,qBAAqB;GACtB,CAAC;AACF,QAAM,KAAK,cAAc,iBAAiB,cAAc;AACxD,QAAM,KAAK,cAAc,uBAAuB,aAAa;AAC7D,QAAM,KAAK,cAAc,mBAAmB,aAAa,qBAAqB;AAE9E,SAAO,IAAI,MAAM;;CAGnB,MAEM,eAAe,KAAc,KAAe;AAChD,MAAI,KAAK,cAAc,mBAAmB,CACxC,OAAM,IAAI,eACR,2FACD;EAIH,MAAM,aAAY,MADE,KAAK,cAAc,oBAAoB,KAAK,KAAK,CAAC,SAAS,OAAO,EAAE,MAAM,EACtE;AAExB,QAAM,KAAK,YAAY,WAAW,UAAU,OAAO,UAAU,CAAC;AAE9D,SAAO,IAAI,KAAK,EACd,SAAS,MACV,CAAC;;;;CApEH,MAAM;CACN,MAAM,YAAY;;;;;;CAiBlB,MAAM;CACN,MAAM,YAAY;;;;;;CAiClB,MAAM;CACN,MAAM,eAAe;;;;;uCA/DvB,MAAM,aAAa,WAAW,oBAAoB,EAAA,mBAAA,qBAAA"}
1
+ {"version":3,"file":"first-time-setup.controller.js","names":[],"sources":["../../src/controllers/first-time-setup.controller.ts"],"sourcesContent":["import { POST, route } from \"awilix-express\";\nimport { AppConstants } from \"@/server.constants\";\nimport { validateMiddleware } from \"@/handlers/validators\";\nimport { wizardSettingsSchema } from \"./validation/setting.validation\";\nimport { BadRequestException, ForbiddenError } from \"@/exceptions/runtime.exceptions\";\nimport { ROLES } from \"@/constants/authorization.constants\";\nimport { SettingsStore } from \"@/state/settings.store\";\nimport type { Request, Response } from \"express\";\nimport type { IUserService } from \"@/services/interfaces/user-service.interface\";\nimport type { IRoleService } from \"@/services/interfaces/role-service.interface\";\nimport { YamlService } from \"@/services/core/yaml.service\";\nimport { MulterService } from \"@/services/core/multer.service\";\n\n@route(AppConstants.apiRoute + \"/first-time-setup\")\nexport class FirstTimeSetupController {\n constructor(\n private readonly settingsStore: SettingsStore,\n private readonly roleService: IRoleService,\n private readonly userService: IUserService,\n private readonly yamlService: YamlService,\n private readonly multerService: MulterService,\n ) {}\n\n @POST()\n @route(\"/validate\")\n async validateWizard(req: Request, res: Response) {\n const { rootUsername } = await validateMiddleware(req, wizardSettingsSchema);\n await this.roleService.getSynchronizedRoleByName(ROLES.ADMIN);\n\n if (this.settingsStore.isWizardCompleted()) {\n throw new ForbiddenError(\"Wizard already completed\");\n }\n\n const user = await this.userService.findRawByUsername(rootUsername?.toLowerCase());\n if (user) {\n throw new BadRequestException(\"This user already exists\");\n }\n\n return res.send();\n }\n\n @POST()\n @route(\"/complete\")\n async completeWizard(req: Request, res: Response) {\n const { loginRequired, registration, rootUsername, rootPassword } = await validateMiddleware(\n req,\n wizardSettingsSchema,\n );\n\n if (this.settingsStore.isWizardCompleted()) {\n throw new ForbiddenError(\"Wizard already completed\");\n }\n\n await this.roleService.getSynchronizedRoleByName(ROLES.ADMIN);\n const user = await this.userService.findRawByUsername(rootUsername?.toLowerCase());\n if (user) {\n throw new BadRequestException(\"This user already exists\");\n }\n\n await this.userService.register({\n username: rootUsername,\n password: rootPassword,\n roles: [ROLES.ADMIN],\n isRootUser: true,\n isVerified: true,\n isDemoUser: false,\n needsPasswordChange: false,\n });\n await this.settingsStore.setLoginRequired(loginRequired);\n await this.settingsStore.setRegistrationEnabled(registration);\n await this.settingsStore.setWizardCompleted(AppConstants.currentWizardVersion);\n\n return res.send();\n }\n\n @POST()\n @route(\"/yaml-import\")\n async importYamlFile(req: Request, res: Response) {\n if (this.settingsStore.isWizardCompleted()) {\n throw new ForbiddenError(\n \"Wizard already completed. Cannot import during first-time setup once wizard is complete.\",\n );\n }\n\n const files = await this.multerService.multerLoadFileAsync(req, res, [\".yaml\", \".yml\"], false);\n const firstFile = files[0];\n\n await this.yamlService.importYaml(firstFile.buffer.toString());\n\n return res.send({\n success: true,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAcO,IAAA,2BAAA,MAAM,yBAAyB;CACpC,YACE,eACA,aACA,aACA,aACA,eACA;EALiB,KAAA,gBAAA;EACA,KAAA,cAAA;EACA,KAAA,cAAA;EACA,KAAA,cAAA;EACA,KAAA,gBAAA;;CAGnB,MAEM,eAAe,KAAc,KAAe;EAChD,MAAM,EAAE,iBAAiB,MAAM,mBAAmB,KAAK,qBAAqB;EAC5E,MAAM,KAAK,YAAY,0BAA0B,MAAM,MAAM;EAE7D,IAAI,KAAK,cAAc,mBAAmB,EACxC,MAAM,IAAI,eAAe,2BAA2B;EAItD,IAAI,MADe,KAAK,YAAY,kBAAkB,cAAc,aAAa,CAAC,EAEhF,MAAM,IAAI,oBAAoB,2BAA2B;EAG3D,OAAO,IAAI,MAAM;;CAGnB,MAEM,eAAe,KAAc,KAAe;EAChD,MAAM,EAAE,eAAe,cAAc,cAAc,iBAAiB,MAAM,mBACxE,KACA,qBACD;EAED,IAAI,KAAK,cAAc,mBAAmB,EACxC,MAAM,IAAI,eAAe,2BAA2B;EAGtD,MAAM,KAAK,YAAY,0BAA0B,MAAM,MAAM;EAE7D,IAAI,MADe,KAAK,YAAY,kBAAkB,cAAc,aAAa,CAAC,EAEhF,MAAM,IAAI,oBAAoB,2BAA2B;EAG3D,MAAM,KAAK,YAAY,SAAS;GAC9B,UAAU;GACV,UAAU;GACV,OAAO,CAAC,MAAM,MAAM;GACpB,YAAY;GACZ,YAAY;GACZ,YAAY;GACZ,qBAAqB;GACtB,CAAC;EACF,MAAM,KAAK,cAAc,iBAAiB,cAAc;EACxD,MAAM,KAAK,cAAc,uBAAuB,aAAa;EAC7D,MAAM,KAAK,cAAc,mBAAmB,aAAa,qBAAqB;EAE9E,OAAO,IAAI,MAAM;;CAGnB,MAEM,eAAe,KAAc,KAAe;EAChD,IAAI,KAAK,cAAc,mBAAmB,EACxC,MAAM,IAAI,eACR,2FACD;EAIH,MAAM,aAAY,MADE,KAAK,cAAc,oBAAoB,KAAK,KAAK,CAAC,SAAS,OAAO,EAAE,MAAM,EACtE;EAExB,MAAM,KAAK,YAAY,WAAW,UAAU,OAAO,UAAU,CAAC;EAE9D,OAAO,IAAI,KAAK,EACd,SAAS,MACV,CAAC;;;;CApEH,MAAM;CACN,MAAM,YAAY;;;;;;CAiBlB,MAAM;CACN,MAAM,YAAY;;;;;;CAiClB,MAAM;CACN,MAAM,eAAe;;;;;uCA/DvB,MAAM,aAAa,WAAW,oBAAoB,EAAA,mBAAA,qBAAA"}
@@ -1,6 +1,6 @@
1
1
  import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
- import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.js";
3
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.js";
2
+ import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorateMetadata.js";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorate.js";
4
4
  import { AppConstants } from "../server.constants.js";
5
5
  import { PERMS } from "../constants/authorization.constants.js";
6
6
  import { authenticate, permission } from "../middleware/authenticate.js";
@@ -1 +1 @@
1
- {"version":3,"file":"floor.controller.js","names":[],"sources":["../../src/controllers/floor.controller.ts"],"sourcesContent":["import type { Request, Response } from \"express\";\nimport { FloorStore } from \"@/state/floor.store\";\nimport { PERMS } from \"@/constants/authorization.constants\";\nimport { AppConstants } from \"@/server.constants\";\nimport { before, DELETE, GET, PATCH, POST, route } from \"awilix-express\";\nimport { authenticate, permission } from \"@/middleware/authenticate\";\nimport { ParamId } from \"@/middleware/param-converter.middleware\";\n\n@route(AppConstants.apiRoute + \"/floor\")\n@before([authenticate()])\nexport class FloorController {\n constructor(private readonly floorStore: FloorStore) {}\n\n @GET()\n @route(\"/\")\n @before([permission(PERMS.Floors.List)])\n async list(req: Request, res: Response) {\n const floors = await this.floorStore.listCache();\n res.send(floors);\n }\n\n @GET()\n @route(\"/:id\")\n @before([permission(PERMS.Floors.Get), ParamId(\"id\")])\n async get(req: Request, res: Response) {\n const floor = await this.floorStore.getFloor(req.local.id);\n res.send(floor);\n }\n\n @DELETE()\n @route(\"/:id\")\n @before([permission(PERMS.Floors.Delete), ParamId(\"id\")])\n async delete(req: Request, res: Response) {\n await this.floorStore.delete(req.local.id);\n res.send();\n }\n\n @POST()\n @route(\"/\")\n @before([permission(PERMS.Floors.Create)])\n async create(req: Request, res: Response) {\n const floor = await this.floorStore.create(req.body);\n res.send(floor);\n }\n\n @PATCH()\n @route(\"/:id/name\")\n @before([permission(PERMS.Floors.Update), ParamId(\"id\")])\n async updateName(req: Request, res: Response) {\n const floor = await this.floorStore.updateName(req.local.id, req.body.name);\n res.send(floor);\n }\n\n @PATCH()\n @route(\"/:id/floor-order\")\n @before([permission(PERMS.Floors.Update), ParamId(\"id\")])\n async updateFloorOrder(req: Request, res: Response) {\n const floor = await this.floorStore.updateFloorOrder(req.local.id, req.body.order);\n res.send(floor);\n }\n\n @POST()\n @route(\"/:id/printer\")\n @before([permission(PERMS.Floors.Update), ParamId(\"id\")])\n async addPrinterToFloor(req: Request, res: Response) {\n const floor = await this.floorStore.addOrUpdatePrinter(req.local.id, req.body);\n res.send(floor);\n }\n\n @DELETE()\n @route(\"/:id/printer\")\n @before([permission(PERMS.Floors.Update), ParamId(\"id\")])\n async removePrinterFromFloor(req: Request, res: Response) {\n const floor = await this.floorStore.removePrinter(req.local.id, req.body.printerId);\n res.send(floor);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAUO,IAAA,kBAAA,MAAM,gBAAgB;CAC3B,YAAY,YAAyC;AAAxB,OAAA,aAAA;;CAE7B,MAGM,KAAK,KAAc,KAAe;EACtC,MAAM,SAAS,MAAM,KAAK,WAAW,WAAW;AAChD,MAAI,KAAK,OAAO;;CAGlB,MAGM,IAAI,KAAc,KAAe;EACrC,MAAM,QAAQ,MAAM,KAAK,WAAW,SAAS,IAAI,MAAM,GAAG;AAC1D,MAAI,KAAK,MAAM;;CAGjB,MAGM,OAAO,KAAc,KAAe;AACxC,QAAM,KAAK,WAAW,OAAO,IAAI,MAAM,GAAG;AAC1C,MAAI,MAAM;;CAGZ,MAGM,OAAO,KAAc,KAAe;EACxC,MAAM,QAAQ,MAAM,KAAK,WAAW,OAAO,IAAI,KAAK;AACpD,MAAI,KAAK,MAAM;;CAGjB,MAGM,WAAW,KAAc,KAAe;EAC5C,MAAM,QAAQ,MAAM,KAAK,WAAW,WAAW,IAAI,MAAM,IAAI,IAAI,KAAK,KAAK;AAC3E,MAAI,KAAK,MAAM;;CAGjB,MAGM,iBAAiB,KAAc,KAAe;EAClD,MAAM,QAAQ,MAAM,KAAK,WAAW,iBAAiB,IAAI,MAAM,IAAI,IAAI,KAAK,MAAM;AAClF,MAAI,KAAK,MAAM;;CAGjB,MAGM,kBAAkB,KAAc,KAAe;EACnD,MAAM,QAAQ,MAAM,KAAK,WAAW,mBAAmB,IAAI,MAAM,IAAI,IAAI,KAAK;AAC9E,MAAI,KAAK,MAAM;;CAGjB,MAGM,uBAAuB,KAAc,KAAe;EACxD,MAAM,QAAQ,MAAM,KAAK,WAAW,cAAc,IAAI,MAAM,IAAI,IAAI,KAAK,UAAU;AACnF,MAAI,KAAK,MAAM;;;;CA7DhB,KAAK;CACL,MAAM,IAAI;CACV,OAAO,CAAC,WAAW,MAAM,OAAO,KAAK,CAAC,CAAC;;;;;;CAMvC,KAAK;CACL,MAAM,OAAO;CACb,OAAO,CAAC,WAAW,MAAM,OAAO,IAAI,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMrD,QAAQ;CACR,MAAM,OAAO;CACb,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMxD,MAAM;CACN,MAAM,IAAI;CACV,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,CAAC,CAAC;;;;;;CAMzC,OAAO;CACP,MAAM,YAAY;CAClB,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMxD,OAAO;CACP,MAAM,mBAAmB;CACzB,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMxD,MAAM;CACN,MAAM,eAAe;CACrB,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMxD,QAAQ;CACR,MAAM,eAAe;CACrB,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CA/D1D,MAAM,aAAa,WAAW,SAAS;CACvC,OAAO,CAAC,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"floor.controller.js","names":[],"sources":["../../src/controllers/floor.controller.ts"],"sourcesContent":["import type { Request, Response } from \"express\";\nimport { FloorStore } from \"@/state/floor.store\";\nimport { PERMS } from \"@/constants/authorization.constants\";\nimport { AppConstants } from \"@/server.constants\";\nimport { before, DELETE, GET, PATCH, POST, route } from \"awilix-express\";\nimport { authenticate, permission } from \"@/middleware/authenticate\";\nimport { ParamId } from \"@/middleware/param-converter.middleware\";\n\n@route(AppConstants.apiRoute + \"/floor\")\n@before([authenticate()])\nexport class FloorController {\n constructor(private readonly floorStore: FloorStore) {}\n\n @GET()\n @route(\"/\")\n @before([permission(PERMS.Floors.List)])\n async list(req: Request, res: Response) {\n const floors = await this.floorStore.listCache();\n res.send(floors);\n }\n\n @GET()\n @route(\"/:id\")\n @before([permission(PERMS.Floors.Get), ParamId(\"id\")])\n async get(req: Request, res: Response) {\n const floor = await this.floorStore.getFloor(req.local.id);\n res.send(floor);\n }\n\n @DELETE()\n @route(\"/:id\")\n @before([permission(PERMS.Floors.Delete), ParamId(\"id\")])\n async delete(req: Request, res: Response) {\n await this.floorStore.delete(req.local.id);\n res.send();\n }\n\n @POST()\n @route(\"/\")\n @before([permission(PERMS.Floors.Create)])\n async create(req: Request, res: Response) {\n const floor = await this.floorStore.create(req.body);\n res.send(floor);\n }\n\n @PATCH()\n @route(\"/:id/name\")\n @before([permission(PERMS.Floors.Update), ParamId(\"id\")])\n async updateName(req: Request, res: Response) {\n const floor = await this.floorStore.updateName(req.local.id, req.body.name);\n res.send(floor);\n }\n\n @PATCH()\n @route(\"/:id/floor-order\")\n @before([permission(PERMS.Floors.Update), ParamId(\"id\")])\n async updateFloorOrder(req: Request, res: Response) {\n const floor = await this.floorStore.updateFloorOrder(req.local.id, req.body.order);\n res.send(floor);\n }\n\n @POST()\n @route(\"/:id/printer\")\n @before([permission(PERMS.Floors.Update), ParamId(\"id\")])\n async addPrinterToFloor(req: Request, res: Response) {\n const floor = await this.floorStore.addOrUpdatePrinter(req.local.id, req.body);\n res.send(floor);\n }\n\n @DELETE()\n @route(\"/:id/printer\")\n @before([permission(PERMS.Floors.Update), ParamId(\"id\")])\n async removePrinterFromFloor(req: Request, res: Response) {\n const floor = await this.floorStore.removePrinter(req.local.id, req.body.printerId);\n res.send(floor);\n }\n}\n"],"mappings":";;;;;;;;;;;;AAUO,IAAA,kBAAA,MAAM,gBAAgB;CAC3B,YAAY,YAAyC;EAAxB,KAAA,aAAA;;CAE7B,MAGM,KAAK,KAAc,KAAe;EACtC,MAAM,SAAS,MAAM,KAAK,WAAW,WAAW;EAChD,IAAI,KAAK,OAAO;;CAGlB,MAGM,IAAI,KAAc,KAAe;EACrC,MAAM,QAAQ,MAAM,KAAK,WAAW,SAAS,IAAI,MAAM,GAAG;EAC1D,IAAI,KAAK,MAAM;;CAGjB,MAGM,OAAO,KAAc,KAAe;EACxC,MAAM,KAAK,WAAW,OAAO,IAAI,MAAM,GAAG;EAC1C,IAAI,MAAM;;CAGZ,MAGM,OAAO,KAAc,KAAe;EACxC,MAAM,QAAQ,MAAM,KAAK,WAAW,OAAO,IAAI,KAAK;EACpD,IAAI,KAAK,MAAM;;CAGjB,MAGM,WAAW,KAAc,KAAe;EAC5C,MAAM,QAAQ,MAAM,KAAK,WAAW,WAAW,IAAI,MAAM,IAAI,IAAI,KAAK,KAAK;EAC3E,IAAI,KAAK,MAAM;;CAGjB,MAGM,iBAAiB,KAAc,KAAe;EAClD,MAAM,QAAQ,MAAM,KAAK,WAAW,iBAAiB,IAAI,MAAM,IAAI,IAAI,KAAK,MAAM;EAClF,IAAI,KAAK,MAAM;;CAGjB,MAGM,kBAAkB,KAAc,KAAe;EACnD,MAAM,QAAQ,MAAM,KAAK,WAAW,mBAAmB,IAAI,MAAM,IAAI,IAAI,KAAK;EAC9E,IAAI,KAAK,MAAM;;CAGjB,MAGM,uBAAuB,KAAc,KAAe;EACxD,MAAM,QAAQ,MAAM,KAAK,WAAW,cAAc,IAAI,MAAM,IAAI,IAAI,KAAK,UAAU;EACnF,IAAI,KAAK,MAAM;;;;CA7DhB,KAAK;CACL,MAAM,IAAI;CACV,OAAO,CAAC,WAAW,MAAM,OAAO,KAAK,CAAC,CAAC;;;;;;CAMvC,KAAK;CACL,MAAM,OAAO;CACb,OAAO,CAAC,WAAW,MAAM,OAAO,IAAI,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMrD,QAAQ;CACR,MAAM,OAAO;CACb,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMxD,MAAM;CACN,MAAM,IAAI;CACV,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,CAAC,CAAC;;;;;;CAMzC,OAAO;CACP,MAAM,YAAY;CAClB,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMxD,OAAO;CACP,MAAM,mBAAmB;CACzB,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMxD,MAAM;CACN,MAAM,eAAe;CACrB,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CAMxD,QAAQ;CACR,MAAM,eAAe;CACrB,OAAO,CAAC,WAAW,MAAM,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,CAAC;;;;;;CA/D1D,MAAM,aAAa,WAAW,SAAS;CACvC,OAAO,CAAC,cAAc,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { __exportAll } from "../_virtual/_rolldown/runtime.js";
2
- import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.js";
3
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.js";
2
+ import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorateMetadata.js";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorate.js";
4
4
  import { AppConstants } from "../server.constants.js";
5
5
  import { register } from "prom-client";
6
6
  import { GET, route } from "awilix-express";