digitaltwin-core 0.14.0 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/README.md +2 -2
  2. package/package.json +102 -106
  3. package/dist/auth/apisix_parser.d.ts +0 -146
  4. package/dist/auth/apisix_parser.d.ts.map +0 -1
  5. package/dist/auth/apisix_parser.js +0 -185
  6. package/dist/auth/apisix_parser.js.map +0 -1
  7. package/dist/auth/auth_config.d.ts +0 -126
  8. package/dist/auth/auth_config.d.ts.map +0 -1
  9. package/dist/auth/auth_config.js +0 -169
  10. package/dist/auth/auth_config.js.map +0 -1
  11. package/dist/auth/index.d.ts +0 -5
  12. package/dist/auth/index.d.ts.map +0 -1
  13. package/dist/auth/index.js +0 -4
  14. package/dist/auth/index.js.map +0 -1
  15. package/dist/auth/types.d.ts +0 -100
  16. package/dist/auth/types.d.ts.map +0 -1
  17. package/dist/auth/types.js +0 -2
  18. package/dist/auth/types.js.map +0 -1
  19. package/dist/auth/user_service.d.ts +0 -86
  20. package/dist/auth/user_service.d.ts.map +0 -1
  21. package/dist/auth/user_service.js +0 -237
  22. package/dist/auth/user_service.js.map +0 -1
  23. package/dist/components/assets_manager.d.ts +0 -662
  24. package/dist/components/assets_manager.d.ts.map +0 -1
  25. package/dist/components/assets_manager.js +0 -1529
  26. package/dist/components/assets_manager.js.map +0 -1
  27. package/dist/components/async_upload.d.ts +0 -20
  28. package/dist/components/async_upload.d.ts.map +0 -1
  29. package/dist/components/async_upload.js +0 -10
  30. package/dist/components/async_upload.js.map +0 -1
  31. package/dist/components/collector.d.ts +0 -203
  32. package/dist/components/collector.d.ts.map +0 -1
  33. package/dist/components/collector.js +0 -202
  34. package/dist/components/collector.js.map +0 -1
  35. package/dist/components/custom_table_manager.d.ts +0 -503
  36. package/dist/components/custom_table_manager.d.ts.map +0 -1
  37. package/dist/components/custom_table_manager.js +0 -1052
  38. package/dist/components/custom_table_manager.js.map +0 -1
  39. package/dist/components/global_assets_handler.d.ts +0 -63
  40. package/dist/components/global_assets_handler.d.ts.map +0 -1
  41. package/dist/components/global_assets_handler.js +0 -127
  42. package/dist/components/global_assets_handler.js.map +0 -1
  43. package/dist/components/handler.d.ts +0 -104
  44. package/dist/components/handler.d.ts.map +0 -1
  45. package/dist/components/handler.js +0 -110
  46. package/dist/components/handler.js.map +0 -1
  47. package/dist/components/harvester.d.ts +0 -182
  48. package/dist/components/harvester.d.ts.map +0 -1
  49. package/dist/components/harvester.js +0 -393
  50. package/dist/components/harvester.js.map +0 -1
  51. package/dist/components/index.d.ts +0 -11
  52. package/dist/components/index.d.ts.map +0 -1
  53. package/dist/components/index.js +0 -9
  54. package/dist/components/index.js.map +0 -1
  55. package/dist/components/interfaces.d.ts +0 -126
  56. package/dist/components/interfaces.d.ts.map +0 -1
  57. package/dist/components/interfaces.js +0 -8
  58. package/dist/components/interfaces.js.map +0 -1
  59. package/dist/components/map_manager.d.ts +0 -61
  60. package/dist/components/map_manager.d.ts.map +0 -1
  61. package/dist/components/map_manager.js +0 -242
  62. package/dist/components/map_manager.js.map +0 -1
  63. package/dist/components/tileset_manager.d.ts +0 -125
  64. package/dist/components/tileset_manager.d.ts.map +0 -1
  65. package/dist/components/tileset_manager.js +0 -618
  66. package/dist/components/tileset_manager.js.map +0 -1
  67. package/dist/components/types.d.ts +0 -226
  68. package/dist/components/types.d.ts.map +0 -1
  69. package/dist/components/types.js +0 -8
  70. package/dist/components/types.js.map +0 -1
  71. package/dist/database/adapters/knex_database_adapter.d.ts +0 -92
  72. package/dist/database/adapters/knex_database_adapter.d.ts.map +0 -1
  73. package/dist/database/adapters/knex_database_adapter.js +0 -647
  74. package/dist/database/adapters/knex_database_adapter.js.map +0 -1
  75. package/dist/database/database_adapter.d.ts +0 -251
  76. package/dist/database/database_adapter.d.ts.map +0 -1
  77. package/dist/database/database_adapter.js +0 -46
  78. package/dist/database/database_adapter.js.map +0 -1
  79. package/dist/engine/digital_twin_engine.d.ts +0 -253
  80. package/dist/engine/digital_twin_engine.d.ts.map +0 -1
  81. package/dist/engine/digital_twin_engine.js +0 -790
  82. package/dist/engine/digital_twin_engine.js.map +0 -1
  83. package/dist/engine/endpoints.d.ts +0 -47
  84. package/dist/engine/endpoints.d.ts.map +0 -1
  85. package/dist/engine/endpoints.js +0 -56
  86. package/dist/engine/endpoints.js.map +0 -1
  87. package/dist/engine/events.d.ts +0 -93
  88. package/dist/engine/events.d.ts.map +0 -1
  89. package/dist/engine/events.js +0 -71
  90. package/dist/engine/events.js.map +0 -1
  91. package/dist/engine/initializer.d.ts +0 -62
  92. package/dist/engine/initializer.d.ts.map +0 -1
  93. package/dist/engine/initializer.js +0 -108
  94. package/dist/engine/initializer.js.map +0 -1
  95. package/dist/engine/queue_manager.d.ts +0 -87
  96. package/dist/engine/queue_manager.d.ts.map +0 -1
  97. package/dist/engine/queue_manager.js +0 -196
  98. package/dist/engine/queue_manager.js.map +0 -1
  99. package/dist/engine/scheduler.d.ts +0 -30
  100. package/dist/engine/scheduler.d.ts.map +0 -1
  101. package/dist/engine/scheduler.js +0 -370
  102. package/dist/engine/scheduler.js.map +0 -1
  103. package/dist/engine/upload_processor.d.ts +0 -36
  104. package/dist/engine/upload_processor.d.ts.map +0 -1
  105. package/dist/engine/upload_processor.js +0 -101
  106. package/dist/engine/upload_processor.js.map +0 -1
  107. package/dist/env/env.d.ts +0 -134
  108. package/dist/env/env.d.ts.map +0 -1
  109. package/dist/env/env.js +0 -177
  110. package/dist/env/env.js.map +0 -1
  111. package/dist/index.d.ts +0 -49
  112. package/dist/index.d.ts.map +0 -1
  113. package/dist/index.js +0 -57
  114. package/dist/index.js.map +0 -1
  115. package/dist/openapi/generator.d.ts +0 -93
  116. package/dist/openapi/generator.d.ts.map +0 -1
  117. package/dist/openapi/generator.js +0 -293
  118. package/dist/openapi/generator.js.map +0 -1
  119. package/dist/openapi/index.d.ts +0 -9
  120. package/dist/openapi/index.d.ts.map +0 -1
  121. package/dist/openapi/index.js +0 -9
  122. package/dist/openapi/index.js.map +0 -1
  123. package/dist/openapi/types.d.ts +0 -182
  124. package/dist/openapi/types.d.ts.map +0 -1
  125. package/dist/openapi/types.js +0 -16
  126. package/dist/openapi/types.js.map +0 -1
  127. package/dist/storage/adapters/local_storage_service.d.ts +0 -51
  128. package/dist/storage/adapters/local_storage_service.d.ts.map +0 -1
  129. package/dist/storage/adapters/local_storage_service.js +0 -110
  130. package/dist/storage/adapters/local_storage_service.js.map +0 -1
  131. package/dist/storage/adapters/ovh_storage_service.d.ts +0 -72
  132. package/dist/storage/adapters/ovh_storage_service.d.ts.map +0 -1
  133. package/dist/storage/adapters/ovh_storage_service.js +0 -206
  134. package/dist/storage/adapters/ovh_storage_service.js.map +0 -1
  135. package/dist/storage/storage_factory.d.ts +0 -14
  136. package/dist/storage/storage_factory.d.ts.map +0 -1
  137. package/dist/storage/storage_factory.js +0 -40
  138. package/dist/storage/storage_factory.js.map +0 -1
  139. package/dist/storage/storage_service.d.ts +0 -163
  140. package/dist/storage/storage_service.d.ts.map +0 -1
  141. package/dist/storage/storage_service.js +0 -54
  142. package/dist/storage/storage_service.js.map +0 -1
  143. package/dist/types/data_record.d.ts +0 -123
  144. package/dist/types/data_record.d.ts.map +0 -1
  145. package/dist/types/data_record.js +0 -8
  146. package/dist/types/data_record.js.map +0 -1
  147. package/dist/utils/http_responses.d.ts +0 -155
  148. package/dist/utils/http_responses.d.ts.map +0 -1
  149. package/dist/utils/http_responses.js +0 -190
  150. package/dist/utils/http_responses.js.map +0 -1
  151. package/dist/utils/index.d.ts +0 -8
  152. package/dist/utils/index.d.ts.map +0 -1
  153. package/dist/utils/index.js +0 -6
  154. package/dist/utils/index.js.map +0 -1
  155. package/dist/utils/logger.d.ts +0 -74
  156. package/dist/utils/logger.d.ts.map +0 -1
  157. package/dist/utils/logger.js +0 -92
  158. package/dist/utils/logger.js.map +0 -1
  159. package/dist/utils/map_to_data_record.d.ts +0 -10
  160. package/dist/utils/map_to_data_record.d.ts.map +0 -1
  161. package/dist/utils/map_to_data_record.js +0 -36
  162. package/dist/utils/map_to_data_record.js.map +0 -1
  163. package/dist/utils/servable_endpoint.d.ts +0 -63
  164. package/dist/utils/servable_endpoint.d.ts.map +0 -1
  165. package/dist/utils/servable_endpoint.js +0 -67
  166. package/dist/utils/servable_endpoint.js.map +0 -1
  167. package/dist/utils/zip_utils.d.ts +0 -66
  168. package/dist/utils/zip_utils.d.ts.map +0 -1
  169. package/dist/utils/zip_utils.js +0 -169
  170. package/dist/utils/zip_utils.js.map +0 -1
@@ -1,618 +0,0 @@
1
- import { AssetsManager } from './assets_manager.js';
2
- import { extractAndStoreArchive } from '../utils/zip_utils.js';
3
- import { ApisixAuthParser } from '../auth/apisix_parser.js';
4
- import { AuthConfig } from '../auth/auth_config.js';
5
- import fs from 'fs/promises';
6
- import { successResponse, errorResponse, badRequestResponse, unauthorizedResponse, notFoundResponse, forbiddenResponse } from '../utils/http_responses.js';
7
- /** Threshold for async upload (50MB) */
8
- const ASYNC_UPLOAD_THRESHOLD = 50 * 1024 * 1024;
9
- /**
10
- * Specialized Assets Manager for handling 3D Tiles tilesets.
11
- *
12
- * This manager extracts uploaded ZIP files and stores each file in cloud storage (OVH S3),
13
- * allowing Cesium and other 3D viewers to load tilesets directly via public URLs.
14
- *
15
- * ## How it works
16
- *
17
- * 1. User uploads a ZIP containing a 3D Tiles tileset
18
- * 2. ZIP is extracted and all files are stored in OVH with public-read ACL
19
- * 3. Database stores only the tileset.json URL and base path
20
- * 4. Cesium loads tileset.json directly from OVH
21
- * 5. Cesium fetches tiles using relative paths in tileset.json (directly from OVH)
22
- *
23
- * ## Endpoints
24
- *
25
- * - GET /{endpoint} - List all tilesets with their public URLs
26
- * - POST /{endpoint} - Upload tileset ZIP (sync < 50MB, async >= 50MB)
27
- * - GET /{endpoint}/:id/status - Poll async upload status
28
- * - PUT /{endpoint}/:id - Update tileset metadata
29
- * - DELETE /{endpoint}/:id - Delete tileset and all files from storage
30
- *
31
- * @example
32
- * ```typescript
33
- * class MyTilesetManager extends TilesetManager {
34
- * getConfiguration() {
35
- * return {
36
- * name: 'tilesets',
37
- * description: 'Manage 3D Tiles tilesets',
38
- * contentType: 'application/json',
39
- * endpoint: 'api/tilesets',
40
- * extension: '.zip'
41
- * }
42
- * }
43
- * }
44
- *
45
- * // After upload, response contains:
46
- * // { tileset_url: 'https://bucket.s3.../tilesets/123/tileset.json' }
47
- * //
48
- * // Cesium loads directly:
49
- * // Cesium.Cesium3DTileset.fromUrl(tileset_url)
50
- * ```
51
- */
52
- export class TilesetManager extends AssetsManager {
53
- constructor() {
54
- super(...arguments);
55
- /** Upload queue for async processing (injected by engine) */
56
- this.uploadQueue = null;
57
- }
58
- /**
59
- * Set the upload queue for async job processing.
60
- * Called by DigitalTwinEngine during initialization.
61
- */
62
- setUploadQueue(queue) {
63
- this.uploadQueue = queue;
64
- }
65
- /**
66
- * Handle tileset upload.
67
- *
68
- * - Files < 50MB: Synchronous extraction and upload
69
- * - Files >= 50MB: Queued for async processing (returns 202)
70
- */
71
- async handleUpload(req) {
72
- try {
73
- if (!req?.body) {
74
- return badRequestResponse('Invalid request: missing request body');
75
- }
76
- // Authenticate user
77
- const userId = await this.authenticateUser(req);
78
- if (typeof userId !== 'number') {
79
- return userId; // Returns error response
80
- }
81
- // Validate request
82
- const { description } = req.body;
83
- const filePath = req.file?.path;
84
- const fileBuffer = req.file?.buffer;
85
- const filename = req.file?.originalname || req.body.filename;
86
- const fileSize = req.file?.size || fileBuffer?.length || 0;
87
- if (!filePath && !fileBuffer) {
88
- return badRequestResponse('Missing required field: ZIP file');
89
- }
90
- if (!description) {
91
- if (filePath)
92
- await fs.unlink(filePath).catch(() => { });
93
- return badRequestResponse('Missing required field: description');
94
- }
95
- if (!filename) {
96
- if (filePath)
97
- await fs.unlink(filePath).catch(() => { });
98
- return badRequestResponse('Filename could not be determined from uploaded file');
99
- }
100
- if (!filename.toLowerCase().endsWith('.zip')) {
101
- if (filePath)
102
- await fs.unlink(filePath).catch(() => { });
103
- return badRequestResponse('Invalid file extension. Expected: .zip');
104
- }
105
- const config = this.getConfiguration();
106
- const isPublic = req.body.is_public !== undefined ? Boolean(req.body.is_public) : true;
107
- // Route to async or sync based on file size and queue availability
108
- if (this.uploadQueue && filePath && fileSize >= ASYNC_UPLOAD_THRESHOLD) {
109
- return this.handleAsyncUpload(userId, filePath, filename, description, isPublic, config);
110
- }
111
- return this.handleSyncUpload(userId, filePath, fileBuffer, filename, description, isPublic, config);
112
- }
113
- catch (error) {
114
- if (req.file?.path)
115
- await fs.unlink(req.file.path).catch(() => { });
116
- return errorResponse(error);
117
- }
118
- }
119
- /**
120
- * Authenticate user from request headers.
121
- * Returns user ID on success, or error response on failure.
122
- */
123
- async authenticateUser(req) {
124
- if (AuthConfig.isAuthDisabled()) {
125
- const userRecord = await this.userService.findOrCreateUser({
126
- id: AuthConfig.getAnonymousUserId(),
127
- roles: []
128
- });
129
- return userRecord.id;
130
- }
131
- if (!ApisixAuthParser.hasValidAuth(req.headers || {})) {
132
- return unauthorizedResponse();
133
- }
134
- const authUser = ApisixAuthParser.parseAuthHeaders(req.headers || {});
135
- if (!authUser) {
136
- return unauthorizedResponse('Invalid authentication headers');
137
- }
138
- const userRecord = await this.userService.findOrCreateUser(authUser);
139
- if (!userRecord.id) {
140
- return errorResponse('Failed to retrieve user information');
141
- }
142
- return userRecord.id;
143
- }
144
- /**
145
- * Queue upload for background processing. Returns HTTP 202 immediately.
146
- */
147
- async handleAsyncUpload(userId, filePath, filename, description, isPublic, config) {
148
- let recordId = null;
149
- try {
150
- // Create pending record (url will be updated after extraction)
151
- const metadata = {
152
- name: config.name,
153
- type: 'application/json',
154
- url: '',
155
- tileset_url: '',
156
- date: new Date(),
157
- description,
158
- filename,
159
- owner_id: userId,
160
- is_public: isPublic,
161
- upload_status: 'pending'
162
- };
163
- const savedRecord = await this.db.save(metadata);
164
- recordId = savedRecord.id;
165
- const jobData = {
166
- type: 'tileset',
167
- recordId,
168
- tempFilePath: filePath,
169
- componentName: config.name,
170
- userId,
171
- filename,
172
- description
173
- };
174
- const job = await this.uploadQueue?.add(`tileset-${recordId}`, jobData, {
175
- jobId: `tileset-upload-${recordId}`
176
- });
177
- if (!job)
178
- throw new Error('Failed to queue upload job');
179
- await this.db.updateById(config.name, recordId, { upload_job_id: job.id });
180
- return {
181
- status: 202,
182
- content: JSON.stringify({
183
- message: 'Tileset upload accepted, processing in background',
184
- id: recordId,
185
- job_id: job.id,
186
- status: 'pending',
187
- status_url: `/${config.endpoint}/${recordId}/status`
188
- }),
189
- headers: { 'Content-Type': 'application/json' }
190
- };
191
- }
192
- catch (error) {
193
- if (recordId !== null)
194
- await this.db.delete(String(recordId), config.name).catch(() => { });
195
- await fs.unlink(filePath).catch(() => { });
196
- throw error;
197
- }
198
- }
199
- /**
200
- * Process upload synchronously.
201
- */
202
- async handleSyncUpload(userId, filePath, fileBuffer, filename, description, isPublic, config) {
203
- let zipBuffer;
204
- try {
205
- const readBuffer = fileBuffer || (filePath ? await fs.readFile(filePath) : null);
206
- if (!readBuffer)
207
- throw new Error('No file data available');
208
- zipBuffer = readBuffer;
209
- }
210
- catch (error) {
211
- return errorResponse(`Failed to read uploaded file: ${error instanceof Error ? error.message : 'Unknown error'}`);
212
- }
213
- try {
214
- // Generate unique base path using timestamp
215
- const basePath = `${config.name}/${Date.now()}`;
216
- // Extract ZIP and upload all files to storage
217
- const extractResult = await extractAndStoreArchive(zipBuffer, this.storage, basePath);
218
- if (!extractResult.root_file) {
219
- // Clean up uploaded files
220
- await this.storage.deleteByPrefix(basePath).catch(() => { });
221
- return badRequestResponse('Invalid tileset: no tileset.json found in the ZIP archive');
222
- }
223
- // Build the public URL for tileset.json
224
- const tilesetPath = `${basePath}/${extractResult.root_file}`;
225
- const tilesetUrl = this.storage.getPublicUrl(tilesetPath);
226
- // Save metadata to database (url = basePath for deletion)
227
- const metadata = {
228
- name: config.name,
229
- type: 'application/json',
230
- url: basePath,
231
- tileset_url: tilesetUrl,
232
- date: new Date(),
233
- description,
234
- filename,
235
- owner_id: userId,
236
- is_public: isPublic,
237
- upload_status: 'completed'
238
- };
239
- const savedRecord = await this.db.save(metadata);
240
- // Clean up temp file
241
- if (filePath)
242
- await fs.unlink(filePath).catch(() => { });
243
- return successResponse({
244
- message: 'Tileset uploaded successfully',
245
- id: savedRecord.id,
246
- tileset_url: tilesetUrl,
247
- file_count: extractResult.file_count
248
- });
249
- }
250
- catch (error) {
251
- if (filePath)
252
- await fs.unlink(filePath).catch(() => { });
253
- throw error;
254
- }
255
- }
256
- /**
257
- * Get upload status for async uploads.
258
- */
259
- async handleGetStatus(req) {
260
- try {
261
- const { id } = req.params || {};
262
- if (!id) {
263
- return badRequestResponse('Asset ID is required');
264
- }
265
- const asset = await this.getAssetById(id);
266
- if (!asset) {
267
- return notFoundResponse('Tileset not found');
268
- }
269
- const record = asset;
270
- if (record.upload_status === 'completed') {
271
- return successResponse({
272
- id: record.id,
273
- status: 'completed',
274
- tileset_url: record.tileset_url
275
- });
276
- }
277
- if (record.upload_status === 'failed') {
278
- return successResponse({
279
- id: record.id,
280
- status: 'failed',
281
- error: record.upload_error || 'Upload failed'
282
- });
283
- }
284
- return successResponse({
285
- id: record.id,
286
- status: record.upload_status || 'unknown',
287
- job_id: record.upload_job_id
288
- });
289
- }
290
- catch (error) {
291
- return errorResponse(error);
292
- }
293
- }
294
- /**
295
- * List all tilesets with their public URLs.
296
- */
297
- async retrieve(req) {
298
- try {
299
- const assets = await this.getAllAssets();
300
- const isAdmin = req && ApisixAuthParser.isAdmin(req.headers || {});
301
- // Get authenticated user ID if available
302
- let authenticatedUserId = null;
303
- if (req && ApisixAuthParser.hasValidAuth(req.headers || {})) {
304
- const authUser = ApisixAuthParser.parseAuthHeaders(req.headers || {});
305
- if (authUser) {
306
- const userRecord = await this.userService.findOrCreateUser(authUser);
307
- authenticatedUserId = userRecord.id || null;
308
- }
309
- }
310
- // Filter to visible assets only (unless admin)
311
- const visibleAssets = isAdmin
312
- ? assets
313
- : assets.filter(asset => asset.is_public || (authenticatedUserId !== null && asset.owner_id === authenticatedUserId));
314
- // Transform to response format
315
- const response = visibleAssets.map(asset => ({
316
- id: asset.id,
317
- description: asset.description || '',
318
- filename: asset.filename || '',
319
- date: asset.date,
320
- owner_id: asset.owner_id || null,
321
- is_public: asset.is_public ?? true,
322
- tileset_url: asset.tileset_url || '',
323
- upload_status: asset.upload_status || 'completed'
324
- }));
325
- return successResponse(response);
326
- }
327
- catch (error) {
328
- return errorResponse(error);
329
- }
330
- }
331
- /**
332
- * Delete tileset and all files from storage.
333
- */
334
- async handleDelete(req) {
335
- try {
336
- // Authenticate user
337
- const userId = await this.authenticateUser(req);
338
- if (typeof userId !== 'number') {
339
- return userId;
340
- }
341
- const { id } = req.params || {};
342
- if (!id) {
343
- return badRequestResponse('Asset ID is required');
344
- }
345
- const asset = await this.getAssetById(id);
346
- if (!asset) {
347
- return notFoundResponse('Tileset not found');
348
- }
349
- // Check ownership (admins can delete any)
350
- const isAdmin = ApisixAuthParser.isAdmin(req.headers || {});
351
- if (!isAdmin && asset.owner_id !== null && asset.owner_id !== userId) {
352
- return forbiddenResponse('You can only delete your own assets');
353
- }
354
- // Block deletion while upload in progress
355
- if (asset.upload_status === 'pending' || asset.upload_status === 'processing') {
356
- return {
357
- status: 409,
358
- content: JSON.stringify({ error: 'Cannot delete tileset while upload is in progress' }),
359
- headers: { 'Content-Type': 'application/json' }
360
- };
361
- }
362
- // Delete all files from storage
363
- // Support both new format (url = basePath) and legacy format (file_index.files)
364
- const legacyFileIndex = asset.file_index;
365
- if (legacyFileIndex?.files && legacyFileIndex.files.length > 0) {
366
- // Legacy format: delete individual files from file_index
367
- console.log(`[TilesetManager] Deleting ${legacyFileIndex.files.length} files (legacy format)`);
368
- for (const file of legacyFileIndex.files) {
369
- await this.storage.delete(file.path).catch(() => {
370
- // Ignore individual file deletion errors
371
- });
372
- }
373
- }
374
- else if (asset.url) {
375
- // New format: url contains basePath, use deleteByPrefix
376
- const deletedCount = await this.storage.deleteByPrefix(asset.url);
377
- console.log(`[TilesetManager] Deleted ${deletedCount} files from ${asset.url}`);
378
- }
379
- // Delete database record
380
- await this.deleteAssetById(id);
381
- return successResponse({ message: 'Tileset deleted successfully' });
382
- }
383
- catch (error) {
384
- return errorResponse(error);
385
- }
386
- }
387
- /**
388
- * Get HTTP endpoints for this manager.
389
- */
390
- getEndpoints() {
391
- const config = this.getConfiguration();
392
- return [
393
- // Status endpoint (for async upload polling)
394
- {
395
- method: 'get',
396
- path: `/${config.endpoint}/:id/status`,
397
- handler: this.handleGetStatus.bind(this),
398
- responseType: 'application/json'
399
- },
400
- // List tilesets
401
- {
402
- method: 'get',
403
- path: `/${config.endpoint}`,
404
- handler: this.retrieve.bind(this),
405
- responseType: 'application/json'
406
- },
407
- // Upload tileset
408
- {
409
- method: 'post',
410
- path: `/${config.endpoint}`,
411
- handler: this.handleUpload.bind(this),
412
- responseType: 'application/json'
413
- },
414
- // Update metadata
415
- {
416
- method: 'put',
417
- path: `/${config.endpoint}/:id`,
418
- handler: this.handleUpdate.bind(this),
419
- responseType: 'application/json'
420
- },
421
- // Delete tileset
422
- {
423
- method: 'delete',
424
- path: `/${config.endpoint}/:id`,
425
- handler: this.handleDelete.bind(this),
426
- responseType: 'application/json'
427
- }
428
- ];
429
- }
430
- /**
431
- * Generate OpenAPI specification.
432
- */
433
- getOpenAPISpec() {
434
- const config = this.getConfiguration();
435
- const basePath = `/${config.endpoint}`;
436
- const tagName = config.tags?.[0] || config.name;
437
- return {
438
- paths: {
439
- [basePath]: {
440
- get: {
441
- summary: 'List all tilesets',
442
- description: 'Returns all tilesets with their public URLs for Cesium loading',
443
- tags: [tagName],
444
- responses: {
445
- '200': {
446
- description: 'List of tilesets',
447
- content: {
448
- 'application/json': {
449
- schema: {
450
- type: 'array',
451
- items: { $ref: '#/components/schemas/TilesetResponse' }
452
- }
453
- }
454
- }
455
- }
456
- }
457
- },
458
- post: {
459
- summary: 'Upload a tileset',
460
- description: 'Upload a ZIP file containing a 3D Tiles tileset. Files < 50MB are processed synchronously, larger files are queued.',
461
- tags: [tagName],
462
- security: [{ ApiKeyAuth: [] }],
463
- requestBody: {
464
- required: true,
465
- content: {
466
- 'multipart/form-data': {
467
- schema: {
468
- type: 'object',
469
- required: ['file', 'description'],
470
- properties: {
471
- file: {
472
- type: 'string',
473
- format: 'binary',
474
- description: 'ZIP file containing tileset'
475
- },
476
- description: { type: 'string', description: 'Tileset description' },
477
- is_public: {
478
- type: 'boolean',
479
- description: 'Whether tileset is public (default: true)'
480
- }
481
- }
482
- }
483
- }
484
- }
485
- },
486
- responses: {
487
- '200': {
488
- description: 'Tileset uploaded successfully (sync)',
489
- content: {
490
- 'application/json': {
491
- schema: {
492
- type: 'object',
493
- properties: {
494
- message: { type: 'string' },
495
- id: { type: 'integer' },
496
- tileset_url: {
497
- type: 'string',
498
- description: 'Public URL to load in Cesium'
499
- },
500
- file_count: { type: 'integer' }
501
- }
502
- }
503
- }
504
- }
505
- },
506
- '202': {
507
- description: 'Upload accepted for async processing',
508
- content: {
509
- 'application/json': {
510
- schema: {
511
- type: 'object',
512
- properties: {
513
- message: { type: 'string' },
514
- id: { type: 'integer' },
515
- status: { type: 'string' },
516
- status_url: { type: 'string' }
517
- }
518
- }
519
- }
520
- }
521
- },
522
- '400': { description: 'Bad request - missing fields or invalid file' },
523
- '401': { description: 'Unauthorized' }
524
- }
525
- }
526
- },
527
- [`${basePath}/{id}/status`]: {
528
- get: {
529
- summary: 'Get upload status',
530
- description: 'Poll the status of an async upload',
531
- tags: [tagName],
532
- parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],
533
- responses: {
534
- '200': {
535
- description: 'Upload status',
536
- content: {
537
- 'application/json': {
538
- schema: {
539
- type: 'object',
540
- properties: {
541
- id: { type: 'integer' },
542
- status: {
543
- type: 'string',
544
- enum: ['pending', 'processing', 'completed', 'failed']
545
- },
546
- tileset_url: { type: 'string' },
547
- error: { type: 'string' }
548
- }
549
- }
550
- }
551
- }
552
- },
553
- '404': { description: 'Tileset not found' }
554
- }
555
- }
556
- },
557
- [`${basePath}/{id}`]: {
558
- put: {
559
- summary: 'Update tileset metadata',
560
- tags: [tagName],
561
- security: [{ ApiKeyAuth: [] }],
562
- parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],
563
- requestBody: {
564
- content: {
565
- 'application/json': {
566
- schema: {
567
- type: 'object',
568
- properties: {
569
- description: { type: 'string' },
570
- is_public: { type: 'boolean' }
571
- }
572
- }
573
- }
574
- }
575
- },
576
- responses: {
577
- '200': { description: 'Updated successfully' },
578
- '401': { description: 'Unauthorized' },
579
- '403': { description: 'Forbidden' },
580
- '404': { description: 'Not found' }
581
- }
582
- },
583
- delete: {
584
- summary: 'Delete tileset',
585
- description: 'Delete tileset and all files from storage',
586
- tags: [tagName],
587
- security: [{ ApiKeyAuth: [] }],
588
- parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],
589
- responses: {
590
- '200': { description: 'Deleted successfully' },
591
- '401': { description: 'Unauthorized' },
592
- '403': { description: 'Forbidden' },
593
- '404': { description: 'Not found' },
594
- '409': { description: 'Upload in progress' }
595
- }
596
- }
597
- }
598
- },
599
- tags: [{ name: tagName, description: config.description }],
600
- schemas: {
601
- TilesetResponse: {
602
- type: 'object',
603
- properties: {
604
- id: { type: 'integer' },
605
- description: { type: 'string' },
606
- filename: { type: 'string' },
607
- date: { type: 'string', format: 'date-time' },
608
- owner_id: { type: 'integer', nullable: true },
609
- is_public: { type: 'boolean' },
610
- tileset_url: { type: 'string', description: 'Public URL to load in Cesium' },
611
- upload_status: { type: 'string', enum: ['pending', 'processing', 'completed', 'failed'] }
612
- }
613
- }
614
- }
615
- };
616
- }
617
- }
618
- //# sourceMappingURL=tileset_manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tileset_manager.js","sourceRoot":"","sources":["../../src/components/tileset_manager.ts"],"names":[],"mappings":"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"}