digitaltwin-core 0.6.1 → 0.7.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 (75) hide show
  1. package/README.md +188 -0
  2. package/dist/auth/apisix_parser.d.ts +122 -0
  3. package/dist/auth/apisix_parser.d.ts.map +1 -0
  4. package/dist/auth/apisix_parser.js +157 -0
  5. package/dist/auth/apisix_parser.js.map +1 -0
  6. package/dist/auth/auth_config.d.ts +95 -0
  7. package/dist/auth/auth_config.d.ts.map +1 -0
  8. package/dist/auth/auth_config.js +125 -0
  9. package/dist/auth/auth_config.js.map +1 -0
  10. package/dist/auth/index.d.ts +5 -0
  11. package/dist/auth/index.d.ts.map +1 -0
  12. package/dist/auth/index.js +4 -0
  13. package/dist/auth/index.js.map +1 -0
  14. package/dist/auth/types.d.ts +100 -0
  15. package/dist/auth/types.d.ts.map +1 -0
  16. package/dist/auth/types.js +2 -0
  17. package/dist/auth/types.js.map +1 -0
  18. package/dist/auth/user_service.d.ts +86 -0
  19. package/dist/auth/user_service.d.ts.map +1 -0
  20. package/dist/auth/user_service.js +239 -0
  21. package/dist/auth/user_service.js.map +1 -0
  22. package/dist/components/assets_manager.d.ts +21 -5
  23. package/dist/components/assets_manager.d.ts.map +1 -1
  24. package/dist/components/assets_manager.js +132 -4
  25. package/dist/components/assets_manager.js.map +1 -1
  26. package/dist/components/custom_table_manager.d.ts +344 -0
  27. package/dist/components/custom_table_manager.d.ts.map +1 -0
  28. package/dist/components/custom_table_manager.js +525 -0
  29. package/dist/components/custom_table_manager.js.map +1 -0
  30. package/dist/components/index.d.ts +4 -1
  31. package/dist/components/index.d.ts.map +1 -1
  32. package/dist/components/index.js +3 -0
  33. package/dist/components/index.js.map +1 -1
  34. package/dist/components/map_manager.d.ts +61 -0
  35. package/dist/components/map_manager.d.ts.map +1 -0
  36. package/dist/components/map_manager.js +233 -0
  37. package/dist/components/map_manager.js.map +1 -0
  38. package/dist/components/tileset_manager.d.ts +55 -0
  39. package/dist/components/tileset_manager.d.ts.map +1 -0
  40. package/dist/components/tileset_manager.js +212 -0
  41. package/dist/components/tileset_manager.js.map +1 -0
  42. package/dist/components/types.d.ts +20 -0
  43. package/dist/components/types.d.ts.map +1 -1
  44. package/dist/database/adapters/knex_database_adapter.d.ts +7 -0
  45. package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -1
  46. package/dist/database/adapters/knex_database_adapter.js +136 -2
  47. package/dist/database/adapters/knex_database_adapter.js.map +1 -1
  48. package/dist/database/database_adapter.d.ts +22 -1
  49. package/dist/database/database_adapter.d.ts.map +1 -1
  50. package/dist/database/database_adapter.js.map +1 -1
  51. package/dist/engine/digital_twin_engine.d.ts +4 -1
  52. package/dist/engine/digital_twin_engine.d.ts.map +1 -1
  53. package/dist/engine/digital_twin_engine.js +69 -3
  54. package/dist/engine/digital_twin_engine.js.map +1 -1
  55. package/dist/engine/endpoints.d.ts +2 -2
  56. package/dist/engine/endpoints.d.ts.map +1 -1
  57. package/dist/engine/endpoints.js.map +1 -1
  58. package/dist/env/env.d.ts +8 -0
  59. package/dist/env/env.d.ts.map +1 -1
  60. package/dist/env/env.js +22 -1
  61. package/dist/env/env.js.map +1 -1
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +3 -0
  65. package/dist/index.js.map +1 -1
  66. package/dist/types/data_record.d.ts +1 -1
  67. package/dist/utils/index.d.ts +5 -0
  68. package/dist/utils/index.d.ts.map +1 -0
  69. package/dist/utils/index.js +5 -0
  70. package/dist/utils/index.js.map +1 -0
  71. package/dist/utils/zip_utils.d.ts +24 -0
  72. package/dist/utils/zip_utils.d.ts.map +1 -0
  73. package/dist/utils/zip_utils.js +77 -0
  74. package/dist/utils/zip_utils.js.map +1 -0
  75. package/package.json +3 -1
@@ -0,0 +1,233 @@
1
+ import { AssetsManager } from './assets_manager.js';
2
+ import { ApisixAuthParser } from '../auth/apisix_parser.js';
3
+ /**
4
+ * Specialized Assets Manager for handling map layer data.
5
+ *
6
+ * Extends the base AssetsManager with specialized logic for:
7
+ * - Processing JSON layer objects containing map data
8
+ * - Extracting and analyzing layer metadata
9
+ * - Storing layer-specific information
10
+ *
11
+ * Inherits all CRUD endpoints from AssetsManager:
12
+ * - GET /{name} - List all layers
13
+ * - POST /{name}/upload - Upload layer data (overridden)
14
+ * - GET /{name}/:id - Get layer data
15
+ * - PUT /{name}/:id - Update layer metadata
16
+ * - DELETE /{name}/:id - Delete layer
17
+ * - GET /{name}/:id/download - Download layer data
18
+ */
19
+ export class MapManager extends AssetsManager {
20
+ /**
21
+ * Override the upload handler to process JSON layer objects instead of files.
22
+ *
23
+ * Processes the layer data:
24
+ * 1. Validates the layer object structure
25
+ * 2. Extracts layer-specific metadata
26
+ * 3. Stores the layer data as JSON
27
+ *
28
+ * @param req - HTTP request with layer JSON data
29
+ * @returns DataResponse with upload result
30
+ */
31
+ async handleUpload(req) {
32
+ try {
33
+ if (!req || !req.body) {
34
+ return {
35
+ status: 400,
36
+ content: JSON.stringify({
37
+ error: 'Invalid request: missing request body'
38
+ }),
39
+ headers: { 'Content-Type': 'application/json' }
40
+ };
41
+ }
42
+ // Check authentication
43
+ if (!ApisixAuthParser.hasValidAuth(req.headers || {})) {
44
+ return {
45
+ status: 401,
46
+ content: JSON.stringify({
47
+ error: 'Authentication required'
48
+ }),
49
+ headers: { 'Content-Type': 'application/json' }
50
+ };
51
+ }
52
+ // Parse authenticated user
53
+ const authUser = ApisixAuthParser.parseAuthHeaders(req.headers || {});
54
+ if (!authUser) {
55
+ return {
56
+ status: 401,
57
+ content: JSON.stringify({
58
+ error: 'Invalid authentication headers'
59
+ }),
60
+ headers: { 'Content-Type': 'application/json' }
61
+ };
62
+ }
63
+ // Find or create user in database
64
+ const userRecord = await this.userService.findOrCreateUser(authUser);
65
+ const { layer, description } = req.body;
66
+ if (!layer) {
67
+ return {
68
+ status: 400,
69
+ content: JSON.stringify({
70
+ error: 'Missing required field: layer (JSON object)'
71
+ }),
72
+ headers: { 'Content-Type': 'application/json' }
73
+ };
74
+ }
75
+ // Validate layer structure
76
+ if (typeof layer !== 'object' || layer === null) {
77
+ return {
78
+ status: 400,
79
+ content: JSON.stringify({
80
+ error: 'Layer must be a valid JSON object'
81
+ }),
82
+ headers: { 'Content-Type': 'application/json' }
83
+ };
84
+ }
85
+ // Analyze layer content
86
+ const layerInfo = this.analyzeLayerContent(layer);
87
+ const config = this.getConfiguration();
88
+ const now = new Date();
89
+ // Convert layer object to JSON string for storage
90
+ const layerJson = JSON.stringify(layer, null, 2);
91
+ const layerBuffer = Buffer.from(layerJson, 'utf-8');
92
+ // Generate filename from layer name or use timestamp
93
+ const filename = `${layerInfo.layer_name || 'layer'}_${Date.now()}.json`;
94
+ // Store layer data using framework pattern
95
+ const url = await this.storage.save(layerBuffer, config.name, filename);
96
+ // Create extended metadata with layer-specific fields
97
+ const metadata = {
98
+ name: config.name,
99
+ type: config.contentType || 'application/json',
100
+ url,
101
+ date: now,
102
+ description: description || layerInfo.description || 'Map layer',
103
+ source: req.body.source || 'uploaded',
104
+ owner_id: userRecord.id,
105
+ filename,
106
+ // Layer-specific metadata
107
+ layer_type: layerInfo.layer_type,
108
+ layer_name: layerInfo.layer_name,
109
+ geometry_type: layerInfo.geometry_type,
110
+ properties_count: layerInfo.properties_count
111
+ };
112
+ await this.db.save(metadata);
113
+ return {
114
+ status: 200,
115
+ content: JSON.stringify({
116
+ message: 'Layer uploaded successfully',
117
+ layer_name: layerInfo.layer_name,
118
+ geometry_type: layerInfo.geometry_type,
119
+ properties_count: layerInfo.properties_count
120
+ }),
121
+ headers: { 'Content-Type': 'application/json' }
122
+ };
123
+ }
124
+ catch (error) {
125
+ return {
126
+ status: 500,
127
+ content: JSON.stringify({
128
+ error: error instanceof Error ? error.message : 'Unknown error'
129
+ }),
130
+ headers: { 'Content-Type': 'application/json' }
131
+ };
132
+ }
133
+ }
134
+ /**
135
+ * Analyze layer content to extract metadata
136
+ * @param layer - The layer object to analyze
137
+ * @returns Layer metadata information
138
+ */
139
+ analyzeLayerContent(layer) {
140
+ // Default values
141
+ let layer_type = 'unknown';
142
+ let layer_name = 'layer';
143
+ let geometry_type;
144
+ let properties_count = 0;
145
+ // Try to detect GeoJSON
146
+ if (layer.type === 'FeatureCollection' && Array.isArray(layer.features)) {
147
+ layer_type = 'geojson';
148
+ layer_name = layer.name || 'geojson_layer';
149
+ // Analyze first feature for geometry type
150
+ if (layer.features.length > 0) {
151
+ const firstFeature = layer.features[0];
152
+ if (firstFeature.geometry && firstFeature.geometry.type) {
153
+ geometry_type = firstFeature.geometry.type.toLowerCase();
154
+ }
155
+ // Count properties in first feature
156
+ if (firstFeature.properties) {
157
+ properties_count = Object.keys(firstFeature.properties).length;
158
+ }
159
+ }
160
+ }
161
+ // Try to detect single GeoJSON Feature
162
+ else if (layer.type === 'Feature' && layer.geometry) {
163
+ layer_type = 'geojson_feature';
164
+ layer_name = layer.properties?.name || 'feature';
165
+ geometry_type = layer.geometry.type?.toLowerCase();
166
+ properties_count = layer.properties ? Object.keys(layer.properties).length : 0;
167
+ }
168
+ // Try to detect other common layer formats
169
+ else if (layer.layers && Array.isArray(layer.layers)) {
170
+ layer_type = 'layer_group';
171
+ layer_name = layer.name || 'layer_group';
172
+ properties_count = layer.layers.length;
173
+ }
174
+ // Generic object
175
+ else {
176
+ layer_type = 'custom';
177
+ layer_name = layer.name || layer.title || layer.id || 'custom_layer';
178
+ properties_count = Object.keys(layer).length;
179
+ }
180
+ // Extract description from various fields
181
+ const description = layer.description || layer.desc || layer.summary;
182
+ return {
183
+ layer_type,
184
+ layer_name,
185
+ geometry_type,
186
+ properties_count,
187
+ description
188
+ };
189
+ }
190
+ /**
191
+ * Override retrieve to include layer-specific metadata in the response
192
+ */
193
+ async retrieve() {
194
+ try {
195
+ const assets = await this.getAllAssets();
196
+ const config = this.getConfiguration();
197
+ // Transform to include layer metadata
198
+ const assetsWithMetadata = assets.map(asset => ({
199
+ id: asset.id,
200
+ name: asset.name,
201
+ date: asset.date,
202
+ contentType: asset.contentType,
203
+ description: asset.description || '',
204
+ source: asset.source || '',
205
+ owner_id: asset.owner_id || null,
206
+ filename: asset.filename || '',
207
+ // Layer-specific fields
208
+ layer_type: asset.layer_type || '',
209
+ layer_name: asset.layer_name || '',
210
+ geometry_type: asset.geometry_type || null,
211
+ properties_count: asset.properties_count || 0,
212
+ // URLs for frontend
213
+ url: `/${config.name}/${asset.id}`,
214
+ download_url: `/${config.name}/${asset.id}/download`
215
+ }));
216
+ return {
217
+ status: 200,
218
+ content: JSON.stringify(assetsWithMetadata),
219
+ headers: { 'Content-Type': 'application/json' }
220
+ };
221
+ }
222
+ catch (error) {
223
+ return {
224
+ status: 500,
225
+ content: JSON.stringify({
226
+ error: error instanceof Error ? error.message : 'Unknown error'
227
+ }),
228
+ headers: { 'Content-Type': 'application/json' }
229
+ };
230
+ }
231
+ }
232
+ }
233
+ //# sourceMappingURL=map_manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map_manager.js","sourceRoot":"","sources":["../../src/components/map_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAsB3D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAgB,UAAW,SAAQ,aAAa;IAClD;;;;;;;;;;OAUG;IACH,KAAK,CAAC,YAAY,CAAC,GAAQ;QACvB,IAAI,CAAC;YACD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACpB,OAAO;oBACH,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;wBACpB,KAAK,EAAE,uCAAuC;qBACjD,CAAC;oBACF,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAClD,CAAA;YACL,CAAC;YAED,uBAAuB;YACvB,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;gBACpD,OAAO;oBACH,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;wBACpB,KAAK,EAAE,yBAAyB;qBACnC,CAAC;oBACF,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAClD,CAAA;YACL,CAAC;YAED,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;YACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO;oBACH,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;wBACpB,KAAK,EAAE,gCAAgC;qBAC1C,CAAC;oBACF,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAClD,CAAA;YACL,CAAC;YAED,kCAAkC;YAClC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;YAEpE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;YAEvC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO;oBACH,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;wBACpB,KAAK,EAAE,6CAA6C;qBACvD,CAAC;oBACF,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAClD,CAAA;YACL,CAAC;YAED,2BAA2B;YAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC9C,OAAO;oBACH,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;wBACpB,KAAK,EAAE,mCAAmC;qBAC7C,CAAC;oBACF,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAClD,CAAA;YACL,CAAC;YAED,wBAAwB;YACxB,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;YAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAA;YACtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YAEtB,kDAAkD;YAClD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;YAChD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAEnD,qDAAqD;YACrD,MAAM,QAAQ,GAAG,GAAG,SAAS,CAAC,UAAU,IAAI,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,CAAA;YAExE,2CAA2C;YAC3C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YAEvE,sDAAsD;YACtD,MAAM,QAAQ,GAAwB;gBAClC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,WAAW,IAAI,kBAAkB;gBAC9C,GAAG;gBACH,IAAI,EAAE,GAAG;gBACT,WAAW,EAAE,WAAW,IAAI,SAAS,CAAC,WAAW,IAAI,WAAW;gBAChE,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU;gBACrC,QAAQ,EAAE,UAAU,CAAC,EAAG;gBACxB,QAAQ;gBACR,0BAA0B;gBAC1B,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,aAAa,EAAE,SAAS,CAAC,aAAa;gBACtC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;aAC/C,CAAA;YAED,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAE5B,OAAO;gBACH,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;oBACpB,OAAO,EAAE,6BAA6B;oBACtC,UAAU,EAAE,SAAS,CAAC,UAAU;oBAChC,aAAa,EAAE,SAAS,CAAC,aAAa;oBACtC,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;iBAC/C,CAAC;gBACF,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAClD,CAAA;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;oBACpB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAClE,CAAC;gBACF,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAClD,CAAA;QACL,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,mBAAmB,CAAC,KAAU;QAOlC,iBAAiB;QACjB,IAAI,UAAU,GAAG,SAAS,CAAA;QAC1B,IAAI,UAAU,GAAG,OAAO,CAAA;QACxB,IAAI,aAAiC,CAAA;QACrC,IAAI,gBAAgB,GAAG,CAAC,CAAA;QAExB,wBAAwB;QACxB,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtE,UAAU,GAAG,SAAS,CAAA;YACtB,UAAU,GAAG,KAAK,CAAC,IAAI,IAAI,eAAe,CAAA;YAE1C,0CAA0C;YAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;gBACtC,IAAI,YAAY,CAAC,QAAQ,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACtD,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;gBAC5D,CAAC;gBAED,oCAAoC;gBACpC,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;oBAC1B,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,MAAM,CAAA;gBAClE,CAAC;YACL,CAAC;QACL,CAAC;QACD,uCAAuC;aAClC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAClD,UAAU,GAAG,iBAAiB,CAAA;YAC9B,UAAU,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,IAAI,SAAS,CAAA;YAChD,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,CAAA;YAClD,gBAAgB,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAClF,CAAC;QACD,2CAA2C;aACtC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,UAAU,GAAG,aAAa,CAAA;YAC1B,UAAU,GAAG,KAAK,CAAC,IAAI,IAAI,aAAa,CAAA;YACxC,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAA;QAC1C,CAAC;QACD,iBAAiB;aACZ,CAAC;YACF,UAAU,GAAG,QAAQ,CAAA;YACrB,UAAU,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,IAAI,cAAc,CAAA;YACpE,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;QAChD,CAAC;QAED,0CAA0C;QAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAA;QAEpE,OAAO;YACH,UAAU;YACV,UAAU;YACV,aAAa;YACb,gBAAgB;YAChB,WAAW;SACd,CAAA;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAA;YAEtC,sCAAsC;YACtC,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC5C,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,EAAE;gBACpC,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;gBAC9B,wBAAwB;gBACxB,UAAU,EAAG,KAAa,CAAC,UAAU,IAAI,EAAE;gBAC3C,UAAU,EAAG,KAAa,CAAC,UAAU,IAAI,EAAE;gBAC3C,aAAa,EAAG,KAAa,CAAC,aAAa,IAAI,IAAI;gBACnD,gBAAgB,EAAG,KAAa,CAAC,gBAAgB,IAAI,CAAC;gBACtD,oBAAoB;gBACpB,GAAG,EAAE,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE;gBAClC,YAAY,EAAE,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,WAAW;aACvD,CAAC,CAAC,CAAA;YAEH,OAAO;gBACH,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;gBAC3C,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAClD,CAAA;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO;gBACH,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;oBACpB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAClE,CAAC;gBACF,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAClD,CAAA;QACL,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,55 @@
1
+ import { AssetsManager } from './assets_manager.js';
2
+ import type { DataResponse } from './types.js';
3
+ /**
4
+ * Extended metadata for tileset assets
5
+ */
6
+ export interface TilesetMetadataRow {
7
+ id?: number;
8
+ name: string;
9
+ type: string;
10
+ url: string;
11
+ date: Date;
12
+ description: string;
13
+ source: string;
14
+ owner_id: number | null;
15
+ filename: string;
16
+ tileset_name?: string;
17
+ file_count?: number;
18
+ has_metadata?: boolean;
19
+ main_files?: string;
20
+ }
21
+ /**
22
+ * Specialized Assets Manager for handling tileset ZIP files.
23
+ *
24
+ * Extends the base AssetsManager with specialized logic for:
25
+ * - Processing ZIP files containing tileset data
26
+ * - Extracting and analyzing tileset metadata
27
+ * - Storing tileset-specific information
28
+ *
29
+ * Inherits all CRUD endpoints from AssetsManager:
30
+ * - GET /{name} - List all tilesets
31
+ * - POST /{name}/upload - Upload tileset ZIP (overridden)
32
+ * - GET /{name}/:id - Get tileset file
33
+ * - PUT /{name}/:id - Update tileset metadata
34
+ * - DELETE /{name}/:id - Delete tileset
35
+ * - GET /{name}/:id/download - Download tileset ZIP
36
+ */
37
+ export declare abstract class TilesetManager extends AssetsManager {
38
+ /**
39
+ * Override the upload handler to process ZIP files containing tilesets.
40
+ *
41
+ * Processes the uploaded ZIP file:
42
+ * 1. Extracts and analyzes the ZIP content
43
+ * 2. Stores tileset-specific metadata
44
+ * 3. Saves the ZIP file using the storage service
45
+ *
46
+ * @param req - HTTP request with ZIP file upload
47
+ * @returns DataResponse with upload result
48
+ */
49
+ handleUpload(req: any): Promise<DataResponse>;
50
+ /**
51
+ * Override retrieve to include tileset-specific metadata in the response
52
+ */
53
+ retrieve(): Promise<DataResponse>;
54
+ }
55
+ //# sourceMappingURL=tileset_manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tileset_manager.d.ts","sourceRoot":"","sources":["../../src/components/tileset_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EAA0B,YAAY,EAAE,MAAM,YAAY,CAAA;AAKtE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,IAAI,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAEhB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,8BAAsB,cAAe,SAAQ,aAAa;IACtD;;;;;;;;;;OAUG;IACG,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;IAsJnD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;CAwC1C"}
@@ -0,0 +1,212 @@
1
+ import { AssetsManager } from './assets_manager.js';
2
+ import { zipToDict, analyzeTilesetContent } from '../utils/zip_utils.js';
3
+ import { ApisixAuthParser } from '../auth/apisix_parser.js';
4
+ import fs from 'fs/promises';
5
+ /**
6
+ * Specialized Assets Manager for handling tileset ZIP files.
7
+ *
8
+ * Extends the base AssetsManager with specialized logic for:
9
+ * - Processing ZIP files containing tileset data
10
+ * - Extracting and analyzing tileset metadata
11
+ * - Storing tileset-specific information
12
+ *
13
+ * Inherits all CRUD endpoints from AssetsManager:
14
+ * - GET /{name} - List all tilesets
15
+ * - POST /{name}/upload - Upload tileset ZIP (overridden)
16
+ * - GET /{name}/:id - Get tileset file
17
+ * - PUT /{name}/:id - Update tileset metadata
18
+ * - DELETE /{name}/:id - Delete tileset
19
+ * - GET /{name}/:id/download - Download tileset ZIP
20
+ */
21
+ export class TilesetManager extends AssetsManager {
22
+ /**
23
+ * Override the upload handler to process ZIP files containing tilesets.
24
+ *
25
+ * Processes the uploaded ZIP file:
26
+ * 1. Extracts and analyzes the ZIP content
27
+ * 2. Stores tileset-specific metadata
28
+ * 3. Saves the ZIP file using the storage service
29
+ *
30
+ * @param req - HTTP request with ZIP file upload
31
+ * @returns DataResponse with upload result
32
+ */
33
+ async handleUpload(req) {
34
+ try {
35
+ if (!req || !req.body) {
36
+ return {
37
+ status: 400,
38
+ content: JSON.stringify({
39
+ error: 'Invalid request: missing request body'
40
+ }),
41
+ headers: { 'Content-Type': 'application/json' }
42
+ };
43
+ }
44
+ // Check authentication
45
+ if (!ApisixAuthParser.hasValidAuth(req.headers || {})) {
46
+ return {
47
+ status: 401,
48
+ content: JSON.stringify({
49
+ error: 'Authentication required'
50
+ }),
51
+ headers: { 'Content-Type': 'application/json' }
52
+ };
53
+ }
54
+ // Parse authenticated user
55
+ const authUser = ApisixAuthParser.parseAuthHeaders(req.headers || {});
56
+ if (!authUser) {
57
+ return {
58
+ status: 401,
59
+ content: JSON.stringify({
60
+ error: 'Invalid authentication headers'
61
+ }),
62
+ headers: { 'Content-Type': 'application/json' }
63
+ };
64
+ }
65
+ // Find or create user in database
66
+ const userRecord = await this.userService.findOrCreateUser(authUser);
67
+ const { description } = req.body;
68
+ const filePath = req.file?.path;
69
+ const filename = req.file?.originalname || req.body.filename;
70
+ if (!filePath || !description) {
71
+ return {
72
+ status: 400,
73
+ content: JSON.stringify({
74
+ error: 'Missing required fields: description, ZIP file'
75
+ }),
76
+ headers: { 'Content-Type': 'application/json' }
77
+ };
78
+ }
79
+ if (!filename) {
80
+ return {
81
+ status: 400,
82
+ content: JSON.stringify({
83
+ error: 'Filename could not be determined from uploaded file'
84
+ }),
85
+ headers: { 'Content-Type': 'application/json' }
86
+ };
87
+ }
88
+ // Validate ZIP file extension
89
+ if (!filename.toLowerCase().endsWith('.zip')) {
90
+ return {
91
+ status: 400,
92
+ content: JSON.stringify({
93
+ error: 'Invalid file extension. Expected: .zip'
94
+ }),
95
+ headers: { 'Content-Type': 'application/json' }
96
+ };
97
+ }
98
+ // Read and process ZIP file
99
+ let fileBuffer;
100
+ try {
101
+ fileBuffer = await fs.readFile(filePath);
102
+ }
103
+ catch (error) {
104
+ return {
105
+ status: 500,
106
+ content: JSON.stringify({
107
+ error: `Failed to read uploaded file: ${error instanceof Error ? error.message : 'Unknown error'}`
108
+ }),
109
+ headers: { 'Content-Type': 'application/json' }
110
+ };
111
+ }
112
+ try {
113
+ // Extract and analyze tileset content
114
+ const zipDict = await zipToDict(fileBuffer);
115
+ const tilesetInfo = analyzeTilesetContent(zipDict);
116
+ // Use the analyzed name or fallback to filename
117
+ const tilesetName = tilesetInfo.name || filename.replace('.zip', '');
118
+ const config = this.getConfiguration();
119
+ const now = new Date();
120
+ // Store ZIP file using framework pattern
121
+ const url = await this.storage.save(fileBuffer, config.name, filename);
122
+ // Create extended metadata with tileset-specific fields
123
+ const metadata = {
124
+ name: config.name,
125
+ type: config.contentType || 'application/zip',
126
+ url,
127
+ date: now,
128
+ description,
129
+ source: req.body.source || 'uploaded',
130
+ owner_id: userRecord.id,
131
+ filename,
132
+ // Tileset-specific metadata
133
+ tileset_name: tilesetName,
134
+ file_count: tilesetInfo.fileCount,
135
+ has_metadata: tilesetInfo.hasMetadata,
136
+ main_files: tilesetInfo.mainFiles.join(',')
137
+ };
138
+ await this.db.save(metadata);
139
+ // Clean up temporary file after successful upload
140
+ await fs.unlink(filePath).catch(() => {
141
+ // Ignore cleanup errors
142
+ });
143
+ return {
144
+ status: 200,
145
+ content: JSON.stringify({
146
+ message: 'Tileset uploaded successfully',
147
+ tileset_name: tilesetName,
148
+ file_count: tilesetInfo.fileCount
149
+ }),
150
+ headers: { 'Content-Type': 'application/json' }
151
+ };
152
+ }
153
+ catch (error) {
154
+ // Clean up temporary file even on error
155
+ await fs.unlink(filePath).catch(() => { });
156
+ throw error;
157
+ }
158
+ }
159
+ catch (error) {
160
+ return {
161
+ status: 500,
162
+ content: JSON.stringify({
163
+ error: error instanceof Error ? error.message : 'Unknown error'
164
+ }),
165
+ headers: { 'Content-Type': 'application/json' }
166
+ };
167
+ }
168
+ }
169
+ /**
170
+ * Override retrieve to include tileset-specific metadata in the response
171
+ */
172
+ async retrieve() {
173
+ try {
174
+ const assets = await this.getAllAssets();
175
+ const config = this.getConfiguration();
176
+ // Transform to include tileset metadata
177
+ const assetsWithMetadata = assets.map(asset => ({
178
+ id: asset.id,
179
+ name: asset.name,
180
+ date: asset.date,
181
+ contentType: asset.contentType,
182
+ description: asset.description || '',
183
+ source: asset.source || '',
184
+ owner_id: asset.owner_id || null,
185
+ filename: asset.filename || '',
186
+ // Tileset-specific fields
187
+ tileset_name: asset.tileset_name || '',
188
+ file_count: asset.file_count || 0,
189
+ has_metadata: asset.has_metadata || false,
190
+ main_files: asset.main_files ? asset.main_files.split(',') : [],
191
+ // URLs for frontend
192
+ url: `/${config.name}/${asset.id}`,
193
+ download_url: `/${config.name}/${asset.id}/download`
194
+ }));
195
+ return {
196
+ status: 200,
197
+ content: JSON.stringify(assetsWithMetadata),
198
+ headers: { 'Content-Type': 'application/json' }
199
+ };
200
+ }
201
+ catch (error) {
202
+ return {
203
+ status: 500,
204
+ content: JSON.stringify({
205
+ error: error instanceof Error ? error.message : 'Unknown error'
206
+ }),
207
+ headers: { 'Content-Type': 'application/json' }
208
+ };
209
+ }
210
+ }
211
+ }
212
+ //# sourceMappingURL=tileset_manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tileset_manager.js","sourceRoot":"","sources":["../../src/components/tileset_manager.ts"],"names":[],"mappings":"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"}
@@ -46,4 +46,24 @@ export interface DataResponse {
46
46
  content: Buffer | string;
47
47
  headers?: Record<string, string>;
48
48
  }
49
+ export interface StoreConfiguration {
50
+ /** Name of the store (will be used as table name) */
51
+ name: string;
52
+ /** Description of what this store manages */
53
+ description: string;
54
+ /** Database columns definition with SQL types */
55
+ columns: {
56
+ [columnName: string]: string;
57
+ };
58
+ /** Custom endpoints for this store manager (optional) */
59
+ endpoints?: EndpointDefinition[];
60
+ }
61
+ export interface EndpointDefinition {
62
+ /** HTTP path relative to store name (e.g., "/add-layers") */
63
+ path: string;
64
+ /** HTTP method */
65
+ method: 'get' | 'post' | 'put' | 'delete';
66
+ /** Method name in the class to handle this endpoint */
67
+ handler: string;
68
+ }
49
69
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,6HAA6H;IAC7H,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IAClE,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IAClE,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAE9B,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAEhB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAE5B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,CAAA;IAE/C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,mBAAoB,SAAQ,sBAAsB;IAC/D,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,6HAA6H;IAC7H,SAAS,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IAClE,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IAClE,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAE9B,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAEhB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAE5B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,CAAA;IAE/C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,mBAAoB,SAAQ,sBAAsB;IAC/D,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,kBAAkB;IAC/B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,iDAAiD;IACjD,OAAO,EAAE;QACL,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;KAC/B,CAAA;IACD,yDAAyD;IACzD,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAA;CACnC;AAED,MAAM,WAAW,kBAAkB;IAC/B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB;IAClB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;IACzC,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAA;CAClB"}
@@ -37,6 +37,7 @@ export declare class KnexDatabaseAdapter extends DatabaseAdapter {
37
37
  getLatestByName(name: string): Promise<DataRecord | undefined>;
38
38
  doesTableExists(name: string): Promise<boolean>;
39
39
  createTable(name: string): Promise<void>;
40
+ createTableWithColumns(name: string, columns: Record<string, string>): Promise<void>;
40
41
  getFirstByName(name: string): Promise<DataRecord | undefined>;
41
42
  getByDateRange(name: string, startDate: Date, endDate?: Date, limit?: number): Promise<DataRecord[]>;
42
43
  getAfterDate(name: string, afterDate: Date, limit?: number): Promise<DataRecord[]>;
@@ -57,6 +58,12 @@ export declare class KnexDatabaseAdapter extends DatabaseAdapter {
57
58
  records: DataRecord[];
58
59
  total: number;
59
60
  }>;
61
+ findByConditions(tableName: string, conditions: Record<string, any>): Promise<DataRecord[]>;
62
+ updateById(tableName: string, id: number, data: Record<string, any>): Promise<void>;
60
63
  close(): Promise<void>;
64
+ /**
65
+ * Get the underlying Knex instance for advanced operations
66
+ */
67
+ getKnex(): Knex;
61
68
  }
62
69
  //# sourceMappingURL=knex_database_adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"knex_database_adapter.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/knex_database_adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knex_database_adapter.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/knex_database_adapter.ts"],"names":[],"mappings":"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"}