@trafficgroup/knex-rel 0.0.27 → 0.0.28
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.
|
@@ -10,4 +10,11 @@ export declare class VideoDAO implements IBaseDAO<IVideo> {
|
|
|
10
10
|
update(id: number, item: Partial<IVideo>): Promise<IVideo | null>;
|
|
11
11
|
delete(id: number): Promise<boolean>;
|
|
12
12
|
getAll(page: number, limit: number, folderId?: number | null): Promise<IDataPaginator<IVideo>>;
|
|
13
|
+
getVideoStatsByFolderIds(folderIds: number[]): Promise<{
|
|
14
|
+
total_videos: number;
|
|
15
|
+
completed_videos: number;
|
|
16
|
+
failed_videos: number;
|
|
17
|
+
processing_videos: number;
|
|
18
|
+
}>;
|
|
19
|
+
getCompletedVideosByFolderIds(folderIds: number[], videoType?: string): Promise<IVideo[]>;
|
|
13
20
|
}
|
|
@@ -83,6 +83,42 @@ class VideoDAO {
|
|
|
83
83
|
};
|
|
84
84
|
});
|
|
85
85
|
}
|
|
86
|
+
getVideoStatsByFolderIds(folderIds) {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
if (!folderIds || folderIds.length === 0) {
|
|
89
|
+
return {
|
|
90
|
+
total_videos: 0,
|
|
91
|
+
completed_videos: 0,
|
|
92
|
+
failed_videos: 0,
|
|
93
|
+
processing_videos: 0
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const result = yield this._knex("video")
|
|
97
|
+
.whereIn("folderId", folderIds)
|
|
98
|
+
.select(this._knex.raw('COUNT(*) as total_videos'), this._knex.raw("COUNT(CASE WHEN status = ? THEN 1 END) as completed_videos", ['COMPLETED']), this._knex.raw("COUNT(CASE WHEN status = ? THEN 1 END) as failed_videos", ['FAILED']), this._knex.raw("COUNT(CASE WHEN status = ? THEN 1 END) as processing_videos", ['PROCESSING']))
|
|
99
|
+
.first();
|
|
100
|
+
return {
|
|
101
|
+
total_videos: parseInt(result === null || result === void 0 ? void 0 : result.total_videos) || 0,
|
|
102
|
+
completed_videos: parseInt(result === null || result === void 0 ? void 0 : result.completed_videos) || 0,
|
|
103
|
+
failed_videos: parseInt(result === null || result === void 0 ? void 0 : result.failed_videos) || 0,
|
|
104
|
+
processing_videos: parseInt(result === null || result === void 0 ? void 0 : result.processing_videos) || 0
|
|
105
|
+
};
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
getCompletedVideosByFolderIds(folderIds, videoType) {
|
|
109
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
110
|
+
if (!folderIds || folderIds.length === 0) {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
const query = this._knex("video")
|
|
114
|
+
.whereIn("folderId", folderIds)
|
|
115
|
+
.where("status", "COMPLETED");
|
|
116
|
+
if (videoType) {
|
|
117
|
+
query.where("videoType", videoType);
|
|
118
|
+
}
|
|
119
|
+
return yield query.select("id", "name", "metadata", "results", "created_at", this._knex.raw("EXTRACT(EPOCH FROM (updated_at - created_at)) as duration"));
|
|
120
|
+
});
|
|
121
|
+
}
|
|
86
122
|
}
|
|
87
123
|
exports.VideoDAO = VideoDAO;
|
|
88
124
|
//# 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;QACY,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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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Knex } from "knex";
|
|
2
|
+
|
|
3
|
+
export async function up(knex: Knex): Promise<void> {
|
|
4
|
+
// Add description and type columns to study table
|
|
5
|
+
await knex.schema.alterTable('study', (table) => {
|
|
6
|
+
table.text('description').nullable();
|
|
7
|
+
table.string('type', 50).notNullable().defaultTo('TMC');
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function down(knex: Knex): Promise<void> {
|
|
12
|
+
// Remove description and type columns from study table
|
|
13
|
+
await knex.schema.alterTable('study', (table) => {
|
|
14
|
+
table.dropColumn('description');
|
|
15
|
+
table.dropColumn('type');
|
|
16
|
+
});
|
|
17
|
+
}
|
package/package.json
CHANGED
|
@@ -68,4 +68,53 @@ export class VideoDAO implements IBaseDAO<IVideo> {
|
|
|
68
68
|
totalPages: Math.ceil(totalCount / limit),
|
|
69
69
|
};
|
|
70
70
|
}
|
|
71
|
+
|
|
72
|
+
async getVideoStatsByFolderIds(folderIds: number[]): Promise<{
|
|
73
|
+
total_videos: number;
|
|
74
|
+
completed_videos: number;
|
|
75
|
+
failed_videos: number;
|
|
76
|
+
processing_videos: number;
|
|
77
|
+
}> {
|
|
78
|
+
if (!folderIds || folderIds.length === 0) {
|
|
79
|
+
return {
|
|
80
|
+
total_videos: 0,
|
|
81
|
+
completed_videos: 0,
|
|
82
|
+
failed_videos: 0,
|
|
83
|
+
processing_videos: 0
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const result = await this._knex("video")
|
|
88
|
+
.whereIn("folderId", folderIds)
|
|
89
|
+
.select(
|
|
90
|
+
this._knex.raw('COUNT(*) as total_videos'),
|
|
91
|
+
this._knex.raw("COUNT(CASE WHEN status = ? THEN 1 END) as completed_videos", ['COMPLETED']),
|
|
92
|
+
this._knex.raw("COUNT(CASE WHEN status = ? THEN 1 END) as failed_videos", ['FAILED']),
|
|
93
|
+
this._knex.raw("COUNT(CASE WHEN status = ? THEN 1 END) as processing_videos", ['PROCESSING'])
|
|
94
|
+
)
|
|
95
|
+
.first() as any;
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
total_videos: parseInt(result?.total_videos) || 0,
|
|
99
|
+
completed_videos: parseInt(result?.completed_videos) || 0,
|
|
100
|
+
failed_videos: parseInt(result?.failed_videos) || 0,
|
|
101
|
+
processing_videos: parseInt(result?.processing_videos) || 0
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async getCompletedVideosByFolderIds(folderIds: number[], videoType?: string): Promise<IVideo[]> {
|
|
106
|
+
if (!folderIds || folderIds.length === 0) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const query = this._knex("video")
|
|
111
|
+
.whereIn("folderId", folderIds)
|
|
112
|
+
.where("status", "COMPLETED");
|
|
113
|
+
|
|
114
|
+
if (videoType) {
|
|
115
|
+
query.where("videoType", videoType);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return await query.select("id", "name", "metadata", "results", "created_at", this._knex.raw("EXTRACT(EPOCH FROM (updated_at - created_at)) as duration"));
|
|
119
|
+
}
|
|
71
120
|
}
|