@fdm-monster/server 2.0.11 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.yarn/install-state.gz +0 -0
- package/.yarn/releases/{yarn-4.13.0.cjs → yarn-4.14.1.cjs} +288 -288
- package/.yarnrc.yml +5 -1
- package/README.md +2 -1
- package/RELEASE_NOTES.MD +153 -2
- package/dist/_virtual/{_@oxc-project_runtime@0.127.0 → _@oxc-project_runtime@0.129.0}/helpers/decorate.js +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.127.0 → _@oxc-project_runtime@0.129.0}/helpers/decorateMetadata.js +1 -1
- package/dist/_virtual/_virtual_controllers.js +2 -0
- package/dist/consoles/typeorm-create.js.map +1 -1
- package/dist/consoles/typeorm-generate.js.map +1 -1
- package/dist/consoles/typeorm-migrate.js.map +1 -1
- package/dist/constants/authorization.constants.js.map +1 -1
- package/dist/container.js +2 -0
- package/dist/container.js.map +1 -1
- package/dist/container.tokens.js +1 -0
- package/dist/container.tokens.js.map +1 -1
- package/dist/controllers/api-key.controller.js +72 -0
- package/dist/controllers/api-key.controller.js.map +1 -0
- package/dist/controllers/auth.controller.js +6 -4
- package/dist/controllers/auth.controller.js.map +1 -1
- package/dist/controllers/batch-call.controller.js +2 -2
- package/dist/controllers/batch-call.controller.js.map +1 -1
- package/dist/controllers/camera-stream.controller.js +2 -2
- package/dist/controllers/camera-stream.controller.js.map +1 -1
- package/dist/controllers/file-storage.controller.js +2 -2
- package/dist/controllers/file-storage.controller.js.map +1 -1
- package/dist/controllers/first-time-setup.controller.js +2 -2
- package/dist/controllers/first-time-setup.controller.js.map +1 -1
- package/dist/controllers/floor.controller.js +2 -2
- package/dist/controllers/floor.controller.js.map +1 -1
- package/dist/controllers/metrics.controller.js +2 -2
- package/dist/controllers/metrics.controller.js.map +1 -1
- package/dist/controllers/print-job.controller.js +2 -2
- package/dist/controllers/print-job.controller.js.map +1 -1
- package/dist/controllers/print-queue.controller.js +2 -2
- package/dist/controllers/print-queue.controller.js.map +1 -1
- package/dist/controllers/printer-files.controller.js +2 -2
- package/dist/controllers/printer-files.controller.js.map +1 -1
- package/dist/controllers/printer-maintenance-log.controller.js +2 -2
- package/dist/controllers/printer-maintenance-log.controller.js.map +1 -1
- package/dist/controllers/printer-settings.controller.js +2 -2
- package/dist/controllers/printer-settings.controller.js.map +1 -1
- package/dist/controllers/printer-tag.controller.js +2 -2
- package/dist/controllers/printer-tag.controller.js.map +1 -1
- package/dist/controllers/printer.controller.js +2 -2
- package/dist/controllers/printer.controller.js.map +1 -1
- package/dist/controllers/server-private.controller.js +2 -2
- package/dist/controllers/server-private.controller.js.map +1 -1
- package/dist/controllers/server-public.controller.js +2 -2
- package/dist/controllers/server-public.controller.js.map +1 -1
- package/dist/controllers/settings.controller.js +2 -2
- package/dist/controllers/settings.controller.js.map +1 -1
- package/dist/controllers/slicer-compat.controller.js +2 -2
- package/dist/controllers/slicer-compat.controller.js.map +1 -1
- package/dist/controllers/user.controller.js +2 -2
- package/dist/controllers/user.controller.js.map +1 -1
- package/dist/controllers/validation/api-key-controller.validation.js +11 -0
- package/dist/controllers/validation/api-key-controller.validation.js.map +1 -0
- package/dist/data-source.js +6 -2
- package/dist/data-source.js.map +1 -1
- package/dist/entities/api-key.entity.js +60 -0
- package/dist/entities/api-key.entity.js.map +1 -0
- package/dist/entities/camera-stream.entity.js +2 -2
- package/dist/entities/floor-position.entity.js +2 -2
- package/dist/entities/floor.entity.js +2 -2
- package/dist/entities/index.js +2 -1
- package/dist/entities/print-job.entity.js +2 -2
- package/dist/entities/printer-maintenance-log.entity.js +2 -2
- package/dist/entities/printer-tag.entity.js +2 -2
- package/dist/entities/printer.entity.js +2 -2
- package/dist/entities/refresh-token.entity.js +2 -2
- package/dist/entities/role.entity.js +2 -2
- package/dist/entities/settings.entity.js +2 -2
- package/dist/entities/tag.entity.js +2 -2
- package/dist/entities/user-role.entity.js +2 -2
- package/dist/entities/user.entity.js +2 -2
- package/dist/exceptions/failed-dependency.exception.js.map +1 -1
- package/dist/exceptions/job.exceptions.js.map +1 -1
- package/dist/exceptions/runtime.exceptions.js.map +1 -1
- package/dist/handlers/event-emitter.js.map +1 -1
- package/dist/handlers/logger-factory.js.map +1 -1
- package/dist/handlers/logger.js.map +1 -1
- package/dist/handlers/logging/file-logging.transport.js +1 -2
- package/dist/handlers/logging/file-logging.transport.js.map +1 -1
- package/dist/handlers/logging/loki-logging.transport.js.map +1 -1
- package/dist/handlers/logging/static.logger.js.map +1 -1
- package/dist/handlers/validators.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/api-key.strategy.js +45 -0
- package/dist/middleware/api-key.strategy.js.map +1 -0
- package/dist/middleware/authenticate.js.map +1 -1
- package/dist/middleware/database.js.map +1 -1
- package/dist/middleware/demo.middleware.js.map +1 -1
- package/dist/middleware/exception.filter.js.map +1 -1
- package/dist/middleware/global.middleware.js.map +1 -1
- package/dist/middleware/param-converter.middleware.js.map +1 -1
- package/dist/middleware/passport.js +3 -0
- package/dist/middleware/passport.js.map +1 -1
- package/dist/middleware/printer-resolver.js.map +1 -1
- package/dist/middleware/printer.js.map +1 -1
- package/dist/middleware/slicer-api-key.middleware.js.map +1 -1
- package/dist/middleware/socketio.middleware.js.map +1 -1
- package/dist/migrations/1706829146617-InitSqlite.js.map +1 -1
- package/dist/migrations/1707494762198-PrinterGroup.js.map +1 -1
- package/dist/migrations/1708465930665-ChangePrintCompletionDeletePrinterCascade.js.map +1 -1
- package/dist/migrations/1713300747465-ChangeRoleNameUnique.js.map +1 -1
- package/dist/migrations/1713897879622-AddPrinterType.js.map +1 -1
- package/dist/migrations/1720338804844-RemovePrinterFile.js.map +1 -1
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js.map +1 -1
- package/dist/migrations/1766576698569-DropPermissions.js.map +1 -1
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js.map +1 -1
- package/dist/migrations/1767279607392-DropCustomGcode.js.map +1 -1
- package/dist/migrations/1767291804417-DropPrintCompletions.js.map +1 -1
- package/dist/migrations/1767352862576-DropSettingsFileClean.js.map +1 -1
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js.map +1 -1
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js.map +1 -1
- package/dist/migrations/1767432108916-RenameGroupToTag.js.map +1 -1
- package/dist/migrations/1767451444137-AddPrintJob.js.map +1 -1
- package/dist/migrations/1767909428129-AddPrinterMaintenanceLog.js.map +1 -1
- package/dist/migrations/1778446203015-AddApiKey.js +49 -0
- package/dist/migrations/1778446203015-AddApiKey.js.map +1 -0
- package/dist/plugins/controllers-plugin.js.map +1 -1
- package/dist/server.constants.js +2 -1
- package/dist/server.constants.js.map +1 -1
- package/dist/server.core.js +6 -2
- package/dist/server.core.js.map +1 -1
- package/dist/server.env.js.map +1 -1
- 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.map +1 -1
- 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.map +1 -1
- package/dist/services/core/batch-call.service.js.map +1 -1
- package/dist/services/core/client-bundle.service.js.map +1 -1
- package/dist/services/core/config.service.js +4 -0
- package/dist/services/core/config.service.js.map +1 -1
- package/dist/services/core/cradle.service.js.map +1 -1
- package/dist/services/core/github.service.js.map +1 -1
- package/dist/services/core/http-client.factory.js.map +1 -1
- package/dist/services/core/logs-manager.service.js.map +1 -1
- package/dist/services/core/monsterpi.service.js.map +1 -1
- package/dist/services/core/multer.service.js.map +1 -1
- package/dist/services/core/server-release.service.js.map +1 -1
- package/dist/services/core/yaml.service.js.map +1 -1
- package/dist/services/file-analysis.service.js.map +1 -1
- package/dist/services/file-storage.service.js.map +1 -1
- package/dist/services/interfaces/api-key.dto.js +19 -0
- package/dist/services/interfaces/api-key.dto.js.map +1 -0
- package/dist/services/interfaces/api-key.service.interface.js +1 -0
- package/dist/services/interfaces/user.dto.js +2 -0
- package/dist/services/interfaces/user.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.map +1 -1
- 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.map +1 -1
- package/dist/services/octoprint/utils/api.utils.js.map +1 -1
- package/dist/services/octoprint/utils/file.utils.js.map +1 -1
- package/dist/services/octoprint/utils/octoprint-http-client.builder.js.map +1 -1
- package/dist/services/octoprint.api.js.map +1 -1
- package/dist/services/orm/api-key.service.js +90 -0
- package/dist/services/orm/api-key.service.js.map +1 -0
- 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.map +1 -1
- package/dist/services/orm/permission.service.js.map +1 -1
- package/dist/services/orm/print-job.service.js.map +1 -1
- package/dist/services/orm/printer-maintenance-log.service.js.map +1 -1
- package/dist/services/orm/printer-tag.service.js.map +1 -1
- 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.map +1 -1
- package/dist/services/orm/settings.service.js.map +1 -1
- package/dist/services/orm/user-role.service.js.map +1 -1
- package/dist/services/orm/user.service.js.map +1 -1
- package/dist/services/print-file-downloader.service.js.map +1 -1
- package/dist/services/print-queue.service.js.map +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/prusa-link-http-polling.adapter.js.map +1 -1
- package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
- package/dist/services/prusa-link/utils/digest-auth.util.js +19 -12
- package/dist/services/prusa-link/utils/digest-auth.util.js.map +1 -1
- package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js +45 -11
- package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js.map +1 -1
- package/dist/services/socket.factory.js.map +1 -1
- package/dist/services/task-manager.service.js.map +1 -1
- package/dist/services/typeorm/typeorm.service.js.map +1 -1
- package/dist/services/validators/printer-service.validation.js.map +1 -1
- package/dist/shared/default-http-client.builder.js.map +1 -1
- package/dist/shared/load-controllers.js.map +1 -1
- package/dist/shared/runtime-settings.migration.js.map +1 -1
- 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/floor.store.js.map +1 -1
- package/dist/state/printer-events.cache.js.map +1 -1
- package/dist/state/printer-socket.store.js.map +1 -1
- package/dist/state/printer-thumbnail.cache.js.map +1 -1
- package/dist/state/printer.cache.js.map +1 -1
- package/dist/state/settings.store.js.map +1 -1
- package/dist/state/socket-io.gateway.js.map +1 -1
- package/dist/state/test-printer-socket.store.js.map +1 -1
- package/dist/tasks/boot.task.js.map +1 -1
- package/dist/tasks/client-bundle.task.js.map +1 -1
- package/dist/tasks/print-job-analysis.task.js.map +1 -1
- package/dist/tasks/printer-websocket-restore.task.js.map +1 -1
- package/dist/tasks/printer-websocket.task.js.map +1 -1
- package/dist/tasks/socketio.task.js.map +1 -1
- package/dist/tasks/software-update.task.js.map +1 -1
- package/dist/tasks.js.map +1 -1
- package/dist/utils/array.util.js.map +1 -1
- package/dist/utils/bgcode/bgcode-thumbnail.parser.js.map +1 -1
- package/dist/utils/bgcode/bgcode.utils.js.map +1 -1
- package/dist/utils/bgcode/heatshrink-decoder.js.map +1 -1
- package/dist/utils/bgcode/png-encoder.js.map +1 -1
- package/dist/utils/bgcode/qoi-decoder.js.map +1 -1
- package/dist/utils/cache/key-diff.cache.js.map +1 -1
- package/dist/utils/correlation-token.util.js.map +1 -1
- package/dist/utils/crypto.utils.js.map +1 -1
- package/dist/utils/env.utils.js.map +1 -1
- package/dist/utils/error.utils.js.map +1 -1
- package/dist/utils/fs.utils.js.map +1 -1
- package/dist/utils/gcode.utils.js.map +1 -1
- package/dist/utils/image-dimensions.js.map +1 -1
- package/dist/utils/job-stats.util.js.map +1 -1
- package/dist/utils/normalize-url.js.map +1 -1
- package/dist/utils/parsers/3mf.parser.js.map +1 -1
- package/dist/utils/parsers/bgcode.parser.js.map +1 -1
- package/dist/utils/parsers/gcode.parser.js.map +1 -1
- package/dist/utils/pretty-print.utils.js.map +1 -1
- package/dist/utils/semver.utils.js.map +1 -1
- package/dist/utils/swagger/decorators.js.map +1 -1
- package/dist/utils/swagger/generator.js.map +1 -1
- package/dist/utils/swagger/swagger.js.map +1 -1
- package/dist/utils/thumbnail.util.js.map +1 -1
- package/dist/utils/time.utils.js.map +1 -1
- package/dist/utils/url.utils.js.map +1 -1
- package/package.json +17 -14
- package/packages/consoles/package.json +4 -4
package/.yarnrc.yml
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
nodeLinker: node-modules
|
|
2
2
|
|
|
3
|
-
yarnPath: .yarn/releases/yarn-4.
|
|
3
|
+
yarnPath: .yarn/releases/yarn-4.14.1.cjs
|
|
4
4
|
httpTimeout: 1000000
|
|
5
|
+
|
|
6
|
+
# Make the default explicit:
|
|
7
|
+
# Disable scripts since we don't want to run any postinstall scripts in this project
|
|
8
|
+
enableScripts: false
|
package/README.md
CHANGED
|
@@ -102,7 +102,7 @@ Thanks to the following parties for their financial support:
|
|
|
102
102
|
These are the people involved in the project. Find the meaning of the emoji keys [here](https://allcontributors.org/docs/en/emoji-key).
|
|
103
103
|
|
|
104
104
|
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
|
|
105
|
-
[](#contributors-)
|
|
106
106
|
<!-- ALL-CONTRIBUTORS-BADGE:END -->
|
|
107
107
|
|
|
108
108
|
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
|
@@ -139,6 +139,7 @@ These are the people involved in the project. Find the meaning of the emoji keys
|
|
|
139
139
|
<td align="center" valign="top" width="10%"><a href="https://github.com/nuvious"><img src="https://avatars.githubusercontent.com/u/5287736?v=4?s=40" width="40px;" alt="David Cheeseman"/><br /><sub><b>David Cheeseman</b></sub></a><br /><a href="#ideas-nuvious" title="Ideas, Planning, & Feedback">🤔</a> <a href="#platform-nuvious" title="Packaging/porting to new platform">📦</a> <a href="#infra-nuvious" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
|
|
140
140
|
<td align="center" valign="top" width="10%"><a href="https://github.com/thatguy-jaysenodell"><img src="https://avatars.githubusercontent.com/u/118288184?v=4?s=40" width="40px;" alt="That Guy Jaysen"/><br /><sub><b>That Guy Jaysen</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Athatguy-jaysenodell" title="Bug reports">🐛</a> <a href="#ideas-thatguy-jaysenodell" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/fdm-monster/fdm-monster/commits?author=thatguy-jaysenodell" title="Code">💻</a></td>
|
|
141
141
|
<td align="center" valign="top" width="10%"><a href="http://design.zagethy.com"><img src="https://avatars.githubusercontent.com/u/6075740?v=4?s=40" width="40px;" alt="Zagethy"/><br /><sub><b>Zagethy</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3AZagethy" title="Bug reports">🐛</a></td>
|
|
142
|
+
<td align="center" valign="top" width="10%"><a href="https://github.com/raykholo"><img src="https://avatars.githubusercontent.com/u/7330584?v=4?s=40" width="40px;" alt="raykholo"/><br /><sub><b>raykholo</b></sub></a><br /><a href="https://github.com/fdm-monster/fdm-monster/commits?author=raykholo" title="Code">💻</a> <a href="https://github.com/fdm-monster/fdm-monster/issues?q=author%3Araykholo" title="Bug reports">🐛</a></td>
|
|
142
143
|
</tr>
|
|
143
144
|
</tbody>
|
|
144
145
|
</table>
|
package/RELEASE_NOTES.MD
CHANGED
|
@@ -1,7 +1,155 @@
|
|
|
1
|
-
#
|
|
1
|
+
# FDM Monster 15/05/2026 2.1.1
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Features
|
|
4
|
+
|
|
5
|
+
- feat(auth): expose INSTANCE_LABEL env var on /auth/login-required response for better client-side handling of multi-instance setups
|
|
6
|
+
|
|
7
|
+
## Fixes
|
|
8
|
+
|
|
9
|
+
- Extends Digest auth for broader PrusaLink support (especially for MK2/MK3 printers with PrusaLink extension on Raspberry Pi)
|
|
10
|
+
|
|
11
|
+
## Chores
|
|
12
|
+
|
|
13
|
+
- Remove unused package Luxon, moved chalk to devDependencies
|
|
14
|
+
|
|
15
|
+
# FDM Monster 13/05/2026 2.1.0
|
|
16
|
+
|
|
17
|
+
## Features
|
|
18
|
+
|
|
19
|
+
- User-managed API keys for programmatic access with SHA-256 verification, per-user scope, and role inheritance
|
|
20
|
+
|
|
21
|
+
## Changes
|
|
22
|
+
|
|
23
|
+
- Update client to 2.4.0 with higher version constraint
|
|
24
|
+
|
|
25
|
+
# FDM Monster 19/03/2025 2.0.11
|
|
26
|
+
|
|
27
|
+
## Features
|
|
28
|
+
|
|
29
|
+
- Move to vitest, vite, viteplus and esm for modern testing and build tooling
|
|
30
|
+
|
|
31
|
+
## Fixes
|
|
32
|
+
|
|
33
|
+
- Bambu error flag now driven from gcode_state instead of stale print_error
|
|
34
|
+
- Controllers loaded using vite plugin
|
|
35
|
+
- Docker build process refactored with reusable workflows
|
|
36
|
+
|
|
37
|
+
## Chore
|
|
38
|
+
|
|
39
|
+
- Speed up PR build docker x64 only
|
|
40
|
+
|
|
41
|
+
# FDM Monster 2.0.10
|
|
42
|
+
|
|
43
|
+
## Fixes
|
|
44
|
+
|
|
45
|
+
- Reject duplicate filename uploads in central file storage (fixes #4972)
|
|
46
|
+
- Added ConflictException for 409 status code responses
|
|
47
|
+
- Refactored printer-files upload handler into focused helper methods
|
|
48
|
+
- Replaced manual error responses with proper exception classes throughout file upload endpoints
|
|
49
|
+
- The printer files load task was removed because it is no longer required
|
|
50
|
+
|
|
51
|
+
# FDM Monster 11/11/2024 1.7.2
|
|
52
|
+
|
|
53
|
+
## Fixes:
|
|
54
|
+
|
|
55
|
+
- API & Service validators: adjust max length of apiKey property validation to 43 to allow new `secrets` based OctoPrint api keys
|
|
56
|
+
|
|
57
|
+
# FDM Monster 04/11/2024 1.7.1
|
|
58
|
+
|
|
59
|
+
## Changes:
|
|
60
|
+
|
|
61
|
+
- Remove PrinterStateUpdatePollTask, it was slowing development down
|
|
62
|
+
- Stopped pushing to old davidzwa dockerhub organization
|
|
63
|
+
|
|
64
|
+
## Fixes:
|
|
65
|
+
|
|
66
|
+
- Octoprint does not require api key, but moonraker does not. Adjust API validation.
|
|
67
|
+
- Only printers which OctoPrint controlled need a USB silence check for restoring the websocket connectivity
|
|
68
|
+
- ApiKey requiredNotIf validation does not work (?)
|
|
69
|
+
- Batch service: missing implementation for batch get settings and batch connect
|
|
70
|
+
- Batch service: get and submit moonraker reprint based on history and webhooks objects
|
|
71
|
+
- Printer current state update task missed information about printer job and progress, caused null progress/job state
|
|
72
|
+
- Test connection: Moonraker adapter would not hook required events for connectivity tests
|
|
73
|
+
- Docker ARM64 release now tracks main instead of develop (and 1, 1.x and 1.x.y versions)
|
|
74
|
+
|
|
75
|
+
# FDM Monster 01/11/2024 1.7.0
|
|
76
|
+
|
|
77
|
+
## Chore:
|
|
78
|
+
|
|
79
|
+
- Workflows: upgrade github actions to node 20
|
|
80
|
+
- Introduce nock to test everything (except for octokit based tests)
|
|
81
|
+
|
|
82
|
+
## Features:
|
|
83
|
+
|
|
84
|
+
- Setting: add experimental moonraker support setting to model, validation and API endpoints
|
|
85
|
+
- Setting: expose experimental typeorm setting and adjust test
|
|
86
|
+
- Apply moonraker setting to middleware, and disable moonraker printers on disabling feature
|
|
87
|
+
- Enable moonraker printerType support
|
|
88
|
+
|
|
89
|
+
## Fixes:
|
|
90
|
+
|
|
91
|
+
- Add sourceMaps: "inline" to jest for hitting breakpoints with swc in Webstorm
|
|
92
|
+
- Printer file clean could contain extra data, skim those props off
|
|
93
|
+
- Batch reprint selection: wrong status is concluded when reprint preparation is called (OctoPrint is not available, instead of no job is selected)
|
|
94
|
+
|
|
95
|
+
# FDM Monster 12/26/2024 1.6.4
|
|
96
|
+
|
|
97
|
+
## Changes:
|
|
98
|
+
|
|
99
|
+
- Dropped printer file database table (kept the entity/schema), so FDMM "remote file" architecture can be redesigned. We're solely using in-memory cache from this point.
|
|
100
|
+
- Introduced first version of the standardized PrinterApi, the concept of multiplePrinterServices with only OctoPrint and printer type to indicate service types in the future
|
|
101
|
+
- Simplified the PrinterFile model, dropped unused properties for multi-print-service standardization in the future.
|
|
102
|
+
- Used attributes for PrinterFilesController
|
|
103
|
+
- Renamed OctoPrintApiService to OctoprintClient
|
|
104
|
+
- Switch to 1.6.x client UI version range
|
|
105
|
+
- Update Octoprint websocket with refresh interval, defaulting to 10sec. This loop will keep refresh attempts internal to the Websocket adapter of each service type (Octoprint, Moonraker, etc).
|
|
106
|
+
|
|
107
|
+
## Fixes:
|
|
108
|
+
|
|
109
|
+
- Print completion service would throw exception that correlationId was not provided (SQLite didn't like that). This error is prevented.
|
|
110
|
+
- Moonraker type printers will resort to OctoPrint implementation (edge case in development)
|
|
111
|
+
- Yaml import service will not assume printerType is provided, therefore defaulting to OctoprintType for older FDM Monster versions
|
|
112
|
+
- Reprint will now take selected job instead of scanning the unreliable file list for latest print date
|
|
4
113
|
|
|
114
|
+
# FDM Monster 14/06/2024 1.6.3
|
|
115
|
+
|
|
116
|
+
## Fixes:
|
|
117
|
+
|
|
118
|
+
- Add .yarn folder to FDM Monster release .zip file on github release
|
|
119
|
+
- SQLite: Role entity name column should be unique
|
|
120
|
+
- OctoPrint: websocket authentication would fail when multiple users are present. Fixed the username lookup with current-user OctoPrint API endpoint
|
|
121
|
+
|
|
122
|
+
## Features:
|
|
123
|
+
|
|
124
|
+
- Moonraker: prep work by modeling the moonraker api and websocket events
|
|
125
|
+
|
|
126
|
+
# FDM Monster 13/04/2024 1.6.2
|
|
127
|
+
|
|
128
|
+
## Features:
|
|
129
|
+
|
|
130
|
+
- Add GitHub Rate Limit API endpoint GET /api/server/github-rate-limit
|
|
131
|
+
- Add feature flag for GitHub Rate Limit API endpoint
|
|
132
|
+
|
|
133
|
+
## Changes:
|
|
134
|
+
|
|
135
|
+
- Dropped the permission check on /api/features as it made no sense
|
|
136
|
+
- Anonymized logging
|
|
137
|
+
- Handle OctoKit errors (ExternalServiceErrors) differently than OctoPrint errors (different HttpClient implementations). Refer to the new rate limit API and feature flag.
|
|
138
|
+
- Set default API call timeout to 10000 milliseconds (to call OctoPrint APIs)
|
|
139
|
+
|
|
140
|
+
## Fixes:
|
|
141
|
+
|
|
142
|
+
- YAML Import would fail updating properly an existing floor by floor level
|
|
143
|
+
- YAML Import has issues updating a floor, printers positions are not consistently are updated.
|
|
144
|
+
- YAML Import converted printer IDs to string, causing the printers to not show up on the printer grid until server restart. The import was done correctly on database level.
|
|
145
|
+
- Deleting a printer would remove the position of another printer, the removal was referring to the wrong position.
|
|
146
|
+
- Setting demo mode will not set wizard to be completed: first time setup will be required after setting demo mode to false.
|
|
147
|
+
- Settings: incorrect file clean shape would not throw any validation errors (SQLite only). Validation has been added for file clean on API level.
|
|
148
|
+
- Settings: make all settings API endpoints stricter by adding validation on API level. Patching is not possible anymore.
|
|
149
|
+
- Printer: add OctoPrint URL validation which parses the error with user friendly errors as result
|
|
150
|
+
|
|
151
|
+
- Add set user roles API to avoid users staying in limbo with GUEST role after verification.
|
|
152
|
+
- User API: apply consistent string number coercion in user API to avoid unexpected ID comparison
|
|
5
153
|
## Features
|
|
6
154
|
|
|
7
155
|
- Move to vitest, vite, viteplus and esm
|
|
@@ -486,3 +634,6 @@ Hotfix release
|
|
|
486
634
|
- Settings: incorrect file clean shape would not throw any validation errors (SQLite only). Validation has been added for file clean on API level.
|
|
487
635
|
- Settings: make all settings API endpoints stricter by adding validation on API level. Patching is not possible anymore.
|
|
488
636
|
- Printer: add OctoPrint URL validation which parses the error with user friendly errors as result
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region \0@oxc-project+runtime@0.
|
|
1
|
+
//#region \0@oxc-project+runtime@0.129.0/helpers/decorate.js
|
|
2
2
|
function __decorate(decorators, target, key, desc) {
|
|
3
3
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
4
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region \0@oxc-project+runtime@0.
|
|
1
|
+
//#region \0@oxc-project+runtime@0.129.0/helpers/decorateMetadata.js
|
|
2
2
|
function __decorateMetadata(k, v) {
|
|
3
3
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
4
4
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { api_key_controller_exports } from "../controllers/api-key.controller.js";
|
|
1
2
|
import { auth_controller_exports } from "../controllers/auth.controller.js";
|
|
2
3
|
import { batch_call_controller_exports } from "../controllers/batch-call.controller.js";
|
|
3
4
|
import { camera_stream_controller_exports } from "../controllers/camera-stream.controller.js";
|
|
@@ -19,6 +20,7 @@ import { slicer_compat_controller_exports } from "../controllers/slicer-compat.c
|
|
|
19
20
|
import { user_controller_exports } from "../controllers/user.controller.js";
|
|
20
21
|
//#region \0virtual:controllers
|
|
21
22
|
var _virtual_controllers_default = [
|
|
23
|
+
api_key_controller_exports,
|
|
22
24
|
auth_controller_exports,
|
|
23
25
|
batch_call_controller_exports,
|
|
24
26
|
camera_stream_controller_exports,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeorm-create.js","names":[],"sources":["../../src/consoles/typeorm-create.ts"],"sourcesContent":["import { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { camelCase } from \"typeorm/util/StringUtils\";\nimport * as readline from \"node:readline\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\n\n/**\n * Gets contents of the migration file.\n */\nfunction getTemplate(name: string, timestamp: number): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${migrationName} implements MigrationInterface {\n name = '${migrationName}'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n // TODO: Add migration queries here\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n // TODO: Add rollback queries here\n }\n\n}\n`;\n}\n\n/**\n * Gets contents of the migration file in Javascript.\n */\nfunction getJavascriptTemplate(name: string, timestamp: number): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `const { MigrationInterface, QueryRunner } = require(\"typeorm\");\n\nmodule.exports = class ${migrationName} {\n name = '${migrationName}'\n\n async up(queryRunner) {\n // TODO: Add migration queries here\n }\n\n async down(queryRunner) {\n // TODO: Add rollback queries here\n }\n}\n`;\n}\n\nasync function confirm(question: string, hint: string) {\n const line = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise<string>((resolve) => {\n line.question(question, (response) => {\n line.close();\n resolve(response);\n });\n line.write(hint);\n });\n}\n\nasync function main() {\n const timestamp = CommandUtils.getTimestamp(Date.now());\n const extension = \".ts\"; // args.outputJs ? \".js\" : \".ts\";\n\n try {\n console.log(chalk.green(`Creating empty migration file...`));\n\n let name;\n while (!name) {\n name = (await confirm(\"Please provide a name for the migration: \", \"NewMigration\"))?.trim();\n if (name) break;\n console.log(chalk.red(`Name is required, try again`));\n process.exit(1);\n }\n\n const fullPath = path.resolve(process.cwd(), `src/migrations/${name}`);\n const filename = timestamp + \"-\" + path.basename(fullPath) + extension;\n\n const fileContent = false\n ? getJavascriptTemplate(path.basename(fullPath), timestamp)\n : getTemplate(path.basename(fullPath), timestamp);\n\n const migrationFileName = path.dirname(fullPath) + \"/\" + filename;\n await CommandUtils.createFile(migrationFileName, fileContent);\n\n console.log(chalk.green(`Migration ${chalk.blue(migrationFileName)} has been generated successfully.`));\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration creation:\", err);\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":";;;;;;;;;;AAUA,SAAS,YAAY,MAAc,WAA2B;CAC5D,MAAM,gBAAgB,GAAG,UAAU,MAAM,KAAK,GAAG;
|
|
1
|
+
{"version":3,"file":"typeorm-create.js","names":[],"sources":["../../src/consoles/typeorm-create.ts"],"sourcesContent":["import { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { camelCase } from \"typeorm/util/StringUtils\";\nimport * as readline from \"node:readline\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\n\n/**\n * Gets contents of the migration file.\n */\nfunction getTemplate(name: string, timestamp: number): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${migrationName} implements MigrationInterface {\n name = '${migrationName}'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n // TODO: Add migration queries here\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n // TODO: Add rollback queries here\n }\n\n}\n`;\n}\n\n/**\n * Gets contents of the migration file in Javascript.\n */\nfunction getJavascriptTemplate(name: string, timestamp: number): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `const { MigrationInterface, QueryRunner } = require(\"typeorm\");\n\nmodule.exports = class ${migrationName} {\n name = '${migrationName}'\n\n async up(queryRunner) {\n // TODO: Add migration queries here\n }\n\n async down(queryRunner) {\n // TODO: Add rollback queries here\n }\n}\n`;\n}\n\nasync function confirm(question: string, hint: string) {\n const line = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise<string>((resolve) => {\n line.question(question, (response) => {\n line.close();\n resolve(response);\n });\n line.write(hint);\n });\n}\n\nasync function main() {\n const timestamp = CommandUtils.getTimestamp(Date.now());\n const extension = \".ts\"; // args.outputJs ? \".js\" : \".ts\";\n\n try {\n console.log(chalk.green(`Creating empty migration file...`));\n\n let name;\n while (!name) {\n name = (await confirm(\"Please provide a name for the migration: \", \"NewMigration\"))?.trim();\n if (name) break;\n console.log(chalk.red(`Name is required, try again`));\n process.exit(1);\n }\n\n const fullPath = path.resolve(process.cwd(), `src/migrations/${name}`);\n const filename = timestamp + \"-\" + path.basename(fullPath) + extension;\n\n const fileContent = false\n ? getJavascriptTemplate(path.basename(fullPath), timestamp)\n : getTemplate(path.basename(fullPath), timestamp);\n\n const migrationFileName = path.dirname(fullPath) + \"/\" + filename;\n await CommandUtils.createFile(migrationFileName, fileContent);\n\n console.log(chalk.green(`Migration ${chalk.blue(migrationFileName)} has been generated successfully.`));\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration creation:\", err);\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":";;;;;;;;;;AAUA,SAAS,YAAY,MAAc,WAA2B;CAC5D,MAAM,gBAAgB,GAAG,UAAU,MAAM,KAAK,GAAG;CAEjD,OAAO;;eAEM,cAAc;cACf,cAAc;;;;;;;;;;;;;AAoC5B,eAAe,QAAQ,UAAkB,MAAc;CACrD,MAAM,OAAO,SAAS,gBAAgB;EACpC,OAAO,QAAQ;EACf,QAAQ,QAAQ;EACjB,CAAC;CAEF,OAAO,IAAI,SAAiB,YAAY;EACtC,KAAK,SAAS,WAAW,aAAa;GACpC,KAAK,OAAO;GACZ,QAAQ,SAAS;IACjB;EACF,KAAK,MAAM,KAAK;GAChB;;AAGJ,eAAe,OAAO;CACpB,MAAM,YAAY,aAAa,aAAa,KAAK,KAAK,CAAC;CACvD,MAAM,YAAY;CAElB,IAAI;EACF,QAAQ,IAAI,MAAM,MAAM,mCAAmC,CAAC;EAE5D,IAAI;EACJ,OAAO,CAAC,MAAM;GACZ,QAAQ,MAAM,QAAQ,6CAA6C,eAAe,GAAG,MAAM;GAC3F,IAAI,MAAM;GACV,QAAQ,IAAI,MAAM,IAAI,8BAA8B,CAAC;GACrD,QAAQ,KAAK,EAAE;;EAGjB,MAAM,WAAW,KAAK,QAAQ,QAAQ,KAAK,EAAE,kBAAkB,OAAO;EACtE,MAAM,WAAW,YAAY,MAAM,KAAK,SAAS,SAAS,GAAG;EAE7D,MAAM,cAEF,YAAY,KAAK,SAAS,SAAS,EAAE,UAAU;EAEnD,MAAM,oBAAoB,KAAK,QAAQ,SAAS,GAAG,MAAM;EACzD,MAAM,aAAa,WAAW,mBAAmB,YAAY;EAE7D,QAAQ,IAAI,MAAM,MAAM,aAAa,MAAM,KAAK,kBAAkB,CAAC,mCAAmC,CAAC;UAChG,KAAK;EACZ,cAAc,UAAU,oCAAoC,IAAI;EAChE,QAAQ,KAAK,EAAE;;;AAInB,IAAI,yBAAQ,IAAI,MAAM,EAAC,SAAS;AAChC,MAAM,CAAC,WAAW;CAChB,IAAI,uBAAM,IAAI,MAAM,EAAC,SAAS;CAC9B,QAAQ,IAAI,QAAQ,MAAM,OAAO,KAAK;CAGtC,QAAQ,KAAK,EAAE;EACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeorm-generate.js","names":[],"sources":["../../src/consoles/typeorm-generate.ts"],"sourcesContent":["import { DataSource } from \"typeorm\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\nimport { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { camelCase } from \"typeorm/util/StringUtils\";\nimport { format } from \"@sqltools/formatter/lib/sqlFormatter\";\nimport * as readline from \"node:readline\";\n\n/**\n * Formats query parameters for migration queries if parameters actually exist\n */\nfunction queryParams(parameters: any[] | undefined): string {\n if (!parameters || !parameters.length) {\n return \"\";\n }\n\n return `, ${JSON.stringify(parameters)}`;\n}\n\n/**\n * Gets contents of the migration file.\n */\nfunction getTemplate(name: string, timestamp: number, upSqls: string[], downSqls: string[]): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${migrationName} implements MigrationInterface {\n name = '${migrationName}'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n${upSqls.join(`\n`)}\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n${downSqls.join(`\n`)}\n }\n\n}\n`;\n}\n\n/**\n * Gets contents of the migration file in Javascript.\n */\nfunction getJavascriptTemplate(name: string, timestamp: number, upSqls: string[], downSqls: string[]): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `const { MigrationInterface, QueryRunner } = require(\"typeorm\");\n\nmodule.exports = class ${migrationName} {\n name = '${migrationName}'\n\n async up(queryRunner) {\n${upSqls.join(`\n`)}\n }\n\n async down(queryRunner) {\n${downSqls.join(`\n`)}\n }\n}\n`;\n}\n\n/**\n *\n */\nfunction prettifyQuery(query: string) {\n const formattedQuery = format(query, { indent: \" \" });\n return \"\\n\" + formattedQuery.replace(/^/gm, \" \") + \"\\n \";\n}\n\nasync function confirm(question: string, hint: string) {\n const line = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise<string>((resolve) => {\n line.question(question, (response) => {\n line.close();\n resolve(response);\n });\n line.write(hint);\n });\n}\n\nasync function main() {\n const timestamp = CommandUtils.getTimestamp(Date.now());\n const extension = \".ts\"; // args.outputJs ? \".js\" : \".ts\";\n\n let dataSource: DataSource | undefined = undefined;\n try {\n dataSource = await CommandUtils.loadDataSource(path.resolve(process.cwd(), \"dist/data-source.js\"));\n dataSource.setOptions({\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n logging: false,\n });\n await dataSource.initialize();\n\n const hasPendingMigrations = await dataSource.showMigrations();\n if (hasPendingMigrations) {\n console.log(\n chalk.yellow(\n `ATTENTION: you have pending migrations (${chalk.blue(\n hasPendingMigrations,\n )}). Running those first, before generating a new migration.`,\n ),\n );\n\n await dataSource.runMigrations({ transaction: \"each\" });\n\n console.log(chalk.green(`Migrations successfully executed.`));\n }\n\n const upSqls: string[] = [],\n downSqls: string[] = [];\n\n try {\n const sqlInMemory = await dataSource.driver.createSchemaBuilder().log();\n\n if (true) {\n sqlInMemory.upQueries.forEach((upQuery) => {\n upQuery.query = prettifyQuery(upQuery.query);\n });\n sqlInMemory.downQueries.forEach((downQuery) => {\n downQuery.query = prettifyQuery(downQuery.query);\n });\n }\n\n sqlInMemory.upQueries.forEach((upQuery) => {\n upSqls.push(\n \" await queryRunner.query(`\" +\n upQuery.query.replace(new RegExp(\"`\", \"g\"), \"\\\\`\") +\n \"`\" +\n queryParams(upQuery.parameters) +\n \");\",\n );\n });\n sqlInMemory.downQueries.forEach((downQuery) => {\n downSqls.push(\n \" await queryRunner.query(`\" +\n downQuery.query.replace(new RegExp(\"`\", \"g\"), \"\\\\`\") +\n \"`\" +\n queryParams(downQuery.parameters) +\n \");\",\n );\n });\n } finally {\n await dataSource.destroy();\n }\n\n if (!upSqls.length) {\n console.log(chalk.green(`No changes in database schema were found`));\n process.exit(0);\n }\n\n console.log(chalk.green(`Migration ready to be saved...`));\n\n console.log(chalk.blue(upSqls.map((s) => s).join(\"\\n\")));\n\n let name;\n while (!name) {\n name = (await confirm(\"Please provide a name for the migration: \", \"Change\"))?.trim();\n if (name) break;\n console.log(chalk.red(`Name is required, try again`));\n process.exit(1);\n }\n\n const fullPath = path.resolve(process.cwd(), `src/migrations/${name}`);\n const filename = timestamp + \"-\" + path.basename(fullPath) + extension;\n\n const fileContent = false\n ? getJavascriptTemplate(path.basename(fullPath), timestamp, upSqls, downSqls.reverse())\n : getTemplate(path.basename(fullPath), timestamp, upSqls, downSqls.reverse());\n\n const migrationFileName = path.dirname(fullPath) + \"/\" + filename;\n await CommandUtils.createFile(migrationFileName, fileContent);\n\n console.log(chalk.green(`Migration ${chalk.blue(migrationFileName)} has been generated successfully.`));\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration generation:\", err);\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":";;;;;;;;;;;AAYA,SAAS,YAAY,YAAuC;
|
|
1
|
+
{"version":3,"file":"typeorm-generate.js","names":[],"sources":["../../src/consoles/typeorm-generate.ts"],"sourcesContent":["import { DataSource } from \"typeorm\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\nimport { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { camelCase } from \"typeorm/util/StringUtils\";\nimport { format } from \"@sqltools/formatter/lib/sqlFormatter\";\nimport * as readline from \"node:readline\";\n\n/**\n * Formats query parameters for migration queries if parameters actually exist\n */\nfunction queryParams(parameters: any[] | undefined): string {\n if (!parameters || !parameters.length) {\n return \"\";\n }\n\n return `, ${JSON.stringify(parameters)}`;\n}\n\n/**\n * Gets contents of the migration file.\n */\nfunction getTemplate(name: string, timestamp: number, upSqls: string[], downSqls: string[]): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `import { MigrationInterface, QueryRunner } from \"typeorm\";\n\nexport class ${migrationName} implements MigrationInterface {\n name = '${migrationName}'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n${upSqls.join(`\n`)}\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n${downSqls.join(`\n`)}\n }\n\n}\n`;\n}\n\n/**\n * Gets contents of the migration file in Javascript.\n */\nfunction getJavascriptTemplate(name: string, timestamp: number, upSqls: string[], downSqls: string[]): string {\n const migrationName = `${camelCase(name, true)}${timestamp}`;\n\n return `const { MigrationInterface, QueryRunner } = require(\"typeorm\");\n\nmodule.exports = class ${migrationName} {\n name = '${migrationName}'\n\n async up(queryRunner) {\n${upSqls.join(`\n`)}\n }\n\n async down(queryRunner) {\n${downSqls.join(`\n`)}\n }\n}\n`;\n}\n\n/**\n *\n */\nfunction prettifyQuery(query: string) {\n const formattedQuery = format(query, { indent: \" \" });\n return \"\\n\" + formattedQuery.replace(/^/gm, \" \") + \"\\n \";\n}\n\nasync function confirm(question: string, hint: string) {\n const line = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise<string>((resolve) => {\n line.question(question, (response) => {\n line.close();\n resolve(response);\n });\n line.write(hint);\n });\n}\n\nasync function main() {\n const timestamp = CommandUtils.getTimestamp(Date.now());\n const extension = \".ts\"; // args.outputJs ? \".js\" : \".ts\";\n\n let dataSource: DataSource | undefined = undefined;\n try {\n dataSource = await CommandUtils.loadDataSource(path.resolve(process.cwd(), \"dist/data-source.js\"));\n dataSource.setOptions({\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n logging: false,\n });\n await dataSource.initialize();\n\n const hasPendingMigrations = await dataSource.showMigrations();\n if (hasPendingMigrations) {\n console.log(\n chalk.yellow(\n `ATTENTION: you have pending migrations (${chalk.blue(\n hasPendingMigrations,\n )}). Running those first, before generating a new migration.`,\n ),\n );\n\n await dataSource.runMigrations({ transaction: \"each\" });\n\n console.log(chalk.green(`Migrations successfully executed.`));\n }\n\n const upSqls: string[] = [],\n downSqls: string[] = [];\n\n try {\n const sqlInMemory = await dataSource.driver.createSchemaBuilder().log();\n\n if (true) {\n sqlInMemory.upQueries.forEach((upQuery) => {\n upQuery.query = prettifyQuery(upQuery.query);\n });\n sqlInMemory.downQueries.forEach((downQuery) => {\n downQuery.query = prettifyQuery(downQuery.query);\n });\n }\n\n sqlInMemory.upQueries.forEach((upQuery) => {\n upSqls.push(\n \" await queryRunner.query(`\" +\n upQuery.query.replace(new RegExp(\"`\", \"g\"), \"\\\\`\") +\n \"`\" +\n queryParams(upQuery.parameters) +\n \");\",\n );\n });\n sqlInMemory.downQueries.forEach((downQuery) => {\n downSqls.push(\n \" await queryRunner.query(`\" +\n downQuery.query.replace(new RegExp(\"`\", \"g\"), \"\\\\`\") +\n \"`\" +\n queryParams(downQuery.parameters) +\n \");\",\n );\n });\n } finally {\n await dataSource.destroy();\n }\n\n if (!upSqls.length) {\n console.log(chalk.green(`No changes in database schema were found`));\n process.exit(0);\n }\n\n console.log(chalk.green(`Migration ready to be saved...`));\n\n console.log(chalk.blue(upSqls.map((s) => s).join(\"\\n\")));\n\n let name;\n while (!name) {\n name = (await confirm(\"Please provide a name for the migration: \", \"Change\"))?.trim();\n if (name) break;\n console.log(chalk.red(`Name is required, try again`));\n process.exit(1);\n }\n\n const fullPath = path.resolve(process.cwd(), `src/migrations/${name}`);\n const filename = timestamp + \"-\" + path.basename(fullPath) + extension;\n\n const fileContent = false\n ? getJavascriptTemplate(path.basename(fullPath), timestamp, upSqls, downSqls.reverse())\n : getTemplate(path.basename(fullPath), timestamp, upSqls, downSqls.reverse());\n\n const migrationFileName = path.dirname(fullPath) + \"/\" + filename;\n await CommandUtils.createFile(migrationFileName, fileContent);\n\n console.log(chalk.green(`Migration ${chalk.blue(migrationFileName)} has been generated successfully.`));\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration generation:\", err);\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeorm-migrate.js","names":[],"sources":["../../src/consoles/typeorm-migrate.ts"],"sourcesContent":["import { DataSource } from \"typeorm\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\nimport { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"path\";\n\nasync function main() {\n let dataSource: DataSource | undefined = undefined;\n try {\n dataSource = await CommandUtils.loadDataSource(path.resolve(process.cwd(), \"dist/data-source.js\"));\n dataSource.setOptions({\n subscribers: [],\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n logging: [\"query\", \"error\", \"schema\"],\n });\n await dataSource.initialize();\n\n const options = {\n transaction: dataSource.options.migrationsTransactionMode ?? (\"all\" as \"all\" | \"none\" | \"each\"),\n // fake: !!args.f,\n };\n options.transaction = \"all\";\n\n await dataSource.runMigrations(options);\n await dataSource.destroy();\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration run:\", err);\n\n if (dataSource && dataSource.isInitialized) await dataSource.destroy();\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":";;;;AAKA,eAAe,OAAO;CACpB,IAAI,aAAqC,KAAA;
|
|
1
|
+
{"version":3,"file":"typeorm-migrate.js","names":[],"sources":["../../src/consoles/typeorm-migrate.ts"],"sourcesContent":["import { DataSource } from \"typeorm\";\nimport { PlatformTools } from \"typeorm/platform/PlatformTools\";\nimport { CommandUtils } from \"typeorm/commands/CommandUtils\";\nimport path from \"path\";\n\nasync function main() {\n let dataSource: DataSource | undefined = undefined;\n try {\n dataSource = await CommandUtils.loadDataSource(path.resolve(process.cwd(), \"dist/data-source.js\"));\n dataSource.setOptions({\n subscribers: [],\n synchronize: false,\n migrationsRun: false,\n dropSchema: false,\n logging: [\"query\", \"error\", \"schema\"],\n });\n await dataSource.initialize();\n\n const options = {\n transaction: dataSource.options.migrationsTransactionMode ?? (\"all\" as \"all\" | \"none\" | \"each\"),\n // fake: !!args.f,\n };\n options.transaction = \"all\";\n\n await dataSource.runMigrations(options);\n await dataSource.destroy();\n } catch (err) {\n PlatformTools.logCmdErr(\"Error during migration run:\", err);\n\n if (dataSource && dataSource.isInitialized) await dataSource.destroy();\n process.exit(1);\n }\n}\n\nlet start = new Date().getTime();\nmain().then(() => {\n let end = new Date().getTime();\n console.log(\"done\", end - start, \"ms\");\n\n // exit process if no errors\n process.exit(0);\n});\n"],"mappings":";;;;AAKA,eAAe,OAAO;CACpB,IAAI,aAAqC,KAAA;CACzC,IAAI;EACF,aAAa,MAAM,aAAa,eAAe,KAAK,QAAQ,QAAQ,KAAK,EAAE,sBAAsB,CAAC;EAClG,WAAW,WAAW;GACpB,aAAa,EAAE;GACf,aAAa;GACb,eAAe;GACf,YAAY;GACZ,SAAS;IAAC;IAAS;IAAS;IAAS;GACtC,CAAC;EACF,MAAM,WAAW,YAAY;EAE7B,MAAM,UAAU,EACd,aAAa,WAAW,QAAQ,6BAA8B,OAE/D;EACD,QAAQ,cAAc;EAEtB,MAAM,WAAW,cAAc,QAAQ;EACvC,MAAM,WAAW,SAAS;UACnB,KAAK;EACZ,cAAc,UAAU,+BAA+B,IAAI;EAE3D,IAAI,cAAc,WAAW,eAAe,MAAM,WAAW,SAAS;EACtE,QAAQ,KAAK,EAAE;;;AAInB,IAAI,yBAAQ,IAAI,MAAM,EAAC,SAAS;AAChC,MAAM,CAAC,WAAW;CAChB,IAAI,uBAAM,IAAI,MAAM,EAAC,SAAS;CAC9B,QAAQ,IAAI,QAAQ,MAAM,OAAO,KAAK;CAGtC,QAAQ,KAAK,EAAE;EACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorization.constants.js","names":[],"sources":["../../src/constants/authorization.constants.ts"],"sourcesContent":["export const AUTH_ERROR_REASON = {\n // Before login\n IncorrectCredentials: \"IncorrectCredentials\",\n InvalidOrExpiredRefreshToken: \"InvalidOrExpiredRefreshToken\",\n InvalidOrExpiredAuthToken: \"InvalidOrExpiredAuthToken\",\n PasswordChangeRequired: \"PasswordChangeRequired\",\n LoginRequired: \"LoginRequired\",\n AccountNotVerified: \"AccountNotVerified\",\n};\n\nexport const PERM_GROUP = {\n PrinterFiles: \"PrinterFiles\",\n PrinterSettings: \"PrinterSettings\",\n Jobs: \"Jobs\",\n Floors: \"Floors\",\n ServerInfo: \"ServerInfo\",\n PrinterMaintenanceLog: \"PrinterMaintenanceLog\",\n} as const;\n\nexport type PermissionGroup = (typeof PERM_GROUP)[keyof typeof PERM_GROUP];\n\nexport const PERMS = {\n [PERM_GROUP.PrinterFiles]: {\n Default: \"PrinterFiles.Default\",\n Get: \"PrinterFiles.Get\",\n Delete: \"PrinterFiles.Delete\",\n Clear: \"PrinterFiles.Clear\",\n Upload: \"PrinterFiles.Upload\",\n Actions: \"PrinterFiles.Actions\",\n },\n [PERM_GROUP.Jobs]: {\n Default: \"Jobs.Default\",\n List: \"Jobs.List\",\n },\n [PERM_GROUP.Floors]: {\n Default: \"Floors.Default\",\n List: \"Floors.List\",\n Get: \"Floors.Get\",\n Create: \"Floors.Create\",\n Update: \"Floors.Update\",\n Delete: \"Floors.Delete\",\n },\n [PERM_GROUP.PrinterSettings]: {\n Default: \"PrinterSettings.Default\",\n Get: \"PrinterSettings.Get\",\n },\n [PERM_GROUP.ServerInfo]: {\n Default: \"ServerInfo.Default\",\n Get: \"ServerInfo.Get\",\n },\n [PERM_GROUP.PrinterMaintenanceLog]: {\n Default: \"PrinterMaintenanceLog.Default\",\n List: \"PrinterMaintenanceLog.List\",\n Get: \"PrinterMaintenanceLog.Get\",\n Create: \"PrinterMaintenanceLog.Create\",\n Complete: \"PrinterMaintenanceLog.Complete\",\n Delete: \"PrinterMaintenanceLog.Delete\",\n },\n} as const;\n\ntype ExtractPerms<T> = T extends Record<string, string> ? T[keyof T] : never;\ntype PermsType = typeof PERMS;\nexport type PermissionName = ExtractPerms<PermsType[keyof PermsType]>;\n\nexport function flattenPermissionDefinition(): PermissionName[] {\n const permissions: PermissionName[] = [];\n for (const key of Object.values(PERM_GROUP)) {\n for (const permissionName of Object.values(PERMS[key])) {\n permissions.push(permissionName);\n }\n }\n return permissions;\n}\n\nexport function allPerms(group: PermissionGroup): PermissionName[] {\n if (!group || !PERMS[group]) throw new Error(`Permission group name '${group}' was not found`);\n return Object.values(PERMS[group]) as PermissionName[];\n}\n\nexport const ROLES = {\n ADMIN: \"ADMIN\",\n OPERATOR: \"OPERATOR\",\n GUEST: \"GUEST\",\n} as const;\n\nexport type RoleName = (typeof ROLES)[keyof typeof ROLES];\n\nexport const ROLE_PERMS: Record<RoleName, PermissionName[]> = {\n [ROLES.ADMIN]: [\n ...new Set([\n ...allPerms(PERM_GROUP.Jobs),\n ...allPerms(PERM_GROUP.Floors),\n ...allPerms(PERM_GROUP.PrinterFiles),\n ...allPerms(PERM_GROUP.PrinterSettings),\n ...allPerms(PERM_GROUP.ServerInfo),\n ...allPerms(PERM_GROUP.PrinterMaintenanceLog),\n ]),\n ],\n [ROLES.OPERATOR]: [\n ...new Set([\n ...allPerms(PERM_GROUP.Jobs),\n ...allPerms(PERM_GROUP.Floors),\n ...allPerms(PERM_GROUP.PrinterFiles),\n ...allPerms(PERM_GROUP.PrinterSettings),\n ...allPerms(PERM_GROUP.PrinterMaintenanceLog),\n ]),\n ],\n [ROLES.GUEST]: [],\n};\n"],"mappings":";AAAA,MAAa,oBAAoB;CAE/B,sBAAsB;CACtB,8BAA8B;CAC9B,2BAA2B;CAC3B,wBAAwB;CACxB,eAAe;CACf,oBAAoB;CACrB;AAED,MAAa,aAAa;CACxB,cAAc;CACd,iBAAiB;CACjB,MAAM;CACN,QAAQ;CACR,YAAY;CACZ,uBAAuB;CACxB;AAID,MAAa,QAAQ;EAClB,WAAW,eAAe;EACzB,SAAS;EACT,KAAK;EACL,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,SAAS;EACV;EACA,WAAW,OAAO;EACjB,SAAS;EACT,MAAM;EACP;EACA,WAAW,SAAS;EACnB,SAAS;EACT,MAAM;EACN,KAAK;EACL,QAAQ;EACR,QAAQ;EACR,QAAQ;EACT;EACA,WAAW,kBAAkB;EAC5B,SAAS;EACT,KAAK;EACN;EACA,WAAW,aAAa;EACvB,SAAS;EACT,KAAK;EACN;EACA,WAAW,wBAAwB;EAClC,SAAS;EACT,MAAM;EACN,KAAK;EACL,QAAQ;EACR,UAAU;EACV,QAAQ;EACT;CACF;AAMD,SAAgB,8BAAgD;CAC9D,MAAM,cAAgC,EAAE;
|
|
1
|
+
{"version":3,"file":"authorization.constants.js","names":[],"sources":["../../src/constants/authorization.constants.ts"],"sourcesContent":["export const AUTH_ERROR_REASON = {\n // Before login\n IncorrectCredentials: \"IncorrectCredentials\",\n InvalidOrExpiredRefreshToken: \"InvalidOrExpiredRefreshToken\",\n InvalidOrExpiredAuthToken: \"InvalidOrExpiredAuthToken\",\n PasswordChangeRequired: \"PasswordChangeRequired\",\n LoginRequired: \"LoginRequired\",\n AccountNotVerified: \"AccountNotVerified\",\n};\n\nexport const PERM_GROUP = {\n PrinterFiles: \"PrinterFiles\",\n PrinterSettings: \"PrinterSettings\",\n Jobs: \"Jobs\",\n Floors: \"Floors\",\n ServerInfo: \"ServerInfo\",\n PrinterMaintenanceLog: \"PrinterMaintenanceLog\",\n} as const;\n\nexport type PermissionGroup = (typeof PERM_GROUP)[keyof typeof PERM_GROUP];\n\nexport const PERMS = {\n [PERM_GROUP.PrinterFiles]: {\n Default: \"PrinterFiles.Default\",\n Get: \"PrinterFiles.Get\",\n Delete: \"PrinterFiles.Delete\",\n Clear: \"PrinterFiles.Clear\",\n Upload: \"PrinterFiles.Upload\",\n Actions: \"PrinterFiles.Actions\",\n },\n [PERM_GROUP.Jobs]: {\n Default: \"Jobs.Default\",\n List: \"Jobs.List\",\n },\n [PERM_GROUP.Floors]: {\n Default: \"Floors.Default\",\n List: \"Floors.List\",\n Get: \"Floors.Get\",\n Create: \"Floors.Create\",\n Update: \"Floors.Update\",\n Delete: \"Floors.Delete\",\n },\n [PERM_GROUP.PrinterSettings]: {\n Default: \"PrinterSettings.Default\",\n Get: \"PrinterSettings.Get\",\n },\n [PERM_GROUP.ServerInfo]: {\n Default: \"ServerInfo.Default\",\n Get: \"ServerInfo.Get\",\n },\n [PERM_GROUP.PrinterMaintenanceLog]: {\n Default: \"PrinterMaintenanceLog.Default\",\n List: \"PrinterMaintenanceLog.List\",\n Get: \"PrinterMaintenanceLog.Get\",\n Create: \"PrinterMaintenanceLog.Create\",\n Complete: \"PrinterMaintenanceLog.Complete\",\n Delete: \"PrinterMaintenanceLog.Delete\",\n },\n} as const;\n\ntype ExtractPerms<T> = T extends Record<string, string> ? T[keyof T] : never;\ntype PermsType = typeof PERMS;\nexport type PermissionName = ExtractPerms<PermsType[keyof PermsType]>;\n\nexport function flattenPermissionDefinition(): PermissionName[] {\n const permissions: PermissionName[] = [];\n for (const key of Object.values(PERM_GROUP)) {\n for (const permissionName of Object.values(PERMS[key])) {\n permissions.push(permissionName);\n }\n }\n return permissions;\n}\n\nexport function allPerms(group: PermissionGroup): PermissionName[] {\n if (!group || !PERMS[group]) throw new Error(`Permission group name '${group}' was not found`);\n return Object.values(PERMS[group]) as PermissionName[];\n}\n\nexport const ROLES = {\n ADMIN: \"ADMIN\",\n OPERATOR: \"OPERATOR\",\n GUEST: \"GUEST\",\n} as const;\n\nexport type RoleName = (typeof ROLES)[keyof typeof ROLES];\n\nexport const ROLE_PERMS: Record<RoleName, PermissionName[]> = {\n [ROLES.ADMIN]: [\n ...new Set([\n ...allPerms(PERM_GROUP.Jobs),\n ...allPerms(PERM_GROUP.Floors),\n ...allPerms(PERM_GROUP.PrinterFiles),\n ...allPerms(PERM_GROUP.PrinterSettings),\n ...allPerms(PERM_GROUP.ServerInfo),\n ...allPerms(PERM_GROUP.PrinterMaintenanceLog),\n ]),\n ],\n [ROLES.OPERATOR]: [\n ...new Set([\n ...allPerms(PERM_GROUP.Jobs),\n ...allPerms(PERM_GROUP.Floors),\n ...allPerms(PERM_GROUP.PrinterFiles),\n ...allPerms(PERM_GROUP.PrinterSettings),\n ...allPerms(PERM_GROUP.PrinterMaintenanceLog),\n ]),\n ],\n [ROLES.GUEST]: [],\n};\n"],"mappings":";AAAA,MAAa,oBAAoB;CAE/B,sBAAsB;CACtB,8BAA8B;CAC9B,2BAA2B;CAC3B,wBAAwB;CACxB,eAAe;CACf,oBAAoB;CACrB;AAED,MAAa,aAAa;CACxB,cAAc;CACd,iBAAiB;CACjB,MAAM;CACN,QAAQ;CACR,YAAY;CACZ,uBAAuB;CACxB;AAID,MAAa,QAAQ;EAClB,WAAW,eAAe;EACzB,SAAS;EACT,KAAK;EACL,QAAQ;EACR,OAAO;EACP,QAAQ;EACR,SAAS;EACV;EACA,WAAW,OAAO;EACjB,SAAS;EACT,MAAM;EACP;EACA,WAAW,SAAS;EACnB,SAAS;EACT,MAAM;EACN,KAAK;EACL,QAAQ;EACR,QAAQ;EACR,QAAQ;EACT;EACA,WAAW,kBAAkB;EAC5B,SAAS;EACT,KAAK;EACN;EACA,WAAW,aAAa;EACvB,SAAS;EACT,KAAK;EACN;EACA,WAAW,wBAAwB;EAClC,SAAS;EACT,MAAM;EACN,KAAK;EACL,QAAQ;EACR,UAAU;EACV,QAAQ;EACT;CACF;AAMD,SAAgB,8BAAgD;CAC9D,MAAM,cAAgC,EAAE;CACxC,KAAK,MAAM,OAAO,OAAO,OAAO,WAAW,EACzC,KAAK,MAAM,kBAAkB,OAAO,OAAO,MAAM,KAAK,EACpD,YAAY,KAAK,eAAe;CAGpC,OAAO;;AAGT,SAAgB,SAAS,OAA0C;CACjE,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,MAAM,IAAI,MAAM,0BAA0B,MAAM,iBAAiB;CAC9F,OAAO,OAAO,OAAO,MAAM,OAAO;;AAGpC,MAAa,QAAQ;CACnB,OAAO;CACP,UAAU;CACV,OAAO;CACR;AAID,MAAa,aAAiD;EAC3D,MAAM,QAAQ,CACb,GAAG,IAAI,IAAI;EACT,GAAG,SAAS,WAAW,KAAK;EAC5B,GAAG,SAAS,WAAW,OAAO;EAC9B,GAAG,SAAS,WAAW,aAAa;EACpC,GAAG,SAAS,WAAW,gBAAgB;EACvC,GAAG,SAAS,WAAW,WAAW;EAClC,GAAG,SAAS,WAAW,sBAAsB;EAC9C,CAAC,CACH;EACA,MAAM,WAAW,CAChB,GAAG,IAAI,IAAI;EACT,GAAG,SAAS,WAAW,KAAK;EAC5B,GAAG,SAAS,WAAW,OAAO;EAC9B,GAAG,SAAS,WAAW,aAAa;EACpC,GAAG,SAAS,WAAW,gBAAgB;EACvC,GAAG,SAAS,WAAW,sBAAsB;EAC9C,CAAC,CACH;EACA,MAAM,QAAQ,EAAE;CAClB"}
|
package/dist/container.js
CHANGED
|
@@ -47,6 +47,7 @@ import { CameraStreamService } from "./services/orm/camera-stream.service.js";
|
|
|
47
47
|
import { JwtService } from "./services/authentication/jwt.service.js";
|
|
48
48
|
import { AuthService } from "./services/authentication/auth.service.js";
|
|
49
49
|
import { RefreshTokenService } from "./services/orm/refresh-token.service.js";
|
|
50
|
+
import { ApiKeyService } from "./services/orm/api-key.service.js";
|
|
50
51
|
import { SettingsService } from "./services/orm/settings.service.js";
|
|
51
52
|
import { FloorService } from "./services/orm/floor.service.js";
|
|
52
53
|
import { FloorPositionService } from "./services/orm/floor-position.service.js";
|
|
@@ -92,6 +93,7 @@ function configureContainer() {
|
|
|
92
93
|
[di.printerMaintenanceLogService]: asClass(PrinterMaintenanceLogService),
|
|
93
94
|
[di.printerTagService]: asClass(PrinterTagService),
|
|
94
95
|
[di.refreshTokenService]: asClass(RefreshTokenService).singleton(),
|
|
96
|
+
[di.apiKeyService]: asClass(ApiKeyService).singleton(),
|
|
95
97
|
[di.userService]: asClass(UserService).singleton(),
|
|
96
98
|
[di.userRoleService]: asClass(UserRoleService).singleton(),
|
|
97
99
|
[di.roleService]: asClass(RoleService).singleton(),
|
package/dist/container.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","names":[],"sources":["../src/container.ts"],"sourcesContent":["import { Octokit } from \"octokit\";\nimport { asClass, asFunction, asValue, createContainer, InjectionMode } from \"awilix\";\nimport { ToadScheduler } from \"toad-scheduler\";\nimport { DITokens } from \"./container.tokens\";\nimport { PrinterService } from \"./services/orm/printer.service\";\nimport { PrinterMaintenanceLogService } from \"./services/orm/printer-maintenance-log.service\";\nimport { SettingsStore } from \"./state/settings.store\";\nimport { ServerReleaseService } from \"./services/core/server-release.service\";\nimport { TaskManagerService } from \"./services/task-manager.service\";\nimport { GithubService } from \"./services/core/github.service\";\nimport { PrinterWebsocketTask } from \"./tasks/printer-websocket.task\";\nimport { SocketIoTask } from \"./tasks/socketio.task\";\nimport { SocketFactory } from \"./services/socket.factory\";\nimport { configureEventEmitter } from \"./handlers/event-emitter\";\nimport { AppConstants } from \"./server.constants\";\nimport { SoftwareUpdateTask } from \"./tasks/software-update.task\";\nimport { LoggerFactory } from \"./handlers/logger-factory\";\nimport { MulterService } from \"./services/core/multer.service\";\nimport { FileUploadTrackerCache } from \"./state/file-upload-tracker.cache\";\nimport { ServerHost } from \"./server.host\";\nimport { BootTask } from \"./tasks/boot.task\";\nimport { UserService } from \"./services/orm/user.service\";\nimport { RoleService } from \"./services/orm/role.service\";\nimport { PermissionService } from \"./services/orm/permission.service\";\nimport { ROLES } from \"./constants/authorization.constants\";\nimport { PrinterWebsocketRestoreTask } from \"./tasks/printer-websocket-restore.task\";\nimport { ConfigService, type IConfigService } from \"./services/core/config.service\";\nimport { SocketIoGateway } from \"./state/socket-io.gateway\";\nimport { ClientBundleService } from \"./services/core/client-bundle.service\";\nimport { FloorStore } from \"./state/floor.store\";\nimport { YamlService } from \"./services/core/yaml.service\";\nimport { MonsterPiService } from \"./services/core/monsterpi.service\";\nimport { BatchCallService } from \"./services/core/batch-call.service\";\nimport { ClientDistDownloadTask } from \"./tasks/client-bundle.task\";\nimport { OctoprintWebsocketAdapter } from \"./services/octoprint/octoprint-websocket.adapter\";\nimport { PrinterCache } from \"./state/printer.cache\";\nimport { PrinterSocketStore } from \"./state/printer-socket.store\";\nimport { TestPrinterSocketStore } from \"./state/test-printer-socket.store\";\nimport { PrinterEventsCache } from \"./state/printer-events.cache\";\nimport { LogDumpService } from \"./services/core/logs-manager.service\";\nimport { CameraStreamService } from \"./services/orm/camera-stream.service\";\nimport { JwtService } from \"./services/authentication/jwt.service\";\nimport { AuthService } from \"./services/authentication/auth.service\";\nimport { throttling, ThrottlingOptions } from \"@octokit/plugin-throttling\";\nimport { RefreshTokenService } from \"@/services/orm/refresh-token.service\";\nimport { SettingsService } from \"@/services/orm/settings.service\";\nimport { FloorService } from \"@/services/orm/floor.service\";\nimport { FloorPositionService } from \"@/services/orm/floor-position.service\";\nimport { ExceptionFilter } from \"@/middleware/exception.filter\";\nimport { TypeormService } from \"@/services/typeorm/typeorm.service\";\nimport { UserRoleService } from \"@/services/orm/user-role.service\";\nimport { PrinterTagService } from \"@/services/orm/printer-tag.service\";\nimport { MoonrakerClient } from \"@/services/moonraker/moonraker.client\";\nimport { MoonrakerWebsocketAdapter } from \"@/services/moonraker/moonraker-websocket.adapter\";\nimport { OctoprintApi } from \"@/services/octoprint.api\";\nimport { OctoprintClient } from \"@/services/octoprint/octoprint.client\";\nimport { MoonrakerApi } from \"@/services/moonraker.api\";\nimport { PrinterApiFactory } from \"@/services/printer-api.factory\";\nimport { PrinterThumbnailCache } from \"@/state/printer-thumbnail.cache\";\nimport { HttpClientFactory } from \"@/services/core/http-client.factory\";\nimport { CradleService } from \"@/services/core/cradle.service\";\nimport { PrusaLinkApi } from \"@/services/prusa-link/prusa-link.api\";\nimport { PrusaLinkHttpPollingAdapter } from \"@/services/prusa-link/prusa-link-http-polling.adapter\";\nimport { BambuClient } from \"@/services/bambu/bambu.client\";\nimport { BambuMqttAdapter } from \"@/services/bambu/bambu-mqtt.adapter\";\nimport { BambuFtpAdapter } from \"@/services/bambu/bambu-ftp.adapter\";\nimport { BambuApi } from \"@/services/bambu.api\";\nimport { PrintQueueService } from \"@/services/print-queue.service\";\nimport { FileStorageService } from \"@/services/file-storage.service\";\nimport { PrintJobService } from \"@/services/orm/print-job.service\";\nimport { FileAnalysisService } from \"@/services/file-analysis.service\";\nimport { PrintJobAnalysisTask } from \"@/tasks/print-job-analysis.task\";\nimport { PrintFileDownloaderService } from \"@/services/print-file-downloader.service\";\n\nexport function configureContainer() {\n const container = createContainer({\n injectionMode: InjectionMode.CLASSIC,\n });\n\n const di = DITokens;\n\n container.register({\n // -- asValue/asFunction constants --\n [di.appDefaultRole]: asValue(ROLES.GUEST),\n [di.appDefaultRoleNoLogin]: asValue(ROLES.ADMIN),\n [di.serverVersion]: asFunction(() => {\n return process.env[AppConstants.VERSION_KEY];\n }),\n [di.cradleService]: asClass(CradleService).inject((container) => ({ container })),\n [di.socketFactory]: asClass(SocketFactory).transient(), // Factory function, transient on purpose!\n\n // V1.6.0 capable services\n [di.typeormService]: asClass(TypeormService).singleton(),\n [di.settingsService]: asClass(SettingsService),\n [di.floorService]: asClass(FloorService).singleton(),\n [di.floorPositionService]: asClass(FloorPositionService).singleton(),\n [di.cameraStreamService]: asClass(CameraStreamService).singleton(),\n [di.printerService]: asClass(PrinterService),\n [di.printerMaintenanceLogService]: asClass(PrinterMaintenanceLogService),\n [di.printerTagService]: asClass(PrinterTagService),\n [di.refreshTokenService]: asClass(RefreshTokenService).singleton(),\n [di.userService]: asClass(UserService).singleton(),\n [di.userRoleService]: asClass(UserRoleService).singleton(),\n [di.roleService]: asClass(RoleService).singleton(),\n [di.permissionService]: asClass(PermissionService).singleton(),\n // -- asClass --\n [di.serverHost]: asClass(ServerHost).singleton(),\n [di.exceptionFilter]: asClass(ExceptionFilter).singleton(),\n [di.settingsStore]: asClass(SettingsStore).singleton(),\n [di.configService]: asClass(ConfigService),\n [di.authService]: asClass(AuthService).singleton(),\n [di.jwtService]: asClass(JwtService).singleton(),\n\n [di.loggerFactory]: asFunction(LoggerFactory).transient(),\n [di.taskManagerService]: asClass(TaskManagerService).singleton(),\n [di.toadScheduler]: asClass(ToadScheduler).singleton(),\n [di.eventEmitter2]: asFunction(configureEventEmitter).singleton(),\n [di.serverReleaseService]: asClass(ServerReleaseService).singleton(),\n [di.monsterPiService]: asClass(MonsterPiService).singleton(),\n [di.githubService]: asClass(GithubService),\n [di.octokitService]: asFunction((configService: IConfigService) => {\n const CustomOctoKit = Octokit.plugin(throttling);\n return new CustomOctoKit({\n auth: configService.get(AppConstants.GITHUB_PAT),\n throttle: {\n onRateLimit: (_retryAfter, options, _octokit, _retryCount) => {\n const logger = LoggerFactory()(\"OctoKitThrottle\");\n logger.warn(`Request quota exhausted for request ${options.method} ${options.url}`);\n },\n onSecondaryRateLimit: (_retryAfter, options, _octokit) => {\n const logger = LoggerFactory()(\"OctoKitThrottle\");\n // does not retry, only logs a warning\n logger.warn(`SecondaryRateLimit detected for request ${options.method} ${options.url}`);\n },\n } satisfies ThrottlingOptions,\n });\n }),\n [di.clientBundleService]: asClass(ClientBundleService),\n [di.logDumpService]: asClass(LogDumpService),\n [di.httpClientFactory]: asClass(HttpClientFactory),\n [di.socketIoGateway]: asClass(SocketIoGateway).singleton(),\n [di.multerService]: asClass(MulterService).singleton(),\n [di.yamlService]: asClass(YamlService),\n [di.printerLogin]: asValue(null), // Fallback when no scope is provided\n [di.printerApiFactory]: asClass(PrinterApiFactory).transient(), // Factory function, transient on purpose!\n [di.prusaLinkApi]: asClass(PrusaLinkApi).transient(), // Transient on purpose\n [di.prusaLinkPollingAdapter]: asClass(PrusaLinkHttpPollingAdapter).transient(), // Transient on purpose\n [di.octoprintApi]: asClass(OctoprintApi).transient(), // Transient on purpose\n [di.octoprintClient]: asClass(OctoprintClient).singleton(),\n [di.octoPrintSockIoAdapter]: asClass(OctoprintWebsocketAdapter).transient(), // Transient on purpose\n [di.moonrakerApi]: asClass(MoonrakerApi).transient(), // Transient on purpose\n [di.moonrakerClient]: asClass(MoonrakerClient).singleton(),\n [di.moonrakerWebsocketAdapter]: asClass(MoonrakerWebsocketAdapter).transient(), // Transient on purpose\n [di.bambuApi]: asClass(BambuApi).transient(),\n [di.bambuClient]: asClass(BambuClient).transient(), // Transient for multi-printer support\n [di.bambuFtpAdapter]: asClass(BambuFtpAdapter).transient(),\n [di.bambuMqttAdapter]: asClass(BambuMqttAdapter).transient(),\n [di.batchCallService]: asClass(BatchCallService).singleton(),\n\n [di.floorStore]: asClass(FloorStore).singleton(),\n [di.printerThumbnailCache]: asClass(PrinterThumbnailCache).singleton(),\n [di.fileUploadTrackerCache]: asClass(FileUploadTrackerCache).singleton(),\n [di.printerCache]: asClass(PrinterCache).singleton(),\n [di.printerEventsCache]: asClass(PrinterEventsCache).singleton(),\n [di.printerSocketStore]: asClass(PrinterSocketStore).singleton(),\n [di.testPrinterSocketStore]: asClass(TestPrinterSocketStore).singleton(),\n [di.printJobService]: asClass(PrintJobService).singleton(),\n [di.printQueueService]: asClass(PrintQueueService).singleton(),\n [di.fileStorageService]: asClass(FileStorageService).singleton(),\n [di.fileAnalysisService]: asClass(FileAnalysisService).singleton(),\n [di.printFileDownloaderService]: asClass(PrintFileDownloaderService).singleton(),\n\n [di.bootTask]: asClass(BootTask),\n [di.softwareUpdateTask]: asClass(SoftwareUpdateTask), // Provided SSE handlers (couplers) shared with controllers\n [di.socketIoTask]: asClass(SocketIoTask).singleton(), // This task is a quick task (~100ms per printer)\n [di.clientDistDownloadTask]: asClass(ClientDistDownloadTask).singleton(),\n [di.printerWebsocketTask]: asClass(PrinterWebsocketTask).singleton(), // This task is a recurring heartbeat task\n [di.printerWebsocketRestoreTask]: asClass(PrinterWebsocketRestoreTask).singleton(), // Task aimed at testing the printer API\n [di.printJobAnalysisTask]: asClass(PrintJobAnalysisTask).singleton(),\n });\n\n return container;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"container.js","names":[],"sources":["../src/container.ts"],"sourcesContent":["import { Octokit } from \"octokit\";\nimport { asClass, asFunction, asValue, createContainer, InjectionMode } from \"awilix\";\nimport { ToadScheduler } from \"toad-scheduler\";\nimport { DITokens } from \"./container.tokens\";\nimport { PrinterService } from \"./services/orm/printer.service\";\nimport { PrinterMaintenanceLogService } from \"./services/orm/printer-maintenance-log.service\";\nimport { SettingsStore } from \"./state/settings.store\";\nimport { ServerReleaseService } from \"./services/core/server-release.service\";\nimport { TaskManagerService } from \"./services/task-manager.service\";\nimport { GithubService } from \"./services/core/github.service\";\nimport { PrinterWebsocketTask } from \"./tasks/printer-websocket.task\";\nimport { SocketIoTask } from \"./tasks/socketio.task\";\nimport { SocketFactory } from \"./services/socket.factory\";\nimport { configureEventEmitter } from \"./handlers/event-emitter\";\nimport { AppConstants } from \"./server.constants\";\nimport { SoftwareUpdateTask } from \"./tasks/software-update.task\";\nimport { LoggerFactory } from \"./handlers/logger-factory\";\nimport { MulterService } from \"./services/core/multer.service\";\nimport { FileUploadTrackerCache } from \"./state/file-upload-tracker.cache\";\nimport { ServerHost } from \"./server.host\";\nimport { BootTask } from \"./tasks/boot.task\";\nimport { UserService } from \"./services/orm/user.service\";\nimport { RoleService } from \"./services/orm/role.service\";\nimport { PermissionService } from \"./services/orm/permission.service\";\nimport { ROLES } from \"./constants/authorization.constants\";\nimport { PrinterWebsocketRestoreTask } from \"./tasks/printer-websocket-restore.task\";\nimport { ConfigService, type IConfigService } from \"./services/core/config.service\";\nimport { SocketIoGateway } from \"./state/socket-io.gateway\";\nimport { ClientBundleService } from \"./services/core/client-bundle.service\";\nimport { FloorStore } from \"./state/floor.store\";\nimport { YamlService } from \"./services/core/yaml.service\";\nimport { MonsterPiService } from \"./services/core/monsterpi.service\";\nimport { BatchCallService } from \"./services/core/batch-call.service\";\nimport { ClientDistDownloadTask } from \"./tasks/client-bundle.task\";\nimport { OctoprintWebsocketAdapter } from \"./services/octoprint/octoprint-websocket.adapter\";\nimport { PrinterCache } from \"./state/printer.cache\";\nimport { PrinterSocketStore } from \"./state/printer-socket.store\";\nimport { TestPrinterSocketStore } from \"./state/test-printer-socket.store\";\nimport { PrinterEventsCache } from \"./state/printer-events.cache\";\nimport { LogDumpService } from \"./services/core/logs-manager.service\";\nimport { CameraStreamService } from \"./services/orm/camera-stream.service\";\nimport { JwtService } from \"./services/authentication/jwt.service\";\nimport { AuthService } from \"./services/authentication/auth.service\";\nimport { throttling, ThrottlingOptions } from \"@octokit/plugin-throttling\";\nimport { RefreshTokenService } from \"@/services/orm/refresh-token.service\";\nimport { ApiKeyService } from \"@/services/orm/api-key.service\";\nimport { SettingsService } from \"@/services/orm/settings.service\";\nimport { FloorService } from \"@/services/orm/floor.service\";\nimport { FloorPositionService } from \"@/services/orm/floor-position.service\";\nimport { ExceptionFilter } from \"@/middleware/exception.filter\";\nimport { TypeormService } from \"@/services/typeorm/typeorm.service\";\nimport { UserRoleService } from \"@/services/orm/user-role.service\";\nimport { PrinterTagService } from \"@/services/orm/printer-tag.service\";\nimport { MoonrakerClient } from \"@/services/moonraker/moonraker.client\";\nimport { MoonrakerWebsocketAdapter } from \"@/services/moonraker/moonraker-websocket.adapter\";\nimport { OctoprintApi } from \"@/services/octoprint.api\";\nimport { OctoprintClient } from \"@/services/octoprint/octoprint.client\";\nimport { MoonrakerApi } from \"@/services/moonraker.api\";\nimport { PrinterApiFactory } from \"@/services/printer-api.factory\";\nimport { PrinterThumbnailCache } from \"@/state/printer-thumbnail.cache\";\nimport { HttpClientFactory } from \"@/services/core/http-client.factory\";\nimport { CradleService } from \"@/services/core/cradle.service\";\nimport { PrusaLinkApi } from \"@/services/prusa-link/prusa-link.api\";\nimport { PrusaLinkHttpPollingAdapter } from \"@/services/prusa-link/prusa-link-http-polling.adapter\";\nimport { BambuClient } from \"@/services/bambu/bambu.client\";\nimport { BambuMqttAdapter } from \"@/services/bambu/bambu-mqtt.adapter\";\nimport { BambuFtpAdapter } from \"@/services/bambu/bambu-ftp.adapter\";\nimport { BambuApi } from \"@/services/bambu.api\";\nimport { PrintQueueService } from \"@/services/print-queue.service\";\nimport { FileStorageService } from \"@/services/file-storage.service\";\nimport { PrintJobService } from \"@/services/orm/print-job.service\";\nimport { FileAnalysisService } from \"@/services/file-analysis.service\";\nimport { PrintJobAnalysisTask } from \"@/tasks/print-job-analysis.task\";\nimport { PrintFileDownloaderService } from \"@/services/print-file-downloader.service\";\n\nexport function configureContainer() {\n const container = createContainer({\n injectionMode: InjectionMode.CLASSIC,\n });\n\n const di = DITokens;\n\n container.register({\n // -- asValue/asFunction constants --\n [di.appDefaultRole]: asValue(ROLES.GUEST),\n [di.appDefaultRoleNoLogin]: asValue(ROLES.ADMIN),\n [di.serverVersion]: asFunction(() => {\n return process.env[AppConstants.VERSION_KEY];\n }),\n [di.cradleService]: asClass(CradleService).inject((container) => ({ container })),\n [di.socketFactory]: asClass(SocketFactory).transient(), // Factory function, transient on purpose!\n\n // V1.6.0 capable services\n [di.typeormService]: asClass(TypeormService).singleton(),\n [di.settingsService]: asClass(SettingsService),\n [di.floorService]: asClass(FloorService).singleton(),\n [di.floorPositionService]: asClass(FloorPositionService).singleton(),\n [di.cameraStreamService]: asClass(CameraStreamService).singleton(),\n [di.printerService]: asClass(PrinterService),\n [di.printerMaintenanceLogService]: asClass(PrinterMaintenanceLogService),\n [di.printerTagService]: asClass(PrinterTagService),\n [di.refreshTokenService]: asClass(RefreshTokenService).singleton(),\n [di.apiKeyService]: asClass(ApiKeyService).singleton(),\n [di.userService]: asClass(UserService).singleton(),\n [di.userRoleService]: asClass(UserRoleService).singleton(),\n [di.roleService]: asClass(RoleService).singleton(),\n [di.permissionService]: asClass(PermissionService).singleton(),\n // -- asClass --\n [di.serverHost]: asClass(ServerHost).singleton(),\n [di.exceptionFilter]: asClass(ExceptionFilter).singleton(),\n [di.settingsStore]: asClass(SettingsStore).singleton(),\n [di.configService]: asClass(ConfigService),\n [di.authService]: asClass(AuthService).singleton(),\n [di.jwtService]: asClass(JwtService).singleton(),\n\n [di.loggerFactory]: asFunction(LoggerFactory).transient(),\n [di.taskManagerService]: asClass(TaskManagerService).singleton(),\n [di.toadScheduler]: asClass(ToadScheduler).singleton(),\n [di.eventEmitter2]: asFunction(configureEventEmitter).singleton(),\n [di.serverReleaseService]: asClass(ServerReleaseService).singleton(),\n [di.monsterPiService]: asClass(MonsterPiService).singleton(),\n [di.githubService]: asClass(GithubService),\n [di.octokitService]: asFunction((configService: IConfigService) => {\n const CustomOctoKit = Octokit.plugin(throttling);\n return new CustomOctoKit({\n auth: configService.get(AppConstants.GITHUB_PAT),\n throttle: {\n onRateLimit: (_retryAfter, options, _octokit, _retryCount) => {\n const logger = LoggerFactory()(\"OctoKitThrottle\");\n logger.warn(`Request quota exhausted for request ${options.method} ${options.url}`);\n },\n onSecondaryRateLimit: (_retryAfter, options, _octokit) => {\n const logger = LoggerFactory()(\"OctoKitThrottle\");\n // does not retry, only logs a warning\n logger.warn(`SecondaryRateLimit detected for request ${options.method} ${options.url}`);\n },\n } satisfies ThrottlingOptions,\n });\n }),\n [di.clientBundleService]: asClass(ClientBundleService),\n [di.logDumpService]: asClass(LogDumpService),\n [di.httpClientFactory]: asClass(HttpClientFactory),\n [di.socketIoGateway]: asClass(SocketIoGateway).singleton(),\n [di.multerService]: asClass(MulterService).singleton(),\n [di.yamlService]: asClass(YamlService),\n [di.printerLogin]: asValue(null), // Fallback when no scope is provided\n [di.printerApiFactory]: asClass(PrinterApiFactory).transient(), // Factory function, transient on purpose!\n [di.prusaLinkApi]: asClass(PrusaLinkApi).transient(), // Transient on purpose\n [di.prusaLinkPollingAdapter]: asClass(PrusaLinkHttpPollingAdapter).transient(), // Transient on purpose\n [di.octoprintApi]: asClass(OctoprintApi).transient(), // Transient on purpose\n [di.octoprintClient]: asClass(OctoprintClient).singleton(),\n [di.octoPrintSockIoAdapter]: asClass(OctoprintWebsocketAdapter).transient(), // Transient on purpose\n [di.moonrakerApi]: asClass(MoonrakerApi).transient(), // Transient on purpose\n [di.moonrakerClient]: asClass(MoonrakerClient).singleton(),\n [di.moonrakerWebsocketAdapter]: asClass(MoonrakerWebsocketAdapter).transient(), // Transient on purpose\n [di.bambuApi]: asClass(BambuApi).transient(),\n [di.bambuClient]: asClass(BambuClient).transient(), // Transient for multi-printer support\n [di.bambuFtpAdapter]: asClass(BambuFtpAdapter).transient(),\n [di.bambuMqttAdapter]: asClass(BambuMqttAdapter).transient(),\n [di.batchCallService]: asClass(BatchCallService).singleton(),\n\n [di.floorStore]: asClass(FloorStore).singleton(),\n [di.printerThumbnailCache]: asClass(PrinterThumbnailCache).singleton(),\n [di.fileUploadTrackerCache]: asClass(FileUploadTrackerCache).singleton(),\n [di.printerCache]: asClass(PrinterCache).singleton(),\n [di.printerEventsCache]: asClass(PrinterEventsCache).singleton(),\n [di.printerSocketStore]: asClass(PrinterSocketStore).singleton(),\n [di.testPrinterSocketStore]: asClass(TestPrinterSocketStore).singleton(),\n [di.printJobService]: asClass(PrintJobService).singleton(),\n [di.printQueueService]: asClass(PrintQueueService).singleton(),\n [di.fileStorageService]: asClass(FileStorageService).singleton(),\n [di.fileAnalysisService]: asClass(FileAnalysisService).singleton(),\n [di.printFileDownloaderService]: asClass(PrintFileDownloaderService).singleton(),\n\n [di.bootTask]: asClass(BootTask),\n [di.softwareUpdateTask]: asClass(SoftwareUpdateTask), // Provided SSE handlers (couplers) shared with controllers\n [di.socketIoTask]: asClass(SocketIoTask).singleton(), // This task is a quick task (~100ms per printer)\n [di.clientDistDownloadTask]: asClass(ClientDistDownloadTask).singleton(),\n [di.printerWebsocketTask]: asClass(PrinterWebsocketTask).singleton(), // This task is a recurring heartbeat task\n [di.printerWebsocketRestoreTask]: asClass(PrinterWebsocketRestoreTask).singleton(), // Task aimed at testing the printer API\n [di.printJobAnalysisTask]: asClass(PrintJobAnalysisTask).singleton(),\n });\n\n return container;\n}\n"],"mappings":"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"}
|
package/dist/container.tokens.js
CHANGED
|
@@ -36,6 +36,7 @@ const DITokens = {
|
|
|
36
36
|
userTokenService: "userTokenService",
|
|
37
37
|
authService: "authService",
|
|
38
38
|
refreshTokenService: "refreshTokenService",
|
|
39
|
+
apiKeyService: "apiKeyService",
|
|
39
40
|
userService: "userService",
|
|
40
41
|
userRoleService: "userRoleService",
|
|
41
42
|
permissionService: "permissionService",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.tokens.js","names":[],"sources":["../src/container.tokens.ts"],"sourcesContent":["export const DITokens = {\n cradleService: \"cradleService\",\n // Values\n serverVersion: \"serverVersion\",\n appDefaultRole: \"appDefaultRole\",\n appDefaultRoleNoLogin: \"appDefaultRoleNoLogin\",\n typeormService: \"typeormService\",\n // Instances\n serverHost: \"serverHost\",\n exceptionFilter: \"exceptionFilter\",\n loggerFactory: \"loggerFactory\",\n httpClientFactory: \"httpClientFactory\",\n socketIoGateway: \"socketIoGateway\",\n multerService: \"multerService\",\n configService: \"configService\",\n taskManagerService: \"taskManagerService\",\n toadScheduler: \"toadScheduler\",\n eventEmitter2: \"eventEmitter2\",\n printerService: \"printerService\",\n printerTagService: \"printerTagService\",\n printerMaintenanceLogService: \"printerMaintenanceLogService\",\n floorPositionService: \"floorPositionService\",\n printJobService: \"printJobService\",\n printQueueService: \"printQueueService\",\n fileStorageService: \"fileStorageService\",\n fileAnalysisService: \"fileAnalysisService\",\n printFileDownloaderService: \"printFileDownloaderService\",\n floorService: \"floorService\",\n yamlService: \"yamlService\",\n settingsService: \"settingsService\",\n serverReleaseService: \"serverReleaseService\",\n monsterPiService: \"monsterPiService\",\n githubService: \"githubService\",\n octokitService: \"octokitService\",\n clientBundleService: \"clientBundleService\",\n logDumpService: \"logDumpService\",\n userTokenService: \"userTokenService\",\n authService: \"authService\",\n refreshTokenService: \"refreshTokenService\",\n userService: \"userService\",\n userRoleService: \"userRoleService\",\n permissionService: \"permissionService\",\n jwtService: \"jwtService\",\n roleService: \"roleService\",\n prusaLinkApi: \"prusaLinkApi\",\n octoprintApi: \"octoprintApi\",\n octoprintClient: \"octoprintClient\",\n moonrakerApi: \"moonrakerApi\",\n moonrakerClient: \"moonrakerClient\",\n bambuApi: \"bambuApi\",\n bambuClient: \"bambuClient\",\n bambuFtpAdapter: \"bambuFtpAdapter\",\n bambuMqttAdapter: \"bambuMqttAdapter\",\n cameraStreamService: \"cameraStreamService\",\n socketFactory: \"socketFactory\",\n printerApiFactory: \"printerApiFactory\",\n printerLogin: \"printerLogin\",\n batchCallService: \"batchCallService\",\n influxDbV2BaseService: \"influxDbV2BaseService\",\n systemInfoBundleService: \"systemInfoBundleService\",\n // Stores\n floorStore: \"floorStore\",\n settingsStore: \"settingsStore\",\n printerSocketStore: \"printerSocketStore\",\n testPrinterSocketStore: \"testPrinterSocketStore\",\n prusaLinkPollingAdapter: \"prusaLinkPollingAdapter\",\n octoPrintSockIoAdapter: \"octoPrintSockIoAdapter\",\n moonrakerWebsocketAdapter: \"moonrakerWebsocketAdapter\",\n // Caches\n printerCache: \"printerCache\",\n printerEventsCache: \"printerEventsCache\",\n printerThumbnailCache: \"printerThumbnailCache\",\n fileUploadTrackerCache: \"fileUploadTrackerCache\",\n // Tasks\n bootTask: \"bootTask\",\n softwareUpdateTask: \"softwareUpdateTask\",\n clientDistDownloadTask: \"clientDistDownloadTask\",\n socketIoTask: \"socketIoTask\",\n printerWebsocketTask: \"printerWebsocketTask\",\n printerWebsocketRestoreTask: \"printerWebsocketRestoreTask\",\n printJobAnalysisTask: \"printJobAnalysisTask\",\n} as const;\n"],"mappings":";AAAA,MAAa,WAAW;CACtB,eAAe;CAEf,eAAe;CACf,gBAAgB;CAChB,uBAAuB;CACvB,gBAAgB;CAEhB,YAAY;CACZ,iBAAiB;CACjB,eAAe;CACf,mBAAmB;CACnB,iBAAiB;CACjB,eAAe;CACf,eAAe;CACf,oBAAoB;CACpB,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,mBAAmB;CACnB,8BAA8B;CAC9B,sBAAsB;CACtB,iBAAiB;CACjB,mBAAmB;CACnB,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,cAAc;CACd,aAAa;CACb,iBAAiB;CACjB,sBAAsB;CACtB,kBAAkB;CAClB,eAAe;CACf,gBAAgB;CAChB,qBAAqB;CACrB,gBAAgB;CAChB,kBAAkB;CAClB,aAAa;CACb,qBAAqB;CACrB,aAAa;CACb,iBAAiB;CACjB,mBAAmB;CACnB,YAAY;CACZ,aAAa;CACb,cAAc;CACd,cAAc;CACd,iBAAiB;CACjB,cAAc;CACd,iBAAiB;CACjB,UAAU;CACV,aAAa;CACb,iBAAiB;CACjB,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,mBAAmB;CACnB,cAAc;CACd,kBAAkB;CAClB,uBAAuB;CACvB,yBAAyB;CAEzB,YAAY;CACZ,eAAe;CACf,oBAAoB;CACpB,wBAAwB;CACxB,yBAAyB;CACzB,wBAAwB;CACxB,2BAA2B;CAE3B,cAAc;CACd,oBAAoB;CACpB,uBAAuB;CACvB,wBAAwB;CAExB,UAAU;CACV,oBAAoB;CACpB,wBAAwB;CACxB,cAAc;CACd,sBAAsB;CACtB,6BAA6B;CAC7B,sBAAsB;CACvB"}
|
|
1
|
+
{"version":3,"file":"container.tokens.js","names":[],"sources":["../src/container.tokens.ts"],"sourcesContent":["export const DITokens = {\n cradleService: \"cradleService\",\n // Values\n serverVersion: \"serverVersion\",\n appDefaultRole: \"appDefaultRole\",\n appDefaultRoleNoLogin: \"appDefaultRoleNoLogin\",\n typeormService: \"typeormService\",\n // Instances\n serverHost: \"serverHost\",\n exceptionFilter: \"exceptionFilter\",\n loggerFactory: \"loggerFactory\",\n httpClientFactory: \"httpClientFactory\",\n socketIoGateway: \"socketIoGateway\",\n multerService: \"multerService\",\n configService: \"configService\",\n taskManagerService: \"taskManagerService\",\n toadScheduler: \"toadScheduler\",\n eventEmitter2: \"eventEmitter2\",\n printerService: \"printerService\",\n printerTagService: \"printerTagService\",\n printerMaintenanceLogService: \"printerMaintenanceLogService\",\n floorPositionService: \"floorPositionService\",\n printJobService: \"printJobService\",\n printQueueService: \"printQueueService\",\n fileStorageService: \"fileStorageService\",\n fileAnalysisService: \"fileAnalysisService\",\n printFileDownloaderService: \"printFileDownloaderService\",\n floorService: \"floorService\",\n yamlService: \"yamlService\",\n settingsService: \"settingsService\",\n serverReleaseService: \"serverReleaseService\",\n monsterPiService: \"monsterPiService\",\n githubService: \"githubService\",\n octokitService: \"octokitService\",\n clientBundleService: \"clientBundleService\",\n logDumpService: \"logDumpService\",\n userTokenService: \"userTokenService\",\n authService: \"authService\",\n refreshTokenService: \"refreshTokenService\",\n apiKeyService: \"apiKeyService\",\n userService: \"userService\",\n userRoleService: \"userRoleService\",\n permissionService: \"permissionService\",\n jwtService: \"jwtService\",\n roleService: \"roleService\",\n prusaLinkApi: \"prusaLinkApi\",\n octoprintApi: \"octoprintApi\",\n octoprintClient: \"octoprintClient\",\n moonrakerApi: \"moonrakerApi\",\n moonrakerClient: \"moonrakerClient\",\n bambuApi: \"bambuApi\",\n bambuClient: \"bambuClient\",\n bambuFtpAdapter: \"bambuFtpAdapter\",\n bambuMqttAdapter: \"bambuMqttAdapter\",\n cameraStreamService: \"cameraStreamService\",\n socketFactory: \"socketFactory\",\n printerApiFactory: \"printerApiFactory\",\n printerLogin: \"printerLogin\",\n batchCallService: \"batchCallService\",\n influxDbV2BaseService: \"influxDbV2BaseService\",\n systemInfoBundleService: \"systemInfoBundleService\",\n // Stores\n floorStore: \"floorStore\",\n settingsStore: \"settingsStore\",\n printerSocketStore: \"printerSocketStore\",\n testPrinterSocketStore: \"testPrinterSocketStore\",\n prusaLinkPollingAdapter: \"prusaLinkPollingAdapter\",\n octoPrintSockIoAdapter: \"octoPrintSockIoAdapter\",\n moonrakerWebsocketAdapter: \"moonrakerWebsocketAdapter\",\n // Caches\n printerCache: \"printerCache\",\n printerEventsCache: \"printerEventsCache\",\n printerThumbnailCache: \"printerThumbnailCache\",\n fileUploadTrackerCache: \"fileUploadTrackerCache\",\n // Tasks\n bootTask: \"bootTask\",\n softwareUpdateTask: \"softwareUpdateTask\",\n clientDistDownloadTask: \"clientDistDownloadTask\",\n socketIoTask: \"socketIoTask\",\n printerWebsocketTask: \"printerWebsocketTask\",\n printerWebsocketRestoreTask: \"printerWebsocketRestoreTask\",\n printJobAnalysisTask: \"printJobAnalysisTask\",\n} as const;\n"],"mappings":";AAAA,MAAa,WAAW;CACtB,eAAe;CAEf,eAAe;CACf,gBAAgB;CAChB,uBAAuB;CACvB,gBAAgB;CAEhB,YAAY;CACZ,iBAAiB;CACjB,eAAe;CACf,mBAAmB;CACnB,iBAAiB;CACjB,eAAe;CACf,eAAe;CACf,oBAAoB;CACpB,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,mBAAmB;CACnB,8BAA8B;CAC9B,sBAAsB;CACtB,iBAAiB;CACjB,mBAAmB;CACnB,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,cAAc;CACd,aAAa;CACb,iBAAiB;CACjB,sBAAsB;CACtB,kBAAkB;CAClB,eAAe;CACf,gBAAgB;CAChB,qBAAqB;CACrB,gBAAgB;CAChB,kBAAkB;CAClB,aAAa;CACb,qBAAqB;CACrB,eAAe;CACf,aAAa;CACb,iBAAiB;CACjB,mBAAmB;CACnB,YAAY;CACZ,aAAa;CACb,cAAc;CACd,cAAc;CACd,iBAAiB;CACjB,cAAc;CACd,iBAAiB;CACjB,UAAU;CACV,aAAa;CACb,iBAAiB;CACjB,kBAAkB;CAClB,qBAAqB;CACrB,eAAe;CACf,mBAAmB;CACnB,cAAc;CACd,kBAAkB;CAClB,uBAAuB;CACvB,yBAAyB;CAEzB,YAAY;CACZ,eAAe;CACf,oBAAoB;CACpB,wBAAwB;CACxB,yBAAyB;CACzB,wBAAwB;CACxB,2BAA2B;CAE3B,cAAc;CACd,oBAAoB;CACpB,uBAAuB;CACvB,wBAAwB;CAExB,UAAU;CACV,oBAAoB;CACpB,wBAAwB;CACxB,cAAc;CACd,sBAAsB;CACtB,6BAA6B;CAC7B,sBAAsB;CACvB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { __exportAll } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorateMetadata.js";
|
|
3
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorate.js";
|
|
4
|
+
import { AuthenticationError } from "../exceptions/runtime.exceptions.js";
|
|
5
|
+
import { validateInput, validateMiddleware } from "../handlers/validators.js";
|
|
6
|
+
import { AppConstants } from "../server.constants.js";
|
|
7
|
+
import { ROLES } from "../constants/authorization.constants.js";
|
|
8
|
+
import { authenticate, authorizeRoles } from "../middleware/authenticate.js";
|
|
9
|
+
import { demoUserNotAllowed } from "../middleware/demo.middleware.js";
|
|
10
|
+
import { apiKeyIdParamSchema, createApiKeySchema } from "./validation/api-key-controller.validation.js";
|
|
11
|
+
import { DELETE, GET, POST, before, route } from "awilix-express";
|
|
12
|
+
//#region src/controllers/api-key.controller.ts
|
|
13
|
+
var api_key_controller_exports = /* @__PURE__ */ __exportAll({ ApiKeyController: () => ApiKeyController });
|
|
14
|
+
let ApiKeyController = class ApiKeyController {
|
|
15
|
+
constructor(apiKeyService) {
|
|
16
|
+
this.apiKeyService = apiKeyService;
|
|
17
|
+
}
|
|
18
|
+
async list(_req, res) {
|
|
19
|
+
const keys = await this.apiKeyService.list();
|
|
20
|
+
res.send(keys);
|
|
21
|
+
}
|
|
22
|
+
async create(req, res) {
|
|
23
|
+
const createdByUserId = this.requireUserId(req);
|
|
24
|
+
const { label, roleIds } = await validateMiddleware(req, createApiKeySchema);
|
|
25
|
+
const created = await this.apiKeyService.create(createdByUserId, label, roleIds);
|
|
26
|
+
res.send(created);
|
|
27
|
+
}
|
|
28
|
+
async delete(req, res) {
|
|
29
|
+
const { id } = await validateInput(req.params, apiKeyIdParamSchema);
|
|
30
|
+
await this.apiKeyService.delete(id);
|
|
31
|
+
res.status(204).send();
|
|
32
|
+
}
|
|
33
|
+
requireUserId(req) {
|
|
34
|
+
const id = req.user?.id;
|
|
35
|
+
if (!id || id < 0) throw new AuthenticationError("Authenticated user is required");
|
|
36
|
+
return id;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
__decorate([
|
|
40
|
+
GET(),
|
|
41
|
+
route("/"),
|
|
42
|
+
__decorateMetadata("design:type", Function),
|
|
43
|
+
__decorateMetadata("design:paramtypes", [Object, Object]),
|
|
44
|
+
__decorateMetadata("design:returntype", Promise)
|
|
45
|
+
], ApiKeyController.prototype, "list", null);
|
|
46
|
+
__decorate([
|
|
47
|
+
POST(),
|
|
48
|
+
route("/"),
|
|
49
|
+
__decorateMetadata("design:type", Function),
|
|
50
|
+
__decorateMetadata("design:paramtypes", [Object, Object]),
|
|
51
|
+
__decorateMetadata("design:returntype", Promise)
|
|
52
|
+
], ApiKeyController.prototype, "create", null);
|
|
53
|
+
__decorate([
|
|
54
|
+
DELETE(),
|
|
55
|
+
route("/:id"),
|
|
56
|
+
__decorateMetadata("design:type", Function),
|
|
57
|
+
__decorateMetadata("design:paramtypes", [Object, Object]),
|
|
58
|
+
__decorateMetadata("design:returntype", Promise)
|
|
59
|
+
], ApiKeyController.prototype, "delete", null);
|
|
60
|
+
ApiKeyController = __decorate([
|
|
61
|
+
route(AppConstants.apiRoute + "/api-keys"),
|
|
62
|
+
before([
|
|
63
|
+
authenticate(),
|
|
64
|
+
authorizeRoles([ROLES.ADMIN]),
|
|
65
|
+
demoUserNotAllowed
|
|
66
|
+
]),
|
|
67
|
+
__decorateMetadata("design:paramtypes", [Object])
|
|
68
|
+
], ApiKeyController);
|
|
69
|
+
//#endregion
|
|
70
|
+
export { ApiKeyController, api_key_controller_exports };
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=api-key.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-key.controller.js","names":[],"sources":["../../src/controllers/api-key.controller.ts"],"sourcesContent":["import { before, DELETE, GET, POST, route } from \"awilix-express\";\nimport { authenticate, authorizeRoles } from \"@/middleware/authenticate\";\nimport { demoUserNotAllowed } from \"@/middleware/demo.middleware\";\nimport { ROLES } from \"@/constants/authorization.constants\";\nimport { AppConstants } from \"@/server.constants\";\nimport { validateInput, validateMiddleware } from \"@/handlers/validators\";\nimport { apiKeyIdParamSchema, createApiKeySchema } from \"@/controllers/validation/api-key-controller.validation\";\nimport type { Request, Response } from \"express\";\nimport type { IApiKeyService } from \"@/services/interfaces/api-key.service.interface\";\nimport { AuthenticationError } from \"@/exceptions/runtime.exceptions\";\n\n/**\n * Admin-only API key management. Keys are m2m credentials with their own\n * role assignment (stored in the `api_key_role` join table); they are NOT\n * user impersonation tokens. `createdByUserId` is audit-only — it records\n * who minted the key, not whose permissions the key holds.\n */\n@route(AppConstants.apiRoute + \"/api-keys\")\n@before([authenticate(), authorizeRoles([ROLES.ADMIN]), demoUserNotAllowed])\nexport class ApiKeyController {\n constructor(private readonly apiKeyService: IApiKeyService) {}\n\n @GET()\n @route(\"/\")\n async list(_req: Request, res: Response) {\n const keys = await this.apiKeyService.list();\n res.send(keys);\n }\n\n @POST()\n @route(\"/\")\n async create(req: Request, res: Response) {\n const createdByUserId = this.requireUserId(req);\n const { label, roleIds } = await validateMiddleware(req, createApiKeySchema);\n const created = await this.apiKeyService.create(createdByUserId, label, roleIds);\n res.send(created);\n }\n\n @DELETE()\n @route(\"/:id\")\n async delete(req: Request, res: Response) {\n const { id } = await validateInput(req.params, apiKeyIdParamSchema);\n await this.apiKeyService.delete(id);\n res.status(204).send();\n }\n\n private requireUserId(req: Request): number {\n // Reachable when loginRequired=false (passport-anonymous falls through\n // without setting req.user); the @before authorizeRoles guard then\n // refuses, but defend the boundary anyway in case the chain is changed.\n const id = req.user?.id;\n if (!id || id < 0) {\n throw new AuthenticationError(\"Authenticated user is required\");\n }\n return id;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAmBO,IAAA,mBAAA,MAAM,iBAAiB;CAC5B,YAAY,eAAgD;EAA/B,KAAA,gBAAA;;CAE7B,MAEM,KAAK,MAAe,KAAe;EACvC,MAAM,OAAO,MAAM,KAAK,cAAc,MAAM;EAC5C,IAAI,KAAK,KAAK;;CAGhB,MAEM,OAAO,KAAc,KAAe;EACxC,MAAM,kBAAkB,KAAK,cAAc,IAAI;EAC/C,MAAM,EAAE,OAAO,YAAY,MAAM,mBAAmB,KAAK,mBAAmB;EAC5E,MAAM,UAAU,MAAM,KAAK,cAAc,OAAO,iBAAiB,OAAO,QAAQ;EAChF,IAAI,KAAK,QAAQ;;CAGnB,MAEM,OAAO,KAAc,KAAe;EACxC,MAAM,EAAE,OAAO,MAAM,cAAc,IAAI,QAAQ,oBAAoB;EACnE,MAAM,KAAK,cAAc,OAAO,GAAG;EACnC,IAAI,OAAO,IAAI,CAAC,MAAM;;CAGxB,cAAsB,KAAsB;EAI1C,MAAM,KAAK,IAAI,MAAM;EACrB,IAAI,CAAC,MAAM,KAAK,GACd,MAAM,IAAI,oBAAoB,iCAAiC;EAEjE,OAAO;;;;CAhCR,KAAK;CACL,MAAM,IAAI;;;;;;CAMV,MAAM;CACN,MAAM,IAAI;;;;;;CAQV,QAAQ;CACR,MAAM,OAAO;;;;;;CAtBf,MAAM,aAAa,WAAW,YAAY;CAC1C,OAAO;EAAC,cAAc;EAAE,eAAe,CAAC,MAAM,MAAM,CAAC;EAAE;EAAmB,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { __exportAll } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.
|
|
3
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
2
|
+
import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorateMetadata.js";
|
|
3
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.129.0/helpers/decorate.js";
|
|
4
4
|
import { BadRequestException } from "../exceptions/runtime.exceptions.js";
|
|
5
5
|
import { validateMiddleware } from "../handlers/validators.js";
|
|
6
6
|
import { AppConstants } from "../server.constants.js";
|
|
7
7
|
import { SettingsStore } from "../state/settings.store.js";
|
|
8
|
-
import { refreshTokenSchema } from "./validation/auth-controller.validation.js";
|
|
9
8
|
import { authenticate } from "../middleware/authenticate.js";
|
|
10
9
|
import { demoUserNotAllowed } from "../middleware/demo.middleware.js";
|
|
10
|
+
import { refreshTokenSchema } from "./validation/auth-controller.validation.js";
|
|
11
11
|
import { registerUserSchema } from "./validation/user-controller.validation.js";
|
|
12
12
|
import { GET, POST, before, route } from "awilix-express";
|
|
13
13
|
//#region src/controllers/auth.controller.ts
|
|
@@ -33,6 +33,7 @@ let AuthController = _AuthController = class AuthController {
|
|
|
33
33
|
const registration = this.settingsStore.isRegistrationEnabled();
|
|
34
34
|
let wizardState = this.settingsStore.getWizardState();
|
|
35
35
|
const isDemoMode = this.configService.isDemoMode();
|
|
36
|
+
const instanceLabel = this.configService.instanceLabel();
|
|
36
37
|
wizardState = {
|
|
37
38
|
...wizardState,
|
|
38
39
|
wizardCompleted: isDemoMode ? true : wizardState.wizardCompleted
|
|
@@ -41,7 +42,8 @@ let AuthController = _AuthController = class AuthController {
|
|
|
41
42
|
loginRequired,
|
|
42
43
|
registration,
|
|
43
44
|
wizardState,
|
|
44
|
-
isDemoMode
|
|
45
|
+
isDemoMode,
|
|
46
|
+
instanceLabel
|
|
45
47
|
});
|
|
46
48
|
}
|
|
47
49
|
async verifyLogin(req, res) {
|