@fdm-monster/server 1.9.4 → 2.0.0

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 (393) hide show
  1. package/.env.template +8 -7
  2. package/.yarn/install-state.gz +0 -0
  3. package/CONTRIBUTING.md +5 -5
  4. package/README.md +9 -8
  5. package/RELEASE_NOTES.MD +52 -0
  6. package/SECURITY.md +1 -1
  7. package/biome.json +8 -5
  8. package/dist/consoles/download-github-releases.js +3 -3
  9. package/dist/consoles/launch-http-servers.js +4 -4
  10. package/dist/consoles/launch-http-servers.js.map +1 -1
  11. package/dist/consoles/mock-bambu.server.js +50 -30
  12. package/dist/consoles/mock-bambu.server.js.map +1 -1
  13. package/dist/consoles/mock-camera/default-image.js +13 -0
  14. package/dist/consoles/mock-camera/default-image.js.map +1 -0
  15. package/dist/consoles/mock-camera/mock-camera.server.js +160 -0
  16. package/dist/consoles/mock-camera/mock-camera.server.js.map +1 -0
  17. package/dist/consoles/mock-octoprint.server.js +281 -73
  18. package/dist/consoles/mock-octoprint.server.js.map +1 -1
  19. package/dist/consoles/mock-prusalink.server.js +17 -17
  20. package/dist/consoles/mock-prusalink.server.js.map +1 -1
  21. package/dist/consoles/typeorm-create.js +135 -0
  22. package/dist/consoles/typeorm-create.js.map +1 -0
  23. package/dist/consoles/typeorm-generate.js +8 -8
  24. package/dist/consoles/typeorm-generate.js.map +1 -1
  25. package/dist/consoles/utils/api-messages.js.map +1 -1
  26. package/dist/constants/authorization.constants.js +25 -31
  27. package/dist/constants/authorization.constants.js.map +1 -1
  28. package/dist/constants/event.constants.js.map +1 -1
  29. package/dist/constants/server-settings.constants.js +3 -19
  30. package/dist/constants/server-settings.constants.js.map +1 -1
  31. package/dist/container.js +43 -59
  32. package/dist/container.js.map +1 -1
  33. package/dist/container.tokens.js +9 -6
  34. package/dist/container.tokens.js.map +1 -1
  35. package/dist/controllers/auth.controller.js +1 -1
  36. package/dist/controllers/auth.controller.js.map +1 -1
  37. package/dist/controllers/batch-call.controller.js +7 -25
  38. package/dist/controllers/batch-call.controller.js.map +1 -1
  39. package/dist/controllers/file-storage.controller.js +248 -0
  40. package/dist/controllers/file-storage.controller.js.map +1 -0
  41. package/dist/controllers/first-time-setup.controller.js +6 -5
  42. package/dist/controllers/first-time-setup.controller.js.map +1 -1
  43. package/dist/controllers/floor.controller.js +12 -12
  44. package/dist/controllers/floor.controller.js.map +1 -1
  45. package/dist/controllers/metrics.controller.js.map +1 -1
  46. package/dist/controllers/print-job.controller.js +666 -0
  47. package/dist/controllers/print-job.controller.js.map +1 -0
  48. package/dist/controllers/print-queue.controller.js +375 -0
  49. package/dist/controllers/print-queue.controller.js.map +1 -0
  50. package/dist/controllers/printer-files.controller.js +88 -59
  51. package/dist/controllers/printer-files.controller.js.map +1 -1
  52. package/dist/controllers/printer-settings.controller.js +0 -21
  53. package/dist/controllers/printer-settings.controller.js.map +1 -1
  54. package/dist/controllers/{printer-group.controller.js → printer-tag.controller.js} +51 -34
  55. package/dist/controllers/printer-tag.controller.js.map +1 -0
  56. package/dist/controllers/printer.controller.js +21 -7
  57. package/dist/controllers/printer.controller.js.map +1 -1
  58. package/dist/controllers/server-private.controller.js +2 -1
  59. package/dist/controllers/server-private.controller.js.map +1 -1
  60. package/dist/controllers/server-public.controller.js +11 -15
  61. package/dist/controllers/server-public.controller.js.map +1 -1
  62. package/dist/controllers/settings.controller.js +0 -68
  63. package/dist/controllers/settings.controller.js.map +1 -1
  64. package/dist/controllers/slicer-compat.controller.js +216 -0
  65. package/dist/controllers/slicer-compat.controller.js.map +1 -0
  66. package/dist/controllers/user.controller.js +8 -12
  67. package/dist/controllers/user.controller.js.map +1 -1
  68. package/dist/controllers/validation/batch-controller.validation.js +13 -13
  69. package/dist/controllers/validation/batch-controller.validation.js.map +1 -1
  70. package/dist/controllers/validation/generic.validation.js +4 -8
  71. package/dist/controllers/validation/generic.validation.js.map +1 -1
  72. package/dist/controllers/validation/printer-files-controller.validation.js +2 -2
  73. package/dist/controllers/validation/user-controller.validation.js +14 -9
  74. package/dist/controllers/validation/user-controller.validation.js.map +1 -1
  75. package/dist/data-source.js +25 -12
  76. package/dist/data-source.js.map +1 -1
  77. package/dist/entities/camera-stream.entity.js +2 -1
  78. package/dist/entities/camera-stream.entity.js.map +1 -1
  79. package/dist/entities/floor.entity.js +3 -5
  80. package/dist/entities/floor.entity.js.map +1 -1
  81. package/dist/entities/index.js +15 -11
  82. package/dist/entities/index.js.map +1 -1
  83. package/dist/entities/print-job.entity.js +195 -0
  84. package/dist/entities/print-job.entity.js.map +1 -0
  85. package/dist/entities/{printer-group.entity.js → printer-tag.entity.js} +17 -17
  86. package/dist/entities/printer-tag.entity.js.map +1 -0
  87. package/dist/entities/printer.entity.js +4 -10
  88. package/dist/entities/printer.entity.js.map +1 -1
  89. package/dist/entities/settings.entity.js +3 -12
  90. package/dist/entities/settings.entity.js.map +1 -1
  91. package/dist/entities/{group.entity.js → tag.entity.js} +15 -8
  92. package/dist/entities/tag.entity.js.map +1 -0
  93. package/dist/handlers/logging/file-logging.transport.js.map +1 -1
  94. package/dist/handlers/logging/static.logger.js.map +1 -1
  95. package/dist/index.js +8 -2
  96. package/dist/index.js.map +1 -1
  97. package/dist/middleware/authenticate.js +4 -4
  98. package/dist/middleware/authenticate.js.map +1 -1
  99. package/dist/middleware/database.js +1 -1
  100. package/dist/middleware/exception.filter.js +114 -90
  101. package/dist/middleware/exception.filter.js.map +1 -1
  102. package/dist/middleware/global.middleware.js +10 -18
  103. package/dist/middleware/global.middleware.js.map +1 -1
  104. package/dist/middleware/param-converter.middleware.js +5 -13
  105. package/dist/middleware/param-converter.middleware.js.map +1 -1
  106. package/dist/middleware/passport.js +2 -2
  107. package/dist/middleware/passport.js.map +1 -1
  108. package/dist/middleware/printer-resolver.js.map +1 -1
  109. package/dist/middleware/printer.js +3 -2
  110. package/dist/middleware/printer.js.map +1 -1
  111. package/dist/middleware/socketio.middleware.js.map +1 -1
  112. package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js +1 -1
  113. package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js.map +1 -1
  114. package/dist/migrations/1766576698569-DropPermissions.js +28 -0
  115. package/dist/migrations/1766576698569-DropPermissions.js.map +1 -0
  116. package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js +186 -0
  117. package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js.map +1 -0
  118. package/dist/migrations/1767279607392-DropCustomGcode.js +31 -0
  119. package/dist/migrations/1767279607392-DropCustomGcode.js.map +1 -0
  120. package/dist/migrations/1767291804417-DropPrintCompletions.js +37 -0
  121. package/dist/migrations/1767291804417-DropPrintCompletions.js.map +1 -0
  122. package/dist/migrations/1767352862576-DropSettingsFileClean.js +88 -0
  123. package/dist/migrations/1767352862576-DropSettingsFileClean.js.map +1 -0
  124. package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js +107 -0
  125. package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js.map +1 -0
  126. package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js +62 -0
  127. package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js.map +1 -0
  128. package/dist/migrations/1767432108916-RenameGroupToTag.js +86 -0
  129. package/dist/migrations/1767432108916-RenameGroupToTag.js.map +1 -0
  130. package/dist/migrations/1767451444137-AddPrintJob.js +207 -0
  131. package/dist/migrations/1767451444137-AddPrintJob.js.map +1 -0
  132. package/dist/server.constants.js +9 -17
  133. package/dist/server.constants.js.map +1 -1
  134. package/dist/server.core.js +3 -7
  135. package/dist/server.core.js.map +1 -1
  136. package/dist/server.env.js +4 -49
  137. package/dist/server.env.js.map +1 -1
  138. package/dist/server.host.js +26 -44
  139. package/dist/server.host.js.map +1 -1
  140. package/dist/services/authentication/auth.service.js.map +1 -1
  141. package/dist/services/authentication/jwt.service.js.map +1 -1
  142. package/dist/services/bambu/bambu-ftp.adapter.js +3 -3
  143. package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
  144. package/dist/services/bambu/bambu-mqtt.adapter.js +74 -77
  145. package/dist/services/bambu/bambu-mqtt.adapter.js.map +1 -1
  146. package/dist/services/bambu/bambu.client.js.map +1 -1
  147. package/dist/services/bambu.api.js +11 -0
  148. package/dist/services/bambu.api.js.map +1 -1
  149. package/dist/services/core/batch-call.service.js +0 -25
  150. package/dist/services/core/batch-call.service.js.map +1 -1
  151. package/dist/services/core/multer.service.js +5 -9
  152. package/dist/services/core/multer.service.js.map +1 -1
  153. package/dist/services/core/yaml.service.js +219 -187
  154. package/dist/services/core/yaml.service.js.map +1 -1
  155. package/dist/services/file-analysis.service.js +146 -0
  156. package/dist/services/file-analysis.service.js.map +1 -0
  157. package/dist/services/file-storage.service.js +386 -0
  158. package/dist/services/file-storage.service.js.map +1 -0
  159. package/dist/services/interfaces/camera-stream.dto.js +2 -2
  160. package/dist/services/interfaces/camera-stream.dto.js.map +1 -1
  161. package/dist/services/interfaces/floor.dto.js +3 -3
  162. package/dist/services/interfaces/floor.dto.js.map +1 -1
  163. package/dist/services/interfaces/{printer-group.dto.js → printer-tag.dto.js} +9 -8
  164. package/dist/services/interfaces/printer-tag.dto.js.map +1 -0
  165. package/dist/services/interfaces/{print-completion.interface.js → printer-tag.service.interface.js} +1 -1
  166. package/dist/services/interfaces/{printer-group.service.interface.js.map → printer-tag.service.interface.js.map} +1 -1
  167. package/dist/services/interfaces/printer.dto.js +2 -2
  168. package/dist/services/interfaces/printer.dto.js.map +1 -1
  169. package/dist/services/interfaces/refresh-token.dto.js.map +1 -1
  170. package/dist/services/interfaces/role.dto.js.map +1 -1
  171. package/dist/services/interfaces/settings.dto.js +0 -1
  172. package/dist/services/interfaces/settings.dto.js.map +1 -1
  173. package/dist/services/interfaces/{group.dto.js → tag.dto.js} +1 -1
  174. package/dist/services/interfaces/tag.dto.js.map +1 -0
  175. package/dist/services/interfaces/user.dto.js.map +1 -1
  176. package/dist/services/moonraker/constants/moonraker-event.dto.js.map +1 -1
  177. package/dist/services/moonraker/moonraker-websocket.adapter.js.map +1 -1
  178. package/dist/services/moonraker/moonraker.client.js.map +1 -1
  179. package/dist/services/moonraker.api.js +3 -0
  180. package/dist/services/moonraker.api.js.map +1 -1
  181. package/dist/services/octoprint/dto/files/gcode-analysis.dto.js.map +1 -0
  182. package/dist/services/octoprint/dto/octoprint-event.dto.js.map +1 -1
  183. package/dist/services/octoprint/octoprint-api.routes.js +0 -7
  184. package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
  185. package/dist/services/octoprint/octoprint-websocket.adapter.js.map +1 -1
  186. package/dist/services/octoprint/octoprint.client.js +0 -4
  187. package/dist/services/octoprint/octoprint.client.js.map +1 -1
  188. package/dist/services/octoprint.api.js +3 -0
  189. package/dist/services/octoprint.api.js.map +1 -1
  190. package/dist/services/orm/base.service.js.map +1 -1
  191. package/dist/services/orm/camera-stream.service.js.map +1 -1
  192. package/dist/services/orm/floor-position.service.js.map +1 -1
  193. package/dist/services/orm/floor.service.js +12 -19
  194. package/dist/services/orm/floor.service.js.map +1 -1
  195. package/dist/services/orm/permission.service.js +3 -54
  196. package/dist/services/orm/permission.service.js.map +1 -1
  197. package/dist/services/orm/print-job.service.js +539 -0
  198. package/dist/services/orm/print-job.service.js.map +1 -0
  199. package/dist/services/orm/printer-tag.service.js +120 -0
  200. package/dist/services/orm/printer-tag.service.js.map +1 -0
  201. package/dist/services/orm/printer.service.js.map +1 -1
  202. package/dist/services/orm/refresh-token.service.js.map +1 -1
  203. package/dist/services/orm/role.service.js +25 -39
  204. package/dist/services/orm/role.service.js.map +1 -1
  205. package/dist/services/orm/settings.service.js +4 -15
  206. package/dist/services/orm/settings.service.js.map +1 -1
  207. package/dist/services/orm/user.service.js +17 -13
  208. package/dist/services/orm/user.service.js.map +1 -1
  209. package/dist/services/print-file-downloader.service.js +169 -0
  210. package/dist/services/print-file-downloader.service.js.map +1 -0
  211. package/dist/services/print-queue.service.js +268 -0
  212. package/dist/services/print-queue.service.js.map +1 -0
  213. package/dist/services/printer-api.factory.js +1 -1
  214. package/dist/services/printer-api.factory.js.map +1 -1
  215. package/dist/services/printer-api.interface.js.map +1 -1
  216. package/dist/services/prusa-link/constants/prusalink-event.dto.js.map +1 -1
  217. package/dist/services/prusa-link/prusa-link-http-polling.adapter.js +1 -3
  218. package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -1
  219. package/dist/services/prusa-link/prusa-link.api.js +4 -1
  220. package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
  221. package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js.map +1 -1
  222. package/dist/services/validators/floor-service.validation.js +25 -31
  223. package/dist/services/validators/floor-service.validation.js.map +1 -1
  224. package/dist/services/validators/print-job.validation.js +31 -0
  225. package/dist/services/validators/print-job.validation.js.map +1 -0
  226. package/dist/services/validators/settings-service.validation.js +0 -22
  227. package/dist/services/validators/settings-service.validation.js.map +1 -1
  228. package/dist/services/validators/user-service.validation.js +15 -10
  229. package/dist/services/validators/user-service.validation.js.map +1 -1
  230. package/dist/services/validators/yaml-service.validation.js +8 -14
  231. package/dist/services/validators/yaml-service.validation.js.map +1 -1
  232. package/dist/shared/load-controllers.js +2 -1
  233. package/dist/shared/load-controllers.js.map +1 -1
  234. package/dist/shared/runtime-settings.migration.js +1 -11
  235. package/dist/shared/runtime-settings.migration.js.map +1 -1
  236. package/dist/shared/websocket-rpc-extended.adapter.js +13 -4
  237. package/dist/shared/websocket-rpc-extended.adapter.js.map +1 -1
  238. package/dist/shared/websocket.adapter.js.map +1 -1
  239. package/dist/state/file-upload-tracker.cache.js.map +1 -1
  240. package/dist/state/file.cache.js +6 -6
  241. package/dist/state/file.cache.js.map +1 -1
  242. package/dist/state/floor.store.js +3 -10
  243. package/dist/state/floor.store.js.map +1 -1
  244. package/dist/state/printer-events.cache.js +180 -20
  245. package/dist/state/printer-events.cache.js.map +1 -1
  246. package/dist/state/printer-files.store.js.map +1 -1
  247. package/dist/state/printer-socket.store.js +25 -20
  248. package/dist/state/printer-socket.store.js.map +1 -1
  249. package/dist/state/printer-thumbnail.cache.js +98 -188
  250. package/dist/state/printer-thumbnail.cache.js.map +1 -1
  251. package/dist/state/printer.cache.js +3 -13
  252. package/dist/state/printer.cache.js.map +1 -1
  253. package/dist/state/settings.store.js +4 -42
  254. package/dist/state/settings.store.js.map +1 -1
  255. package/dist/state/socket-io.gateway.js +1 -1
  256. package/dist/state/socket-io.gateway.js.map +1 -1
  257. package/dist/state/test-printer-socket.store.js +6 -3
  258. package/dist/state/test-printer-socket.store.js.map +1 -1
  259. package/dist/tasks/boot.task.js +11 -91
  260. package/dist/tasks/boot.task.js.map +1 -1
  261. package/dist/tasks/print-job-analysis.task.js +116 -0
  262. package/dist/tasks/print-job-analysis.task.js.map +1 -0
  263. package/dist/tasks/printer-files-load.task.js +29 -0
  264. package/dist/tasks/printer-files-load.task.js.map +1 -0
  265. package/dist/tasks/socketio.task.js +1 -1
  266. package/dist/tasks/socketio.task.js.map +1 -1
  267. package/dist/tasks.js +3 -2
  268. package/dist/tasks.js.map +1 -1
  269. package/dist/utils/cache/key-diff.cache.js +20 -61
  270. package/dist/utils/cache/key-diff.cache.js.map +1 -1
  271. package/dist/utils/parsers/3mf.parser.js +337 -0
  272. package/dist/utils/parsers/3mf.parser.js.map +1 -0
  273. package/dist/utils/parsers/bgcode.parser.js +223 -0
  274. package/dist/utils/parsers/bgcode.parser.js.map +1 -0
  275. package/dist/utils/parsers/gcode.parser.js +254 -0
  276. package/dist/utils/parsers/gcode.parser.js.map +1 -0
  277. package/dist/utils/swagger/decorators.js +39 -0
  278. package/dist/utils/swagger/decorators.js.map +1 -0
  279. package/dist/utils/swagger/generator.js +196 -0
  280. package/dist/utils/swagger/generator.js.map +1 -0
  281. package/dist/utils/swagger/swagger.js +93 -0
  282. package/dist/utils/swagger/swagger.js.map +1 -0
  283. package/package.json +24 -30
  284. package/dist/controllers/custom-gcode.controller.js +0 -150
  285. package/dist/controllers/custom-gcode.controller.js.map +0 -1
  286. package/dist/controllers/print-completion.controller.js +0 -118
  287. package/dist/controllers/print-completion.controller.js.map +0 -1
  288. package/dist/controllers/printer-group.controller.js.map +0 -1
  289. package/dist/entities/custom-gcode.entity.js +0 -49
  290. package/dist/entities/custom-gcode.entity.js.map +0 -1
  291. package/dist/entities/group.entity.js.map +0 -1
  292. package/dist/entities/permission.entity.js +0 -37
  293. package/dist/entities/permission.entity.js.map +0 -1
  294. package/dist/entities/print-completion.entity.js +0 -90
  295. package/dist/entities/print-completion.entity.js.map +0 -1
  296. package/dist/entities/printer-group.entity.js.map +0 -1
  297. package/dist/models/Auth/Permission.js +0 -20
  298. package/dist/models/Auth/Permission.js.map +0 -1
  299. package/dist/models/Auth/RefreshToken.js +0 -41
  300. package/dist/models/Auth/RefreshToken.js.map +0 -1
  301. package/dist/models/Auth/Role.js +0 -20
  302. package/dist/models/Auth/Role.js.map +0 -1
  303. package/dist/models/Auth/User.js +0 -49
  304. package/dist/models/Auth/User.js.map +0 -1
  305. package/dist/models/CameraStream.js +0 -49
  306. package/dist/models/CameraStream.js.map +0 -1
  307. package/dist/models/CustomGcode.js +0 -28
  308. package/dist/models/CustomGcode.js.map +0 -1
  309. package/dist/models/Floor.js +0 -33
  310. package/dist/models/Floor.js.map +0 -1
  311. package/dist/models/FloorPrinter.js +0 -38
  312. package/dist/models/FloorPrinter.js.map +0 -1
  313. package/dist/models/PrintCompletion.js +0 -40
  314. package/dist/models/PrintCompletion.js.map +0 -1
  315. package/dist/models/Printer.js +0 -78
  316. package/dist/models/Printer.js.map +0 -1
  317. package/dist/models/Settings.js +0 -150
  318. package/dist/models/Settings.js.map +0 -1
  319. package/dist/models/index.js +0 -54
  320. package/dist/models/index.js.map +0 -1
  321. package/dist/mongo-migrations/20210713120034-printers-settingsapperance-apikey.js +0 -45
  322. package/dist/mongo-migrations/20210713120034-printers-settingsapperance-apikey.js.map +0 -1
  323. package/dist/mongo-migrations/20210907173950-printers-enabled.js +0 -35
  324. package/dist/mongo-migrations/20210907173950-printers-enabled.js.map +0 -1
  325. package/dist/mongo-migrations/20211029110742-user-password-passwordhash.js +0 -35
  326. package/dist/mongo-migrations/20211029110742-user-password-passwordhash.js.map +0 -1
  327. package/dist/mongo-migrations/20230414141005-floor-remove-groupinfloor.js +0 -60
  328. package/dist/mongo-migrations/20230414141005-floor-remove-groupinfloor.js.map +0 -1
  329. package/dist/mongo-migrations/20230427202911-printer-remove-sortindex.js +0 -30
  330. package/dist/mongo-migrations/20230427202911-printer-remove-sortindex.js.map +0 -1
  331. package/dist/mongo-migrations/20230716065316-user-remove-name.js +0 -30
  332. package/dist/mongo-migrations/20230716065316-user-remove-name.js.map +0 -1
  333. package/dist/mongo-migrations/20231111081809-printer-flatten-name.js +0 -35
  334. package/dist/mongo-migrations/20231111081809-printer-flatten-name.js.map +0 -1
  335. package/dist/mongo-migrations/20231111082521-printer-remove-settingsappearance.js +0 -41
  336. package/dist/mongo-migrations/20231111082521-printer-remove-settingsappearance.js.map +0 -1
  337. package/dist/mongo-migrations/20231202183902-printer-files-simpler.js +0 -41
  338. package/dist/mongo-migrations/20231202183902-printer-files-simpler.js.map +0 -1
  339. package/dist/services/interfaces/custom-gcode.dto.js +0 -18
  340. package/dist/services/interfaces/custom-gcode.dto.js.map +0 -1
  341. package/dist/services/interfaces/custom-gcode.service.interface.js +0 -6
  342. package/dist/services/interfaces/custom-gcode.service.interface.js.map +0 -1
  343. package/dist/services/interfaces/gcode-analysis.dto.js.map +0 -1
  344. package/dist/services/interfaces/group.dto.js.map +0 -1
  345. package/dist/services/interfaces/permission.dto.js +0 -16
  346. package/dist/services/interfaces/permission.dto.js.map +0 -1
  347. package/dist/services/interfaces/print-completion-context.dto.js +0 -6
  348. package/dist/services/interfaces/print-completion-context.dto.js.map +0 -1
  349. package/dist/services/interfaces/print-completion.dto.js +0 -38
  350. package/dist/services/interfaces/print-completion.dto.js.map +0 -1
  351. package/dist/services/interfaces/print-completion.interface.js.map +0 -1
  352. package/dist/services/interfaces/printer-group.dto.js.map +0 -1
  353. package/dist/services/interfaces/printer-group.service.interface.js +0 -6
  354. package/dist/services/mongoose/camera-stream.service.js +0 -67
  355. package/dist/services/mongoose/camera-stream.service.js.map +0 -1
  356. package/dist/services/mongoose/custom-gcode.service.js +0 -50
  357. package/dist/services/mongoose/custom-gcode.service.js.map +0 -1
  358. package/dist/services/mongoose/floor.service.js +0 -139
  359. package/dist/services/mongoose/floor.service.js.map +0 -1
  360. package/dist/services/mongoose/permission.service.js +0 -73
  361. package/dist/services/mongoose/permission.service.js.map +0 -1
  362. package/dist/services/mongoose/print-completion.service.js +0 -134
  363. package/dist/services/mongoose/print-completion.service.js.map +0 -1
  364. package/dist/services/mongoose/print-completion.shared.js +0 -59
  365. package/dist/services/mongoose/print-completion.shared.js.map +0 -1
  366. package/dist/services/mongoose/printer.service.js +0 -216
  367. package/dist/services/mongoose/printer.service.js.map +0 -1
  368. package/dist/services/mongoose/refresh-token.service.js +0 -104
  369. package/dist/services/mongoose/refresh-token.service.js.map +0 -1
  370. package/dist/services/mongoose/role.service.js +0 -132
  371. package/dist/services/mongoose/role.service.js.map +0 -1
  372. package/dist/services/mongoose/settings.service.js +0 -124
  373. package/dist/services/mongoose/settings.service.js.map +0 -1
  374. package/dist/services/mongoose/user.service.js +0 -180
  375. package/dist/services/mongoose/user.service.js.map +0 -1
  376. package/dist/services/orm/custom-gcode.service.js +0 -42
  377. package/dist/services/orm/custom-gcode.service.js.map +0 -1
  378. package/dist/services/orm/print-completion.service.js +0 -87
  379. package/dist/services/orm/print-completion.service.js.map +0 -1
  380. package/dist/services/orm/printer-group.service.js +0 -109
  381. package/dist/services/orm/printer-group.service.js.map +0 -1
  382. package/dist/services/validators/camera-service.validation.js +0 -19
  383. package/dist/services/validators/camera-service.validation.js.map +0 -1
  384. package/dist/services/validators/print-completion-service.validation.js +0 -33
  385. package/dist/services/validators/print-completion-service.validation.js.map +0 -1
  386. package/dist/shared.constants.js +0 -15
  387. package/dist/shared.constants.js.map +0 -1
  388. package/dist/tasks/print-completion.socketio.task.js +0 -91
  389. package/dist/tasks/print-completion.socketio.task.js.map +0 -1
  390. package/dist/tasks/printer-file-clean.task.js +0 -74
  391. package/dist/tasks/printer-file-clean.task.js.map +0 -1
  392. package/migrate-mongo-config.js +0 -45
  393. /package/dist/services/{interfaces → octoprint/dto/files}/gcode-analysis.dto.js +0 -0
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "GCodeParser", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return GCodeParser;
9
+ }
10
+ });
11
+ const _promises = /*#__PURE__*/ _interop_require_wildcard(require("node:fs/promises"));
12
+ const _nodereadline = /*#__PURE__*/ _interop_require_wildcard(require("node:readline"));
13
+ const _nodefs = require("node:fs");
14
+ function _getRequireWildcardCache(nodeInterop) {
15
+ if (typeof WeakMap !== "function") return null;
16
+ var cacheBabelInterop = new WeakMap();
17
+ var cacheNodeInterop = new WeakMap();
18
+ return (_getRequireWildcardCache = function(nodeInterop) {
19
+ return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
20
+ })(nodeInterop);
21
+ }
22
+ function _interop_require_wildcard(obj, nodeInterop) {
23
+ if (!nodeInterop && obj && obj.__esModule) {
24
+ return obj;
25
+ }
26
+ if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
27
+ return {
28
+ default: obj
29
+ };
30
+ }
31
+ var cache = _getRequireWildcardCache(nodeInterop);
32
+ if (cache && cache.has(obj)) {
33
+ return cache.get(obj);
34
+ }
35
+ var newObj = {
36
+ __proto__: null
37
+ };
38
+ var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
39
+ for(var key in obj){
40
+ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
41
+ var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
42
+ if (desc && (desc.get || desc.set)) {
43
+ Object.defineProperty(newObj, key, desc);
44
+ } else {
45
+ newObj[key] = obj[key];
46
+ }
47
+ }
48
+ }
49
+ newObj.default = obj;
50
+ if (cache) {
51
+ cache.set(obj, newObj);
52
+ }
53
+ return newObj;
54
+ }
55
+ class GCodeParser {
56
+ maxHeaderLinesToRead = 500;
57
+ maxFooterLinesToRead = 500;
58
+ async parse(filePath) {
59
+ const stats = await _promises.stat(filePath);
60
+ const fileName = filePath.split(/[/\\]/).pop() || filePath;
61
+ const metadata = await this.extractMetadata(filePath);
62
+ const thumbnails = await this.extractThumbnails(filePath);
63
+ const normalized = {
64
+ fileName,
65
+ fileFormat: "gcode",
66
+ fileSize: stats.size,
67
+ gcodePrintTimeSeconds: this.parseTime(metadata.estimated_printing_time_normal_mode || metadata.estimated_printing_time || metadata.print_time),
68
+ nozzleDiameterMm: this.parseFloat(metadata.nozzle_diameter),
69
+ filamentDiameterMm: this.parseFloat(metadata.filament_diameter),
70
+ filamentDensityGramsCm3: this.parseFloat(metadata.filament_density),
71
+ filamentUsedMm: this.parseFloat(metadata.filament_used_mm),
72
+ filamentUsedCm3: this.parseFloat(metadata.filament_used_cm3),
73
+ filamentUsedGrams: this.parseFloat(metadata.filament_used_g),
74
+ totalFilamentUsedGrams: this.parseFloat(metadata.total_filament_used_g || metadata.filament_used_g),
75
+ layerHeight: this.parseFloat(metadata.layer_height),
76
+ firstLayerHeight: this.parseFloat(metadata.first_layer_height || metadata.initial_layer_height),
77
+ bedTemperature: this.parseFloat(metadata.bed_temperature || metadata.first_layer_bed_temperature),
78
+ nozzleTemperature: this.parseFloat(metadata.temperature || metadata.first_layer_temperature),
79
+ fillDensity: metadata.fill_density || null,
80
+ filamentType: metadata.filament_type || null,
81
+ printerModel: metadata.printer_model || metadata.printer_name || null,
82
+ slicerVersion: metadata.generated_by || metadata.slicer_version || null,
83
+ maxLayerZ: this.parseFloat(metadata.max_layer_z),
84
+ totalLayers: this.parseInt(metadata.total_layers) || this.parseInt(metadata.layer_count),
85
+ generatedBy: metadata.generated_by,
86
+ thumbnails: thumbnails.length > 0 ? thumbnails.map((t)=>({
87
+ width: t.width,
88
+ height: t.height,
89
+ format: t.format,
90
+ dataLength: t.data?.length || 0
91
+ })) : undefined
92
+ };
93
+ return {
94
+ raw: {
95
+ _thumbnails: thumbnails,
96
+ metadata
97
+ },
98
+ normalized
99
+ };
100
+ }
101
+ async extractMetadata(filePath) {
102
+ const metadata = {};
103
+ await this.extractMetadataFromStart(filePath, metadata);
104
+ await this.extractMetadataFromEnd(filePath, metadata);
105
+ return metadata;
106
+ }
107
+ async extractMetadataFromStart(filePath, metadata) {
108
+ let linesRead = 0;
109
+ const fileStream = (0, _nodefs.createReadStream)(filePath);
110
+ const rl = _nodereadline.createInterface({
111
+ input: fileStream,
112
+ crlfDelay: Infinity
113
+ });
114
+ for await (const line of rl){
115
+ if (linesRead >= this.maxHeaderLinesToRead) break;
116
+ linesRead++;
117
+ this.parseMetadataLine(line, metadata);
118
+ }
119
+ rl.close();
120
+ fileStream.close();
121
+ }
122
+ async extractMetadataFromEnd(filePath, metadata) {
123
+ const stats = await _promises.stat(filePath);
124
+ const fileSize = stats.size;
125
+ const estimatedBytes = this.maxFooterLinesToRead * 50;
126
+ const startPosition = Math.max(0, fileSize - estimatedBytes);
127
+ const fileHandle = await _promises.open(filePath, 'r');
128
+ try {
129
+ const buffer = Buffer.alloc(estimatedBytes);
130
+ const { bytesRead } = await fileHandle.read(buffer, 0, estimatedBytes, startPosition);
131
+ const text = buffer.toString('utf8', 0, bytesRead);
132
+ const lines = text.split('\n');
133
+ for (const line of lines){
134
+ this.parseMetadataLine(line, metadata);
135
+ }
136
+ } finally{
137
+ await fileHandle.close();
138
+ }
139
+ }
140
+ parseMetadataLine(line, metadata) {
141
+ if (!line.startsWith(";")) return;
142
+ const generatedByMatch = line.match(/^;\s*generated by\s+([^\s]+)/i);
143
+ if (generatedByMatch && !metadata.generated_by) {
144
+ metadata.generated_by = generatedByMatch[1];
145
+ return;
146
+ }
147
+ const prusaMatch = line.match(/^;\s*([^=]+?)\s*=\s*(.+)$/);
148
+ if (prusaMatch) {
149
+ let key = prusaMatch[1].trim().toLowerCase().replace(/\s+/g, "_");
150
+ let value = prusaMatch[2].trim();
151
+ key = key.replace(/\[([^\]]+)\]/g, (_, unit)=>'_' + unit.replace(/\^/g, ''));
152
+ key = key.replace(/\(([^)]+)\)/g, (_, content)=>'_' + content.replace(/\s+/g, '_'));
153
+ key = key.replace(/_+/g, '_');
154
+ if (!metadata[key]) {
155
+ metadata[key] = value.trim();
156
+ }
157
+ return;
158
+ }
159
+ const curaMatch = line.match(/^;([A-Z_]+):(.+)$/);
160
+ if (curaMatch) {
161
+ const [, key, value] = curaMatch;
162
+ const normalizedKey = key.toLowerCase();
163
+ if (!metadata[normalizedKey]) {
164
+ metadata[normalizedKey] = value.trim();
165
+ }
166
+ return;
167
+ }
168
+ const s3dMatch = line.match(/^;\s*([^:]+?):\s*(.+)$/);
169
+ if (s3dMatch) {
170
+ const [, key, value] = s3dMatch;
171
+ const normalizedKey = key.trim().toLowerCase().replace(/\s+/g, "_");
172
+ if (!metadata[normalizedKey]) {
173
+ metadata[normalizedKey] = value.trim();
174
+ }
175
+ }
176
+ }
177
+ async extractThumbnails(filePath) {
178
+ const thumbnails = [];
179
+ let linesRead = 0;
180
+ let inThumbnail = false;
181
+ let thumbnailData = [];
182
+ let currentWidth = 0;
183
+ let currentHeight = 0;
184
+ let currentFormat = "PNG";
185
+ const fileStream = (0, _nodefs.createReadStream)(filePath);
186
+ const rl = _nodereadline.createInterface({
187
+ input: fileStream,
188
+ crlfDelay: Infinity
189
+ });
190
+ for await (const line of rl){
191
+ if (linesRead >= this.maxHeaderLinesToRead && !inThumbnail) break;
192
+ linesRead++;
193
+ const thumbnailStart = line.match(/;\s*thumbnail begin (\d+)x(\d+)\s*(\w+)?/i);
194
+ if (thumbnailStart) {
195
+ inThumbnail = true;
196
+ currentWidth = parseInt(thumbnailStart[1]);
197
+ currentHeight = parseInt(thumbnailStart[2]);
198
+ const thirdParam = thumbnailStart[3];
199
+ if (thirdParam && /^(PNG|JPG|JPEG|QOI)$/i.test(thirdParam)) {
200
+ currentFormat = thirdParam.toUpperCase();
201
+ } else {
202
+ currentFormat = "PNG";
203
+ }
204
+ thumbnailData = [];
205
+ continue;
206
+ }
207
+ if (inThumbnail) {
208
+ if (line.match(/;\s*thumbnail end/i)) {
209
+ thumbnails.push({
210
+ width: currentWidth,
211
+ height: currentHeight,
212
+ format: currentFormat.toUpperCase(),
213
+ data: thumbnailData.join("")
214
+ });
215
+ inThumbnail = false;
216
+ thumbnailData = [];
217
+ } else if (line.startsWith(";")) {
218
+ const data = line.substring(1).trim();
219
+ if (data) {
220
+ thumbnailData.push(data);
221
+ }
222
+ }
223
+ }
224
+ }
225
+ rl.close();
226
+ fileStream.close();
227
+ return thumbnails;
228
+ }
229
+ parseFloat(value) {
230
+ if (!value) return null;
231
+ const num = parseFloat(value);
232
+ return isNaN(num) ? null : num;
233
+ }
234
+ parseInt(value) {
235
+ if (!value) return null;
236
+ const num = parseInt(value, 10);
237
+ return isNaN(num) ? null : num;
238
+ }
239
+ parseTime(value) {
240
+ if (!value) return null;
241
+ const match = value.match(/(?:(\d+)h)?(?:\s*(\d+)m)?(?:\s*(\d+)s)?/);
242
+ if (match && (match[1] || match[2] || match[3])) {
243
+ const hours = parseInt(match[1] || "0");
244
+ const minutes = parseInt(match[2] || "0");
245
+ const secs = parseInt(match[3] || "0");
246
+ return hours * 3600 + minutes * 60 + secs;
247
+ }
248
+ const seconds = parseFloat(value);
249
+ if (!isNaN(seconds)) return seconds;
250
+ return null;
251
+ }
252
+ }
253
+
254
+ //# sourceMappingURL=gcode.parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/parsers/gcode.parser.ts"],"names":["GCodeParser","maxHeaderLinesToRead","maxFooterLinesToRead","parse","filePath","stats","fs","stat","fileName","split","pop","metadata","extractMetadata","thumbnails","extractThumbnails","normalized","fileFormat","fileSize","size","gcodePrintTimeSeconds","parseTime","estimated_printing_time_normal_mode","estimated_printing_time","print_time","nozzleDiameterMm","parseFloat","nozzle_diameter","filamentDiameterMm","filament_diameter","filamentDensityGramsCm3","filament_density","filamentUsedMm","filament_used_mm","filamentUsedCm3","filament_used_cm3","filamentUsedGrams","filament_used_g","totalFilamentUsedGrams","total_filament_used_g","layerHeight","layer_height","firstLayerHeight","first_layer_height","initial_layer_height","bedTemperature","bed_temperature","first_layer_bed_temperature","nozzleTemperature","temperature","first_layer_temperature","fillDensity","fill_density","filamentType","filament_type","printerModel","printer_model","printer_name","slicerVersion","generated_by","slicer_version","maxLayerZ","max_layer_z","totalLayers","parseInt","total_layers","layer_count","generatedBy","length","map","t","width","height","format","dataLength","data","undefined","raw","_thumbnails","extractMetadataFromStart","extractMetadataFromEnd","linesRead","fileStream","createReadStream","rl","readline","createInterface","input","crlfDelay","Infinity","line","parseMetadataLine","close","estimatedBytes","startPosition","Math","max","fileHandle","open","buffer","Buffer","alloc","bytesRead","read","text","toString","lines","startsWith","generatedByMatch","match","prusaMatch","key","trim","toLowerCase","replace","value","_","unit","content","curaMatch","normalizedKey","s3dMatch","inThumbnail","thumbnailData","currentWidth","currentHeight","currentFormat","thumbnailStart","thirdParam","test","toUpperCase","push","join","substring","num","isNaN","hours","minutes","secs","seconds"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get API_METADATA_KEY () {
13
+ return API_METADATA_KEY;
14
+ },
15
+ get ApiOperation () {
16
+ return ApiOperation;
17
+ },
18
+ get ApiProperty () {
19
+ return ApiProperty;
20
+ }
21
+ });
22
+ require("reflect-metadata");
23
+ const API_METADATA_KEY = "Router Config";
24
+ function ApiProperty(options = {}) {
25
+ return function(target, propertyKey) {
26
+ const metadata = Reflect.getMetadata(API_METADATA_KEY, target.constructor) || {};
27
+ metadata[propertyKey] = options;
28
+ Reflect.defineMetadata(API_METADATA_KEY, metadata, target.constructor);
29
+ };
30
+ }
31
+ function ApiOperation(options = {}) {
32
+ return function(target, propertyKey, descriptor) {
33
+ const metadata = Reflect.getMetadata(API_METADATA_KEY, target.constructor) || {};
34
+ metadata[`${propertyKey}:operation`] = options;
35
+ Reflect.defineMetadata(API_METADATA_KEY, metadata, target.constructor);
36
+ };
37
+ }
38
+
39
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/swagger/decorators.ts"],"names":["API_METADATA_KEY","ApiOperation","ApiProperty","options","target","propertyKey","metadata","Reflect","getMetadata","defineMetadata","descriptor"],"mappings":";;;;;;;;;;;QAGaA;eAAAA;;QAwBGC;eAAAA;;QARAC;eAAAA;;;QAlBT;AAEA,MAAMF,mBAAmB;AAgBzB,SAASE,YAAYC,UAA8B,CAAC,CAAC;IAC1D,OAAO,SAAUC,MAAW,EAAEC,WAAmB;QAC/C,MAAMC,WAAWC,QAAQC,WAAW,CAACR,kBAAkBI,OAAO,WAAW,KAAK,CAAC;QAC/EE,QAAQ,CAACD,YAAY,GAAGF;QACxBI,QAAQE,cAAc,CAACT,kBAAkBM,UAAUF,OAAO,WAAW;IACvE;AACF;AAEO,SAASH,aAAaE,UAA+B,CAAC,CAAC;IAC5D,OAAO,SAAUC,MAAW,EAAEC,WAAmB,EAAEK,UAA8B;QAC/E,MAAMJ,WAAWC,QAAQC,WAAW,CAACR,kBAAkBI,OAAO,WAAW,KAAK,CAAC;QAC/EE,QAAQ,CAAC,GAAGD,YAAY,UAAU,CAAC,CAAC,GAAGF;QACvCI,QAAQE,cAAc,CAACT,kBAAkBM,UAAUF,OAAO,WAAW;IACvE;AACF"}
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "SwaggerGenerator", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return SwaggerGenerator;
9
+ }
10
+ });
11
+ const _decorators = require("./decorators");
12
+ const _awilixexpress = require("awilix-express");
13
+ class SwaggerGenerator {
14
+ logger;
15
+ constructor(logger){
16
+ this.logger = logger;
17
+ }
18
+ openApiDoc = {
19
+ openapi: "3.1.0",
20
+ info: {
21
+ title: "FDM Monster API",
22
+ version: process.env.npm_package_version || "2.0.0",
23
+ description: "FDM Monster is a bulk OctoPrint, Klipper, PrusaLink and BambuLab manager to set up, configure and monitor 3D printers. Our aim is to provide neat overview over your farm.",
24
+ license: {
25
+ name: "AGPL-3.0-or-later",
26
+ url: "https://www.gnu.org/licenses/agpl-3.0.en.html"
27
+ },
28
+ contact: {
29
+ name: "FDM Monster GitHub",
30
+ url: "https://github.com/fdm-monster/fdm-monster"
31
+ }
32
+ },
33
+ servers: [
34
+ {
35
+ url: "/api",
36
+ description: "API Server"
37
+ }
38
+ ],
39
+ paths: {},
40
+ components: {
41
+ schemas: {},
42
+ securitySchemes: {
43
+ bearerAuth: {
44
+ type: "http",
45
+ scheme: "bearer",
46
+ bearerFormat: "JWT",
47
+ description: "Enter your JWT token"
48
+ }
49
+ }
50
+ },
51
+ security: [
52
+ {
53
+ bearerAuth: []
54
+ }
55
+ ]
56
+ };
57
+ async generate() {
58
+ try {
59
+ const routePath = "../../controllers";
60
+ const discoveredControllers = (0, _awilixexpress.findControllers)(`${routePath}/*.controller.js`, {
61
+ cwd: __dirname,
62
+ ignore: [
63
+ "**/*.map",
64
+ "**/*.d.ts"
65
+ ],
66
+ absolute: true
67
+ });
68
+ for (const registration of discoveredControllers){
69
+ await this.processController(registration);
70
+ }
71
+ this.logger.log(`Generated OpenAPI spec with ${Object.keys(this.openApiDoc.paths || {}).length} paths`);
72
+ } catch (error) {
73
+ this.logger.error("Failed to generate swagger specification", error);
74
+ }
75
+ return this.openApiDoc;
76
+ }
77
+ async processController(prototype) {
78
+ for (const [methodName, methodConfig] of prototype.state.methods){
79
+ if (methodConfig.paths.length > 0) {
80
+ await this.processMethod(prototype, prototype.state.root, methodName, methodConfig);
81
+ }
82
+ }
83
+ }
84
+ async processMethod(controller, root, methodName, methodConfig) {
85
+ if (!methodName) return;
86
+ const method = methodName.toString();
87
+ const name = method.toLowerCase();
88
+ for (let methodPath of methodConfig.paths){
89
+ methodPath = root.paths[0] + methodPath;
90
+ methodPath = methodPath.replaceAll(/:([a-zA-Z0-9_]+)/g, "{$1}");
91
+ const metadata = Reflect.getMetadata(_decorators.API_METADATA_KEY, controller.target);
92
+ for (const verb of methodConfig.verbs){
93
+ const key = `${name}:operation`;
94
+ const description = metadata?.hasOwnProperty(key) ? metadata[key] : null;
95
+ const httpMethod = verb.toLowerCase();
96
+ const operationObject = {
97
+ tags: [
98
+ controller.target.name
99
+ ],
100
+ summary: description?.summary ?? method,
101
+ description: description?.description ?? "",
102
+ responses: description?.responses ?? {
103
+ "200": {
104
+ description: "Successful response"
105
+ }
106
+ }
107
+ };
108
+ operationObject.parameters = this.extractPathParameters(methodPath);
109
+ const paramTypes = Reflect.getMetadata("design:paramtypes", controller.target, name);
110
+ const returnType = Reflect.getMetadata("design:returntype", controller.target, name);
111
+ if (paramTypes) {
112
+ const additionalParams = this.processParameterTypes(paramTypes);
113
+ operationObject.parameters = [
114
+ ...operationObject.parameters,
115
+ ...additionalParams
116
+ ];
117
+ }
118
+ if (returnType && operationObject.responses?.["200"]) {
119
+ operationObject.responses["200"].content = {
120
+ "application/json": {
121
+ schema: this.processReturnType(returnType)
122
+ }
123
+ };
124
+ }
125
+ const operation = {
126
+ [httpMethod]: operationObject
127
+ };
128
+ this.openApiDoc.paths ??= {};
129
+ this.openApiDoc.paths[methodPath] = {
130
+ ...this.openApiDoc.paths[methodPath] || {},
131
+ ...operation
132
+ };
133
+ }
134
+ }
135
+ }
136
+ extractPathParameters(path) {
137
+ const paramRegex = /\{([a-zA-Z0-9_]+)\}/g;
138
+ const params = [];
139
+ let match;
140
+ while((match = paramRegex.exec(path)) !== null){
141
+ const paramName = match[1];
142
+ params.push({
143
+ name: paramName,
144
+ in: "path",
145
+ required: true,
146
+ schema: {
147
+ type: "string"
148
+ },
149
+ description: `The ${paramName} parameter`
150
+ });
151
+ }
152
+ return params;
153
+ }
154
+ processParameterTypes(types) {
155
+ return types.map((type)=>this.createParameterDefinition(type));
156
+ }
157
+ processReturnType(type) {
158
+ return this.createSchemaDefinition(type);
159
+ }
160
+ createSchemaDefinition(type) {
161
+ return {
162
+ type: "object",
163
+ properties: this.getTypeProperties(type)
164
+ };
165
+ }
166
+ createParameterDefinition(type) {
167
+ return {
168
+ in: "body",
169
+ schema: this.createSchemaDefinition(type)
170
+ };
171
+ }
172
+ getTypeProperties(type) {
173
+ const properties = {};
174
+ const metadata = Reflect.getMetadata(_decorators.API_METADATA_KEY, type) || {};
175
+ Object.keys(metadata).forEach((key)=>{
176
+ properties[key] = {
177
+ type: this.getPropertyType(metadata[key].type),
178
+ description: metadata[key].description,
179
+ example: metadata[key].example
180
+ };
181
+ });
182
+ return properties;
183
+ }
184
+ getPropertyType(type) {
185
+ const typeMap = {
186
+ String: "string",
187
+ Number: "number",
188
+ Boolean: "boolean",
189
+ Object: "object",
190
+ Array: "array"
191
+ };
192
+ return typeMap[type?.name] || "string";
193
+ }
194
+ }
195
+
196
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/swagger/generator.ts"],"names":["SwaggerGenerator","logger","openApiDoc","openapi","info","title","version","process","env","npm_package_version","description","license","name","url","contact","servers","paths","components","schemas","securitySchemes","bearerAuth","type","scheme","bearerFormat","security","generate","routePath","discoveredControllers","findControllers","cwd","__dirname","ignore","absolute","registration","processController","log","Object","keys","length","error","prototype","methodName","methodConfig","state","methods","processMethod","root","controller","method","toString","toLowerCase","methodPath","replaceAll","metadata","Reflect","getMetadata","API_METADATA_KEY","target","verb","verbs","key","hasOwnProperty","httpMethod","operationObject","tags","summary","responses","parameters","extractPathParameters","paramTypes","returnType","additionalParams","processParameterTypes","content","schema","processReturnType","operation","path","paramRegex","params","match","exec","paramName","push","in","required","types","map","createParameterDefinition","createSchemaDefinition","properties","getTypeProperties","forEach","getPropertyType","example","typeMap","String","Number","Boolean","Array"],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "setupSwagger", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return setupSwagger;
9
+ }
10
+ });
11
+ const _generator = require("./generator");
12
+ const _express = require("express");
13
+ const _nodepath = require("node:path");
14
+ const _serverconstants = require("../../server.constants");
15
+ const _fsutils = require("../fs.utils");
16
+ const _promises = require("node:fs/promises");
17
+ function getSwaggerUiDistPath() {
18
+ try {
19
+ return (0, _nodepath.dirname)(require.resolve("swagger-ui-dist/package.json"));
20
+ } catch {
21
+ return (0, _nodepath.join)(process.cwd(), "node_modules", "swagger-ui-dist");
22
+ }
23
+ }
24
+ function generateSwaggerHTML() {
25
+ return `
26
+ <!DOCTYPE html>
27
+ <html lang="en">
28
+ <head>
29
+ <meta charset="UTF-8">
30
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
31
+ <title>FDM Monster API Documentation</title>
32
+ <link rel="stylesheet" href="/api-docs/static/swagger-ui.css" />
33
+ <style>
34
+ html { box-sizing: border-box; overflow: -moz-scrollbars-vertical; overflow-y: scroll; }
35
+ *, *:before, *:after { box-sizing: inherit; }
36
+ body { margin: 0; padding: 0; }
37
+ </style>
38
+ </head>
39
+ <body>
40
+ <div id="swagger-ui"></div>
41
+ <script src="/api-docs/static/swagger-ui-bundle.js"></script>
42
+ <script src="/api-docs/static/swagger-ui-standalone-preset.js"></script>
43
+ <script>
44
+ window.onload = function() {
45
+ window.ui = SwaggerUIBundle({
46
+ url: '/api-docs/swagger.json',
47
+ dom_id: '#swagger-ui',
48
+ deepLinking: true,
49
+ presets: [
50
+ SwaggerUIBundle.presets.apis,
51
+ SwaggerUIStandalonePreset
52
+ ],
53
+ plugins: [
54
+ SwaggerUIBundle.plugins.DownloadUrl
55
+ ],
56
+ layout: "StandaloneLayout"
57
+ });
58
+ };
59
+ </script>
60
+ </body>
61
+ </html>
62
+ `.trim();
63
+ }
64
+ async function setupSwagger(app, logger) {
65
+ const generator = new _generator.SwaggerGenerator(logger);
66
+ const specification = await generator.generate();
67
+ const generateJsonFile = process.env[_serverconstants.AppConstants.GENERATE_SWAGGER_JSON] === "true";
68
+ if (generateJsonFile) {
69
+ try {
70
+ const mediaPath = (0, _nodepath.join)((0, _fsutils.superRootPath)(), _serverconstants.AppConstants.defaultFileStorageFolder);
71
+ (0, _fsutils.ensureDirExists)(mediaPath);
72
+ const swaggerJsonPath = (0, _nodepath.join)(mediaPath, "swagger.json");
73
+ const jsonContent = JSON.stringify(specification, null, 2);
74
+ await (0, _promises.writeFile)(swaggerJsonPath, jsonContent, "utf-8");
75
+ logger.log(`Swagger JSON file generated at: ${swaggerJsonPath}`);
76
+ } catch (error) {
77
+ logger.error("Failed to generate swagger.json file", error);
78
+ }
79
+ }
80
+ const swaggerUiPath = getSwaggerUiDistPath();
81
+ app.use("/api-docs/static", (0, _express.static)(swaggerUiPath));
82
+ app.get("/api-docs/swagger.json", (_req, res)=>{
83
+ res.setHeader("Content-Type", "application/json");
84
+ res.send(specification);
85
+ });
86
+ app.get("/api-docs", (_req, res)=>{
87
+ res.setHeader("Content-Type", "text/html");
88
+ res.send(generateSwaggerHTML());
89
+ });
90
+ return specification;
91
+ }
92
+
93
+ //# sourceMappingURL=swagger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/swagger/swagger.ts"],"names":["setupSwagger","getSwaggerUiDistPath","dirname","require","resolve","join","process","cwd","generateSwaggerHTML","trim","app","logger","generator","SwaggerGenerator","specification","generate","generateJsonFile","env","AppConstants","GENERATE_SWAGGER_JSON","mediaPath","superRootPath","defaultFileStorageFolder","ensureDirExists","swaggerJsonPath","jsonContent","JSON","stringify","writeFile","log","error","swaggerUiPath","use","expressStatic","get","_req","res","setHeader","send"],"mappings":";;;;+BA6DsBA;;;eAAAA;;;2BA7DW;yBACoB;0BACvB;iCACD;yBACkB;0BAErB;AAG1B,SAASC;IACP,IAAI;QAEF,OAAOC,IAAAA,iBAAO,EAACC,QAAQC,OAAO,CAAC;IACjC,EAAE,OAAM;QAEN,OAAOC,IAAAA,cAAI,EAACC,QAAQC,GAAG,IAAI,gBAAgB;IAC7C;AACF;AAGA,SAASC;IACP,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCR,CAAC,CAACC,IAAI;AACR;AAEO,eAAeT,aAAaU,GAAgB,EAAEC,MAAqB;IACxE,MAAMC,YAAY,IAAIC,2BAAgB,CAACF;IACvC,MAAMG,gBAAgB,MAAMF,UAAUG,QAAQ;IAG9C,MAAMC,mBAAmBV,QAAQW,GAAG,CAACC,6BAAY,CAACC,qBAAqB,CAAC,KAAK;IAE7E,IAAIH,kBAAkB;QACpB,IAAI;YACF,MAAMI,YAAYf,IAAAA,cAAI,EAACgB,IAAAA,sBAAa,KAAIH,6BAAY,CAACI,wBAAwB;YAC7EC,IAAAA,wBAAe,EAACH;YAEhB,MAAMI,kBAAkBnB,IAAAA,cAAI,EAACe,WAAW;YACxC,MAAMK,cAAcC,KAAKC,SAAS,CAACb,eAAe,MAAM;YAExD,MAAMc,IAAAA,mBAAS,EAACJ,iBAAiBC,aAAa;YAC9Cd,OAAOkB,GAAG,CAAC,CAAC,gCAAgC,EAAEL,iBAAiB;QACjE,EAAE,OAAOM,OAAO;YACdnB,OAAOmB,KAAK,CAAC,wCAAwCA;QACvD;IACF;IAGA,MAAMC,gBAAgB9B;IACtBS,IAAIsB,GAAG,CAAC,oBAAoBC,IAAAA,eAAa,EAACF;IAG1CrB,IAAIwB,GAAG,CAAC,0BAA0B,CAACC,MAAMC;QACvCA,IAAIC,SAAS,CAAC,gBAAgB;QAC9BD,IAAIE,IAAI,CAACxB;IACX;IAGAJ,IAAIwB,GAAG,CAAC,aAAa,CAACC,MAAMC;QAC1BA,IAAIC,SAAS,CAAC,gBAAgB;QAC9BD,IAAIE,IAAI,CAAC9B;IACX;IAEA,OAAOM;AACT"}