@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
@@ -13,7 +13,7 @@ const _yamlservicevalidation = require("../validators/yaml-service.validation");
13
13
  const _jsyaml = require("js-yaml");
14
14
  const _printerapiinterface = require("../printer-api.interface");
15
15
  class YamlService {
16
- printerGroupService;
16
+ printerTagService;
17
17
  printerService;
18
18
  printerCache;
19
19
  floorStore;
@@ -21,10 +21,9 @@ class YamlService {
21
21
  userService;
22
22
  roleService;
23
23
  settingsStore;
24
- isTypeormMode;
25
24
  logger;
26
- constructor(loggerFactory, printerGroupService, printerService, printerCache, floorStore, floorService, userService, roleService, settingsStore, isTypeormMode){
27
- this.printerGroupService = printerGroupService;
25
+ constructor(loggerFactory, printerTagService, printerService, printerCache, floorStore, floorService, userService, roleService, settingsStore){
26
+ this.printerTagService = printerTagService;
28
27
  this.printerService = printerService;
29
28
  this.printerCache = printerCache;
30
29
  this.floorStore = floorStore;
@@ -32,50 +31,26 @@ class YamlService {
32
31
  this.userService = userService;
33
32
  this.roleService = roleService;
34
33
  this.settingsStore = settingsStore;
35
- this.isTypeormMode = isTypeormMode;
36
34
  this.logger = loggerFactory(YamlService.name);
37
35
  }
38
36
  async importYaml(yamlBuffer) {
39
37
  const importSpec = await (0, _jsyaml.load)(yamlBuffer);
40
38
  const databaseTypeSqlite = importSpec.databaseType === "sqlite";
41
39
  const { exportPrinters, exportFloorGrid, exportSettings, exportUsers } = importSpec.config;
42
- const wizardCompleted = this.settingsStore.getWizardSettings()?.wizardCompleted;
40
+ this.normalizeYamlData(importSpec, databaseTypeSqlite);
41
+ const importData = await (0, _validators.validateInput)(importSpec, _yamlservicevalidation.importPrintersFloorsYamlSchema);
43
42
  const hasSystemData = exportSettings || exportUsers;
44
- if (hasSystemData && wizardCompleted) {
43
+ if (hasSystemData) {
45
44
  await this.validateSystemTablesEmpty(importSpec);
46
- }
47
- for (const printer of importSpec.printers){
48
- if (!printer.name && printer.printerName) {
49
- printer.name = printer.printerName;
50
- delete printer.printerName;
45
+ if (exportSettings && importSpec.settings) {
46
+ this.logger.log("Importing settings");
47
+ await this.importSettings(importSpec.settings);
51
48
  }
52
- if (printer.settingsAppearance?.name) {
53
- printer.name = printer.settingsAppearance?.name;
54
- delete printer.settingsAppearance?.name;
55
- }
56
- if (databaseTypeSqlite && typeof printer.id === "string") {
57
- printer.id = Number.parseInt(printer.id);
58
- }
59
- if (![
60
- _printerapiinterface.OctoprintType,
61
- _printerapiinterface.MoonrakerType
62
- ].includes(printer.printerType)) {
63
- printer.printerType = _printerapiinterface.OctoprintType;
49
+ if (exportUsers && importSpec.users && importSpec.users.length > 0) {
50
+ this.logger.log(`Importing users (${importSpec.users.length} users)`);
51
+ await this.importUsers(importSpec.users, databaseTypeSqlite);
64
52
  }
65
53
  }
66
- if (databaseTypeSqlite) {
67
- for (const floor of importSpec.floors){
68
- if (typeof floor.id === "string") {
69
- floor.id = Number.parseInt(floor.id);
70
- }
71
- for (const printer of floor.printers){
72
- if (typeof printer.printerId === "string") {
73
- printer.printerId = parseInt(printer.printerId);
74
- }
75
- }
76
- }
77
- }
78
- const importData = await (0, _validators.validateInput)(importSpec, _yamlservicevalidation.importPrintersFloorsYamlSchema);
79
54
  if (exportFloorGrid && importData.floors?.length) {
80
55
  for (const floor of importData.floors){
81
56
  await (0, _validators.validateInput)(floor, _yamlservicevalidation.importPrinterPositionsSchema);
@@ -85,123 +60,148 @@ class YamlService {
85
60
  const { updateByPropertyPrinters, insertPrinters } = await this.analysePrintersUpsert(importData.printers ?? [], importData.config.printerComparisonStrategiesByPriority);
86
61
  this.logger.log("Analysing floors for import");
87
62
  const { updateByPropertyFloors, insertFloors } = await this.analyseFloorsUpsert(importData.floors ?? [], importData.config.floorComparisonStrategiesByPriority);
88
- this.logger.log("Analysing groups for import");
89
- const { updateByNameGroups, insertGroups } = await this.analyseUpsertGroups(importData.groups ?? []);
63
+ this.logger.log("Analysing tags for import");
64
+ const { updateByNameTags, insertTags } = await this.analyseUpsertTags(importData.tags ?? []);
90
65
  this.logger.log(`Performing pure insert printers (${insertPrinters.length} printers)`);
91
66
  const printerIdMap = {};
92
67
  for (const newPrinter of insertPrinters){
93
- const state = await this.printerService.create({
94
- ...newPrinter
95
- });
96
- if (!newPrinter.id) {
97
- throw new Error(`Saved ID was empty ${JSON.stringify(newPrinter)}`);
68
+ try {
69
+ const state = await this.printerService.create({
70
+ ...newPrinter
71
+ });
72
+ if (!newPrinter.id) {
73
+ throw new Error(`Saved ID was empty ${JSON.stringify(newPrinter)}`);
74
+ }
75
+ printerIdMap[newPrinter.id] = state.id;
76
+ } catch (error) {
77
+ this.logger.error(`Failed to create printer ${newPrinter.name}:`, error);
98
78
  }
99
- printerIdMap[newPrinter.id] = state.id;
100
79
  }
101
80
  this.logger.log(`Performing update import printers (${updateByPropertyPrinters.length} printers)`);
102
81
  for (const updatePrinterSpec of updateByPropertyPrinters){
103
- const updateId = updatePrinterSpec.printerId;
104
- const updatedPrinter = updatePrinterSpec.value;
105
- if (typeof updateId === "string" && this.isTypeormMode) {
106
- throw new Error("Cannot update a printer by string id in SQLite mode");
107
- } else if (typeof updateId === "number" && !this.isTypeormMode) {
108
- throw new Error("Cannot update a printer by number id in MongoDB mode");
109
- }
110
- const originalPrinterId = updatedPrinter.id;
111
- delete updatePrinterSpec.value.id;
112
- updatedPrinter.id = updateId;
113
- const state = await this.printerService.update(updateId, updatedPrinter);
114
- if (!updatePrinterSpec.printerId) {
115
- throw new Error("Saved ID was empty");
82
+ try {
83
+ const updateId = updatePrinterSpec.printerId;
84
+ const updatedPrinter = updatePrinterSpec.value;
85
+ if (typeof updateId === "string") {
86
+ throw new Error("Cannot update a printer by string id in sqlite mode");
87
+ }
88
+ const originalPrinterId = updatedPrinter.id;
89
+ delete updatePrinterSpec.value.id;
90
+ updatedPrinter.id = updateId;
91
+ const state = await this.printerService.update(updateId, updatedPrinter);
92
+ if (!updatePrinterSpec.printerId) {
93
+ throw new Error("Saved ID was empty");
94
+ }
95
+ printerIdMap[originalPrinterId] = state.id;
96
+ } catch (error) {
97
+ this.logger.error(`Failed to update printer ${updatePrinterSpec.value.name}:`, error);
116
98
  }
117
- printerIdMap[originalPrinterId] = state.id;
118
99
  }
119
100
  this.logger.log(`Performing pure create floors (${insertFloors.length} floors)`);
120
101
  const floorIdMap = {};
121
102
  for (const newFloor of insertFloors){
122
- const originalFloorId = newFloor.id;
123
- delete newFloor.id;
124
- const knownPrinterPositions = [];
125
- if (exportFloorGrid && exportPrinters) {
126
- for (const floorPosition of newFloor.printers){
127
- const knownPrinterId = printerIdMap[floorPosition.printerId];
128
- if (!knownPrinterId) {
129
- continue;
103
+ try {
104
+ const originalFloorId = newFloor.id;
105
+ delete newFloor.id;
106
+ const knownPrinterPositions = [];
107
+ if (exportFloorGrid && exportPrinters) {
108
+ for (const floorPosition of newFloor.printers){
109
+ const knownPrinterId = printerIdMap[floorPosition.printerId];
110
+ if (!knownPrinterId) {
111
+ continue;
112
+ }
113
+ delete floorPosition.id;
114
+ delete floorPosition.floorId;
115
+ floorPosition.printerId = knownPrinterId;
116
+ knownPrinterPositions.push(floorPosition);
130
117
  }
131
- delete floorPosition.id;
132
- delete floorPosition.floorId;
133
- floorPosition.printerId = knownPrinterId;
134
- knownPrinterPositions.push(floorPosition);
118
+ newFloor.printers = knownPrinterPositions;
135
119
  }
136
- newFloor.printers = knownPrinterPositions;
120
+ const createdFloor = await this.floorStore.create({
121
+ ...newFloor
122
+ });
123
+ floorIdMap[originalFloorId] = createdFloor.id;
124
+ } catch (error) {
125
+ this.logger.error(`Failed to create floor ${newFloor.name}:`, error);
137
126
  }
138
- const createdFloor = await this.floorStore.create({
139
- ...newFloor
140
- });
141
- floorIdMap[originalFloorId] = createdFloor.id;
142
127
  }
143
128
  this.logger.log(`Performing update of floors (${updateByPropertyFloors.length} floors)`);
144
129
  for (const updateFloorSpec of updateByPropertyFloors){
145
- const updateId = updateFloorSpec.floorId;
146
- if (typeof updateId === "string" && this.isTypeormMode) {
147
- throw new Error("Cannot update a floor by string id in SQLite mode");
148
- } else if (typeof updateId === "number" && !this.isTypeormMode) {
149
- throw new Error("Cannot update a floor by number id in MongoDB mode");
150
- }
151
- const updatedFloor = updateFloorSpec.value;
152
- const originalFloorId = updatedFloor.id;
153
- delete updatedFloor.id;
154
- const knownPrinters = [];
155
- if (exportFloorGrid && exportPrinters) {
156
- for (const floorPosition of updatedFloor?.printers){
157
- const knownPrinterId = printerIdMap[floorPosition.printerId];
158
- if (!knownPrinterId) {
159
- continue;
130
+ try {
131
+ const updateId = updateFloorSpec.floorId;
132
+ if (typeof updateId === "string") {
133
+ throw new Error("Cannot update a floor by string id in sqlite mode");
134
+ }
135
+ const updatedFloor = updateFloorSpec.value;
136
+ const originalFloorId = updatedFloor.id;
137
+ delete updatedFloor.id;
138
+ const knownPrinters = [];
139
+ if (exportFloorGrid && exportPrinters) {
140
+ for (const floorPosition of updatedFloor?.printers){
141
+ const knownPrinterId = printerIdMap[floorPosition.printerId];
142
+ if (!knownPrinterId) {
143
+ continue;
144
+ }
145
+ delete floorPosition.id;
146
+ delete floorPosition.floorId;
147
+ floorPosition.printerId = knownPrinterId;
148
+ floorPosition.floorId = updateId;
149
+ knownPrinters.push(floorPosition);
160
150
  }
161
- delete floorPosition.id;
162
- delete floorPosition.floorId;
163
- floorPosition.printerId = knownPrinterId;
164
- floorPosition.floorId = updateId;
165
- knownPrinters.push(floorPosition);
151
+ updatedFloor.id = updateId;
152
+ updatedFloor.printers = knownPrinters;
166
153
  }
167
- updatedFloor.id = updateId;
168
- updatedFloor.printers = knownPrinters;
154
+ const newFloor = await this.floorStore.update(updateId, updatedFloor);
155
+ floorIdMap[originalFloorId] = newFloor.id;
156
+ } catch (error) {
157
+ this.logger.error(`Failed to update floor ${updateFloorSpec.value.name}:`, error);
169
158
  }
170
- const newFloor = await this.floorStore.update(updateId, updatedFloor);
171
- floorIdMap[originalFloorId] = newFloor.id;
172
159
  }
173
160
  await this.floorStore.loadStore();
174
- this.logger.log(`Performing pure create groups (${insertGroups.length} groups)`);
175
- for (const group of insertGroups){
176
- const createdGroup = await this.printerGroupService.createGroup({
177
- name: group.name
178
- });
179
- for (const printer of group.printers){
180
- const knownPrinterId = printerIdMap[printer.printerId];
181
- if (!knownPrinterId) continue;
182
- await this.printerGroupService.addPrinterToGroup(createdGroup.id, knownPrinterId);
161
+ this.logger.log(`Performing pure create tags (${insertTags.length} tags)`);
162
+ for (const tag of insertTags){
163
+ try {
164
+ const createdTag = await this.printerTagService.createTag({
165
+ name: tag.name,
166
+ color: tag.color
167
+ });
168
+ for (const printer of tag.printers){
169
+ const knownPrinterId = printerIdMap[printer.printerId];
170
+ if (!knownPrinterId) continue;
171
+ try {
172
+ await this.printerTagService.addPrinterToTag(createdTag.id, knownPrinterId);
173
+ } catch (error) {
174
+ this.logger.error(`Failed to add printer ${knownPrinterId} to tag ${tag.name}:`, error);
175
+ }
176
+ }
177
+ } catch (error) {
178
+ this.logger.error(`Failed to create tag ${tag.name}:`, error);
183
179
  }
184
180
  }
185
- this.logger.log(`Performing update of grouped printer links (${updateByNameGroups.length} groups)`);
186
- for (const updateGroupSpec of updateByNameGroups){
187
- const existingGroup = await this.printerGroupService.getGroupWithPrinters(updateGroupSpec.groupId);
188
- const existingPrinterIds = existingGroup.printers.map((p)=>p.printerId);
189
- const wantedTargetPrinterIds = updateGroupSpec.value.printers.filter((p)=>!!printerIdMap[p.printerId]).map((p)=>printerIdMap[p.printerId]);
190
- for (const unwantedId of existingPrinterIds.filter((eid)=>!wantedTargetPrinterIds.includes(eid))){
191
- await this.printerGroupService.removePrinterFromGroup(existingGroup.id, unwantedId);
192
- }
193
- for (const nonExistingNewId of wantedTargetPrinterIds.filter((eid)=>!existingPrinterIds.includes(eid))){
194
- await this.printerGroupService.addPrinterToGroup(existingGroup.id, nonExistingNewId);
181
+ this.logger.log(`Performing update of tag printer links (${updateByNameTags.length} tags)`);
182
+ for (const updateTagSpec of updateByNameTags){
183
+ try {
184
+ const existingTag = await this.printerTagService.getPrintersByTag(updateTagSpec.tagId);
185
+ const existingPrinterIds = existingTag.printers.map((p)=>p.printerId);
186
+ const wantedTargetPrinterIds = updateTagSpec.value.printers.filter((p)=>!!printerIdMap[p.printerId]).map((p)=>printerIdMap[p.printerId]);
187
+ for (const unwantedId of existingPrinterIds.filter((eid)=>!wantedTargetPrinterIds.includes(eid))){
188
+ try {
189
+ await this.printerTagService.removePrinterFromTag(existingTag.id, unwantedId);
190
+ } catch (error) {
191
+ this.logger.error(`Failed to remove printer ${unwantedId} from tag ${existingTag.name}:`, error);
192
+ }
193
+ }
194
+ for (const nonExistingNewId of wantedTargetPrinterIds.filter((eid)=>!existingPrinterIds.includes(eid))){
195
+ try {
196
+ await this.printerTagService.addPrinterToTag(existingTag.id, nonExistingNewId);
197
+ } catch (error) {
198
+ this.logger.error(`Failed to add printer ${nonExistingNewId} to tag ${existingTag.name}:`, error);
199
+ }
200
+ }
201
+ } catch (error) {
202
+ this.logger.error(`Failed to update tag ${updateTagSpec.value.name}:`, error);
195
203
  }
196
204
  }
197
- if (exportSettings && importSpec.settings) {
198
- this.logger.log("Importing settings");
199
- await this.importSettings(importSpec.settings);
200
- }
201
- if (exportUsers && importSpec.users && importSpec.users.length > 0) {
202
- this.logger.log(`Importing users (${importSpec.users.length} users)`);
203
- await this.importUsers(importSpec.users, databaseTypeSqlite);
204
- }
205
205
  return {
206
206
  updateByPropertyPrinters,
207
207
  updateByPropertyFloors,
@@ -221,14 +221,12 @@ class YamlService {
221
221
  if (settings.frontend) {
222
222
  await this.settingsStore.updateFrontendSettings(settings.frontend);
223
223
  }
224
- if (settings.printerFileClean) {
225
- await this.settingsStore.updateFileCleanSettings(settings.printerFileClean);
226
- }
227
224
  if (settings.wizard?.wizardCompleted) {
228
225
  const importedWizardVersion = settings.wizard.wizardVersion;
229
226
  this.logger.log(`Marking wizard as completed with version: ${importedWizardVersion}`);
230
227
  await this.settingsStore.setWizardCompleted(importedWizardVersion);
231
228
  }
229
+ await this.settingsStore.loadSettings();
232
230
  this.logger.log("Settings imported successfully");
233
231
  }
234
232
  async importUsers(users, databaseTypeSqlite) {
@@ -237,17 +235,11 @@ class YamlService {
237
235
  if (databaseTypeSqlite && typeof user.id === "string") {
238
236
  user.id = Number.parseInt(user.id);
239
237
  }
240
- let roleIds = [];
241
- if (user.roles && user.roles.length > 0) {
242
- roleIds = user.roles.map((roleNameOrId)=>{
243
- const role = allRoles.find((r)=>r.name === roleNameOrId);
244
- return role?.id;
245
- }).filter((id)=>id !== undefined);
246
- }
238
+ const roleNames = (user.roles ?? []).filter((roleName)=>allRoles.some((r)=>r.name === roleName));
247
239
  await this.userService.register({
248
240
  username: user.username,
249
241
  password: "temporary-password-to-be-replaced",
250
- roles: roleIds,
242
+ roles: roleNames,
251
243
  isRootUser: user.isRootUser ?? false,
252
244
  isDemoUser: user.isDemoUser ?? false,
253
245
  isVerified: user.isVerified ?? false,
@@ -259,6 +251,10 @@ class YamlService {
259
251
  }
260
252
  async validateSystemTablesEmpty(importSpec) {
261
253
  const errors = [];
254
+ const wizardCompleted = this.settingsStore.getWizardSettings()?.wizardCompleted;
255
+ if (!wizardCompleted) {
256
+ return;
257
+ }
262
258
  if (importSpec.settings && importSpec.config.exportSettings) {
263
259
  const existingSettings = this.settingsStore.getSettings();
264
260
  if (existingSettings && Object.keys(existingSettings).length > 0) {
@@ -296,7 +292,7 @@ class YamlService {
296
292
  }
297
293
  updateByPropertyPrinters.push({
298
294
  strategy: "name",
299
- printerId: this.isTypeormMode ? parseInt(ids[foundIndex]) : ids[foundIndex],
295
+ printerId: Number.parseInt(ids[foundIndex]),
300
296
  value: printer
301
297
  });
302
298
  break;
@@ -310,7 +306,7 @@ class YamlService {
310
306
  }
311
307
  updateByPropertyPrinters.push({
312
308
  strategy: "url",
313
- printerId: this.isTypeormMode ? parseInt(ids[foundIndex]) : ids[foundIndex],
309
+ printerId: Number.parseInt(ids[foundIndex]),
314
310
  value: printer
315
311
  });
316
312
  break;
@@ -332,7 +328,7 @@ class YamlService {
332
328
  async analyseFloorsUpsert(upsertFloors, comparisonStrategy) {
333
329
  const existingFloors = await this.floorService.list();
334
330
  const names = existingFloors.map((p)=>p.name.toLowerCase());
335
- const floorLevels = existingFloors.map((p)=>p.floor);
331
+ const floorLevels = existingFloors.map((p)=>p.order);
336
332
  const ids = existingFloors.map((p)=>p.id.toString());
337
333
  const insertFloors = [];
338
334
  const updateByPropertyFloors = [];
@@ -350,13 +346,13 @@ class YamlService {
350
346
  }
351
347
  updateByPropertyFloors.push({
352
348
  strategy: "name",
353
- floorId: this.isTypeormMode ? parseInt(ids[foundIndex]) : ids[foundIndex],
349
+ floorId: Number.parseInt(ids[foundIndex]),
354
350
  value: floor
355
351
  });
356
352
  break;
357
353
  }
358
354
  } else if (strategy === "floor") {
359
- const comparedProperty = floor.floor;
355
+ const comparedProperty = floor.order;
360
356
  const foundIndex = floorLevels.findIndex((n)=>n === comparedProperty);
361
357
  if (foundIndex !== -1) {
362
358
  if (!ids[foundIndex]) {
@@ -364,7 +360,7 @@ class YamlService {
364
360
  }
365
361
  updateByPropertyFloors.push({
366
362
  strategy: "floor",
367
- floorId: this.isTypeormMode ? Number.parseInt(ids[foundIndex]) : ids[foundIndex],
363
+ floorId: Number.parseInt(ids[foundIndex]),
368
364
  value: floor
369
365
  });
370
366
  break;
@@ -380,54 +376,51 @@ class YamlService {
380
376
  insertFloors
381
377
  };
382
378
  }
383
- async analyseUpsertGroups(upsertGroups) {
384
- if (!this.isTypeormMode || !upsertGroups?.length) {
379
+ async analyseUpsertTags(upsertTags) {
380
+ if (!upsertTags?.length) {
385
381
  return {
386
- updateByNameGroups: [],
387
- insertGroups: []
382
+ updateByNameTags: [],
383
+ insertTags: []
388
384
  };
389
385
  }
390
- const existingGroups = await this.printerGroupService.listGroups();
391
- const names = existingGroups.map((p)=>p.name.toLowerCase());
392
- const ids = existingGroups.map((p)=>p.id.toString());
393
- const insertGroups = [];
394
- const updateByNameGroups = [];
395
- for (const group of upsertGroups){
396
- const comparedProperty = group.name.toLowerCase();
386
+ const existingTags = await this.printerTagService.listTags();
387
+ const names = existingTags.map((p)=>p.name.toLowerCase());
388
+ const ids = existingTags.map((p)=>p.id.toString());
389
+ const insertTags = [];
390
+ const updateByNameTags = [];
391
+ for (const tag of upsertTags){
392
+ const comparedProperty = tag.name.toLowerCase();
397
393
  const foundIndex = names.findIndex((n)=>n === comparedProperty);
398
394
  if (foundIndex !== -1) {
399
395
  if (!ids[foundIndex]) {
400
- throw new Error("IDS not found, group name");
396
+ throw new Error("IDS not found, tag name");
401
397
  }
402
- updateByNameGroups.push({
398
+ updateByNameTags.push({
403
399
  strategy: "name",
404
- groupId: parseInt(ids[foundIndex]),
405
- value: group
400
+ tagId: Number.parseInt(ids[foundIndex]),
401
+ value: tag
406
402
  });
407
403
  break;
408
404
  } else {
409
- insertGroups.push(group);
405
+ insertTags.push(tag);
410
406
  }
411
407
  }
412
408
  return {
413
- insertGroups,
414
- updateByNameGroups
409
+ insertTags,
410
+ updateByNameTags
415
411
  };
416
412
  }
417
413
  async exportYaml(options) {
418
414
  const input = await (0, _validators.validateInput)(options, _yamlservicevalidation.exportPrintersFloorsYamlSchema);
419
- if (!this.isTypeormMode) {
420
- input.exportGroups = false;
421
- }
422
- const { exportFloors, exportPrinters, exportFloorGrid, exportGroups, exportSettings, exportUsers } = input;
415
+ const { exportFloors, exportPrinters, exportFloorGrid, exportTags, exportSettings, exportUsers } = input;
423
416
  const dumpedObject = {
424
417
  version: process.env.npm_package_version,
425
418
  exportedAt: new Date(),
426
- databaseType: this.isTypeormMode ? "sqlite" : "mongo",
419
+ databaseType: "sqlite",
427
420
  config: input,
428
421
  printers: undefined,
429
422
  floors: undefined,
430
- groups: undefined,
423
+ tags: undefined,
431
424
  settings: undefined,
432
425
  users: undefined,
433
426
  user_roles: undefined
@@ -454,7 +447,7 @@ class YamlService {
454
447
  dumpedObject.floors = floors.map((f)=>{
455
448
  const dumpedFloor = {
456
449
  id: f.id,
457
- floor: f.floor,
450
+ order: f.order,
458
451
  name: f.name,
459
452
  printers: undefined
460
453
  };
@@ -471,13 +464,13 @@ class YamlService {
471
464
  return dumpedFloor;
472
465
  });
473
466
  }
474
- if (exportGroups && this.isTypeormMode) {
475
- const groups = await this.printerGroupService.listGroups();
476
- dumpedObject.groups = groups.map((g)=>{
467
+ if (exportTags) {
468
+ const tags = await this.printerTagService.listTags();
469
+ dumpedObject.tags = tags.map((t)=>{
477
470
  return {
478
- name: g.name,
479
- id: g.id,
480
- printers: g.printers.map((p)=>{
471
+ name: t.name,
472
+ id: t.id,
473
+ printers: t.printers.map((p)=>{
481
474
  return {
482
475
  printerId: p.printerId
483
476
  };
@@ -486,15 +479,13 @@ class YamlService {
486
479
  });
487
480
  }
488
481
  if (exportSettings) {
489
- const settings = this.settingsStore.getSettings();
490
- dumpedObject.settings = settings;
482
+ dumpedObject.settings = this.settingsStore.getSettings();
491
483
  }
492
484
  if (exportUsers) {
493
485
  const users = await this.userService.listUsers(1000);
494
- const allRoles = this.roleService.roles;
495
486
  dumpedObject.users = users.map((u)=>{
496
487
  const userDto = this.userService.toDto(u);
497
- const userObj = {
488
+ return {
498
489
  id: userDto.id,
499
490
  username: userDto.username,
500
491
  isDemoUser: userDto.isDemoUser,
@@ -502,19 +493,60 @@ class YamlService {
502
493
  isVerified: userDto.isVerified,
503
494
  needsPasswordChange: userDto.needsPasswordChange,
504
495
  passwordHash: u.passwordHash,
505
- createdAt: userDto.createdAt
496
+ createdAt: userDto.createdAt,
497
+ roles: userDto.roles
506
498
  };
507
- if (userDto.roles && userDto.roles.length > 0) {
508
- userObj.roles = userDto.roles.map((roleId)=>{
509
- const role = allRoles.find((r)=>r.id.toString() === roleId.toString());
510
- return role?.name;
511
- }).filter((name)=>name !== undefined);
512
- }
513
- return userObj;
514
499
  });
515
500
  }
516
501
  return (0, _jsyaml.dump)(dumpedObject, {});
517
502
  }
503
+ normalizeYamlData(importSpec, databaseTypeSqlite) {
504
+ for (const printer of importSpec.printers){
505
+ if (!printer.name && printer.printerName) {
506
+ printer.name = printer.printerName;
507
+ delete printer.printerName;
508
+ }
509
+ if (printer.settingsAppearance?.name) {
510
+ printer.name = printer.settingsAppearance?.name;
511
+ delete printer.settingsAppearance?.name;
512
+ }
513
+ if (databaseTypeSqlite && typeof printer.id === "string") {
514
+ printer.id = Number.parseInt(printer.id);
515
+ }
516
+ if (![
517
+ _printerapiinterface.OctoprintType,
518
+ _printerapiinterface.MoonrakerType,
519
+ _printerapiinterface.PrusaLinkType,
520
+ _printerapiinterface.BambuType
521
+ ].includes(printer.printerType)) {
522
+ printer.printerType = _printerapiinterface.OctoprintType;
523
+ }
524
+ }
525
+ for (const floor of importSpec.floors){
526
+ if (floor.floor !== undefined && floor.order === undefined) {
527
+ floor.order = floor.floor;
528
+ delete floor.floor;
529
+ }
530
+ if (databaseTypeSqlite) {
531
+ if (typeof floor.id === "string") {
532
+ floor.id = Number.parseInt(floor.id);
533
+ }
534
+ for (const printer of floor.printers){
535
+ if (typeof printer.printerId === "string") {
536
+ printer.printerId = Number.parseInt(printer.printerId);
537
+ }
538
+ }
539
+ }
540
+ }
541
+ if (importSpec.groups && !importSpec.tags) {
542
+ importSpec.tags = importSpec.groups;
543
+ delete importSpec.groups;
544
+ }
545
+ if (importSpec.config.exportGroups !== undefined && importSpec.config.exportTags === undefined) {
546
+ importSpec.config.exportTags = importSpec.config.exportGroups;
547
+ delete importSpec.config.exportGroups;
548
+ }
549
+ }
518
550
  }
519
551
 
520
552
  //# sourceMappingURL=yaml.service.js.map