@fdm-monster/server 2.0.0-rc1 → 2.0.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/.env.template +8 -3
- package/.yarn/install-state.gz +0 -0
- package/CONTRIBUTING.md +1 -1
- package/README.md +5 -4
- package/RELEASE_NOTES.MD +53 -0
- package/SECURITY.md +1 -1
- package/dist/consoles/download-github-releases.js +3 -3
- package/dist/consoles/launch-http-servers.js +4 -4
- package/dist/consoles/launch-http-servers.js.map +1 -1
- package/dist/consoles/mock-bambu.server.js +35 -16
- package/dist/consoles/mock-bambu.server.js.map +1 -1
- package/dist/consoles/mock-camera/default-image.js +13 -0
- package/dist/consoles/mock-camera/default-image.js.map +1 -0
- package/dist/consoles/mock-camera/mock-camera.server.js +160 -0
- package/dist/consoles/mock-camera/mock-camera.server.js.map +1 -0
- package/dist/consoles/mock-octoprint.server.js +281 -73
- package/dist/consoles/mock-octoprint.server.js.map +1 -1
- package/dist/consoles/mock-prusalink.server.js +11 -11
- package/dist/consoles/mock-prusalink.server.js.map +1 -1
- package/dist/consoles/typeorm-create.js +135 -0
- package/dist/consoles/typeorm-create.js.map +1 -0
- package/dist/consoles/typeorm-generate.js +8 -8
- package/dist/consoles/typeorm-generate.js.map +1 -1
- package/dist/constants/authorization.constants.js +13 -26
- package/dist/constants/authorization.constants.js.map +1 -1
- package/dist/constants/server-settings.constants.js +7 -20
- package/dist/constants/server-settings.constants.js.map +1 -1
- package/dist/container.js +18 -10
- package/dist/container.js.map +1 -1
- package/dist/container.tokens.js +9 -5
- package/dist/container.tokens.js.map +1 -1
- package/dist/controllers/batch-call.controller.js +0 -15
- package/dist/controllers/batch-call.controller.js.map +1 -1
- package/dist/controllers/file-storage.controller.js +319 -0
- package/dist/controllers/file-storage.controller.js.map +1 -0
- package/dist/controllers/first-time-setup.controller.js +2 -1
- package/dist/controllers/first-time-setup.controller.js.map +1 -1
- package/dist/controllers/floor.controller.js +12 -12
- package/dist/controllers/floor.controller.js.map +1 -1
- package/dist/controllers/print-job.controller.js +666 -0
- package/dist/controllers/print-job.controller.js.map +1 -0
- package/dist/controllers/print-queue.controller.js +375 -0
- package/dist/controllers/print-queue.controller.js.map +1 -0
- package/dist/controllers/printer-files.controller.js +86 -59
- package/dist/controllers/printer-files.controller.js.map +1 -1
- package/dist/controllers/printer-settings.controller.js +0 -21
- package/dist/controllers/printer-settings.controller.js.map +1 -1
- package/dist/controllers/{printer-group.controller.js → printer-tag.controller.js} +51 -34
- package/dist/controllers/printer-tag.controller.js.map +1 -0
- package/dist/controllers/printer.controller.js +15 -0
- package/dist/controllers/printer.controller.js.map +1 -1
- package/dist/controllers/server-private.controller.js +2 -1
- package/dist/controllers/server-private.controller.js.map +1 -1
- package/dist/controllers/server-public.controller.js +6 -2
- package/dist/controllers/server-public.controller.js.map +1 -1
- package/dist/controllers/settings.controller.js +44 -44
- package/dist/controllers/settings.controller.js.map +1 -1
- package/dist/controllers/slicer-compat.controller.js +220 -0
- package/dist/controllers/slicer-compat.controller.js.map +1 -0
- package/dist/data-source.js +20 -8
- package/dist/data-source.js.map +1 -1
- package/dist/entities/camera-stream.entity.js +2 -1
- package/dist/entities/camera-stream.entity.js.map +1 -1
- package/dist/entities/floor.entity.js +3 -5
- package/dist/entities/floor.entity.js.map +1 -1
- package/dist/entities/index.js +15 -7
- package/dist/entities/index.js.map +1 -1
- package/dist/entities/print-job.entity.js +195 -0
- package/dist/entities/print-job.entity.js.map +1 -0
- package/dist/entities/{printer-group.entity.js → printer-tag.entity.js} +17 -17
- package/dist/entities/printer-tag.entity.js.map +1 -0
- package/dist/entities/printer.entity.js +4 -10
- package/dist/entities/printer.entity.js.map +1 -1
- package/dist/entities/settings.entity.js +3 -12
- package/dist/entities/settings.entity.js.map +1 -1
- package/dist/entities/{group.entity.js → tag.entity.js} +15 -8
- package/dist/entities/tag.entity.js.map +1 -0
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/exception.filter.js +114 -90
- package/dist/middleware/exception.filter.js.map +1 -1
- package/dist/middleware/global.middleware.js +6 -6
- package/dist/middleware/global.middleware.js.map +1 -1
- package/dist/middleware/slicer-api-key.middleware.js +29 -0
- package/dist/middleware/slicer-api-key.middleware.js.map +1 -0
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js +186 -0
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js.map +1 -0
- package/dist/migrations/1767279607392-DropCustomGcode.js +31 -0
- package/dist/migrations/1767279607392-DropCustomGcode.js.map +1 -0
- package/dist/migrations/1767291804417-DropPrintCompletions.js +37 -0
- package/dist/migrations/1767291804417-DropPrintCompletions.js.map +1 -0
- package/dist/migrations/1767352862576-DropSettingsFileClean.js +88 -0
- package/dist/migrations/1767352862576-DropSettingsFileClean.js.map +1 -0
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js +107 -0
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js.map +1 -0
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js +62 -0
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js.map +1 -0
- package/dist/migrations/1767432108916-RenameGroupToTag.js +86 -0
- package/dist/migrations/1767432108916-RenameGroupToTag.js.map +1 -0
- package/dist/migrations/1767451444137-AddPrintJob.js +207 -0
- package/dist/migrations/1767451444137-AddPrintJob.js.map +1 -0
- package/dist/server.constants.js +9 -9
- package/dist/server.constants.js.map +1 -1
- package/dist/server.host.js +24 -32
- package/dist/server.host.js.map +1 -1
- package/dist/services/bambu/bambu-ftp.adapter.js +1 -1
- package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
- package/dist/services/bambu/bambu-mqtt.adapter.js +73 -76
- package/dist/services/bambu/bambu-mqtt.adapter.js.map +1 -1
- package/dist/services/core/batch-call.service.js +0 -25
- package/dist/services/core/batch-call.service.js.map +1 -1
- package/dist/services/core/multer.service.js +5 -9
- package/dist/services/core/multer.service.js.map +1 -1
- package/dist/services/core/yaml.service.js +231 -156
- package/dist/services/core/yaml.service.js.map +1 -1
- package/dist/services/file-analysis.service.js +146 -0
- package/dist/services/file-analysis.service.js.map +1 -0
- package/dist/services/file-storage.service.js +387 -0
- package/dist/services/file-storage.service.js.map +1 -0
- package/dist/services/interfaces/floor.dto.js +3 -3
- package/dist/services/interfaces/floor.dto.js.map +1 -1
- package/dist/services/interfaces/{printer-group.dto.js → printer-tag.dto.js} +9 -8
- package/dist/services/interfaces/printer-tag.dto.js.map +1 -0
- package/dist/services/interfaces/{print-completion.interface.js → printer-tag.service.interface.js} +1 -1
- package/dist/services/interfaces/{printer-group.service.interface.js.map → printer-tag.service.interface.js.map} +1 -1
- package/dist/services/interfaces/settings.dto.js +0 -1
- package/dist/services/interfaces/settings.dto.js.map +1 -1
- package/dist/services/interfaces/{group.dto.js → tag.dto.js} +1 -1
- package/dist/services/interfaces/tag.dto.js.map +1 -0
- package/dist/services/octoprint/dto/files/gcode-analysis.dto.js.map +1 -0
- package/dist/services/octoprint/octoprint-api.routes.js +0 -7
- package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
- package/dist/services/octoprint/octoprint.client.js +0 -4
- package/dist/services/octoprint/octoprint.client.js.map +1 -1
- package/dist/services/orm/floor.service.js +9 -16
- package/dist/services/orm/floor.service.js.map +1 -1
- package/dist/services/orm/print-job.service.js +539 -0
- package/dist/services/orm/print-job.service.js.map +1 -0
- package/dist/services/orm/printer-tag.service.js +120 -0
- package/dist/services/orm/printer-tag.service.js.map +1 -0
- package/dist/services/orm/settings.service.js +5 -6
- package/dist/services/orm/settings.service.js.map +1 -1
- package/dist/services/print-file-downloader.service.js +169 -0
- package/dist/services/print-file-downloader.service.js.map +1 -0
- package/dist/services/print-queue.service.js +268 -0
- package/dist/services/print-queue.service.js.map +1 -0
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js +1 -3
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -1
- package/dist/services/validators/floor-service.validation.js +10 -10
- package/dist/services/validators/floor-service.validation.js.map +1 -1
- package/dist/services/validators/print-job.validation.js +31 -0
- package/dist/services/validators/print-job.validation.js.map +1 -0
- package/dist/services/validators/settings-service.validation.js +21 -24
- package/dist/services/validators/settings-service.validation.js.map +1 -1
- package/dist/services/validators/yaml-service.validation.js +9 -13
- package/dist/services/validators/yaml-service.validation.js.map +1 -1
- package/dist/shared/load-controllers.js +2 -1
- package/dist/shared/load-controllers.js.map +1 -1
- package/dist/shared/runtime-settings.migration.js +9 -9
- package/dist/shared/runtime-settings.migration.js.map +1 -1
- package/dist/state/floor.store.js +2 -9
- package/dist/state/floor.store.js.map +1 -1
- package/dist/state/printer-events.cache.js +179 -19
- package/dist/state/printer-events.cache.js.map +1 -1
- package/dist/state/printer-thumbnail.cache.js +98 -183
- package/dist/state/printer-thumbnail.cache.js.map +1 -1
- package/dist/state/settings.store.js +39 -37
- package/dist/state/settings.store.js.map +1 -1
- package/dist/state/socket-io.gateway.js +1 -1
- package/dist/state/socket-io.gateway.js.map +1 -1
- package/dist/tasks/boot.task.js +7 -5
- package/dist/tasks/boot.task.js.map +1 -1
- package/dist/tasks/print-job-analysis.task.js +116 -0
- package/dist/tasks/print-job-analysis.task.js.map +1 -0
- package/dist/tasks/printer-files-load.task.js +29 -0
- package/dist/tasks/printer-files-load.task.js.map +1 -0
- package/dist/tasks/socketio.task.js +1 -1
- package/dist/tasks/socketio.task.js.map +1 -1
- package/dist/tasks.js +3 -2
- package/dist/tasks.js.map +1 -1
- package/dist/utils/parsers/3mf.parser.js +337 -0
- package/dist/utils/parsers/3mf.parser.js.map +1 -0
- package/dist/utils/parsers/bgcode.parser.js +223 -0
- package/dist/utils/parsers/bgcode.parser.js.map +1 -0
- package/dist/utils/parsers/gcode.parser.js +254 -0
- package/dist/utils/parsers/gcode.parser.js.map +1 -0
- package/dist/utils/swagger/decorators.js +39 -0
- package/dist/utils/swagger/decorators.js.map +1 -0
- package/dist/utils/swagger/generator.js +196 -0
- package/dist/utils/swagger/generator.js.map +1 -0
- package/dist/utils/swagger/swagger.js +93 -0
- package/dist/utils/swagger/swagger.js.map +1 -0
- package/package.json +21 -17
- package/dist/controllers/custom-gcode.controller.js +0 -147
- package/dist/controllers/custom-gcode.controller.js.map +0 -1
- package/dist/controllers/print-completion.controller.js +0 -118
- package/dist/controllers/print-completion.controller.js.map +0 -1
- package/dist/controllers/printer-group.controller.js.map +0 -1
- package/dist/entities/custom-gcode.entity.js +0 -49
- package/dist/entities/custom-gcode.entity.js.map +0 -1
- package/dist/entities/group.entity.js.map +0 -1
- package/dist/entities/print-completion.entity.js +0 -90
- package/dist/entities/print-completion.entity.js.map +0 -1
- package/dist/entities/printer-group.entity.js.map +0 -1
- package/dist/services/interfaces/custom-gcode.dto.js +0 -18
- package/dist/services/interfaces/custom-gcode.dto.js.map +0 -1
- package/dist/services/interfaces/custom-gcode.service.interface.js +0 -6
- package/dist/services/interfaces/custom-gcode.service.interface.js.map +0 -1
- package/dist/services/interfaces/gcode-analysis.dto.js.map +0 -1
- package/dist/services/interfaces/group.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion-context.dto.js +0 -6
- package/dist/services/interfaces/print-completion-context.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion.dto.js +0 -38
- package/dist/services/interfaces/print-completion.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion.interface.js.map +0 -1
- package/dist/services/interfaces/printer-group.dto.js.map +0 -1
- package/dist/services/interfaces/printer-group.service.interface.js +0 -6
- package/dist/services/orm/custom-gcode.service.js +0 -42
- package/dist/services/orm/custom-gcode.service.js.map +0 -1
- package/dist/services/orm/print-completion.service.js +0 -87
- package/dist/services/orm/print-completion.service.js.map +0 -1
- package/dist/services/orm/print-completion.shared.js +0 -59
- package/dist/services/orm/print-completion.shared.js.map +0 -1
- package/dist/services/orm/printer-group.service.js +0 -109
- package/dist/services/orm/printer-group.service.js.map +0 -1
- package/dist/tasks/print-completion.socketio.task.js +0 -91
- package/dist/tasks/print-completion.socketio.task.js.map +0 -1
- package/dist/tasks/printer-file-clean.task.js +0 -74
- package/dist/tasks/printer-file-clean.task.js.map +0 -1
- /package/dist/services/{interfaces → octoprint/dto/files}/gcode-analysis.dto.js +0 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "FileAnalysisService", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return FileAnalysisService;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _gcodeparser = require("../utils/parsers/gcode.parser");
|
|
12
|
+
const _3mfparser = require("../utils/parsers/3mf.parser");
|
|
13
|
+
const _bgcodeparser = require("../utils/parsers/bgcode.parser");
|
|
14
|
+
const _nodepath = require("node:path");
|
|
15
|
+
const _promises = require("node:fs/promises");
|
|
16
|
+
class FileAnalysisService {
|
|
17
|
+
logger;
|
|
18
|
+
FILE_FORMATS = {
|
|
19
|
+
GCODE: "gcode",
|
|
20
|
+
THREE_MF: "3mf",
|
|
21
|
+
BGCODE: "bgcode"
|
|
22
|
+
};
|
|
23
|
+
EXTENSIONS = {
|
|
24
|
+
THREE_MF: ".3mf",
|
|
25
|
+
BGCODE: ".bgcode",
|
|
26
|
+
GCODE: ".gcode",
|
|
27
|
+
GCODE_SHORT: ".g",
|
|
28
|
+
GCODE_ALT: ".gco",
|
|
29
|
+
GCODE_THREE_MF: ".gcode.3mf"
|
|
30
|
+
};
|
|
31
|
+
gcodeParser;
|
|
32
|
+
threemfParser;
|
|
33
|
+
bgcodeParser;
|
|
34
|
+
constructor(loggerFactory){
|
|
35
|
+
this.logger = loggerFactory(FileAnalysisService.name);
|
|
36
|
+
this.gcodeParser = new _gcodeparser.GCodeParser();
|
|
37
|
+
this.threemfParser = new _3mfparser.ThreeMFParser();
|
|
38
|
+
this.bgcodeParser = new _bgcodeparser.BGCodeParser();
|
|
39
|
+
this.logger.log("File analysis service initialized with all parsers");
|
|
40
|
+
}
|
|
41
|
+
async analyzeFile(filePath) {
|
|
42
|
+
const ext = (0, _nodepath.extname)(filePath).toLowerCase();
|
|
43
|
+
const fileFormat = this.getFileFormat(ext, filePath);
|
|
44
|
+
this.logger.log(`Analyzing file: ${(0, _nodepath.basename)(filePath)} (format: ${fileFormat}, ext: ${ext})`);
|
|
45
|
+
let result;
|
|
46
|
+
try {
|
|
47
|
+
switch(fileFormat){
|
|
48
|
+
case this.FILE_FORMATS.GCODE:
|
|
49
|
+
result = await this.analyzeGCode(filePath);
|
|
50
|
+
break;
|
|
51
|
+
case this.FILE_FORMATS.THREE_MF:
|
|
52
|
+
result = await this.analyze3MF(filePath);
|
|
53
|
+
break;
|
|
54
|
+
case this.FILE_FORMATS.BGCODE:
|
|
55
|
+
result = await this.analyzeBGCode(filePath);
|
|
56
|
+
break;
|
|
57
|
+
default:
|
|
58
|
+
throw new Error(`Unsupported file format: ${fileFormat}`);
|
|
59
|
+
}
|
|
60
|
+
const thumbnails = this.extractThumbnails(result);
|
|
61
|
+
return {
|
|
62
|
+
metadata: result.normalized,
|
|
63
|
+
thumbnails
|
|
64
|
+
};
|
|
65
|
+
} catch (error) {
|
|
66
|
+
this.logger.error(`Failed to analyze file ${filePath} (ext: "${ext}"): ${error}`);
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async analyzeMultiPlate3MF(filePath) {
|
|
71
|
+
const result = await this.analyze3MF(filePath);
|
|
72
|
+
if (!result.normalized.isMultiPlate || !result.plates) {
|
|
73
|
+
return [
|
|
74
|
+
{
|
|
75
|
+
metadata: result.normalized,
|
|
76
|
+
thumbnails: this.extractThumbnails(result)
|
|
77
|
+
}
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
return result.plates.map((plate)=>({
|
|
81
|
+
metadata: {
|
|
82
|
+
...result.normalized,
|
|
83
|
+
plateNumber: plate.plateNumber,
|
|
84
|
+
gcodePrintTimeSeconds: plate.gcodePrintTimeSeconds,
|
|
85
|
+
filamentUsedGrams: plate.filamentUsedGrams,
|
|
86
|
+
totalLayers: plate.totalLayers
|
|
87
|
+
},
|
|
88
|
+
thumbnails: plate.thumbnails?.map((t)=>({
|
|
89
|
+
width: t.width || 0,
|
|
90
|
+
height: t.height || 0,
|
|
91
|
+
format: t.type || t.format || "PNG"
|
|
92
|
+
})) || []
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
async analyzeGCode(filePath) {
|
|
96
|
+
return await this.gcodeParser.parse(filePath);
|
|
97
|
+
}
|
|
98
|
+
async analyze3MF(filePath) {
|
|
99
|
+
return await this.threemfParser.parse(filePath);
|
|
100
|
+
}
|
|
101
|
+
async analyzeBGCode(filePath) {
|
|
102
|
+
return await this.bgcodeParser.parse(filePath);
|
|
103
|
+
}
|
|
104
|
+
extractThumbnails(result) {
|
|
105
|
+
const thumbnails = [];
|
|
106
|
+
if (result.raw._thumbnails) {
|
|
107
|
+
for (const thumb of result.raw._thumbnails){
|
|
108
|
+
thumbnails.push({
|
|
109
|
+
width: thumb.width,
|
|
110
|
+
height: thumb.height,
|
|
111
|
+
format: thumb.format,
|
|
112
|
+
data: thumb.data
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return thumbnails;
|
|
117
|
+
}
|
|
118
|
+
getFileFormat(ext, filePath) {
|
|
119
|
+
const lowerPath = filePath.toLowerCase();
|
|
120
|
+
if (lowerPath.endsWith(this.EXTENSIONS.GCODE_THREE_MF) || lowerPath.endsWith(this.EXTENSIONS.THREE_MF)) {
|
|
121
|
+
return this.FILE_FORMATS.THREE_MF;
|
|
122
|
+
}
|
|
123
|
+
if (lowerPath.endsWith(this.EXTENSIONS.BGCODE)) {
|
|
124
|
+
return this.FILE_FORMATS.BGCODE;
|
|
125
|
+
}
|
|
126
|
+
if (lowerPath.endsWith(this.EXTENSIONS.GCODE) || lowerPath.endsWith(this.EXTENSIONS.GCODE_SHORT) || lowerPath.endsWith(this.EXTENSIONS.GCODE_ALT)) {
|
|
127
|
+
return this.FILE_FORMATS.GCODE;
|
|
128
|
+
}
|
|
129
|
+
if (ext === this.EXTENSIONS.THREE_MF) return this.FILE_FORMATS.THREE_MF;
|
|
130
|
+
if (ext === this.EXTENSIONS.BGCODE) return this.FILE_FORMATS.BGCODE;
|
|
131
|
+
if (ext === this.EXTENSIONS.GCODE || ext === this.EXTENSIONS.GCODE_SHORT || ext === this.EXTENSIONS.GCODE_ALT) {
|
|
132
|
+
return this.FILE_FORMATS.GCODE;
|
|
133
|
+
}
|
|
134
|
+
throw new Error(`Unknown file extension: "${ext}" (path: "${filePath}")`);
|
|
135
|
+
}
|
|
136
|
+
async needsAnalysis(filePath) {
|
|
137
|
+
try {
|
|
138
|
+
await (0, _promises.access)(filePath);
|
|
139
|
+
return true;
|
|
140
|
+
} catch {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
//# sourceMappingURL=file-analysis.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/file-analysis.service.ts"],"names":["FileAnalysisService","logger","FILE_FORMATS","GCODE","THREE_MF","BGCODE","EXTENSIONS","GCODE_SHORT","GCODE_ALT","GCODE_THREE_MF","gcodeParser","threemfParser","bgcodeParser","loggerFactory","name","GCodeParser","ThreeMFParser","BGCodeParser","log","analyzeFile","filePath","ext","extname","toLowerCase","fileFormat","getFileFormat","basename","result","analyzeGCode","analyze3MF","analyzeBGCode","Error","thumbnails","extractThumbnails","metadata","normalized","error","analyzeMultiPlate3MF","isMultiPlate","plates","map","plate","plateNumber","gcodePrintTimeSeconds","filamentUsedGrams","totalLayers","t","width","height","format","type","parse","raw","_thumbnails","thumb","push","data","lowerPath","endsWith","needsAnalysis","access"],"mappings":"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"}
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "FileStorageService", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return FileStorageService;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _printjobentity = require("../entities/print-job.entity");
|
|
12
|
+
const _serverconstants = require("../server.constants");
|
|
13
|
+
const _fsutils = require("../utils/fs.utils");
|
|
14
|
+
const _nodepath = /*#__PURE__*/ _interop_require_wildcard(require("node:path"));
|
|
15
|
+
const _promises = require("node:fs/promises");
|
|
16
|
+
const _nodecrypto = require("node:crypto");
|
|
17
|
+
const _nodefs = require("node:fs");
|
|
18
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
19
|
+
if (typeof WeakMap !== "function") return null;
|
|
20
|
+
var cacheBabelInterop = new WeakMap();
|
|
21
|
+
var cacheNodeInterop = new WeakMap();
|
|
22
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
23
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
24
|
+
})(nodeInterop);
|
|
25
|
+
}
|
|
26
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
27
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
28
|
+
return obj;
|
|
29
|
+
}
|
|
30
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
31
|
+
return {
|
|
32
|
+
default: obj
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
36
|
+
if (cache && cache.has(obj)) {
|
|
37
|
+
return cache.get(obj);
|
|
38
|
+
}
|
|
39
|
+
var newObj = {
|
|
40
|
+
__proto__: null
|
|
41
|
+
};
|
|
42
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
43
|
+
for(var key in obj){
|
|
44
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
45
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
46
|
+
if (desc && (desc.get || desc.set)) {
|
|
47
|
+
Object.defineProperty(newObj, key, desc);
|
|
48
|
+
} else {
|
|
49
|
+
newObj[key] = obj[key];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
newObj.default = obj;
|
|
54
|
+
if (cache) {
|
|
55
|
+
cache.set(obj, newObj);
|
|
56
|
+
}
|
|
57
|
+
return newObj;
|
|
58
|
+
}
|
|
59
|
+
class FileStorageService {
|
|
60
|
+
printJobRepository;
|
|
61
|
+
logger;
|
|
62
|
+
storageBasePath;
|
|
63
|
+
STORAGE_SUBDIRS = [
|
|
64
|
+
"gcode",
|
|
65
|
+
"3mf",
|
|
66
|
+
"bgcode"
|
|
67
|
+
];
|
|
68
|
+
constructor(loggerFactory, typeormService){
|
|
69
|
+
this.printJobRepository = typeormService.getDataSource().getRepository(_printjobentity.PrintJob);
|
|
70
|
+
this.logger = loggerFactory(FileStorageService.name);
|
|
71
|
+
this.storageBasePath = (0, _nodepath.join)((0, _fsutils.superRootPath)(), _serverconstants.AppConstants.defaultPrintFilesStorage);
|
|
72
|
+
}
|
|
73
|
+
async ensureStorageDirectories() {
|
|
74
|
+
try {
|
|
75
|
+
await (0, _promises.mkdir)(this.storageBasePath, {
|
|
76
|
+
recursive: true
|
|
77
|
+
});
|
|
78
|
+
for (const subdir of this.STORAGE_SUBDIRS){
|
|
79
|
+
await (0, _promises.mkdir)((0, _nodepath.join)(this.storageBasePath, subdir), {
|
|
80
|
+
recursive: true
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
} catch (error) {
|
|
84
|
+
this.logger.error("Failed to create storage directories", error);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
readFile(fileStorageId) {
|
|
88
|
+
const filePath = this.getFilePath(fileStorageId);
|
|
89
|
+
return (0, _nodefs.readFileSync)(filePath);
|
|
90
|
+
}
|
|
91
|
+
async saveFile(file, fileHash) {
|
|
92
|
+
const fileExt = (0, _nodepath.extname)(file.originalname).toLowerCase();
|
|
93
|
+
let fileId;
|
|
94
|
+
if (fileHash) {
|
|
95
|
+
const nameHash = (0, _nodecrypto.createHash)('sha256').update(fileHash + file.originalname).digest('hex').substring(0, 32);
|
|
96
|
+
fileId = `${nameHash.substring(0, 8)}-${nameHash.substring(8, 12)}-${nameHash.substring(12, 16)}-${nameHash.substring(16, 20)}-${nameHash.substring(20, 32)}`;
|
|
97
|
+
} else {
|
|
98
|
+
fileId = crypto.randomUUID();
|
|
99
|
+
}
|
|
100
|
+
let subdir = "gcode";
|
|
101
|
+
if (fileExt === ".3mf" || file.originalname.includes(".gcode.3mf")) {
|
|
102
|
+
subdir = "3mf";
|
|
103
|
+
} else if (fileExt === ".bgcode") {
|
|
104
|
+
subdir = "bgcode";
|
|
105
|
+
}
|
|
106
|
+
const targetDir = (0, _nodepath.join)(this.storageBasePath, subdir);
|
|
107
|
+
const targetPath = (0, _nodepath.join)(targetDir, `${fileId}${fileExt}`);
|
|
108
|
+
if (file.path) {
|
|
109
|
+
await (0, _promises.rename)(file.path, targetPath);
|
|
110
|
+
} else if (file.buffer) {
|
|
111
|
+
await (0, _promises.writeFile)(targetPath, file.buffer);
|
|
112
|
+
} else {
|
|
113
|
+
throw new Error("File has no path or buffer");
|
|
114
|
+
}
|
|
115
|
+
this.logger.log(`Saved file ${file.originalname} as ${fileId}`);
|
|
116
|
+
return fileId;
|
|
117
|
+
}
|
|
118
|
+
async getFile(fileStorageId) {
|
|
119
|
+
const filePath = await this.findFilePath(fileStorageId);
|
|
120
|
+
if (!filePath) {
|
|
121
|
+
throw new Error(`File ${fileStorageId} not found in storage`);
|
|
122
|
+
}
|
|
123
|
+
return (0, _promises.readFile)(filePath);
|
|
124
|
+
}
|
|
125
|
+
async deleteFile(fileStorageId) {
|
|
126
|
+
const filePath = await this.findFilePath(fileStorageId);
|
|
127
|
+
if (!filePath) {
|
|
128
|
+
this.logger.warn(`File ${fileStorageId} not found, cannot delete`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
await (0, _promises.unlink)(filePath);
|
|
132
|
+
const metadataPath = filePath + ".json";
|
|
133
|
+
try {
|
|
134
|
+
await (0, _promises.unlink)(metadataPath);
|
|
135
|
+
this.logger.debug(`Deleted metadata JSON for ${fileStorageId}`);
|
|
136
|
+
} catch {}
|
|
137
|
+
const thumbnailDir = filePath.replace(/\.(gcode|3mf|bgcode)$/i, '_thumbnails');
|
|
138
|
+
try {
|
|
139
|
+
await (0, _promises.rm)(thumbnailDir, {
|
|
140
|
+
recursive: true,
|
|
141
|
+
force: true
|
|
142
|
+
});
|
|
143
|
+
this.logger.debug(`Deleted thumbnails for ${fileStorageId}`);
|
|
144
|
+
} catch {}
|
|
145
|
+
this.logger.log(`Deleted file ${fileStorageId}`);
|
|
146
|
+
}
|
|
147
|
+
getFilePath(fileStorageId) {
|
|
148
|
+
for (const subdir of this.STORAGE_SUBDIRS){
|
|
149
|
+
for (const ext of [
|
|
150
|
+
".gcode",
|
|
151
|
+
".3mf",
|
|
152
|
+
".bgcode",
|
|
153
|
+
""
|
|
154
|
+
]){
|
|
155
|
+
const fullPath = (0, _nodepath.join)(this.storageBasePath, subdir, fileStorageId + ext);
|
|
156
|
+
if ((0, _nodefs.existsSync)(fullPath)) {
|
|
157
|
+
return fullPath;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return (0, _nodepath.join)(this.storageBasePath, "gcode", fileStorageId);
|
|
162
|
+
}
|
|
163
|
+
async calculateFileHash(filePath) {
|
|
164
|
+
const fileBuffer = await (0, _promises.readFile)(filePath);
|
|
165
|
+
const hashSum = (0, _nodecrypto.createHash)("sha256");
|
|
166
|
+
hashSum.update(fileBuffer);
|
|
167
|
+
return hashSum.digest("hex");
|
|
168
|
+
}
|
|
169
|
+
getDeterministicId(fileHash, fileName) {
|
|
170
|
+
const nameHash = (0, _nodecrypto.createHash)('sha256').update(fileHash + fileName).digest('hex').substring(0, 32);
|
|
171
|
+
return `${nameHash.substring(0, 8)}-${nameHash.substring(8, 12)}-${nameHash.substring(12, 16)}-${nameHash.substring(16, 20)}-${nameHash.substring(20, 32)}`;
|
|
172
|
+
}
|
|
173
|
+
async findFilePath(fileStorageId) {
|
|
174
|
+
for (const subdir of this.STORAGE_SUBDIRS){
|
|
175
|
+
const dirPath = (0, _nodepath.join)(this.storageBasePath, subdir);
|
|
176
|
+
try {
|
|
177
|
+
const files = await (0, _promises.readdir)(dirPath);
|
|
178
|
+
const matchingFile = files.find((f)=>f.startsWith(fileStorageId));
|
|
179
|
+
if (matchingFile) {
|
|
180
|
+
return (0, _nodepath.join)(dirPath, matchingFile);
|
|
181
|
+
}
|
|
182
|
+
} catch {}
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
async fileExists(fileStorageId) {
|
|
187
|
+
const filePath = await this.findFilePath(fileStorageId);
|
|
188
|
+
return filePath !== null;
|
|
189
|
+
}
|
|
190
|
+
async findDuplicateByHash(fileHash) {
|
|
191
|
+
return this.printJobRepository.findOne({
|
|
192
|
+
where: {
|
|
193
|
+
fileHash
|
|
194
|
+
},
|
|
195
|
+
order: {
|
|
196
|
+
createdAt: "DESC"
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
async saveMetadata(fileStorageId, metadata, fileHash, originalFileName, thumbnailMetadata) {
|
|
201
|
+
const filePath = await this.findFilePath(fileStorageId);
|
|
202
|
+
if (!filePath) {
|
|
203
|
+
this.logger.warn(`Cannot save metadata - file ${fileStorageId} not found`);
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const metadataPath = filePath + ".json";
|
|
207
|
+
let existingOriginalFileName = originalFileName;
|
|
208
|
+
let existingThumbnails = thumbnailMetadata;
|
|
209
|
+
try {
|
|
210
|
+
const existingContent = await (0, _promises.readFile)(metadataPath, "utf8");
|
|
211
|
+
const existing = JSON.parse(existingContent);
|
|
212
|
+
if (existing._originalFileName && !originalFileName) {
|
|
213
|
+
existingOriginalFileName = existing._originalFileName;
|
|
214
|
+
}
|
|
215
|
+
if (existing._thumbnails && !thumbnailMetadata) {
|
|
216
|
+
existingThumbnails = existing._thumbnails;
|
|
217
|
+
}
|
|
218
|
+
} catch {}
|
|
219
|
+
const metadataWithMeta = {
|
|
220
|
+
...metadata,
|
|
221
|
+
_fileHash: fileHash || null,
|
|
222
|
+
_analyzedAt: new Date().toISOString(),
|
|
223
|
+
_fileStorageId: fileStorageId,
|
|
224
|
+
_originalFileName: existingOriginalFileName || metadata.fileName || null,
|
|
225
|
+
_thumbnails: existingThumbnails || []
|
|
226
|
+
};
|
|
227
|
+
await (0, _promises.writeFile)(metadataPath, JSON.stringify(metadataWithMeta, null, 2), "utf8");
|
|
228
|
+
const thumbnailMeta = thumbnailMetadata ? ` with ${thumbnailMetadata.length} thumbnail(s)` : '';
|
|
229
|
+
this.logger.debug(`Saved metadata for ${fileStorageId}${thumbnailMeta}`);
|
|
230
|
+
}
|
|
231
|
+
async loadMetadata(fileStorageId) {
|
|
232
|
+
const filePath = await this.findFilePath(fileStorageId);
|
|
233
|
+
if (!filePath) {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
const metadataPath = filePath + ".json";
|
|
237
|
+
try {
|
|
238
|
+
const content = await (0, _promises.readFile)(metadataPath, "utf8");
|
|
239
|
+
return JSON.parse(content);
|
|
240
|
+
} catch (error) {
|
|
241
|
+
return null;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
async hasMetadata(fileStorageId) {
|
|
245
|
+
const filePath = await this.findFilePath(fileStorageId);
|
|
246
|
+
if (!filePath) {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
const metadataPath = filePath + ".json";
|
|
250
|
+
try {
|
|
251
|
+
await (0, _promises.access)(metadataPath);
|
|
252
|
+
return true;
|
|
253
|
+
} catch {
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async saveThumbnails(fileStorageId, thumbnails) {
|
|
258
|
+
const savedThumbnails = [];
|
|
259
|
+
if (!thumbnails || thumbnails.length === 0) {
|
|
260
|
+
return savedThumbnails;
|
|
261
|
+
}
|
|
262
|
+
const filePath = await this.findFilePath(fileStorageId);
|
|
263
|
+
if (!filePath) {
|
|
264
|
+
this.logger.warn(`Cannot save thumbnails - file ${fileStorageId} not found`);
|
|
265
|
+
return savedThumbnails;
|
|
266
|
+
}
|
|
267
|
+
const thumbnailDir = filePath.replace(/\.(gcode|3mf|bgcode)$/i, '_thumbnails');
|
|
268
|
+
try {
|
|
269
|
+
await (0, _promises.rm)(thumbnailDir, {
|
|
270
|
+
recursive: true,
|
|
271
|
+
force: true
|
|
272
|
+
});
|
|
273
|
+
this.logger.debug(`Cleared old thumbnails for ${fileStorageId}`);
|
|
274
|
+
} catch {}
|
|
275
|
+
await (0, _promises.mkdir)(thumbnailDir, {
|
|
276
|
+
recursive: true
|
|
277
|
+
});
|
|
278
|
+
for(let i = 0; i < thumbnails.length; i++){
|
|
279
|
+
const thumb = thumbnails[i];
|
|
280
|
+
if (!thumb.data) continue;
|
|
281
|
+
const ext = thumb.format?.toLowerCase() || 'png';
|
|
282
|
+
const filename = `thumb_${i}.${ext}`;
|
|
283
|
+
const thumbPath = (0, _nodepath.join)(thumbnailDir, filename);
|
|
284
|
+
try {
|
|
285
|
+
const buffer = Buffer.from(thumb.data, 'base64');
|
|
286
|
+
await (0, _promises.writeFile)(thumbPath, buffer);
|
|
287
|
+
const relativePath = _nodepath.default.relative(this.storageBasePath, thumbPath);
|
|
288
|
+
savedThumbnails.push({
|
|
289
|
+
index: i,
|
|
290
|
+
path: relativePath,
|
|
291
|
+
filename,
|
|
292
|
+
width: thumb.width || 0,
|
|
293
|
+
height: thumb.height || 0,
|
|
294
|
+
format: ext,
|
|
295
|
+
size: buffer.length
|
|
296
|
+
});
|
|
297
|
+
this.logger.debug(`Saved thumbnail ${i} for ${fileStorageId} (${thumb.width}x${thumb.height}, ${buffer.length} bytes)`);
|
|
298
|
+
} catch (error) {
|
|
299
|
+
this.logger.warn(`Failed to save thumbnail ${i} for ${fileStorageId}: ${error}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return savedThumbnails;
|
|
303
|
+
}
|
|
304
|
+
async getThumbnail(fileStorageId, index) {
|
|
305
|
+
const filePath = await this.findFilePath(fileStorageId);
|
|
306
|
+
if (!filePath) return null;
|
|
307
|
+
const thumbnailDir = filePath.replace(/\.(gcode|3mf|bgcode)$/i, '_thumbnails');
|
|
308
|
+
for (const ext of [
|
|
309
|
+
'png',
|
|
310
|
+
'jpg',
|
|
311
|
+
'jpeg',
|
|
312
|
+
'qoi'
|
|
313
|
+
]){
|
|
314
|
+
const thumbPath = (0, _nodepath.join)(thumbnailDir, `thumb_${index}.${ext}`);
|
|
315
|
+
try {
|
|
316
|
+
return await (0, _promises.readFile)(thumbPath);
|
|
317
|
+
} catch {}
|
|
318
|
+
}
|
|
319
|
+
return null;
|
|
320
|
+
}
|
|
321
|
+
async listThumbnails(fileStorageId) {
|
|
322
|
+
const filePath = await this.findFilePath(fileStorageId);
|
|
323
|
+
if (!filePath) return [];
|
|
324
|
+
const thumbnailDir = filePath.replace(/\.(gcode|3mf|bgcode)$/i, '_thumbnails');
|
|
325
|
+
try {
|
|
326
|
+
const files = await (0, _promises.readdir)(thumbnailDir);
|
|
327
|
+
return files.filter((f)=>f.startsWith('thumb_')).sort((a, b)=>a.localeCompare(b));
|
|
328
|
+
} catch {
|
|
329
|
+
return [];
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
async listAllFiles() {
|
|
333
|
+
const files = [];
|
|
334
|
+
for (const subdir of this.STORAGE_SUBDIRS){
|
|
335
|
+
const dirPath = (0, _nodepath.join)(this.storageBasePath, subdir);
|
|
336
|
+
try {
|
|
337
|
+
const dirFiles = await (0, _promises.readdir)(dirPath);
|
|
338
|
+
for (const file of dirFiles){
|
|
339
|
+
if (file.endsWith('_thumbnails') || file.endsWith('.json')) continue;
|
|
340
|
+
const fileId = _nodepath.default.parse(file).name;
|
|
341
|
+
const filePath = (0, _nodepath.join)(dirPath, file);
|
|
342
|
+
const stats = await (0, _promises.stat)(filePath);
|
|
343
|
+
const metadata = await this.loadMetadata(fileId);
|
|
344
|
+
const thumbnails = await this.listThumbnails(fileId);
|
|
345
|
+
files.push({
|
|
346
|
+
fileStorageId: fileId,
|
|
347
|
+
fileName: metadata?._fileName || file,
|
|
348
|
+
fileFormat: subdir,
|
|
349
|
+
fileSize: stats.size,
|
|
350
|
+
fileHash: metadata?._fileHash || '',
|
|
351
|
+
createdAt: stats.birthtime,
|
|
352
|
+
thumbnailCount: thumbnails.length,
|
|
353
|
+
metadata: metadata
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
} catch (error) {
|
|
357
|
+
this.logger.error(`Error listing files in ${subdir}`, error);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return files.sort((a, b)=>b.createdAt.getTime() - a.createdAt.getTime());
|
|
361
|
+
}
|
|
362
|
+
async getFileInfo(fileStorageId) {
|
|
363
|
+
const filePath = await this.findFilePath(fileStorageId);
|
|
364
|
+
if (!filePath) return null;
|
|
365
|
+
try {
|
|
366
|
+
const stats = await (0, _promises.stat)(filePath);
|
|
367
|
+
const metadata = await this.loadMetadata(fileStorageId);
|
|
368
|
+
const thumbnails = await this.listThumbnails(fileStorageId);
|
|
369
|
+
const ext = (0, _nodepath.extname)(filePath).substring(1);
|
|
370
|
+
return {
|
|
371
|
+
fileStorageId,
|
|
372
|
+
fileName: metadata?._originalFileName || (0, _nodepath.basename)(filePath),
|
|
373
|
+
fileFormat: ext,
|
|
374
|
+
fileSize: stats.size,
|
|
375
|
+
fileHash: metadata?._fileHash || '',
|
|
376
|
+
createdAt: stats.birthtime,
|
|
377
|
+
thumbnailCount: thumbnails.length,
|
|
378
|
+
metadata: metadata
|
|
379
|
+
};
|
|
380
|
+
} catch (error) {
|
|
381
|
+
this.logger.error(`Error getting file info for ${fileStorageId}`, error);
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
//# sourceMappingURL=file-storage.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/file-storage.service.ts"],"names":["FileStorageService","printJobRepository","logger","storageBasePath","STORAGE_SUBDIRS","loggerFactory","typeormService","getDataSource","getRepository","PrintJob","name","join","superRootPath","AppConstants","defaultPrintFilesStorage","ensureStorageDirectories","mkdir","recursive","subdir","error","readFile","fileStorageId","filePath","getFilePath","readFileSync","saveFile","file","fileHash","fileExt","extname","originalname","toLowerCase","fileId","nameHash","createHash","update","digest","substring","crypto","randomUUID","includes","targetDir","targetPath","path","rename","buffer","writeFile","Error","log","getFile","findFilePath","deleteFile","warn","unlink","metadataPath","debug","thumbnailDir","replace","rm","force","ext","fullPath","existsSync","calculateFileHash","fileBuffer","hashSum","getDeterministicId","fileName","dirPath","files","readdir","matchingFile","find","f","startsWith","fileExists","findDuplicateByHash","findOne","where","order","createdAt","saveMetadata","metadata","originalFileName","thumbnailMetadata","existingOriginalFileName","existingThumbnails","existingContent","existing","JSON","parse","_originalFileName","_thumbnails","metadataWithMeta","_fileHash","_analyzedAt","Date","toISOString","_fileStorageId","stringify","thumbnailMeta","length","loadMetadata","content","hasMetadata","access","saveThumbnails","thumbnails","savedThumbnails","i","thumb","data","format","filename","thumbPath","Buffer","from","relativePath","relative","push","index","width","height","size","getThumbnail","listThumbnails","filter","sort","a","b","localeCompare","listAllFiles","dirFiles","endsWith","stats","stat","_fileName","fileFormat","fileSize","birthtime","thumbnailCount","getTime","getFileInfo","basename"],"mappings":"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"}
|
|
@@ -40,18 +40,18 @@ class CreatePositionDto {
|
|
|
40
40
|
class FloorDto {
|
|
41
41
|
id;
|
|
42
42
|
name;
|
|
43
|
-
|
|
43
|
+
order;
|
|
44
44
|
printers;
|
|
45
45
|
}
|
|
46
46
|
class CreateFloorDto {
|
|
47
47
|
printers;
|
|
48
48
|
name;
|
|
49
|
-
|
|
49
|
+
order;
|
|
50
50
|
}
|
|
51
51
|
class UpdateFloorDto {
|
|
52
52
|
printers;
|
|
53
53
|
name;
|
|
54
|
-
|
|
54
|
+
order;
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
//# sourceMappingURL=floor.dto.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/services/interfaces/floor.dto.ts"],"names":["CreateFloorDto","CreatePositionDto","FloorDto","PositionDto","UpdateFloorDto","x","y","printerId","floorId","id","name","
|
|
1
|
+
{"version":3,"sources":["../../../src/services/interfaces/floor.dto.ts"],"names":["CreateFloorDto","CreatePositionDto","FloorDto","PositionDto","UpdateFloorDto","x","y","printerId","floorId","id","name","order","printers"],"mappings":";;;;;;;;;;;QAqBaA;eAAAA;;QAdAC;eAAAA;;QAOAC;eAAAA;;QAdAC;eAAAA;;QA2BAC;eAAAA;;;AA3BN,MAAMD;IACXE,EAAU;IACVC,EAAU;IACVC,UAAkB;IAClBC,QAAgB;AAClB;AAEO,MAAMP;IACXI,EAAU;IACVC,EAAU;IACVC,UAAkB;IAClBC,QAAiB;AACnB;AAEO,MAAMN;IACXO,GAAW;IACXC,KAAa;IACbC,MAAc;IACdC,SAAwB;AAC1B;AAEO,MAAMZ;IACXY,SAA+B;IAC/BF,KAAa;IACbC,MAAc;AAChB;AAEO,MAAMP;IACXQ,SAAyB;IACzBF,KAAc;IACdC,MAAe;AACjB"}
|
|
@@ -9,19 +9,20 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
get
|
|
13
|
-
return
|
|
12
|
+
get CreateTagDto () {
|
|
13
|
+
return CreateTagDto;
|
|
14
14
|
},
|
|
15
|
-
get
|
|
16
|
-
return
|
|
15
|
+
get PrinterTagDto () {
|
|
16
|
+
return PrinterTagDto;
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
|
-
class
|
|
19
|
+
class PrinterTagDto {
|
|
20
20
|
printerId;
|
|
21
|
-
|
|
21
|
+
tagId;
|
|
22
22
|
}
|
|
23
|
-
class
|
|
23
|
+
class CreateTagDto {
|
|
24
24
|
name;
|
|
25
|
+
color;
|
|
25
26
|
}
|
|
26
27
|
|
|
27
|
-
//# sourceMappingURL=printer-
|
|
28
|
+
//# sourceMappingURL=printer-tag.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/services/interfaces/printer-tag.dto.ts"],"names":["CreateTagDto","PrinterTagDto","printerId","tagId","name","color"],"mappings":";;;;;;;;;;;QAKaA;eAAAA;;QALAC;eAAAA;;;AAAN,MAAMA;IACXC,UAAkB;IAClBC,MAAc;AAChB;AAEO,MAAMH;IACXI,KAAa;IACbC,MAAe;AACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/services/interfaces/printer-
|
|
1
|
+
{"version":3,"sources":["../../../src/services/interfaces/printer-tag.service.interface.ts"],"names":[],"mappings":""}
|
|
@@ -13,7 +13,6 @@ class SettingsDto {
|
|
|
13
13
|
[_serversettingsconstants.serverSettingsKey];
|
|
14
14
|
[_serversettingsconstants.wizardSettingKey];
|
|
15
15
|
[_serversettingsconstants.frontendSettingKey];
|
|
16
|
-
[_serversettingsconstants.printerFileCleanSettingKey];
|
|
17
16
|
[_serversettingsconstants.timeoutSettingKey];
|
|
18
17
|
}
|
|
19
18
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/services/interfaces/settings.dto.ts"],"names":["SettingsDto","serverSettingsKey","wizardSettingKey","frontendSettingKey","
|
|
1
|
+
{"version":3,"sources":["../../../src/services/interfaces/settings.dto.ts"],"names":["SettingsDto","serverSettingsKey","wizardSettingKey","frontendSettingKey","timeoutSettingKey"],"mappings":";;;;+BA+BaA;;;eAAAA;;;yCA1BN;AA0BA,MAAMA;IACX,CAACC,0CAAiB,CAAC,CAAoB;IACvC,CAACC,yCAAgB,CAAC,CAAoB;IACtC,CAACC,2CAAkB,CAAC,CAAsB;IAE1C,CAACC,0CAAiB,CAAC,CAAqB;AAC1C"}
|