@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.
- package/.env.template +8 -7
- package/.yarn/install-state.gz +0 -0
- package/CONTRIBUTING.md +5 -5
- package/README.md +9 -8
- package/RELEASE_NOTES.MD +52 -0
- package/SECURITY.md +1 -1
- package/biome.json +8 -5
- package/dist/consoles/download-github-releases.js +3 -3
- package/dist/consoles/launch-http-servers.js +4 -4
- package/dist/consoles/launch-http-servers.js.map +1 -1
- package/dist/consoles/mock-bambu.server.js +50 -30
- package/dist/consoles/mock-bambu.server.js.map +1 -1
- package/dist/consoles/mock-camera/default-image.js +13 -0
- package/dist/consoles/mock-camera/default-image.js.map +1 -0
- package/dist/consoles/mock-camera/mock-camera.server.js +160 -0
- package/dist/consoles/mock-camera/mock-camera.server.js.map +1 -0
- package/dist/consoles/mock-octoprint.server.js +281 -73
- package/dist/consoles/mock-octoprint.server.js.map +1 -1
- package/dist/consoles/mock-prusalink.server.js +17 -17
- package/dist/consoles/mock-prusalink.server.js.map +1 -1
- package/dist/consoles/typeorm-create.js +135 -0
- package/dist/consoles/typeorm-create.js.map +1 -0
- package/dist/consoles/typeorm-generate.js +8 -8
- package/dist/consoles/typeorm-generate.js.map +1 -1
- package/dist/consoles/utils/api-messages.js.map +1 -1
- package/dist/constants/authorization.constants.js +25 -31
- package/dist/constants/authorization.constants.js.map +1 -1
- package/dist/constants/event.constants.js.map +1 -1
- package/dist/constants/server-settings.constants.js +3 -19
- package/dist/constants/server-settings.constants.js.map +1 -1
- package/dist/container.js +43 -59
- package/dist/container.js.map +1 -1
- package/dist/container.tokens.js +9 -6
- package/dist/container.tokens.js.map +1 -1
- package/dist/controllers/auth.controller.js +1 -1
- package/dist/controllers/auth.controller.js.map +1 -1
- package/dist/controllers/batch-call.controller.js +7 -25
- package/dist/controllers/batch-call.controller.js.map +1 -1
- package/dist/controllers/file-storage.controller.js +248 -0
- package/dist/controllers/file-storage.controller.js.map +1 -0
- package/dist/controllers/first-time-setup.controller.js +6 -5
- package/dist/controllers/first-time-setup.controller.js.map +1 -1
- package/dist/controllers/floor.controller.js +12 -12
- package/dist/controllers/floor.controller.js.map +1 -1
- package/dist/controllers/metrics.controller.js.map +1 -1
- package/dist/controllers/print-job.controller.js +666 -0
- package/dist/controllers/print-job.controller.js.map +1 -0
- package/dist/controllers/print-queue.controller.js +375 -0
- package/dist/controllers/print-queue.controller.js.map +1 -0
- package/dist/controllers/printer-files.controller.js +88 -59
- package/dist/controllers/printer-files.controller.js.map +1 -1
- package/dist/controllers/printer-settings.controller.js +0 -21
- package/dist/controllers/printer-settings.controller.js.map +1 -1
- package/dist/controllers/{printer-group.controller.js → printer-tag.controller.js} +51 -34
- package/dist/controllers/printer-tag.controller.js.map +1 -0
- package/dist/controllers/printer.controller.js +21 -7
- package/dist/controllers/printer.controller.js.map +1 -1
- package/dist/controllers/server-private.controller.js +2 -1
- package/dist/controllers/server-private.controller.js.map +1 -1
- package/dist/controllers/server-public.controller.js +11 -15
- package/dist/controllers/server-public.controller.js.map +1 -1
- package/dist/controllers/settings.controller.js +0 -68
- package/dist/controllers/settings.controller.js.map +1 -1
- package/dist/controllers/slicer-compat.controller.js +216 -0
- package/dist/controllers/slicer-compat.controller.js.map +1 -0
- package/dist/controllers/user.controller.js +8 -12
- package/dist/controllers/user.controller.js.map +1 -1
- package/dist/controllers/validation/batch-controller.validation.js +13 -13
- package/dist/controllers/validation/batch-controller.validation.js.map +1 -1
- package/dist/controllers/validation/generic.validation.js +4 -8
- package/dist/controllers/validation/generic.validation.js.map +1 -1
- package/dist/controllers/validation/printer-files-controller.validation.js +2 -2
- package/dist/controllers/validation/user-controller.validation.js +14 -9
- package/dist/controllers/validation/user-controller.validation.js.map +1 -1
- package/dist/data-source.js +25 -12
- package/dist/data-source.js.map +1 -1
- package/dist/entities/camera-stream.entity.js +2 -1
- package/dist/entities/camera-stream.entity.js.map +1 -1
- package/dist/entities/floor.entity.js +3 -5
- package/dist/entities/floor.entity.js.map +1 -1
- package/dist/entities/index.js +15 -11
- package/dist/entities/index.js.map +1 -1
- package/dist/entities/print-job.entity.js +195 -0
- package/dist/entities/print-job.entity.js.map +1 -0
- package/dist/entities/{printer-group.entity.js → printer-tag.entity.js} +17 -17
- package/dist/entities/printer-tag.entity.js.map +1 -0
- package/dist/entities/printer.entity.js +4 -10
- package/dist/entities/printer.entity.js.map +1 -1
- package/dist/entities/settings.entity.js +3 -12
- package/dist/entities/settings.entity.js.map +1 -1
- package/dist/entities/{group.entity.js → tag.entity.js} +15 -8
- package/dist/entities/tag.entity.js.map +1 -0
- package/dist/handlers/logging/file-logging.transport.js.map +1 -1
- package/dist/handlers/logging/static.logger.js.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/authenticate.js +4 -4
- package/dist/middleware/authenticate.js.map +1 -1
- package/dist/middleware/database.js +1 -1
- package/dist/middleware/exception.filter.js +114 -90
- package/dist/middleware/exception.filter.js.map +1 -1
- package/dist/middleware/global.middleware.js +10 -18
- package/dist/middleware/global.middleware.js.map +1 -1
- package/dist/middleware/param-converter.middleware.js +5 -13
- package/dist/middleware/param-converter.middleware.js.map +1 -1
- package/dist/middleware/passport.js +2 -2
- package/dist/middleware/passport.js.map +1 -1
- package/dist/middleware/printer-resolver.js.map +1 -1
- package/dist/middleware/printer.js +3 -2
- package/dist/middleware/printer.js.map +1 -1
- package/dist/middleware/socketio.middleware.js.map +1 -1
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js +1 -1
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js.map +1 -1
- package/dist/migrations/1766576698569-DropPermissions.js +28 -0
- package/dist/migrations/1766576698569-DropPermissions.js.map +1 -0
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js +186 -0
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js.map +1 -0
- package/dist/migrations/1767279607392-DropCustomGcode.js +31 -0
- package/dist/migrations/1767279607392-DropCustomGcode.js.map +1 -0
- package/dist/migrations/1767291804417-DropPrintCompletions.js +37 -0
- package/dist/migrations/1767291804417-DropPrintCompletions.js.map +1 -0
- package/dist/migrations/1767352862576-DropSettingsFileClean.js +88 -0
- package/dist/migrations/1767352862576-DropSettingsFileClean.js.map +1 -0
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js +107 -0
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js.map +1 -0
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js +62 -0
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js.map +1 -0
- package/dist/migrations/1767432108916-RenameGroupToTag.js +86 -0
- package/dist/migrations/1767432108916-RenameGroupToTag.js.map +1 -0
- package/dist/migrations/1767451444137-AddPrintJob.js +207 -0
- package/dist/migrations/1767451444137-AddPrintJob.js.map +1 -0
- package/dist/server.constants.js +9 -17
- package/dist/server.constants.js.map +1 -1
- package/dist/server.core.js +3 -7
- package/dist/server.core.js.map +1 -1
- package/dist/server.env.js +4 -49
- package/dist/server.env.js.map +1 -1
- package/dist/server.host.js +26 -44
- package/dist/server.host.js.map +1 -1
- package/dist/services/authentication/auth.service.js.map +1 -1
- package/dist/services/authentication/jwt.service.js.map +1 -1
- package/dist/services/bambu/bambu-ftp.adapter.js +3 -3
- package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
- package/dist/services/bambu/bambu-mqtt.adapter.js +74 -77
- package/dist/services/bambu/bambu-mqtt.adapter.js.map +1 -1
- package/dist/services/bambu/bambu.client.js.map +1 -1
- package/dist/services/bambu.api.js +11 -0
- package/dist/services/bambu.api.js.map +1 -1
- package/dist/services/core/batch-call.service.js +0 -25
- package/dist/services/core/batch-call.service.js.map +1 -1
- package/dist/services/core/multer.service.js +5 -9
- package/dist/services/core/multer.service.js.map +1 -1
- package/dist/services/core/yaml.service.js +219 -187
- package/dist/services/core/yaml.service.js.map +1 -1
- package/dist/services/file-analysis.service.js +146 -0
- package/dist/services/file-analysis.service.js.map +1 -0
- package/dist/services/file-storage.service.js +386 -0
- package/dist/services/file-storage.service.js.map +1 -0
- package/dist/services/interfaces/camera-stream.dto.js +2 -2
- package/dist/services/interfaces/camera-stream.dto.js.map +1 -1
- package/dist/services/interfaces/floor.dto.js +3 -3
- package/dist/services/interfaces/floor.dto.js.map +1 -1
- package/dist/services/interfaces/{printer-group.dto.js → printer-tag.dto.js} +9 -8
- package/dist/services/interfaces/printer-tag.dto.js.map +1 -0
- package/dist/services/interfaces/{print-completion.interface.js → printer-tag.service.interface.js} +1 -1
- package/dist/services/interfaces/{printer-group.service.interface.js.map → printer-tag.service.interface.js.map} +1 -1
- package/dist/services/interfaces/printer.dto.js +2 -2
- package/dist/services/interfaces/printer.dto.js.map +1 -1
- package/dist/services/interfaces/refresh-token.dto.js.map +1 -1
- package/dist/services/interfaces/role.dto.js.map +1 -1
- package/dist/services/interfaces/settings.dto.js +0 -1
- package/dist/services/interfaces/settings.dto.js.map +1 -1
- package/dist/services/interfaces/{group.dto.js → tag.dto.js} +1 -1
- package/dist/services/interfaces/tag.dto.js.map +1 -0
- package/dist/services/interfaces/user.dto.js.map +1 -1
- package/dist/services/moonraker/constants/moonraker-event.dto.js.map +1 -1
- package/dist/services/moonraker/moonraker-websocket.adapter.js.map +1 -1
- package/dist/services/moonraker/moonraker.client.js.map +1 -1
- package/dist/services/moonraker.api.js +3 -0
- package/dist/services/moonraker.api.js.map +1 -1
- package/dist/services/octoprint/dto/files/gcode-analysis.dto.js.map +1 -0
- package/dist/services/octoprint/dto/octoprint-event.dto.js.map +1 -1
- package/dist/services/octoprint/octoprint-api.routes.js +0 -7
- package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
- package/dist/services/octoprint/octoprint-websocket.adapter.js.map +1 -1
- package/dist/services/octoprint/octoprint.client.js +0 -4
- package/dist/services/octoprint/octoprint.client.js.map +1 -1
- package/dist/services/octoprint.api.js +3 -0
- package/dist/services/octoprint.api.js.map +1 -1
- package/dist/services/orm/base.service.js.map +1 -1
- package/dist/services/orm/camera-stream.service.js.map +1 -1
- package/dist/services/orm/floor-position.service.js.map +1 -1
- package/dist/services/orm/floor.service.js +12 -19
- package/dist/services/orm/floor.service.js.map +1 -1
- package/dist/services/orm/permission.service.js +3 -54
- package/dist/services/orm/permission.service.js.map +1 -1
- package/dist/services/orm/print-job.service.js +539 -0
- package/dist/services/orm/print-job.service.js.map +1 -0
- package/dist/services/orm/printer-tag.service.js +120 -0
- package/dist/services/orm/printer-tag.service.js.map +1 -0
- package/dist/services/orm/printer.service.js.map +1 -1
- package/dist/services/orm/refresh-token.service.js.map +1 -1
- package/dist/services/orm/role.service.js +25 -39
- package/dist/services/orm/role.service.js.map +1 -1
- package/dist/services/orm/settings.service.js +4 -15
- package/dist/services/orm/settings.service.js.map +1 -1
- package/dist/services/orm/user.service.js +17 -13
- package/dist/services/orm/user.service.js.map +1 -1
- package/dist/services/print-file-downloader.service.js +169 -0
- package/dist/services/print-file-downloader.service.js.map +1 -0
- package/dist/services/print-queue.service.js +268 -0
- package/dist/services/print-queue.service.js.map +1 -0
- package/dist/services/printer-api.factory.js +1 -1
- package/dist/services/printer-api.factory.js.map +1 -1
- package/dist/services/printer-api.interface.js.map +1 -1
- package/dist/services/prusa-link/constants/prusalink-event.dto.js.map +1 -1
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js +1 -3
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -1
- package/dist/services/prusa-link/prusa-link.api.js +4 -1
- package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
- package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js.map +1 -1
- package/dist/services/validators/floor-service.validation.js +25 -31
- package/dist/services/validators/floor-service.validation.js.map +1 -1
- package/dist/services/validators/print-job.validation.js +31 -0
- package/dist/services/validators/print-job.validation.js.map +1 -0
- package/dist/services/validators/settings-service.validation.js +0 -22
- package/dist/services/validators/settings-service.validation.js.map +1 -1
- package/dist/services/validators/user-service.validation.js +15 -10
- package/dist/services/validators/user-service.validation.js.map +1 -1
- package/dist/services/validators/yaml-service.validation.js +8 -14
- package/dist/services/validators/yaml-service.validation.js.map +1 -1
- package/dist/shared/load-controllers.js +2 -1
- package/dist/shared/load-controllers.js.map +1 -1
- package/dist/shared/runtime-settings.migration.js +1 -11
- package/dist/shared/runtime-settings.migration.js.map +1 -1
- package/dist/shared/websocket-rpc-extended.adapter.js +13 -4
- package/dist/shared/websocket-rpc-extended.adapter.js.map +1 -1
- package/dist/shared/websocket.adapter.js.map +1 -1
- package/dist/state/file-upload-tracker.cache.js.map +1 -1
- package/dist/state/file.cache.js +6 -6
- package/dist/state/file.cache.js.map +1 -1
- package/dist/state/floor.store.js +3 -10
- package/dist/state/floor.store.js.map +1 -1
- package/dist/state/printer-events.cache.js +180 -20
- package/dist/state/printer-events.cache.js.map +1 -1
- package/dist/state/printer-files.store.js.map +1 -1
- package/dist/state/printer-socket.store.js +25 -20
- package/dist/state/printer-socket.store.js.map +1 -1
- package/dist/state/printer-thumbnail.cache.js +98 -188
- package/dist/state/printer-thumbnail.cache.js.map +1 -1
- package/dist/state/printer.cache.js +3 -13
- package/dist/state/printer.cache.js.map +1 -1
- package/dist/state/settings.store.js +4 -42
- package/dist/state/settings.store.js.map +1 -1
- package/dist/state/socket-io.gateway.js +1 -1
- package/dist/state/socket-io.gateway.js.map +1 -1
- package/dist/state/test-printer-socket.store.js +6 -3
- package/dist/state/test-printer-socket.store.js.map +1 -1
- package/dist/tasks/boot.task.js +11 -91
- package/dist/tasks/boot.task.js.map +1 -1
- package/dist/tasks/print-job-analysis.task.js +116 -0
- package/dist/tasks/print-job-analysis.task.js.map +1 -0
- package/dist/tasks/printer-files-load.task.js +29 -0
- package/dist/tasks/printer-files-load.task.js.map +1 -0
- package/dist/tasks/socketio.task.js +1 -1
- package/dist/tasks/socketio.task.js.map +1 -1
- package/dist/tasks.js +3 -2
- package/dist/tasks.js.map +1 -1
- package/dist/utils/cache/key-diff.cache.js +20 -61
- package/dist/utils/cache/key-diff.cache.js.map +1 -1
- package/dist/utils/parsers/3mf.parser.js +337 -0
- package/dist/utils/parsers/3mf.parser.js.map +1 -0
- package/dist/utils/parsers/bgcode.parser.js +223 -0
- package/dist/utils/parsers/bgcode.parser.js.map +1 -0
- package/dist/utils/parsers/gcode.parser.js +254 -0
- package/dist/utils/parsers/gcode.parser.js.map +1 -0
- package/dist/utils/swagger/decorators.js +39 -0
- package/dist/utils/swagger/decorators.js.map +1 -0
- package/dist/utils/swagger/generator.js +196 -0
- package/dist/utils/swagger/generator.js.map +1 -0
- package/dist/utils/swagger/swagger.js +93 -0
- package/dist/utils/swagger/swagger.js.map +1 -0
- package/package.json +24 -30
- package/dist/controllers/custom-gcode.controller.js +0 -150
- package/dist/controllers/custom-gcode.controller.js.map +0 -1
- package/dist/controllers/print-completion.controller.js +0 -118
- package/dist/controllers/print-completion.controller.js.map +0 -1
- package/dist/controllers/printer-group.controller.js.map +0 -1
- package/dist/entities/custom-gcode.entity.js +0 -49
- package/dist/entities/custom-gcode.entity.js.map +0 -1
- package/dist/entities/group.entity.js.map +0 -1
- package/dist/entities/permission.entity.js +0 -37
- package/dist/entities/permission.entity.js.map +0 -1
- package/dist/entities/print-completion.entity.js +0 -90
- package/dist/entities/print-completion.entity.js.map +0 -1
- package/dist/entities/printer-group.entity.js.map +0 -1
- package/dist/models/Auth/Permission.js +0 -20
- package/dist/models/Auth/Permission.js.map +0 -1
- package/dist/models/Auth/RefreshToken.js +0 -41
- package/dist/models/Auth/RefreshToken.js.map +0 -1
- package/dist/models/Auth/Role.js +0 -20
- package/dist/models/Auth/Role.js.map +0 -1
- package/dist/models/Auth/User.js +0 -49
- package/dist/models/Auth/User.js.map +0 -1
- package/dist/models/CameraStream.js +0 -49
- package/dist/models/CameraStream.js.map +0 -1
- package/dist/models/CustomGcode.js +0 -28
- package/dist/models/CustomGcode.js.map +0 -1
- package/dist/models/Floor.js +0 -33
- package/dist/models/Floor.js.map +0 -1
- package/dist/models/FloorPrinter.js +0 -38
- package/dist/models/FloorPrinter.js.map +0 -1
- package/dist/models/PrintCompletion.js +0 -40
- package/dist/models/PrintCompletion.js.map +0 -1
- package/dist/models/Printer.js +0 -78
- package/dist/models/Printer.js.map +0 -1
- package/dist/models/Settings.js +0 -150
- package/dist/models/Settings.js.map +0 -1
- package/dist/models/index.js +0 -54
- package/dist/models/index.js.map +0 -1
- package/dist/mongo-migrations/20210713120034-printers-settingsapperance-apikey.js +0 -45
- package/dist/mongo-migrations/20210713120034-printers-settingsapperance-apikey.js.map +0 -1
- package/dist/mongo-migrations/20210907173950-printers-enabled.js +0 -35
- package/dist/mongo-migrations/20210907173950-printers-enabled.js.map +0 -1
- package/dist/mongo-migrations/20211029110742-user-password-passwordhash.js +0 -35
- package/dist/mongo-migrations/20211029110742-user-password-passwordhash.js.map +0 -1
- package/dist/mongo-migrations/20230414141005-floor-remove-groupinfloor.js +0 -60
- package/dist/mongo-migrations/20230414141005-floor-remove-groupinfloor.js.map +0 -1
- package/dist/mongo-migrations/20230427202911-printer-remove-sortindex.js +0 -30
- package/dist/mongo-migrations/20230427202911-printer-remove-sortindex.js.map +0 -1
- package/dist/mongo-migrations/20230716065316-user-remove-name.js +0 -30
- package/dist/mongo-migrations/20230716065316-user-remove-name.js.map +0 -1
- package/dist/mongo-migrations/20231111081809-printer-flatten-name.js +0 -35
- package/dist/mongo-migrations/20231111081809-printer-flatten-name.js.map +0 -1
- package/dist/mongo-migrations/20231111082521-printer-remove-settingsappearance.js +0 -41
- package/dist/mongo-migrations/20231111082521-printer-remove-settingsappearance.js.map +0 -1
- package/dist/mongo-migrations/20231202183902-printer-files-simpler.js +0 -41
- package/dist/mongo-migrations/20231202183902-printer-files-simpler.js.map +0 -1
- package/dist/services/interfaces/custom-gcode.dto.js +0 -18
- package/dist/services/interfaces/custom-gcode.dto.js.map +0 -1
- package/dist/services/interfaces/custom-gcode.service.interface.js +0 -6
- package/dist/services/interfaces/custom-gcode.service.interface.js.map +0 -1
- package/dist/services/interfaces/gcode-analysis.dto.js.map +0 -1
- package/dist/services/interfaces/group.dto.js.map +0 -1
- package/dist/services/interfaces/permission.dto.js +0 -16
- package/dist/services/interfaces/permission.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion-context.dto.js +0 -6
- package/dist/services/interfaces/print-completion-context.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion.dto.js +0 -38
- package/dist/services/interfaces/print-completion.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion.interface.js.map +0 -1
- package/dist/services/interfaces/printer-group.dto.js.map +0 -1
- package/dist/services/interfaces/printer-group.service.interface.js +0 -6
- package/dist/services/mongoose/camera-stream.service.js +0 -67
- package/dist/services/mongoose/camera-stream.service.js.map +0 -1
- package/dist/services/mongoose/custom-gcode.service.js +0 -50
- package/dist/services/mongoose/custom-gcode.service.js.map +0 -1
- package/dist/services/mongoose/floor.service.js +0 -139
- package/dist/services/mongoose/floor.service.js.map +0 -1
- package/dist/services/mongoose/permission.service.js +0 -73
- package/dist/services/mongoose/permission.service.js.map +0 -1
- package/dist/services/mongoose/print-completion.service.js +0 -134
- package/dist/services/mongoose/print-completion.service.js.map +0 -1
- package/dist/services/mongoose/print-completion.shared.js +0 -59
- package/dist/services/mongoose/print-completion.shared.js.map +0 -1
- package/dist/services/mongoose/printer.service.js +0 -216
- package/dist/services/mongoose/printer.service.js.map +0 -1
- package/dist/services/mongoose/refresh-token.service.js +0 -104
- package/dist/services/mongoose/refresh-token.service.js.map +0 -1
- package/dist/services/mongoose/role.service.js +0 -132
- package/dist/services/mongoose/role.service.js.map +0 -1
- package/dist/services/mongoose/settings.service.js +0 -124
- package/dist/services/mongoose/settings.service.js.map +0 -1
- package/dist/services/mongoose/user.service.js +0 -180
- package/dist/services/mongoose/user.service.js.map +0 -1
- package/dist/services/orm/custom-gcode.service.js +0 -42
- package/dist/services/orm/custom-gcode.service.js.map +0 -1
- package/dist/services/orm/print-completion.service.js +0 -87
- package/dist/services/orm/print-completion.service.js.map +0 -1
- package/dist/services/orm/printer-group.service.js +0 -109
- package/dist/services/orm/printer-group.service.js.map +0 -1
- package/dist/services/validators/camera-service.validation.js +0 -19
- package/dist/services/validators/camera-service.validation.js.map +0 -1
- package/dist/services/validators/print-completion-service.validation.js +0 -33
- package/dist/services/validators/print-completion-service.validation.js.map +0 -1
- package/dist/shared.constants.js +0 -15
- package/dist/shared.constants.js.map +0 -1
- package/dist/tasks/print-completion.socketio.task.js +0 -91
- package/dist/tasks/print-completion.socketio.task.js.map +0 -1
- package/dist/tasks/printer-file-clean.task.js +0 -74
- package/dist/tasks/printer-file-clean.task.js.map +0 -1
- package/migrate-mongo-config.js +0 -45
- /package/dist/services/{interfaces → octoprint/dto/files}/gcode-analysis.dto.js +0 -0
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "PrintJobService", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return PrintJobService;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _printjobentity = require("../../entities/print-job.entity");
|
|
12
|
+
const _runtimeexceptions = require("../../exceptions/runtime.exceptions");
|
|
13
|
+
class PrintJobService {
|
|
14
|
+
printJobRepository;
|
|
15
|
+
eventEmitter2;
|
|
16
|
+
logger;
|
|
17
|
+
constructor(loggerFactory, typeormService, eventEmitter2){
|
|
18
|
+
this.printJobRepository = typeormService.getDataSource().getRepository(_printjobentity.PrintJob);
|
|
19
|
+
this.eventEmitter2 = eventEmitter2;
|
|
20
|
+
this.logger = loggerFactory(PrintJobService.name);
|
|
21
|
+
}
|
|
22
|
+
async getJobByIdOrFail(id, relations) {
|
|
23
|
+
const job = await this.printJobRepository.findOne({
|
|
24
|
+
where: {
|
|
25
|
+
id
|
|
26
|
+
},
|
|
27
|
+
relations
|
|
28
|
+
});
|
|
29
|
+
if (!job) {
|
|
30
|
+
throw new _runtimeexceptions.NotFoundException(`Job ${id} not found`);
|
|
31
|
+
}
|
|
32
|
+
return job;
|
|
33
|
+
}
|
|
34
|
+
async handleFileAnalyzed(jobId, metadata, thumbnails) {
|
|
35
|
+
const job = await this.printJobRepository.findOne({
|
|
36
|
+
where: {
|
|
37
|
+
id: jobId
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
if (!job) {
|
|
41
|
+
throw new Error(`Print job ${jobId} not found`);
|
|
42
|
+
}
|
|
43
|
+
job.metadata = metadata;
|
|
44
|
+
job.analysisState = "ANALYZED";
|
|
45
|
+
job.analyzedAt = new Date();
|
|
46
|
+
job.fileFormat = metadata.fileFormat;
|
|
47
|
+
await this.printJobRepository.save(job);
|
|
48
|
+
this.eventEmitter2.emit("printJob.analyzed", {
|
|
49
|
+
jobId: job.id,
|
|
50
|
+
printerId: job.printerId,
|
|
51
|
+
metadata
|
|
52
|
+
});
|
|
53
|
+
this.logger.log(`Print job ${jobId} analyzed: ${metadata.fileName}`);
|
|
54
|
+
return job;
|
|
55
|
+
}
|
|
56
|
+
async handlePrintStarted(printerId, fileName, jobId, printerName) {
|
|
57
|
+
const existingJob = await this.printJobRepository.findOne({
|
|
58
|
+
where: {
|
|
59
|
+
printerId,
|
|
60
|
+
status: "PRINTING"
|
|
61
|
+
},
|
|
62
|
+
order: {
|
|
63
|
+
startedAt: "DESC"
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
if (existingJob?.fileName === fileName && !jobId) {
|
|
67
|
+
return existingJob;
|
|
68
|
+
}
|
|
69
|
+
if (existingJob && existingJob.fileName !== fileName && !jobId) {
|
|
70
|
+
existingJob.status = "UNKNOWN";
|
|
71
|
+
existingJob.statusReason = "Print state unknown - printer started new job while previous job was still marked as printing. " + "This may indicate a disconnect, server restart, or manual printer control.";
|
|
72
|
+
existingJob.endedAt = new Date();
|
|
73
|
+
await this.printJobRepository.save(existingJob);
|
|
74
|
+
this.logger.warn(`Printer ${printerId} started new print "${fileName}" while job ${existingJob.id} was PRINTING "${existingJob.fileName}". ` + `Marked job ${existingJob.id} as UNKNOWN.`);
|
|
75
|
+
}
|
|
76
|
+
let job;
|
|
77
|
+
if (jobId) {
|
|
78
|
+
job = await this.printJobRepository.findOne({
|
|
79
|
+
where: {
|
|
80
|
+
id: jobId
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
if (!job) {
|
|
84
|
+
throw new Error(`Print job ${jobId} not found`);
|
|
85
|
+
}
|
|
86
|
+
} else {
|
|
87
|
+
job = await this.printJobRepository.findOne({
|
|
88
|
+
where: {
|
|
89
|
+
printerId,
|
|
90
|
+
fileName,
|
|
91
|
+
status: "PENDING"
|
|
92
|
+
},
|
|
93
|
+
order: {
|
|
94
|
+
createdAt: "DESC"
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
if (!job) {
|
|
98
|
+
job = await this.printJobRepository.findOne({
|
|
99
|
+
where: {
|
|
100
|
+
printerId,
|
|
101
|
+
fileName
|
|
102
|
+
},
|
|
103
|
+
order: {
|
|
104
|
+
createdAt: "DESC"
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
if (!job) {
|
|
109
|
+
this.logger.log(`Creating new job for ${fileName} - no pending or existing job found`);
|
|
110
|
+
job = this.printJobRepository.create({
|
|
111
|
+
printerId,
|
|
112
|
+
printerName: printerName || null,
|
|
113
|
+
fileName,
|
|
114
|
+
status: "PRINTING",
|
|
115
|
+
analysisState: "NOT_ANALYZED"
|
|
116
|
+
});
|
|
117
|
+
} else if (job.status === "PENDING") {
|
|
118
|
+
this.logger.log(`Promoting pending job ${job.id} to PRINTING`);
|
|
119
|
+
} else if (job.status === "COMPLETED" || job.status === "FAILED" || job.status === "CANCELLED") {
|
|
120
|
+
this.logger.log(`Creating new job for re-print of ${fileName} (previous job ${job.id} was ${job.status})`);
|
|
121
|
+
job = this.printJobRepository.create({
|
|
122
|
+
printerId,
|
|
123
|
+
printerName: printerName || job.printerName || null,
|
|
124
|
+
fileName,
|
|
125
|
+
status: "PRINTING",
|
|
126
|
+
analysisState: job.analysisState,
|
|
127
|
+
metadata: job.metadata,
|
|
128
|
+
fileFormat: job.fileFormat
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
job.status = "PRINTING";
|
|
133
|
+
job.startedAt = new Date();
|
|
134
|
+
job.progress = 0;
|
|
135
|
+
if (printerName && !job.printerName) {
|
|
136
|
+
job.printerName = printerName;
|
|
137
|
+
}
|
|
138
|
+
if (!job.statistics) {
|
|
139
|
+
job.statistics = {
|
|
140
|
+
startedAt: new Date(),
|
|
141
|
+
endedAt: null,
|
|
142
|
+
actualPrintTimeSeconds: null,
|
|
143
|
+
progress: 0
|
|
144
|
+
};
|
|
145
|
+
} else {
|
|
146
|
+
job.statistics.startedAt = new Date();
|
|
147
|
+
job.statistics.progress = 0;
|
|
148
|
+
}
|
|
149
|
+
await this.printJobRepository.save(job);
|
|
150
|
+
this.eventEmitter2.emit("printJob.started", {
|
|
151
|
+
jobId: job.id,
|
|
152
|
+
printerId,
|
|
153
|
+
fileName,
|
|
154
|
+
startedAt: job.startedAt
|
|
155
|
+
});
|
|
156
|
+
this.logger.log(`Print job ${job.id} started on printer ${printerId}: ${fileName}`);
|
|
157
|
+
return job;
|
|
158
|
+
}
|
|
159
|
+
async handlePrintProgress(printerId, progress, currentLayer, totalLayers) {
|
|
160
|
+
const job = await this.printJobRepository.findOne({
|
|
161
|
+
where: {
|
|
162
|
+
printerId,
|
|
163
|
+
status: "PRINTING"
|
|
164
|
+
},
|
|
165
|
+
order: {
|
|
166
|
+
startedAt: "DESC"
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
if (!job) {
|
|
170
|
+
this.logger.warn(`No active print job found for printer ${printerId} during progress update`);
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
job.progress = Math.min(100, Math.max(0, progress));
|
|
174
|
+
if (!job.statistics) {
|
|
175
|
+
job.statistics = {
|
|
176
|
+
startedAt: job.startedAt,
|
|
177
|
+
endedAt: null,
|
|
178
|
+
actualPrintTimeSeconds: null,
|
|
179
|
+
progress: job.progress
|
|
180
|
+
};
|
|
181
|
+
} else {
|
|
182
|
+
job.statistics.progress = job.progress;
|
|
183
|
+
}
|
|
184
|
+
if (currentLayer !== undefined) {
|
|
185
|
+
job.statistics.currentLayer = currentLayer;
|
|
186
|
+
}
|
|
187
|
+
if (totalLayers !== undefined) {
|
|
188
|
+
job.statistics.totalLayers = totalLayers;
|
|
189
|
+
}
|
|
190
|
+
await this.printJobRepository.save(job);
|
|
191
|
+
this.eventEmitter2.emit("printJob.progress", {
|
|
192
|
+
jobId: job.id,
|
|
193
|
+
printerId,
|
|
194
|
+
progress: job.progress,
|
|
195
|
+
currentLayer,
|
|
196
|
+
totalLayers
|
|
197
|
+
});
|
|
198
|
+
return job;
|
|
199
|
+
}
|
|
200
|
+
async handlePrintCompleted(printerId, fileName) {
|
|
201
|
+
const job = await this.printJobRepository.findOne({
|
|
202
|
+
where: {
|
|
203
|
+
printerId,
|
|
204
|
+
status: "PRINTING"
|
|
205
|
+
},
|
|
206
|
+
order: {
|
|
207
|
+
startedAt: "DESC"
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
if (!job) {
|
|
211
|
+
this.logger.warn(`No active print job found for printer ${printerId} on completion`);
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
if (fileName && job.fileName !== fileName) {
|
|
215
|
+
this.logger.warn(`Filename mismatch on completion: expected "${job.fileName}", got "${fileName}"`);
|
|
216
|
+
}
|
|
217
|
+
const endedAt = new Date();
|
|
218
|
+
const actualTimeSeconds = job.startedAt ? (endedAt.getTime() - job.startedAt.getTime()) / 1000 : null;
|
|
219
|
+
job.status = "COMPLETED";
|
|
220
|
+
job.endedAt = endedAt;
|
|
221
|
+
job.progress = 100;
|
|
222
|
+
if (!job.statistics) {
|
|
223
|
+
job.statistics = {
|
|
224
|
+
startedAt: job.startedAt,
|
|
225
|
+
endedAt,
|
|
226
|
+
actualPrintTimeSeconds: actualTimeSeconds,
|
|
227
|
+
progress: 100
|
|
228
|
+
};
|
|
229
|
+
} else {
|
|
230
|
+
job.statistics.endedAt = endedAt;
|
|
231
|
+
job.statistics.actualPrintTimeSeconds = actualTimeSeconds;
|
|
232
|
+
job.statistics.progress = 100;
|
|
233
|
+
}
|
|
234
|
+
await this.printJobRepository.save(job);
|
|
235
|
+
this.eventEmitter2.emit("printJob.completed", {
|
|
236
|
+
jobId: job.id,
|
|
237
|
+
printerId,
|
|
238
|
+
fileName: job.fileName,
|
|
239
|
+
actualTimeSeconds,
|
|
240
|
+
estimatedTimeSeconds: job.metadata?.gcodePrintTimeSeconds
|
|
241
|
+
});
|
|
242
|
+
this.logger.log(`Print job ${job.id} completed on printer ${printerId}: ${job.fileName} ` + `(${actualTimeSeconds?.toFixed(0)}s actual, ${job.metadata?.gcodePrintTimeSeconds}s estimated)`);
|
|
243
|
+
return job;
|
|
244
|
+
}
|
|
245
|
+
async handlePrintFailed(printerId, reason, fileName) {
|
|
246
|
+
const job = await this.printJobRepository.findOne({
|
|
247
|
+
where: {
|
|
248
|
+
printerId,
|
|
249
|
+
status: "PRINTING"
|
|
250
|
+
},
|
|
251
|
+
order: {
|
|
252
|
+
startedAt: "DESC"
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
if (!job) {
|
|
256
|
+
this.logger.warn(`No active print job found for printer ${printerId} on failure`);
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
const endedAt = new Date();
|
|
260
|
+
const actualTimeSeconds = job.startedAt ? (endedAt.getTime() - job.startedAt.getTime()) / 1000 : null;
|
|
261
|
+
job.status = "FAILED";
|
|
262
|
+
job.statusReason = reason;
|
|
263
|
+
job.endedAt = endedAt;
|
|
264
|
+
if (!job.statistics) {
|
|
265
|
+
job.statistics = {
|
|
266
|
+
startedAt: job.startedAt,
|
|
267
|
+
endedAt,
|
|
268
|
+
actualPrintTimeSeconds: actualTimeSeconds,
|
|
269
|
+
progress: job.progress,
|
|
270
|
+
failureReason: reason,
|
|
271
|
+
failureTime: endedAt
|
|
272
|
+
};
|
|
273
|
+
} else {
|
|
274
|
+
job.statistics.endedAt = endedAt;
|
|
275
|
+
job.statistics.actualPrintTimeSeconds = actualTimeSeconds;
|
|
276
|
+
job.statistics.failureReason = reason;
|
|
277
|
+
job.statistics.failureTime = endedAt;
|
|
278
|
+
}
|
|
279
|
+
await this.printJobRepository.save(job);
|
|
280
|
+
this.eventEmitter2.emit("printJob.failed", {
|
|
281
|
+
jobId: job.id,
|
|
282
|
+
printerId,
|
|
283
|
+
fileName: job.fileName,
|
|
284
|
+
reason,
|
|
285
|
+
failedAt: endedAt
|
|
286
|
+
});
|
|
287
|
+
this.logger.log(`Print job ${job.id} failed on printer ${printerId}: ${job.fileName} - ${reason}`);
|
|
288
|
+
return job;
|
|
289
|
+
}
|
|
290
|
+
async handlePrintCancelled(printerId, reason) {
|
|
291
|
+
const job = await this.printJobRepository.findOne({
|
|
292
|
+
where: {
|
|
293
|
+
printerId,
|
|
294
|
+
status: "PRINTING"
|
|
295
|
+
},
|
|
296
|
+
order: {
|
|
297
|
+
startedAt: "DESC"
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
if (!job) {
|
|
301
|
+
this.logger.warn(`No active print job found for printer ${printerId} on cancellation`);
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
const endedAt = new Date();
|
|
305
|
+
const actualTimeSeconds = job.startedAt ? (endedAt.getTime() - job.startedAt.getTime()) / 1000 : null;
|
|
306
|
+
job.status = "CANCELLED";
|
|
307
|
+
job.statusReason = reason || "Print cancelled by user";
|
|
308
|
+
job.endedAt = endedAt;
|
|
309
|
+
if (!job.statistics) {
|
|
310
|
+
job.statistics = {
|
|
311
|
+
startedAt: job.startedAt,
|
|
312
|
+
endedAt,
|
|
313
|
+
actualPrintTimeSeconds: actualTimeSeconds,
|
|
314
|
+
progress: job.progress
|
|
315
|
+
};
|
|
316
|
+
} else {
|
|
317
|
+
job.statistics.endedAt = endedAt;
|
|
318
|
+
job.statistics.actualPrintTimeSeconds = actualTimeSeconds;
|
|
319
|
+
}
|
|
320
|
+
await this.printJobRepository.save(job);
|
|
321
|
+
this.eventEmitter2.emit("printJob.cancelled", {
|
|
322
|
+
jobId: job.id,
|
|
323
|
+
printerId,
|
|
324
|
+
fileName: job.fileName,
|
|
325
|
+
cancelledAt: endedAt
|
|
326
|
+
});
|
|
327
|
+
this.logger.log(`Print job ${job.id} cancelled on printer ${printerId}: ${job.fileName}`);
|
|
328
|
+
return job;
|
|
329
|
+
}
|
|
330
|
+
async handlePrintPaused(printerId) {
|
|
331
|
+
const job = await this.printJobRepository.findOne({
|
|
332
|
+
where: {
|
|
333
|
+
printerId,
|
|
334
|
+
status: "PRINTING"
|
|
335
|
+
},
|
|
336
|
+
order: {
|
|
337
|
+
startedAt: "DESC"
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
if (!job) {
|
|
341
|
+
this.logger.warn(`No active print job found for printer ${printerId} on pause`);
|
|
342
|
+
return null;
|
|
343
|
+
}
|
|
344
|
+
job.status = "PAUSED";
|
|
345
|
+
await this.printJobRepository.save(job);
|
|
346
|
+
this.logger.log(`Print job ${job.id} paused on printer ${printerId}`);
|
|
347
|
+
return job;
|
|
348
|
+
}
|
|
349
|
+
async handlePrintResumed(printerId) {
|
|
350
|
+
const job = await this.printJobRepository.findOne({
|
|
351
|
+
where: {
|
|
352
|
+
printerId,
|
|
353
|
+
status: "PAUSED"
|
|
354
|
+
},
|
|
355
|
+
order: {
|
|
356
|
+
startedAt: "DESC"
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
if (!job) {
|
|
360
|
+
this.logger.warn(`No paused print job found for printer ${printerId} on resume`);
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
job.status = "PRINTING";
|
|
364
|
+
await this.printJobRepository.save(job);
|
|
365
|
+
this.logger.log(`Print job ${job.id} resumed on printer ${printerId}`);
|
|
366
|
+
return job;
|
|
367
|
+
}
|
|
368
|
+
async cleanupStaleJobs() {
|
|
369
|
+
const staleJobs = await this.printJobRepository.find({
|
|
370
|
+
where: {
|
|
371
|
+
status: "PRINTING"
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
for (const job of staleJobs){
|
|
375
|
+
job.status = "UNKNOWN";
|
|
376
|
+
job.statusReason = "Print state unknown after server restart. The print may have completed, " + "failed, or still be running. Check your printer for current status.";
|
|
377
|
+
await this.printJobRepository.save(job);
|
|
378
|
+
this.logger.warn(`Marked job ${job.id} (printer ${job.printerId}) as UNKNOWN after startup - ` + `was PRINTING before server stopped`);
|
|
379
|
+
}
|
|
380
|
+
if (staleJobs.length > 0) {
|
|
381
|
+
this.logger.log(`Cleaned up ${staleJobs.length} stale print job(s) on startup`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
async getActivePrintJob(printerId) {
|
|
385
|
+
return this.printJobRepository.findOne({
|
|
386
|
+
where: {
|
|
387
|
+
printerId,
|
|
388
|
+
status: "PRINTING"
|
|
389
|
+
},
|
|
390
|
+
order: {
|
|
391
|
+
startedAt: "DESC"
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
async getPrintJobHistory(printerId, limit = 50) {
|
|
396
|
+
return this.printJobRepository.find({
|
|
397
|
+
where: {
|
|
398
|
+
printerId
|
|
399
|
+
},
|
|
400
|
+
order: {
|
|
401
|
+
createdAt: "DESC"
|
|
402
|
+
},
|
|
403
|
+
take: limit
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
async markStarted(printerId, fileName, printerName) {
|
|
407
|
+
return await this.handlePrintStarted(printerId, fileName, undefined, printerName);
|
|
408
|
+
}
|
|
409
|
+
async markProgress(printerId, fileName, progress, currentLayer, totalLayers) {
|
|
410
|
+
return await this.handlePrintProgress(printerId, progress, currentLayer, totalLayers);
|
|
411
|
+
}
|
|
412
|
+
async markFinished(printerId, fileName) {
|
|
413
|
+
return await this.handlePrintCompleted(printerId, fileName);
|
|
414
|
+
}
|
|
415
|
+
async markFailed(printerId, fileName, reason) {
|
|
416
|
+
return await this.handlePrintFailed(printerId, reason, fileName);
|
|
417
|
+
}
|
|
418
|
+
async updateJobMetadata(printerId, fileName, partialMetadata) {
|
|
419
|
+
const job = await this.printJobRepository.findOne({
|
|
420
|
+
where: {
|
|
421
|
+
printerId,
|
|
422
|
+
fileName,
|
|
423
|
+
status: "PRINTING"
|
|
424
|
+
},
|
|
425
|
+
order: {
|
|
426
|
+
startedAt: "DESC"
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
if (!job) {
|
|
430
|
+
this.logger.debug(`No active job found for printer ${printerId}, file ${fileName} - skipping metadata update`);
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
if (job.analysisState === "ANALYZED" && job.metadata) {
|
|
434
|
+
this.logger.debug(`Job ${job.id} already has analyzed metadata, merging only missing fields`);
|
|
435
|
+
const updatedMetadata = {
|
|
436
|
+
...job.metadata
|
|
437
|
+
};
|
|
438
|
+
for (const [key, value] of Object.entries(partialMetadata)){
|
|
439
|
+
if (value != null && (updatedMetadata[key] == null || updatedMetadata[key] === null)) {
|
|
440
|
+
updatedMetadata[key] = value;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
job.metadata = updatedMetadata;
|
|
444
|
+
} else if (job.metadata) {
|
|
445
|
+
job.metadata = {
|
|
446
|
+
...job.metadata,
|
|
447
|
+
...partialMetadata
|
|
448
|
+
};
|
|
449
|
+
} else {
|
|
450
|
+
const hasData = Object.values(partialMetadata).some((v)=>v != null && v !== null);
|
|
451
|
+
if (!hasData) {
|
|
452
|
+
this.logger.debug(`Skipping metadata creation for job ${job.id} - no meaningful data provided`);
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
job.metadata = {
|
|
456
|
+
fileName,
|
|
457
|
+
fileFormat: job.fileFormat || "gcode",
|
|
458
|
+
...partialMetadata
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
await this.printJobRepository.save(job);
|
|
462
|
+
this.logger.debug(`Updated metadata for job ${job.id}`);
|
|
463
|
+
}
|
|
464
|
+
async searchPrintJobs(searchPrinter, searchFile, startDate, endDate) {
|
|
465
|
+
const query = this.printJobRepository.createQueryBuilder("job");
|
|
466
|
+
if (searchPrinter) {
|
|
467
|
+
query.andWhere("job.printerId = :printerId", {
|
|
468
|
+
printerId: Number.parseInt(searchPrinter, 10)
|
|
469
|
+
});
|
|
470
|
+
}
|
|
471
|
+
if (searchFile) {
|
|
472
|
+
query.andWhere("job.fileName LIKE :fileName", {
|
|
473
|
+
fileName: `%${searchFile}%`
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
if (startDate) {
|
|
477
|
+
query.andWhere("job.startedAt >= :startDate", {
|
|
478
|
+
startDate
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
if (endDate) {
|
|
482
|
+
query.andWhere("job.startedAt <= :endDate", {
|
|
483
|
+
endDate
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
return await query.orderBy("job.startedAt", "DESC").getMany();
|
|
487
|
+
}
|
|
488
|
+
async searchPrintJobsPaged(searchPrinter, searchFile, startDate, endDate, page = 1, pageSize = 50) {
|
|
489
|
+
const query = this.printJobRepository.createQueryBuilder("job");
|
|
490
|
+
if (searchPrinter) {
|
|
491
|
+
query.andWhere("job.printerId = :printerId", {
|
|
492
|
+
printerId: Number.parseInt(searchPrinter, 10)
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
if (searchFile) {
|
|
496
|
+
query.andWhere("job.fileName LIKE :fileName", {
|
|
497
|
+
fileName: `%${searchFile}%`
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
if (startDate) {
|
|
501
|
+
query.andWhere("job.startedAt >= :startDate", {
|
|
502
|
+
startDate
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
if (endDate) {
|
|
506
|
+
query.andWhere("job.startedAt <= :endDate", {
|
|
507
|
+
endDate
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
return await query.orderBy("job.startedAt", "DESC").skip((page - 1) * pageSize).take(pageSize).getManyAndCount();
|
|
511
|
+
}
|
|
512
|
+
async createPendingJob(printerId, fileName, metadata, printerName) {
|
|
513
|
+
const hasAnalysisData = metadata.gcodePrintTimeSeconds !== null || metadata.filamentUsedGrams !== null || metadata.totalFilamentUsedGrams !== null || metadata.layerHeight !== null || metadata.totalLayers !== null;
|
|
514
|
+
const analysisState = hasAnalysisData ? "ANALYZED" : "NOT_ANALYZED";
|
|
515
|
+
const status = "PENDING";
|
|
516
|
+
const job = this.printJobRepository.create({
|
|
517
|
+
printerId,
|
|
518
|
+
printerName: printerName || null,
|
|
519
|
+
fileName,
|
|
520
|
+
status,
|
|
521
|
+
analysisState,
|
|
522
|
+
metadata,
|
|
523
|
+
fileFormat: metadata.fileFormat,
|
|
524
|
+
fileSize: metadata.fileSize,
|
|
525
|
+
analyzedAt: hasAnalysisData ? new Date() : null
|
|
526
|
+
});
|
|
527
|
+
await this.printJobRepository.save(job);
|
|
528
|
+
this.logger.log(`Created ${analysisState.toLowerCase()} print job ${job.id} for printer ${printerId}: ${fileName} (format: ${metadata.fileFormat})`);
|
|
529
|
+
return job;
|
|
530
|
+
}
|
|
531
|
+
async triggerFileAnalysis(jobId) {
|
|
532
|
+
this.eventEmitter2.emit("printJob.needsFileDownload", {
|
|
533
|
+
jobId
|
|
534
|
+
});
|
|
535
|
+
this.logger.log(`Triggered file download and analysis for job ${jobId}`);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
//# sourceMappingURL=print-job.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/services/orm/print-job.service.ts"],"names":["PrintJobService","printJobRepository","eventEmitter2","logger","loggerFactory","typeormService","getDataSource","getRepository","PrintJob","name","getJobByIdOrFail","id","relations","job","findOne","where","NotFoundException","handleFileAnalyzed","jobId","metadata","thumbnails","Error","analysisState","analyzedAt","Date","fileFormat","save","emit","printerId","log","fileName","handlePrintStarted","printerName","existingJob","status","order","startedAt","statusReason","endedAt","warn","createdAt","create","progress","statistics","actualPrintTimeSeconds","handlePrintProgress","currentLayer","totalLayers","Math","min","max","undefined","handlePrintCompleted","actualTimeSeconds","getTime","estimatedTimeSeconds","gcodePrintTimeSeconds","toFixed","handlePrintFailed","reason","failureReason","failureTime","failedAt","handlePrintCancelled","cancelledAt","handlePrintPaused","handlePrintResumed","cleanupStaleJobs","staleJobs","find","length","getActivePrintJob","getPrintJobHistory","limit","take","markStarted","markProgress","markFinished","markFailed","updateJobMetadata","partialMetadata","debug","updatedMetadata","key","value","Object","entries","hasData","values","some","v","searchPrintJobs","searchPrinter","searchFile","startDate","endDate","query","createQueryBuilder","andWhere","Number","parseInt","orderBy","getMany","searchPrintJobsPaged","page","pageSize","skip","getManyAndCount","createPendingJob","hasAnalysisData","filamentUsedGrams","totalFilamentUsedGrams","layerHeight","fileSize","toLowerCase","triggerFileAnalysis"],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "PrinterTagService", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return PrinterTagService;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _baseservice = require("./base.service");
|
|
12
|
+
const _printertagentity = require("../../entities/printer-tag.entity");
|
|
13
|
+
const _printertagdto = require("../interfaces/printer-tag.dto");
|
|
14
|
+
const _tagentity = require("../../entities/tag.entity");
|
|
15
|
+
const _classvalidator = require("class-validator");
|
|
16
|
+
const _runtimeexceptions = require("../../exceptions/runtime.exceptions");
|
|
17
|
+
class PrinterTagService extends (0, _baseservice.BaseService)(_printertagentity.PrinterTag, _printertagdto.PrinterTagDto) {
|
|
18
|
+
tagRepository;
|
|
19
|
+
constructor(typeormService){
|
|
20
|
+
super(typeormService);
|
|
21
|
+
this.tagRepository = typeormService.getDataSource().getRepository(_tagentity.Tag);
|
|
22
|
+
}
|
|
23
|
+
async listTags() {
|
|
24
|
+
const tags = await this.tagRepository.find();
|
|
25
|
+
const tagRecords = {};
|
|
26
|
+
for (const tag of tags){
|
|
27
|
+
tagRecords[tag.id] = {
|
|
28
|
+
id: tag.id,
|
|
29
|
+
name: tag.name,
|
|
30
|
+
color: tag.color,
|
|
31
|
+
printers: []
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
for (const tag of tags){
|
|
35
|
+
tagRecords[tag.id].printers = await this.repository.findBy({
|
|
36
|
+
tagId: tag.id
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return Object.values(tagRecords);
|
|
40
|
+
}
|
|
41
|
+
async getTag(tagId) {
|
|
42
|
+
const tag = await this.tagRepository.findOneBy({
|
|
43
|
+
id: tagId
|
|
44
|
+
});
|
|
45
|
+
if (!tag) {
|
|
46
|
+
throw new _runtimeexceptions.NotFoundException("Tag does not exist");
|
|
47
|
+
}
|
|
48
|
+
return tag;
|
|
49
|
+
}
|
|
50
|
+
async getPrintersByTag(tagId) {
|
|
51
|
+
const tag = await this.getTag(tagId);
|
|
52
|
+
const printerTags = await this.repository.findBy({
|
|
53
|
+
tagId: tag.id
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
id: tag.id,
|
|
57
|
+
name: tag.name,
|
|
58
|
+
color: tag.color,
|
|
59
|
+
printers: printerTags
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
async createTag(dto) {
|
|
63
|
+
await (0, _classvalidator.validate)(dto);
|
|
64
|
+
const entity = this.tagRepository.create(dto);
|
|
65
|
+
await (0, _classvalidator.validate)(entity);
|
|
66
|
+
const tag = await this.tagRepository.save(entity);
|
|
67
|
+
return await this.getPrintersByTag(tag.id);
|
|
68
|
+
}
|
|
69
|
+
async updateTagName(tagId, name) {
|
|
70
|
+
const entity = await this.getTag(tagId);
|
|
71
|
+
const updateDto = {
|
|
72
|
+
name
|
|
73
|
+
};
|
|
74
|
+
await (0, _classvalidator.validate)(updateDto);
|
|
75
|
+
await (0, _classvalidator.validate)(Object.assign(entity, updateDto));
|
|
76
|
+
await this.tagRepository.update(entity.id, updateDto);
|
|
77
|
+
}
|
|
78
|
+
async updateTagColor(tagId, color) {
|
|
79
|
+
const entity = await this.getTag(tagId);
|
|
80
|
+
const updateDto = {
|
|
81
|
+
color
|
|
82
|
+
};
|
|
83
|
+
await (0, _classvalidator.validate)(updateDto);
|
|
84
|
+
await (0, _classvalidator.validate)(Object.assign(entity, updateDto));
|
|
85
|
+
await this.tagRepository.update(entity.id, updateDto);
|
|
86
|
+
}
|
|
87
|
+
async deleteTag(tagId) {
|
|
88
|
+
const tag = await this.getTag(tagId);
|
|
89
|
+
await this.tagRepository.delete({
|
|
90
|
+
id: tag.id
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
async addPrinterToTag(tagId, printerId) {
|
|
94
|
+
const tag = await this.getTag(tagId);
|
|
95
|
+
const alreadyExisting = await this.repository.findOneBy({
|
|
96
|
+
tagId: tag.id,
|
|
97
|
+
printerId
|
|
98
|
+
});
|
|
99
|
+
if (alreadyExisting) return alreadyExisting;
|
|
100
|
+
return await this.create({
|
|
101
|
+
tagId: tag.id,
|
|
102
|
+
printerId
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async removePrinterFromTag(tagId, printerId) {
|
|
106
|
+
await this.getTag(tagId);
|
|
107
|
+
await this.repository.delete({
|
|
108
|
+
tagId,
|
|
109
|
+
printerId
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
toDto(entity) {
|
|
113
|
+
return {
|
|
114
|
+
printerId: entity.printerId,
|
|
115
|
+
tagId: entity.tagId
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
//# sourceMappingURL=printer-tag.service.js.map
|