@trafficgroup/knex-rel 0.1.5 → 0.1.7
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/folder/folder.dao.js +3 -6
- package/dist/dao/folder/folder.dao.js.map +1 -1
- package/dist/dao/report-configuration/report-configuration.dao.d.ts +8 -0
- package/dist/dao/report-configuration/report-configuration.dao.js +19 -0
- package/dist/dao/report-configuration/report-configuration.dao.js.map +1 -1
- package/dist/dao/study/study.dao.d.ts +1 -0
- package/dist/dao/study/study.dao.js +18 -3
- package/dist/dao/study/study.dao.js.map +1 -1
- package/dist/dao/video/video.dao.d.ts +0 -9
- package/dist/dao/video/video.dao.js +0 -51
- package/dist/dao/video/video.dao.js.map +1 -1
- package/dist/interfaces/folder/folder.interfaces.d.ts +0 -3
- package/dist/interfaces/study/study.interfaces.d.ts +5 -0
- package/dist/interfaces/video/video.interfaces.d.ts +0 -3
- package/migrations/20251010143500_migration.ts +83 -0
- package/package.json +1 -1
- package/src/dao/folder/folder.dao.ts +3 -18
- package/src/dao/report-configuration/report-configuration.dao.ts +25 -0
- package/src/dao/study/study.dao.ts +34 -3
- package/src/dao/video/video.dao.ts +0 -63
- package/src/interfaces/folder/folder.interfaces.ts +0 -3
- package/src/interfaces/study/study.interfaces.ts +5 -0
- package/src/interfaces/video/video.interfaces.ts +0 -3
- package/plan.md +0 -831
|
@@ -30,8 +30,7 @@ class FolderDAO {
|
|
|
30
30
|
return __awaiter(this, void 0, void 0, function* () {
|
|
31
31
|
const folder = yield this._knex("folders as f")
|
|
32
32
|
.innerJoin("study as s", "f.studyId", "s.id")
|
|
33
|
-
.
|
|
34
|
-
.select("f.*", this._knex.raw("to_jsonb(s.*) as study"), this._knex.raw("to_jsonb(c.*) as camera"))
|
|
33
|
+
.select("f.*", this._knex.raw("to_jsonb(s.*) as study"))
|
|
35
34
|
.where("f.id", id)
|
|
36
35
|
.first();
|
|
37
36
|
return folder || null;
|
|
@@ -41,8 +40,7 @@ class FolderDAO {
|
|
|
41
40
|
return __awaiter(this, void 0, void 0, function* () {
|
|
42
41
|
const folder = yield this._knex("folders as f")
|
|
43
42
|
.innerJoin("study as s", "f.studyId", "s.id")
|
|
44
|
-
.
|
|
45
|
-
.select("f.*", this._knex.raw("to_jsonb(s.*) as study"), this._knex.raw("to_jsonb(c.*) as camera"))
|
|
43
|
+
.select("f.*", this._knex.raw("to_jsonb(s.*) as study"))
|
|
46
44
|
.where("f.uuid", uuid)
|
|
47
45
|
.first();
|
|
48
46
|
return folder || null;
|
|
@@ -68,8 +66,7 @@ class FolderDAO {
|
|
|
68
66
|
const offset = (page - 1) * limit;
|
|
69
67
|
const query = this._knex("folders as f")
|
|
70
68
|
.innerJoin("study as s", "f.studyId", "s.id")
|
|
71
|
-
.
|
|
72
|
-
.select("f.*", this._knex.raw("to_jsonb(s.*) as study"), this._knex.raw("to_jsonb(c.*) as camera"));
|
|
69
|
+
.select("f.*", this._knex.raw("to_jsonb(s.*) as study"));
|
|
73
70
|
if (studyId !== undefined && studyId !== null) {
|
|
74
71
|
query.where("f.studyId", studyId);
|
|
75
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folder.dao.js","sourceRoot":"","sources":["../../../src/dao/folder/folder.dao.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,0EAA+C;AAE/C,MAAa,SAAS;IAAtB;QACU,UAAK,GAAyB,wBAAW,CAAC,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"folder.dao.js","sourceRoot":"","sources":["../../../src/dao/folder/folder.dao.ts"],"names":[],"mappings":"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"}
|
|
@@ -82,6 +82,14 @@ export declare class ReportConfigurationDAO implements IBaseDAO<IReportConfigura
|
|
|
82
82
|
* @returns Merged object with summed numeric values
|
|
83
83
|
*/
|
|
84
84
|
private _deepMergeNumericData;
|
|
85
|
+
/**
|
|
86
|
+
* Create "Total" vehicle class by summing all custom classes
|
|
87
|
+
* Works for both ATR and TMC formats through structure-agnostic deep merge
|
|
88
|
+
*
|
|
89
|
+
* @param customClassesData - Object with custom class names as keys
|
|
90
|
+
* @returns Aggregated nested structure summing all classes
|
|
91
|
+
*/
|
|
92
|
+
private _createTotalClass;
|
|
85
93
|
/**
|
|
86
94
|
* Get the FHWA mapping constant (for reference/debugging)
|
|
87
95
|
*/
|
|
@@ -191,6 +191,9 @@ class ReportConfigurationDAO {
|
|
|
191
191
|
if (!cls.name || cls.name.length === 0) {
|
|
192
192
|
errors.push(`Custom class ${idx + 1}: name cannot be empty`);
|
|
193
193
|
}
|
|
194
|
+
if (cls.name && cls.name.toLowerCase() === "total") {
|
|
195
|
+
errors.push(`Custom class ${idx + 1}: "Total" is a reserved name and cannot be used`);
|
|
196
|
+
}
|
|
194
197
|
if (cls.name && cls.name.length > 30) {
|
|
195
198
|
errors.push(`Custom class ${idx + 1}: name exceeds 30 characters`);
|
|
196
199
|
}
|
|
@@ -292,6 +295,8 @@ class ReportConfigurationDAO {
|
|
|
292
295
|
// Deep merge nested data into custom class accumulator
|
|
293
296
|
result[customClassName] = this._deepMergeNumericData(result[customClassName], nestedData);
|
|
294
297
|
}
|
|
298
|
+
// Add "Total" class that aggregates all custom classes
|
|
299
|
+
result["Total"] = this._createTotalClass(result);
|
|
295
300
|
return result;
|
|
296
301
|
}
|
|
297
302
|
/**
|
|
@@ -324,6 +329,20 @@ class ReportConfigurationDAO {
|
|
|
324
329
|
}
|
|
325
330
|
return target;
|
|
326
331
|
}
|
|
332
|
+
/**
|
|
333
|
+
* Create "Total" vehicle class by summing all custom classes
|
|
334
|
+
* Works for both ATR and TMC formats through structure-agnostic deep merge
|
|
335
|
+
*
|
|
336
|
+
* @param customClassesData - Object with custom class names as keys
|
|
337
|
+
* @returns Aggregated nested structure summing all classes
|
|
338
|
+
*/
|
|
339
|
+
_createTotalClass(customClassesData) {
|
|
340
|
+
let total = {};
|
|
341
|
+
for (const [className, nestedData] of Object.entries(customClassesData)) {
|
|
342
|
+
total = this._deepMergeNumericData(total, nestedData);
|
|
343
|
+
}
|
|
344
|
+
return total;
|
|
345
|
+
}
|
|
327
346
|
/**
|
|
328
347
|
* Get the FHWA mapping constant (for reference/debugging)
|
|
329
348
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-configuration.dao.js","sourceRoot":"","sources":["../../../src/dao/report-configuration/report-configuration.dao.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAQA,0EAA+C;AAE/C;;;;;;;;;;;;;GAaG;AACH,MAAM,uBAAuB,GAA6B;IACxD,UAAU,EAAE,CAAC,CAAC,CAAC;IACf,GAAG,EAAE,CAAC,CAAC,CAAC;IACR,YAAY,EAAE,CAAC,CAAC,CAAC;IACjB,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,yCAAyC;IACjE,GAAG,EAAE,CAAC,CAAC,CAAC;IACR,QAAQ,EAAE,CAAC,CAAC,CAAC;IACb,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc;IAC5C,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,eAAe;IACvD,0DAA0D;CAC3D,CAAC;AAEF,MAAa,sBAAsB;IAAnC;QACU,UAAK,GAAyB,wBAAW,CAAC,aAAa,EAAE,CAAC;QAC1D,cAAS,GAAG,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"report-configuration.dao.js","sourceRoot":"","sources":["../../../src/dao/report-configuration/report-configuration.dao.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,4 +8,5 @@ export declare class StudyDAO implements IBaseDAO<IStudy> {
|
|
|
8
8
|
update(id: number, item: Partial<IStudy>): Promise<IStudy | null>;
|
|
9
9
|
delete(id: number): Promise<boolean>;
|
|
10
10
|
getAll(page: number, limit: number, createdBy?: number | null): Promise<IDataPaginator<IStudy>>;
|
|
11
|
+
getStudiesByCamera(cameraId: number): Promise<IStudy[]>;
|
|
11
12
|
}
|
|
@@ -30,7 +30,8 @@ class StudyDAO {
|
|
|
30
30
|
return __awaiter(this, void 0, void 0, function* () {
|
|
31
31
|
const study = yield this._knex("study as s")
|
|
32
32
|
.innerJoin("users as u", "s.createdBy", "u.id")
|
|
33
|
-
.
|
|
33
|
+
.leftJoin("cameras as c", "s.cameraId", "c.id")
|
|
34
|
+
.select("s.*", this._knex.raw("to_jsonb(u.*) as user"), this._knex.raw("to_jsonb(c.*) as camera"))
|
|
34
35
|
.where("s.id", id)
|
|
35
36
|
.first();
|
|
36
37
|
return study || null;
|
|
@@ -40,7 +41,8 @@ class StudyDAO {
|
|
|
40
41
|
return __awaiter(this, void 0, void 0, function* () {
|
|
41
42
|
const study = yield this._knex("study as s")
|
|
42
43
|
.innerJoin("users as u", "s.createdBy", "u.id")
|
|
43
|
-
.
|
|
44
|
+
.leftJoin("cameras as c", "s.cameraId", "c.id")
|
|
45
|
+
.select("s.*", this._knex.raw("to_jsonb(u.*) as user"), this._knex.raw("to_jsonb(c.*) as camera"))
|
|
44
46
|
.where("s.uuid", uuid)
|
|
45
47
|
.first();
|
|
46
48
|
return study || null;
|
|
@@ -66,7 +68,8 @@ class StudyDAO {
|
|
|
66
68
|
const offset = (page - 1) * limit;
|
|
67
69
|
const query = this._knex("study as s")
|
|
68
70
|
.innerJoin("users as u", "s.createdBy", "u.id")
|
|
69
|
-
.
|
|
71
|
+
.leftJoin("cameras as c", "s.cameraId", "c.id")
|
|
72
|
+
.select("s.*", this._knex.raw("to_jsonb(u.*) as user"), this._knex.raw("to_jsonb(c.*) as camera"));
|
|
70
73
|
if (createdBy !== undefined && createdBy !== null) {
|
|
71
74
|
query.where("s.createdBy", createdBy);
|
|
72
75
|
}
|
|
@@ -84,6 +87,18 @@ class StudyDAO {
|
|
|
84
87
|
};
|
|
85
88
|
});
|
|
86
89
|
}
|
|
90
|
+
getStudiesByCamera(cameraId) {
|
|
91
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
+
const studies = yield this._knex("study as s")
|
|
93
|
+
.innerJoin("users as u", "s.createdBy", "u.id")
|
|
94
|
+
.leftJoin("cameras as c", "s.cameraId", "c.id")
|
|
95
|
+
.select("s.*", this._knex.raw("to_jsonb(u.*) as user"), this._knex.raw("to_jsonb(c.*) as camera"))
|
|
96
|
+
.where("s.cameraId", cameraId)
|
|
97
|
+
.orderBy("s.created_at", "desc")
|
|
98
|
+
.limit(10);
|
|
99
|
+
return studies;
|
|
100
|
+
});
|
|
101
|
+
}
|
|
87
102
|
}
|
|
88
103
|
exports.StudyDAO = StudyDAO;
|
|
89
104
|
//# sourceMappingURL=study.dao.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"study.dao.js","sourceRoot":"","sources":["../../../src/dao/study/study.dao.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,0EAA+C;AAE/C,MAAa,QAAQ;IAArB;QACU,UAAK,GAAyB,wBAAW,CAAC,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"study.dao.js","sourceRoot":"","sources":["../../../src/dao/study/study.dao.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,13 +34,4 @@ export declare class VideoDAO implements IBaseDAO<IVideo> {
|
|
|
34
34
|
* Get all video IDs for a specific folder (used for cascade operations)
|
|
35
35
|
*/
|
|
36
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
|
-
*/
|
|
41
|
-
bulkUpdateCamera(videoIds: number[], cameraId: number | null, trx?: Knex.Transaction): Promise<number>;
|
|
42
|
-
/**
|
|
43
|
-
* Get videos by camera ID with folder information (paginated)
|
|
44
|
-
*/
|
|
45
|
-
getVideosByCameraIdWithFolder(cameraId: number, page: number, limit: number): Promise<IDataPaginator<IVideo>>;
|
|
46
37
|
}
|
|
@@ -224,57 +224,6 @@ class VideoDAO {
|
|
|
224
224
|
return rows.map((row) => row.id);
|
|
225
225
|
});
|
|
226
226
|
}
|
|
227
|
-
/**
|
|
228
|
-
* Bulk update camera assignment for multiple videos
|
|
229
|
-
* Supports optional transaction for service-level transaction management
|
|
230
|
-
*/
|
|
231
|
-
bulkUpdateCamera(videoIds, cameraId, trx) {
|
|
232
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
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({
|
|
240
|
-
cameraId: cameraId,
|
|
241
|
-
updated_at: query.fn.now(),
|
|
242
|
-
})
|
|
243
|
-
.returning("id");
|
|
244
|
-
return result.length;
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* Get videos by camera ID with folder information (paginated)
|
|
249
|
-
*/
|
|
250
|
-
getVideosByCameraIdWithFolder(cameraId, page, limit) {
|
|
251
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
252
|
-
const offset = (page - 1) * limit;
|
|
253
|
-
const query = this._knex("video as v")
|
|
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")
|
|
259
|
-
.where("v.cameraId", cameraId)
|
|
260
|
-
.count("* as count");
|
|
261
|
-
const totalCount = +countResult.count;
|
|
262
|
-
const videos = yield query
|
|
263
|
-
.clone()
|
|
264
|
-
.limit(limit)
|
|
265
|
-
.offset(offset)
|
|
266
|
-
.orderBy("v.created_at", "desc");
|
|
267
|
-
return {
|
|
268
|
-
success: true,
|
|
269
|
-
data: videos,
|
|
270
|
-
page,
|
|
271
|
-
limit,
|
|
272
|
-
count: videos.length,
|
|
273
|
-
totalCount,
|
|
274
|
-
totalPages: Math.ceil(totalCount / limit),
|
|
275
|
-
};
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
227
|
}
|
|
279
228
|
exports.VideoDAO = VideoDAO;
|
|
280
229
|
//# sourceMappingURL=video.dao.js.map
|
|
@@ -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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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { IStudy } from "../study/study.interfaces";
|
|
2
|
-
import type { ICamera } from "../camera/camera.interfaces";
|
|
3
2
|
export interface IFolder {
|
|
4
3
|
id: number;
|
|
5
4
|
uuid: string;
|
|
@@ -7,9 +6,7 @@ export interface IFolder {
|
|
|
7
6
|
createdBy: number;
|
|
8
7
|
status: "UPLOADING" | "COMPLETE";
|
|
9
8
|
studyId: number;
|
|
10
|
-
cameraId?: number;
|
|
11
9
|
created_at: string;
|
|
12
10
|
updated_at: string;
|
|
13
11
|
study?: IStudy;
|
|
14
|
-
camera?: ICamera;
|
|
15
12
|
}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import type { IUser } from "../user/user.interfaces";
|
|
2
|
+
import type { ICamera } from "../camera/camera.interfaces";
|
|
2
3
|
export interface IStudy {
|
|
3
4
|
id: number;
|
|
4
5
|
uuid: string;
|
|
5
6
|
name: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
type: "TMC" | "ATR";
|
|
6
9
|
createdBy: number;
|
|
10
|
+
cameraId?: number;
|
|
7
11
|
status: "COMPLETE" | "IN PROGRESS" | "FAILED";
|
|
8
12
|
created_at: string;
|
|
9
13
|
updated_at: string;
|
|
10
14
|
user?: IUser;
|
|
15
|
+
camera?: ICamera;
|
|
11
16
|
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import type { IFolder } from "../folder/folder.interfaces";
|
|
2
|
-
import type { ICamera } from "../camera/camera.interfaces";
|
|
3
2
|
export interface IVideo {
|
|
4
3
|
id: number;
|
|
5
4
|
uuid: string;
|
|
6
5
|
folderId: number;
|
|
7
|
-
cameraId?: number;
|
|
8
6
|
annotationSourceId?: number;
|
|
9
7
|
name: string;
|
|
10
8
|
videoLocation: string;
|
|
@@ -25,5 +23,4 @@ export interface IVideo {
|
|
|
25
23
|
created_at: string;
|
|
26
24
|
updated_at: string;
|
|
27
25
|
folder?: IFolder;
|
|
28
|
-
camera?: ICamera;
|
|
29
26
|
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { Knex } from "knex";
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
// 1. Add cameraId to study table
|
|
5
|
+
const studyHasCamera = await knex.schema.hasColumn("study", "cameraId");
|
|
6
|
+
if (!studyHasCamera) {
|
|
7
|
+
await knex.schema.alterTable("study", (table) => {
|
|
8
|
+
table
|
|
9
|
+
.integer("cameraId")
|
|
10
|
+
.nullable()
|
|
11
|
+
.references("id")
|
|
12
|
+
.inTable("cameras")
|
|
13
|
+
.onDelete("SET NULL");
|
|
14
|
+
table.index(["cameraId"]);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// 2. Remove cameraId from video table
|
|
19
|
+
const videoHasCamera = await knex.schema.hasColumn("video", "cameraId");
|
|
20
|
+
if (videoHasCamera) {
|
|
21
|
+
await knex.raw(
|
|
22
|
+
`ALTER TABLE video DROP CONSTRAINT IF EXISTS video_cameraid_foreign`,
|
|
23
|
+
);
|
|
24
|
+
await knex.raw(`DROP INDEX IF EXISTS video_cameraid_index`);
|
|
25
|
+
await knex.schema.alterTable("video", (table) => {
|
|
26
|
+
table.dropColumn("cameraId");
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// 3. Remove cameraId from folders table
|
|
31
|
+
const foldersHasCamera = await knex.schema.hasColumn("folders", "cameraId");
|
|
32
|
+
if (foldersHasCamera) {
|
|
33
|
+
await knex.raw(
|
|
34
|
+
`ALTER TABLE folders DROP CONSTRAINT IF EXISTS folders_cameraid_foreign`,
|
|
35
|
+
);
|
|
36
|
+
await knex.raw(`DROP INDEX IF EXISTS folders_cameraid_index`);
|
|
37
|
+
await knex.schema.alterTable("folders", (table) => {
|
|
38
|
+
table.dropColumn("cameraId");
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function down(knex: Knex): Promise<void> {
|
|
44
|
+
// 1. Restore cameraId to folders table
|
|
45
|
+
const foldersHasCamera = await knex.schema.hasColumn("folders", "cameraId");
|
|
46
|
+
if (!foldersHasCamera) {
|
|
47
|
+
await knex.schema.alterTable("folders", (table) => {
|
|
48
|
+
table
|
|
49
|
+
.integer("cameraId")
|
|
50
|
+
.nullable()
|
|
51
|
+
.references("id")
|
|
52
|
+
.inTable("cameras")
|
|
53
|
+
.onDelete("SET NULL");
|
|
54
|
+
table.index(["cameraId"]);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 2. Restore cameraId to video table
|
|
59
|
+
const videoHasCamera = await knex.schema.hasColumn("video", "cameraId");
|
|
60
|
+
if (!videoHasCamera) {
|
|
61
|
+
await knex.schema.alterTable("video", (table) => {
|
|
62
|
+
table
|
|
63
|
+
.integer("cameraId")
|
|
64
|
+
.nullable()
|
|
65
|
+
.references("id")
|
|
66
|
+
.inTable("cameras")
|
|
67
|
+
.onDelete("SET NULL");
|
|
68
|
+
table.index(["cameraId"]);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 3. Remove cameraId from study table
|
|
73
|
+
const studyHasCamera = await knex.schema.hasColumn("study", "cameraId");
|
|
74
|
+
if (studyHasCamera) {
|
|
75
|
+
await knex.raw(
|
|
76
|
+
`ALTER TABLE study DROP CONSTRAINT IF EXISTS study_cameraid_foreign`,
|
|
77
|
+
);
|
|
78
|
+
await knex.raw(`DROP INDEX IF EXISTS study_cameraid_index`);
|
|
79
|
+
await knex.schema.alterTable("study", (table) => {
|
|
80
|
+
table.dropColumn("cameraId");
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
package/package.json
CHANGED
|
@@ -16,12 +16,7 @@ export class FolderDAO implements IBaseDAO<IFolder> {
|
|
|
16
16
|
async getById(id: number): Promise<IFolder | null> {
|
|
17
17
|
const folder = await this._knex("folders as f")
|
|
18
18
|
.innerJoin("study as s", "f.studyId", "s.id")
|
|
19
|
-
.
|
|
20
|
-
.select(
|
|
21
|
-
"f.*",
|
|
22
|
-
this._knex.raw("to_jsonb(s.*) as study"),
|
|
23
|
-
this._knex.raw("to_jsonb(c.*) as camera"),
|
|
24
|
-
)
|
|
19
|
+
.select("f.*", this._knex.raw("to_jsonb(s.*) as study"))
|
|
25
20
|
.where("f.id", id)
|
|
26
21
|
.first();
|
|
27
22
|
return folder || null;
|
|
@@ -30,12 +25,7 @@ export class FolderDAO implements IBaseDAO<IFolder> {
|
|
|
30
25
|
async getByUuid(uuid: string): Promise<IFolder | null> {
|
|
31
26
|
const folder = await this._knex("folders as f")
|
|
32
27
|
.innerJoin("study as s", "f.studyId", "s.id")
|
|
33
|
-
.
|
|
34
|
-
.select(
|
|
35
|
-
"f.*",
|
|
36
|
-
this._knex.raw("to_jsonb(s.*) as study"),
|
|
37
|
-
this._knex.raw("to_jsonb(c.*) as camera"),
|
|
38
|
-
)
|
|
28
|
+
.select("f.*", this._knex.raw("to_jsonb(s.*) as study"))
|
|
39
29
|
.where("f.uuid", uuid)
|
|
40
30
|
.first();
|
|
41
31
|
return folder || null;
|
|
@@ -63,12 +53,7 @@ export class FolderDAO implements IBaseDAO<IFolder> {
|
|
|
63
53
|
|
|
64
54
|
const query = this._knex("folders as f")
|
|
65
55
|
.innerJoin("study as s", "f.studyId", "s.id")
|
|
66
|
-
.
|
|
67
|
-
.select(
|
|
68
|
-
"f.*",
|
|
69
|
-
this._knex.raw("to_jsonb(s.*) as study"),
|
|
70
|
-
this._knex.raw("to_jsonb(c.*) as camera"),
|
|
71
|
-
);
|
|
56
|
+
.select("f.*", this._knex.raw("to_jsonb(s.*) as study"));
|
|
72
57
|
if (studyId !== undefined && studyId !== null) {
|
|
73
58
|
query.where("f.studyId", studyId);
|
|
74
59
|
}
|
|
@@ -200,6 +200,11 @@ export class ReportConfigurationDAO implements IBaseDAO<IReportConfiguration> {
|
|
|
200
200
|
if (!cls.name || cls.name.length === 0) {
|
|
201
201
|
errors.push(`Custom class ${idx + 1}: name cannot be empty`);
|
|
202
202
|
}
|
|
203
|
+
if (cls.name && cls.name.toLowerCase() === "total") {
|
|
204
|
+
errors.push(
|
|
205
|
+
`Custom class ${idx + 1}: "Total" is a reserved name and cannot be used`,
|
|
206
|
+
);
|
|
207
|
+
}
|
|
203
208
|
if (cls.name && cls.name.length > 30) {
|
|
204
209
|
errors.push(`Custom class ${idx + 1}: name exceeds 30 characters`);
|
|
205
210
|
}
|
|
@@ -336,6 +341,9 @@ export class ReportConfigurationDAO implements IBaseDAO<IReportConfiguration> {
|
|
|
336
341
|
);
|
|
337
342
|
}
|
|
338
343
|
|
|
344
|
+
// Add "Total" class that aggregates all custom classes
|
|
345
|
+
result["Total"] = this._createTotalClass(result);
|
|
346
|
+
|
|
339
347
|
return result;
|
|
340
348
|
}
|
|
341
349
|
|
|
@@ -374,6 +382,23 @@ export class ReportConfigurationDAO implements IBaseDAO<IReportConfiguration> {
|
|
|
374
382
|
return target;
|
|
375
383
|
}
|
|
376
384
|
|
|
385
|
+
/**
|
|
386
|
+
* Create "Total" vehicle class by summing all custom classes
|
|
387
|
+
* Works for both ATR and TMC formats through structure-agnostic deep merge
|
|
388
|
+
*
|
|
389
|
+
* @param customClassesData - Object with custom class names as keys
|
|
390
|
+
* @returns Aggregated nested structure summing all classes
|
|
391
|
+
*/
|
|
392
|
+
private _createTotalClass(customClassesData: Record<string, any>): any {
|
|
393
|
+
let total: any = {};
|
|
394
|
+
|
|
395
|
+
for (const [className, nestedData] of Object.entries(customClassesData)) {
|
|
396
|
+
total = this._deepMergeNumericData(total, nestedData);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return total;
|
|
400
|
+
}
|
|
401
|
+
|
|
377
402
|
/**
|
|
378
403
|
* Get the FHWA mapping constant (for reference/debugging)
|
|
379
404
|
*/
|
|
@@ -16,7 +16,12 @@ export class StudyDAO implements IBaseDAO<IStudy> {
|
|
|
16
16
|
async getById(id: number): Promise<IStudy | null> {
|
|
17
17
|
const study = await this._knex("study as s")
|
|
18
18
|
.innerJoin("users as u", "s.createdBy", "u.id")
|
|
19
|
-
.
|
|
19
|
+
.leftJoin("cameras as c", "s.cameraId", "c.id")
|
|
20
|
+
.select(
|
|
21
|
+
"s.*",
|
|
22
|
+
this._knex.raw("to_jsonb(u.*) as user"),
|
|
23
|
+
this._knex.raw("to_jsonb(c.*) as camera"),
|
|
24
|
+
)
|
|
20
25
|
.where("s.id", id)
|
|
21
26
|
.first();
|
|
22
27
|
return study || null;
|
|
@@ -25,7 +30,12 @@ export class StudyDAO implements IBaseDAO<IStudy> {
|
|
|
25
30
|
async getByUuid(uuid: string): Promise<IStudy | null> {
|
|
26
31
|
const study = await this._knex("study as s")
|
|
27
32
|
.innerJoin("users as u", "s.createdBy", "u.id")
|
|
28
|
-
.
|
|
33
|
+
.leftJoin("cameras as c", "s.cameraId", "c.id")
|
|
34
|
+
.select(
|
|
35
|
+
"s.*",
|
|
36
|
+
this._knex.raw("to_jsonb(u.*) as user"),
|
|
37
|
+
this._knex.raw("to_jsonb(c.*) as camera"),
|
|
38
|
+
)
|
|
29
39
|
.where("s.uuid", uuid)
|
|
30
40
|
.first();
|
|
31
41
|
return study || null;
|
|
@@ -53,7 +63,12 @@ export class StudyDAO implements IBaseDAO<IStudy> {
|
|
|
53
63
|
|
|
54
64
|
const query = this._knex("study as s")
|
|
55
65
|
.innerJoin("users as u", "s.createdBy", "u.id")
|
|
56
|
-
.
|
|
66
|
+
.leftJoin("cameras as c", "s.cameraId", "c.id")
|
|
67
|
+
.select(
|
|
68
|
+
"s.*",
|
|
69
|
+
this._knex.raw("to_jsonb(u.*) as user"),
|
|
70
|
+
this._knex.raw("to_jsonb(c.*) as camera"),
|
|
71
|
+
);
|
|
57
72
|
if (createdBy !== undefined && createdBy !== null) {
|
|
58
73
|
query.where("s.createdBy", createdBy);
|
|
59
74
|
}
|
|
@@ -72,4 +87,20 @@ export class StudyDAO implements IBaseDAO<IStudy> {
|
|
|
72
87
|
totalPages: Math.ceil(totalCount / limit),
|
|
73
88
|
};
|
|
74
89
|
}
|
|
90
|
+
|
|
91
|
+
async getStudiesByCamera(cameraId: number): Promise<IStudy[]> {
|
|
92
|
+
const studies = await this._knex("study as s")
|
|
93
|
+
.innerJoin("users as u", "s.createdBy", "u.id")
|
|
94
|
+
.leftJoin("cameras as c", "s.cameraId", "c.id")
|
|
95
|
+
.select(
|
|
96
|
+
"s.*",
|
|
97
|
+
this._knex.raw("to_jsonb(u.*) as user"),
|
|
98
|
+
this._knex.raw("to_jsonb(c.*) as camera"),
|
|
99
|
+
)
|
|
100
|
+
.where("s.cameraId", cameraId)
|
|
101
|
+
.orderBy("s.created_at", "desc")
|
|
102
|
+
.limit(10);
|
|
103
|
+
|
|
104
|
+
return studies;
|
|
105
|
+
}
|
|
75
106
|
}
|