@trafficgroup/knex-rel 0.1.3 → 0.1.5
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/dist/dao/VideoMinuteResultDAO.d.ts +0 -4
- package/dist/dao/VideoMinuteResultDAO.js +7 -48
- package/dist/dao/VideoMinuteResultDAO.js.map +1 -1
- package/dist/dao/camera/camera.dao.d.ts +8 -1
- package/dist/dao/camera/camera.dao.js +27 -8
- package/dist/dao/camera/camera.dao.js.map +1 -1
- package/dist/dao/report-configuration/report-configuration.dao.d.ts +94 -0
- package/dist/dao/report-configuration/report-configuration.dao.js +352 -0
- package/dist/dao/report-configuration/report-configuration.dao.js.map +1 -0
- package/dist/dao/video/video.dao.d.ts +10 -0
- package/dist/dao/video/video.dao.js +40 -16
- package/dist/dao/video/video.dao.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces/report-configuration/report-configuration.interfaces.d.ts +26 -0
- package/dist/interfaces/report-configuration/report-configuration.interfaces.js +3 -0
- package/dist/interfaces/report-configuration/report-configuration.interfaces.js.map +1 -0
- package/migrations/20250930200521_migration.ts +52 -0
- package/package.json +1 -1
- package/plan.md +755 -212
- package/src/dao/VideoMinuteResultDAO.ts +7 -64
- package/src/dao/camera/camera.dao.ts +30 -10
- package/src/dao/report-configuration/report-configuration.dao.ts +402 -0
- package/src/dao/video/video.dao.ts +46 -18
- package/src/index.ts +8 -0
- package/src/interfaces/report-configuration/report-configuration.interfaces.ts +30 -0
- package/cameras_analysis.md +0 -199
- package/folder_cameraid_analysis.md +0 -167
- package/migrations/20250924000000_camera_name_search_index.ts +0 -22
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ReportConfigurationDAO = void 0;
|
|
16
|
+
const KnexConnection_1 = __importDefault(require("../../KnexConnection"));
|
|
17
|
+
/**
|
|
18
|
+
* Mapping from detection labels to FHWA vehicle classes (1-13)
|
|
19
|
+
*
|
|
20
|
+
* FHWA Classes:
|
|
21
|
+
* - Class 1: Motorcycles
|
|
22
|
+
* - Class 2: Cars (passenger cars)
|
|
23
|
+
* - Class 3: Pickup trucks, vans, motorized vehicles
|
|
24
|
+
* - Class 4: Buses
|
|
25
|
+
* - Class 5: Work vans (2-axle, 6-tire single units)
|
|
26
|
+
* - Classes 6-8: Single unit trucks
|
|
27
|
+
* - Classes 9-13: Articulated trucks (semi-trailers, multi-trailers)
|
|
28
|
+
*
|
|
29
|
+
* Non-motorized vehicles (pedestrian, bicycle, non_motorized_vehicle) are EXCLUDED
|
|
30
|
+
*/
|
|
31
|
+
const DETECTION_LABEL_TO_FHWA = {
|
|
32
|
+
motorcycle: [1],
|
|
33
|
+
car: [2],
|
|
34
|
+
pickup_truck: [3],
|
|
35
|
+
motorized_vehicle: [3], // Maps to Class 3 (same as pickup_truck)
|
|
36
|
+
bus: [4],
|
|
37
|
+
work_van: [5],
|
|
38
|
+
single_unit_truck: [6, 7, 8], // Classes 6-8
|
|
39
|
+
articulated_truck: [9, 10, 11, 12, 13], // Classes 9-13
|
|
40
|
+
// pedestrian, bicycle, non_motorized_vehicle are EXCLUDED
|
|
41
|
+
};
|
|
42
|
+
class ReportConfigurationDAO {
|
|
43
|
+
constructor() {
|
|
44
|
+
this._knex = KnexConnection_1.default.getConnection();
|
|
45
|
+
this.tableName = "report_configurations";
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Create a new report configuration
|
|
49
|
+
*/
|
|
50
|
+
create(item) {
|
|
51
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
+
// Validate configuration before creating
|
|
53
|
+
const validation = this.validateConfiguration(item.configuration);
|
|
54
|
+
if (!validation.valid) {
|
|
55
|
+
throw new Error(`Invalid configuration: ${validation.errors.join(", ")}`);
|
|
56
|
+
}
|
|
57
|
+
const [createdConfig] = yield this._knex(this.tableName)
|
|
58
|
+
.insert({
|
|
59
|
+
name: item.name,
|
|
60
|
+
description: item.description,
|
|
61
|
+
configuration: JSON.stringify(item.configuration),
|
|
62
|
+
})
|
|
63
|
+
.returning("*");
|
|
64
|
+
return this._deserialize(createdConfig);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get configuration by numeric ID
|
|
69
|
+
*/
|
|
70
|
+
getById(id) {
|
|
71
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
+
const config = yield this._knex(this.tableName).where({ id }).first();
|
|
73
|
+
return config ? this._deserialize(config) : null;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get configuration by UUID
|
|
78
|
+
*/
|
|
79
|
+
getByUuid(uuid) {
|
|
80
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
+
const config = yield this._knex(this.tableName).where({ uuid }).first();
|
|
82
|
+
return config ? this._deserialize(config) : null;
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get configuration by name
|
|
87
|
+
*/
|
|
88
|
+
getByName(name) {
|
|
89
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
const config = yield this._knex(this.tableName)
|
|
91
|
+
.whereRaw("LOWER(name) = LOWER(?)", [name])
|
|
92
|
+
.first();
|
|
93
|
+
return config ? this._deserialize(config) : null;
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Update a configuration
|
|
98
|
+
*/
|
|
99
|
+
update(id, item) {
|
|
100
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
101
|
+
// If configuration is being updated, validate it
|
|
102
|
+
if (item.configuration) {
|
|
103
|
+
const validation = this.validateConfiguration(item.configuration);
|
|
104
|
+
if (!validation.valid) {
|
|
105
|
+
throw new Error(`Invalid configuration: ${validation.errors.join(", ")}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const updateData = {};
|
|
109
|
+
if (item.name !== undefined)
|
|
110
|
+
updateData.name = item.name;
|
|
111
|
+
if (item.description !== undefined)
|
|
112
|
+
updateData.description = item.description;
|
|
113
|
+
if (item.configuration !== undefined)
|
|
114
|
+
updateData.configuration = JSON.stringify(item.configuration);
|
|
115
|
+
const [updatedConfig] = yield this._knex(this.tableName)
|
|
116
|
+
.where({ id })
|
|
117
|
+
.update(updateData)
|
|
118
|
+
.returning("*");
|
|
119
|
+
return updatedConfig ? this._deserialize(updatedConfig) : null;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Delete a configuration
|
|
124
|
+
* Prevents deletion of the last configuration (business logic protection)
|
|
125
|
+
*/
|
|
126
|
+
delete(id) {
|
|
127
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
128
|
+
// Count total configurations
|
|
129
|
+
const [{ count }] = yield this._knex(this.tableName).count("* as count");
|
|
130
|
+
if (parseInt(count) <= 1) {
|
|
131
|
+
throw new Error("Cannot delete the last configuration. At least one configuration must exist.");
|
|
132
|
+
}
|
|
133
|
+
const result = yield this._knex(this.tableName).where({ id }).del();
|
|
134
|
+
return result > 0;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get all configurations with pagination
|
|
139
|
+
*/
|
|
140
|
+
getAll(page, limit) {
|
|
141
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
142
|
+
const offset = (page - 1) * limit;
|
|
143
|
+
const [countResult] = yield this._knex(this.tableName).count("* as count");
|
|
144
|
+
const totalCount = +countResult.count;
|
|
145
|
+
const configs = yield this._knex(this.tableName)
|
|
146
|
+
.limit(limit)
|
|
147
|
+
.offset(offset)
|
|
148
|
+
.orderBy("created_at", "desc");
|
|
149
|
+
return {
|
|
150
|
+
success: true,
|
|
151
|
+
data: configs.map((c) => this._deserialize(c)),
|
|
152
|
+
page,
|
|
153
|
+
limit,
|
|
154
|
+
count: configs.length,
|
|
155
|
+
totalCount,
|
|
156
|
+
totalPages: Math.ceil(totalCount / limit),
|
|
157
|
+
};
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Validate a report configuration
|
|
162
|
+
*
|
|
163
|
+
* Rules:
|
|
164
|
+
* - Minimum 2, maximum 7 custom classes
|
|
165
|
+
* - Custom class names must be 1-30 characters
|
|
166
|
+
* - FHWA classes must be in range 1-13
|
|
167
|
+
* - Each FHWA class can only be mapped to one custom class (no duplicates)
|
|
168
|
+
* - Each custom class must have at least one FHWA class
|
|
169
|
+
*/
|
|
170
|
+
validateConfiguration(config) {
|
|
171
|
+
const errors = [];
|
|
172
|
+
// Validate version exists
|
|
173
|
+
if (!config.version) {
|
|
174
|
+
errors.push("Configuration version is required");
|
|
175
|
+
}
|
|
176
|
+
// Validate custom classes array
|
|
177
|
+
if (!config.customClasses || !Array.isArray(config.customClasses)) {
|
|
178
|
+
errors.push("customClasses must be an array");
|
|
179
|
+
return { valid: false, errors };
|
|
180
|
+
}
|
|
181
|
+
// Min 2, max 7 custom classes
|
|
182
|
+
if (config.customClasses.length < 2) {
|
|
183
|
+
errors.push("Minimum 2 custom classes required");
|
|
184
|
+
}
|
|
185
|
+
if (config.customClasses.length > 7) {
|
|
186
|
+
errors.push("Maximum 7 custom classes allowed");
|
|
187
|
+
}
|
|
188
|
+
// Check name length (max 30 chars) and FHWA classes validity
|
|
189
|
+
const allFhwaClasses = [];
|
|
190
|
+
config.customClasses.forEach((cls, idx) => {
|
|
191
|
+
if (!cls.name || cls.name.length === 0) {
|
|
192
|
+
errors.push(`Custom class ${idx + 1}: name cannot be empty`);
|
|
193
|
+
}
|
|
194
|
+
if (cls.name && cls.name.length > 30) {
|
|
195
|
+
errors.push(`Custom class ${idx + 1}: name exceeds 30 characters`);
|
|
196
|
+
}
|
|
197
|
+
if (!Array.isArray(cls.fhwaClasses) || cls.fhwaClasses.length === 0) {
|
|
198
|
+
errors.push(`Custom class ${idx + 1}: must have at least one FHWA class`);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
cls.fhwaClasses.forEach((fhwa) => {
|
|
202
|
+
if (!Number.isInteger(fhwa) || fhwa < 1 || fhwa > 13) {
|
|
203
|
+
errors.push(`Custom class ${idx + 1}: FHWA class ${fhwa} is invalid (must be 1-13)`);
|
|
204
|
+
}
|
|
205
|
+
allFhwaClasses.push(fhwa);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
// Check for duplicate FHWA classes (many-to-one only)
|
|
210
|
+
const uniqueFhwaClasses = new Set(allFhwaClasses);
|
|
211
|
+
if (uniqueFhwaClasses.size !== allFhwaClasses.length) {
|
|
212
|
+
const duplicates = allFhwaClasses.filter((item, index) => allFhwaClasses.indexOf(item) !== index);
|
|
213
|
+
errors.push(`Duplicate FHWA classes detected: ${[...new Set(duplicates)].join(", ")}. Each FHWA class can only be mapped to one custom class.`);
|
|
214
|
+
}
|
|
215
|
+
return { valid: errors.length === 0, errors };
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Apply configuration transformation to detection results
|
|
219
|
+
*
|
|
220
|
+
* Two-step transformation:
|
|
221
|
+
* 1. Detection labels → FHWA classes (using DETECTION_LABEL_TO_FHWA mapping)
|
|
222
|
+
* 2. FHWA classes → Custom classes (using configuration)
|
|
223
|
+
*
|
|
224
|
+
* @param detectionResults - Raw detection results with labels as keys and counts as values
|
|
225
|
+
* Example: { 'car': 150, 'articulated_truck': 23, 'motorcycle': 5 }
|
|
226
|
+
* @param config - The report configuration to apply
|
|
227
|
+
* @returns Transformed results with custom class names as keys and counts as values
|
|
228
|
+
* Example: { 'Cars': 155, 'Heavy Trucks': 23 }
|
|
229
|
+
*/
|
|
230
|
+
applyConfiguration(detectionResults, config) {
|
|
231
|
+
// Step 1: Detection labels → FHWA classes
|
|
232
|
+
const fhwaClassCounts = {};
|
|
233
|
+
for (const [label, count] of Object.entries(detectionResults)) {
|
|
234
|
+
const fhwaClasses = DETECTION_LABEL_TO_FHWA[label];
|
|
235
|
+
if (fhwaClasses && fhwaClasses.length > 0) {
|
|
236
|
+
fhwaClasses.forEach((fhwaClass) => {
|
|
237
|
+
fhwaClassCounts[fhwaClass] =
|
|
238
|
+
(fhwaClassCounts[fhwaClass] || 0) + count;
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
// Labels not in DETECTION_LABEL_TO_FHWA are silently ignored (e.g., pedestrian, bicycle)
|
|
242
|
+
}
|
|
243
|
+
// Step 2: FHWA classes → Custom classes
|
|
244
|
+
const customClassCounts = {};
|
|
245
|
+
config.configuration.customClasses.forEach((customClass) => {
|
|
246
|
+
let total = 0;
|
|
247
|
+
customClass.fhwaClasses.forEach((fhwaClass) => {
|
|
248
|
+
total += fhwaClassCounts[fhwaClass] || 0;
|
|
249
|
+
});
|
|
250
|
+
customClassCounts[customClass.name] = total;
|
|
251
|
+
});
|
|
252
|
+
return customClassCounts;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Transform nested vehicle structure with custom class mapping
|
|
256
|
+
*
|
|
257
|
+
* Handles both ATR (lane-based) and TMC (direction/turn-based) formats
|
|
258
|
+
* Preserves all nesting levels while transforming detection labels to custom classes
|
|
259
|
+
*
|
|
260
|
+
* @param vehiclesStructure - Nested vehicles object with detection labels as keys
|
|
261
|
+
* ATR: { "car": { "0": 45, "1": 50 }, ... }
|
|
262
|
+
* TMC: { "car": { "NORTH": { "straight": 10 }, ... }, ... }
|
|
263
|
+
* @param config - Report configuration with custom class mappings
|
|
264
|
+
* @returns Transformed structure with custom class names as keys
|
|
265
|
+
*/
|
|
266
|
+
applyConfigurationToNestedStructure(vehiclesStructure, config) {
|
|
267
|
+
// Build reverse mapping: detection label → custom class name
|
|
268
|
+
const detectionToCustomClass = {};
|
|
269
|
+
for (const customClass of config.configuration.customClasses) {
|
|
270
|
+
// For each FHWA class in this custom class
|
|
271
|
+
for (const fhwaClass of customClass.fhwaClasses) {
|
|
272
|
+
// Find all detection labels that map to this FHWA class
|
|
273
|
+
for (const [label, fhwaClasses] of Object.entries(DETECTION_LABEL_TO_FHWA)) {
|
|
274
|
+
if (fhwaClasses.includes(fhwaClass)) {
|
|
275
|
+
detectionToCustomClass[label] = customClass.name;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Initialize empty structure for each custom class
|
|
281
|
+
const result = {};
|
|
282
|
+
for (const customClass of config.configuration.customClasses) {
|
|
283
|
+
result[customClass.name] = {};
|
|
284
|
+
}
|
|
285
|
+
// Iterate through detection labels in input structure
|
|
286
|
+
for (const [detectionLabel, nestedData] of Object.entries(vehiclesStructure)) {
|
|
287
|
+
const customClassName = detectionToCustomClass[detectionLabel];
|
|
288
|
+
// Skip labels not mapped to any custom class (e.g., pedestrian, bicycle)
|
|
289
|
+
if (!customClassName) {
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
// Deep merge nested data into custom class accumulator
|
|
293
|
+
result[customClassName] = this._deepMergeNumericData(result[customClassName], nestedData);
|
|
294
|
+
}
|
|
295
|
+
return result;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Deep merge numeric data at arbitrary nesting levels
|
|
299
|
+
*
|
|
300
|
+
* Recursively merges two nested structures, summing numeric leaf values
|
|
301
|
+
* Handles ATR format (2 levels: vehicle → lane → count)
|
|
302
|
+
* Handles TMC format (3 levels: vehicle → direction → turn → count)
|
|
303
|
+
*
|
|
304
|
+
* @param target - Target accumulator object
|
|
305
|
+
* @param source - Source data to merge into target
|
|
306
|
+
* @returns Merged object with summed numeric values
|
|
307
|
+
*/
|
|
308
|
+
_deepMergeNumericData(target, source) {
|
|
309
|
+
// Base case: if source is a number, add it to target
|
|
310
|
+
if (typeof source === "number") {
|
|
311
|
+
return (typeof target === "number" ? target : 0) + source;
|
|
312
|
+
}
|
|
313
|
+
// If source is not an object, return target unchanged
|
|
314
|
+
if (typeof source !== "object" || source === null) {
|
|
315
|
+
return target;
|
|
316
|
+
}
|
|
317
|
+
// Ensure target is an object
|
|
318
|
+
if (typeof target !== "object" || target === null) {
|
|
319
|
+
target = {};
|
|
320
|
+
}
|
|
321
|
+
// Recursively merge each key in source
|
|
322
|
+
for (const [key, value] of Object.entries(source)) {
|
|
323
|
+
target[key] = this._deepMergeNumericData(target[key], value);
|
|
324
|
+
}
|
|
325
|
+
return target;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Get the FHWA mapping constant (for reference/debugging)
|
|
329
|
+
*/
|
|
330
|
+
getDetectionLabelToFhwaMapping() {
|
|
331
|
+
return Object.assign({}, DETECTION_LABEL_TO_FHWA);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Deserialize database row to IReportConfiguration interface
|
|
335
|
+
* Converts snake_case to camelCase and parses JSONB
|
|
336
|
+
*/
|
|
337
|
+
_deserialize(row) {
|
|
338
|
+
return {
|
|
339
|
+
id: row.id,
|
|
340
|
+
uuid: row.uuid,
|
|
341
|
+
name: row.name,
|
|
342
|
+
description: row.description,
|
|
343
|
+
configuration: typeof row.configuration === "string"
|
|
344
|
+
? JSON.parse(row.configuration)
|
|
345
|
+
: row.configuration,
|
|
346
|
+
created_at: row.created_at,
|
|
347
|
+
updated_at: row.updated_at,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
exports.ReportConfigurationDAO = ReportConfigurationDAO;
|
|
352
|
+
//# sourceMappingURL=report-configuration.dao.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-configuration.dao.js","sourceRoot":"","sources":["../../../src/dao/report-configuration/report-configuration.dao.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,17 @@ export declare class VideoDAO implements IBaseDAO<IVideo> {
|
|
|
30
30
|
* Suitable for use as lane annotation templates
|
|
31
31
|
*/
|
|
32
32
|
getTemplateVideos(folderId: number, videoType: string): Promise<IVideo[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Get all video IDs for a specific folder (used for cascade operations)
|
|
35
|
+
*/
|
|
33
36
|
getVideoIdsByFolderId(folderId: number): Promise<number[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Bulk update camera assignment for multiple videos
|
|
39
|
+
* Supports optional transaction for service-level transaction management
|
|
40
|
+
*/
|
|
34
41
|
bulkUpdateCamera(videoIds: number[], cameraId: number | null, trx?: Knex.Transaction): Promise<number>;
|
|
42
|
+
/**
|
|
43
|
+
* Get videos by camera ID with folder information (paginated)
|
|
44
|
+
*/
|
|
35
45
|
getVideosByCameraIdWithFolder(cameraId: number, page: number, limit: number): Promise<IDataPaginator<IVideo>>;
|
|
36
46
|
}
|
|
@@ -189,13 +189,13 @@ class VideoDAO {
|
|
|
189
189
|
// Check if metadata has at least one key with pt1 and pt2 properties
|
|
190
190
|
query = query.whereRaw(`
|
|
191
191
|
EXISTS (
|
|
192
|
-
SELECT 1
|
|
192
|
+
SELECT 1
|
|
193
193
|
FROM jsonb_each(metadata) as entry(key, value)
|
|
194
|
-
WHERE key != 'lanes'
|
|
194
|
+
WHERE key != 'lanes'
|
|
195
195
|
AND key != 'finish_line'
|
|
196
196
|
AND jsonb_typeof(value) = 'object'
|
|
197
|
-
AND value
|
|
198
|
-
AND value
|
|
197
|
+
AND jsonb_exists(value, 'pt1')
|
|
198
|
+
AND jsonb_exists(value, 'pt2')
|
|
199
199
|
AND jsonb_typeof(value->'pt1') = 'array'
|
|
200
200
|
AND jsonb_typeof(value->'pt2') = 'array'
|
|
201
201
|
AND jsonb_array_length(value->'pt1') = 2
|
|
@@ -212,34 +212,58 @@ class VideoDAO {
|
|
|
212
212
|
}
|
|
213
213
|
});
|
|
214
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Get all video IDs for a specific folder (used for cascade operations)
|
|
217
|
+
*/
|
|
215
218
|
getVideoIdsByFolderId(folderId) {
|
|
216
219
|
return __awaiter(this, void 0, void 0, function* () {
|
|
217
|
-
const
|
|
218
|
-
.where(
|
|
219
|
-
.select("id")
|
|
220
|
-
|
|
220
|
+
const rows = yield this._knex("video")
|
|
221
|
+
.where({ folderId })
|
|
222
|
+
.select("id")
|
|
223
|
+
.orderBy("id", "asc");
|
|
224
|
+
return rows.map((row) => row.id);
|
|
221
225
|
});
|
|
222
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* Bulk update camera assignment for multiple videos
|
|
229
|
+
* Supports optional transaction for service-level transaction management
|
|
230
|
+
*/
|
|
223
231
|
bulkUpdateCamera(videoIds, cameraId, trx) {
|
|
224
232
|
return __awaiter(this, void 0, void 0, function* () {
|
|
225
|
-
|
|
226
|
-
|
|
233
|
+
if (!videoIds || videoIds.length === 0) {
|
|
234
|
+
return 0;
|
|
235
|
+
}
|
|
236
|
+
const query = trx || this._knex;
|
|
237
|
+
const result = yield query("video")
|
|
238
|
+
.whereIn("id", videoIds)
|
|
239
|
+
.update({
|
|
227
240
|
cameraId: cameraId,
|
|
228
|
-
updated_at:
|
|
229
|
-
})
|
|
230
|
-
|
|
241
|
+
updated_at: query.fn.now(),
|
|
242
|
+
})
|
|
243
|
+
.returning("id");
|
|
244
|
+
return result.length;
|
|
231
245
|
});
|
|
232
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* Get videos by camera ID with folder information (paginated)
|
|
249
|
+
*/
|
|
233
250
|
getVideosByCameraIdWithFolder(cameraId, page, limit) {
|
|
234
251
|
return __awaiter(this, void 0, void 0, function* () {
|
|
235
252
|
const offset = (page - 1) * limit;
|
|
236
253
|
const query = this._knex("video as v")
|
|
237
254
|
.innerJoin("folders as f", "v.folderId", "f.id")
|
|
255
|
+
.select("v.*", this._knex.raw("to_jsonb(f.*) as folder"))
|
|
256
|
+
.where("v.cameraId", cameraId);
|
|
257
|
+
// Optimized count query without JOIN
|
|
258
|
+
const [countResult] = yield this._knex("video as v")
|
|
238
259
|
.where("v.cameraId", cameraId)
|
|
239
|
-
.
|
|
240
|
-
const [countResult] = yield query.clone().clearSelect().count("* as count");
|
|
260
|
+
.count("* as count");
|
|
241
261
|
const totalCount = +countResult.count;
|
|
242
|
-
const videos = yield query
|
|
262
|
+
const videos = yield query
|
|
263
|
+
.clone()
|
|
264
|
+
.limit(limit)
|
|
265
|
+
.offset(offset)
|
|
266
|
+
.orderBy("v.created_at", "desc");
|
|
243
267
|
return {
|
|
244
268
|
success: true,
|
|
245
269
|
data: videos,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video.dao.js","sourceRoot":"","sources":["../../../src/dao/video/video.dao.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,0EAA+C;AAE/C,MAAa,QAAQ;IAArB;QACU,UAAK,GAAyB,wBAAW,CAAC,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"video.dao.js","sourceRoot":"","sources":["../../../src/dao/video/video.dao.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { CameraDAO } from "./dao/camera/camera.dao";
|
|
|
3
3
|
export { ChatDAO } from "./dao/chat/chat.dao";
|
|
4
4
|
export { FolderDAO } from "./dao/folder/folder.dao";
|
|
5
5
|
export { MessageDAO } from "./dao/message/message.dao";
|
|
6
|
+
export { ReportConfigurationDAO } from "./dao/report-configuration/report-configuration.dao";
|
|
6
7
|
export { StudyDAO } from "./dao/study/study.dao";
|
|
7
8
|
export { UserDAO } from "./dao/user/user.dao";
|
|
8
9
|
export { UserPushNotificationTokenDAO } from "./dao/user-push-notification-token/user-push-notification-token.dao";
|
|
@@ -14,6 +15,7 @@ export { ICamera } from "./interfaces/camera/camera.interfaces";
|
|
|
14
15
|
export { IChat, IChatCreate, IChatUpdate, } from "./interfaces/chat/chat.interfaces";
|
|
15
16
|
export { IFolder } from "./interfaces/folder/folder.interfaces";
|
|
16
17
|
export { IMessage, IMessageCreate, IMessageUpdate, } from "./interfaces/message/message.interfaces";
|
|
18
|
+
export { IReportConfiguration, IReportConfigurationData, IReportConfigurationInput, ICustomClass, IValidationResult, } from "./interfaces/report-configuration/report-configuration.interfaces";
|
|
17
19
|
export { IStudy } from "./interfaces/study/study.interfaces";
|
|
18
20
|
export { IUser } from "./interfaces/user/user.interfaces";
|
|
19
21
|
export { IUserPushNotificationToken } from "./interfaces/user-push-notification-token/user-push-notification-token.interfaces";
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.KnexManager = exports.VideoMinuteResultDAO = exports.VideoDAO = exports.UserPushNotificationTokenDAO = exports.UserDAO = exports.StudyDAO = exports.MessageDAO = exports.FolderDAO = exports.ChatDAO = exports.CameraDAO = exports.AuthDAO = void 0;
|
|
6
|
+
exports.KnexManager = exports.VideoMinuteResultDAO = exports.VideoDAO = exports.UserPushNotificationTokenDAO = exports.UserDAO = exports.StudyDAO = exports.ReportConfigurationDAO = exports.MessageDAO = exports.FolderDAO = exports.ChatDAO = exports.CameraDAO = exports.AuthDAO = void 0;
|
|
7
7
|
// DAOs
|
|
8
8
|
var auth_dao_1 = require("./dao/auth/auth.dao");
|
|
9
9
|
Object.defineProperty(exports, "AuthDAO", { enumerable: true, get: function () { return auth_dao_1.AuthDAO; } });
|
|
@@ -15,6 +15,8 @@ var folder_dao_1 = require("./dao/folder/folder.dao");
|
|
|
15
15
|
Object.defineProperty(exports, "FolderDAO", { enumerable: true, get: function () { return folder_dao_1.FolderDAO; } });
|
|
16
16
|
var message_dao_1 = require("./dao/message/message.dao");
|
|
17
17
|
Object.defineProperty(exports, "MessageDAO", { enumerable: true, get: function () { return message_dao_1.MessageDAO; } });
|
|
18
|
+
var report_configuration_dao_1 = require("./dao/report-configuration/report-configuration.dao");
|
|
19
|
+
Object.defineProperty(exports, "ReportConfigurationDAO", { enumerable: true, get: function () { return report_configuration_dao_1.ReportConfigurationDAO; } });
|
|
18
20
|
var study_dao_1 = require("./dao/study/study.dao");
|
|
19
21
|
Object.defineProperty(exports, "StudyDAO", { enumerable: true, get: function () { return study_dao_1.StudyDAO; } });
|
|
20
22
|
var user_dao_1 = require("./dao/user/user.dao");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO;AACP,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAChB,sDAAoD;AAA3C,uGAAA,SAAS,OAAA;AAClB,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAChB,sDAAoD;AAA3C,uGAAA,SAAS,OAAA;AAClB,yDAAuD;AAA9C,yGAAA,UAAU,OAAA;AACnB,mDAAiD;AAAxC,qGAAA,QAAQ,OAAA;AACjB,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAChB,wHAAmH;AAA1G,gJAAA,4BAA4B,OAAA;AACrC,mDAAiD;AAAxC,qGAAA,QAAQ,OAAA;AACjB,mEAAkE;AAAzD,4HAAA,oBAAoB,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO;AACP,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAChB,sDAAoD;AAA3C,uGAAA,SAAS,OAAA;AAClB,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAChB,sDAAoD;AAA3C,uGAAA,SAAS,OAAA;AAClB,yDAAuD;AAA9C,yGAAA,UAAU,OAAA;AACnB,gGAA6F;AAApF,kIAAA,sBAAsB,OAAA;AAC/B,mDAAiD;AAAxC,qGAAA,QAAQ,OAAA;AACjB,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAChB,wHAAmH;AAA1G,gJAAA,4BAA4B,OAAA;AACrC,mDAAiD;AAAxC,qGAAA,QAAQ,OAAA;AACjB,mEAAkE;AAAzD,4HAAA,oBAAoB,OAAA;AAkC7B,sEAA2C;AAClC,sBADF,wBAAW,CACE"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export interface IReportConfiguration {
|
|
2
|
+
id: number;
|
|
3
|
+
uuid: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
configuration: IReportConfigurationData;
|
|
7
|
+
created_at: Date;
|
|
8
|
+
updated_at: Date;
|
|
9
|
+
}
|
|
10
|
+
export interface IReportConfigurationData {
|
|
11
|
+
version: string;
|
|
12
|
+
customClasses: ICustomClass[];
|
|
13
|
+
}
|
|
14
|
+
export interface ICustomClass {
|
|
15
|
+
name: string;
|
|
16
|
+
fhwaClasses: number[];
|
|
17
|
+
}
|
|
18
|
+
export interface IReportConfigurationInput {
|
|
19
|
+
name: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
configuration: IReportConfigurationData;
|
|
22
|
+
}
|
|
23
|
+
export interface IValidationResult {
|
|
24
|
+
valid: boolean;
|
|
25
|
+
errors: string[];
|
|
26
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-configuration.interfaces.js","sourceRoot":"","sources":["../../../src/interfaces/report-configuration/report-configuration.interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { Knex } from "knex";
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
// Create report_configurations table
|
|
5
|
+
await knex.schema.createTable("report_configurations", (table) => {
|
|
6
|
+
table.increments("id").primary();
|
|
7
|
+
table
|
|
8
|
+
.uuid("uuid")
|
|
9
|
+
.notNullable()
|
|
10
|
+
.unique()
|
|
11
|
+
.defaultTo(knex.raw("uuid_generate_v4()"));
|
|
12
|
+
table.string("name", 30).notNullable().unique();
|
|
13
|
+
table.text("description");
|
|
14
|
+
table.jsonb("configuration").notNullable();
|
|
15
|
+
table.timestamps(true, true); // created_at, updated_at
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
// Create indexes
|
|
19
|
+
await knex.schema.alterTable("report_configurations", (table) => {
|
|
20
|
+
table.index("uuid", "idx_report_configurations_uuid");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
await knex.raw(`
|
|
24
|
+
CREATE INDEX idx_report_configurations_name_lower
|
|
25
|
+
ON report_configurations(LOWER(name))
|
|
26
|
+
`);
|
|
27
|
+
|
|
28
|
+
// Seed "Default" configuration
|
|
29
|
+
await knex("report_configurations").insert({
|
|
30
|
+
name: "Default",
|
|
31
|
+
description: "Standard configuration matching current system behavior",
|
|
32
|
+
configuration: JSON.stringify({
|
|
33
|
+
version: "1.0",
|
|
34
|
+
customClasses: [
|
|
35
|
+
{ name: "Cars", fhwaClasses: [1, 2, 3] },
|
|
36
|
+
{ name: "Medium Trucks", fhwaClasses: [5] },
|
|
37
|
+
{ name: "Heavy Trucks", fhwaClasses: [4, 6, 7, 8, 9, 10, 11, 12, 13] },
|
|
38
|
+
],
|
|
39
|
+
}),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function down(knex: Knex): Promise<void> {
|
|
44
|
+
// Drop indexes first
|
|
45
|
+
await knex.raw("DROP INDEX IF EXISTS idx_report_configurations_name_lower");
|
|
46
|
+
await knex.schema.alterTable("report_configurations", (table) => {
|
|
47
|
+
table.dropIndex("uuid", "idx_report_configurations_uuid");
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Drop table
|
|
51
|
+
await knex.schema.dropTableIfExists("report_configurations");
|
|
52
|
+
}
|