@trafficgroup/knex-rel 0.0.27 → 0.0.29
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/.claude/settings.local.json +2 -5
- package/CLAUDE.md +72 -63
- package/dist/dao/VideoMinuteResultDAO.d.ts +48 -0
- package/dist/dao/VideoMinuteResultDAO.js +238 -0
- package/dist/dao/VideoMinuteResultDAO.js.map +1 -0
- package/dist/dao/auth/auth.dao.js +4 -1
- package/dist/dao/auth/auth.dao.js.map +1 -1
- package/dist/dao/chat/chat.dao.d.ts +1 -1
- package/dist/dao/chat/chat.dao.js +25 -35
- package/dist/dao/chat/chat.dao.js.map +1 -1
- package/dist/dao/folder/folder.dao.js +7 -2
- package/dist/dao/folder/folder.dao.js.map +1 -1
- package/dist/dao/message/message.dao.d.ts +1 -1
- package/dist/dao/message/message.dao.js +18 -26
- package/dist/dao/message/message.dao.js.map +1 -1
- package/dist/dao/study/study.dao.js +7 -2
- package/dist/dao/study/study.dao.js.map +1 -1
- package/dist/dao/user/user.dao.js +4 -1
- package/dist/dao/user/user.dao.js.map +1 -1
- package/dist/dao/user-push-notification-token/user-push-notification-token.dao.js +26 -8
- package/dist/dao/user-push-notification-token/user-push-notification-token.dao.js.map +1 -1
- package/dist/dao/video/video.dao.d.ts +15 -0
- package/dist/dao/video/video.dao.js +85 -2
- package/dist/dao/video/video.dao.js.map +1 -1
- package/dist/entities/BaseEntity.d.ts +4 -0
- package/dist/entities/BaseEntity.js +3 -0
- package/dist/entities/BaseEntity.js.map +1 -0
- package/dist/entities/VideoMinuteResult.d.ts +21 -0
- package/dist/entities/VideoMinuteResult.js +3 -0
- package/dist/entities/VideoMinuteResult.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces/chat/chat.interfaces.d.ts +3 -3
- package/dist/interfaces/folder/folder.interfaces.d.ts +1 -1
- package/dist/interfaces/message/message.interfaces.d.ts +2 -2
- package/dist/interfaces/study/study.interfaces.d.ts +1 -1
- package/dist/interfaces/user/user.interfaces.d.ts +1 -1
- package/dist/interfaces/user-push-notification-token/user-push-notification-token.interfaces.d.ts +1 -1
- package/dist/interfaces/video/video.interfaces.d.ts +3 -2
- package/migrations/20250717160737_migration.ts +1 -1
- package/migrations/20250717160908_migration.ts +5 -2
- package/migrations/20250717161310_migration.ts +1 -1
- package/migrations/20250717161406_migration.ts +3 -3
- package/migrations/20250717162431_migration.ts +1 -1
- package/migrations/20250717173228_migration.ts +2 -2
- package/migrations/20250717204731_migration.ts +1 -1
- package/migrations/20250722210109_migration.ts +8 -4
- package/migrations/20250722211019_migration.ts +1 -1
- package/migrations/20250723153852_migration.ts +13 -10
- package/migrations/20250723162257_migration.ts +4 -7
- package/migrations/20250723171109_migration.ts +4 -7
- package/migrations/20250723205331_migration.ts +6 -9
- package/migrations/20250724191345_migration.ts +8 -11
- package/migrations/20250730180932_migration.ts +14 -13
- package/migrations/20250730213625_migration.ts +8 -11
- package/migrations/20250804124509_migration.ts +26 -21
- package/migrations/20250804132053_migration.ts +5 -8
- package/migrations/20250804164518_migration.ts +17 -0
- package/migrations/20250823223016_migration.ts +46 -0
- package/package.json +47 -47
- package/plan.md +304 -0
- package/src/d.types.ts +22 -18
- package/src/dao/VideoMinuteResultDAO.ts +273 -0
- package/src/dao/auth/auth.dao.ts +58 -55
- package/src/dao/chat/chat.dao.ts +45 -43
- package/src/dao/folder/folder.dao.ts +75 -66
- package/src/dao/message/message.dao.ts +32 -32
- package/src/dao/study/study.dao.ts +75 -66
- package/src/dao/user/user.dao.ts +59 -57
- package/src/dao/user-push-notification-token/user-push-notification-token.dao.ts +83 -49
- package/src/dao/video/video.dao.ts +199 -71
- package/src/entities/BaseEntity.ts +4 -0
- package/src/entities/VideoMinuteResult.ts +24 -0
- package/src/index.ts +37 -23
- package/src/interfaces/auth/auth.interfaces.ts +10 -10
- package/src/interfaces/chat/chat.interfaces.ts +4 -4
- package/src/interfaces/folder/folder.interfaces.ts +13 -13
- package/src/interfaces/message/message.interfaces.ts +3 -3
- package/src/interfaces/study/study.interfaces.ts +12 -12
- package/src/interfaces/user/user.interfaces.ts +11 -11
- package/src/interfaces/user-push-notification-token/user-push-notification-token.interfaces.ts +9 -9
- package/src/interfaces/video/video.interfaces.ts +22 -21
package/CLAUDE.md
CHANGED
|
@@ -1,63 +1,72 @@
|
|
|
1
|
-
# CLAUDE.md
|
|
2
|
-
|
|
3
|
-
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
-
|
|
5
|
-
## Project Overview
|
|
6
|
-
|
|
7
|
-
This is `@trafficgroup/knex-rel` - a TypeScript-based Knex.js module for database operations with PostgreSQL. It provides a standardized data access layer with DAOs (Data Access Objects) and interfaces for various entities.
|
|
8
|
-
|
|
9
|
-
## Development Commands
|
|
10
|
-
|
|
11
|
-
### Building and Formatting
|
|
12
|
-
|
|
13
|
-
- `npm run
|
|
14
|
-
- `npm run
|
|
15
|
-
- `npm
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
- `npm run
|
|
21
|
-
- `npm run
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
- `
|
|
37
|
-
-
|
|
38
|
-
|
|
39
|
-
**
|
|
40
|
-
|
|
41
|
-
- `
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
This is `@trafficgroup/knex-rel` - a TypeScript-based Knex.js module for database operations with PostgreSQL. It provides a standardized data access layer with DAOs (Data Access Objects) and interfaces for various entities.
|
|
8
|
+
|
|
9
|
+
## Development Commands
|
|
10
|
+
|
|
11
|
+
### Building and Formatting
|
|
12
|
+
|
|
13
|
+
- `npm run build` - Compile TypeScript to JavaScript in dist/
|
|
14
|
+
- `npm run format` - Format code with Prettier
|
|
15
|
+
- `npm run clean` - Clean dist/, format, and rebuild
|
|
16
|
+
- `npm test` - Run Jest tests
|
|
17
|
+
|
|
18
|
+
### Database Operations
|
|
19
|
+
|
|
20
|
+
- `npm run migrate:create` - Create a new TypeScript migration file
|
|
21
|
+
- `npm run migrate:deploy` - Run all pending migrations
|
|
22
|
+
- `npm run seed:create` - Create a new TypeScript seed file
|
|
23
|
+
- `npm run seed:run` - Execute all seed files
|
|
24
|
+
|
|
25
|
+
### Publishing
|
|
26
|
+
|
|
27
|
+
- `npm run npm:publish` - Clean, build, and publish to npm
|
|
28
|
+
|
|
29
|
+
## Architecture
|
|
30
|
+
|
|
31
|
+
### Core Components
|
|
32
|
+
|
|
33
|
+
**KnexManager** (`src/KnexConnection.ts`): Singleton connection manager
|
|
34
|
+
|
|
35
|
+
- `connect(config?, connections?)` - Establish database connection
|
|
36
|
+
- `getConnection()` - Get active connection instance
|
|
37
|
+
- `disconnect()` - Close connection and cleanup
|
|
38
|
+
|
|
39
|
+
**DAO Pattern**: All data access follows the `IBaseDAO<T>` interface with standard CRUD operations:
|
|
40
|
+
|
|
41
|
+
- `create(item)`, `getById(id)`, `getByUuid(uuid)`, `getAll(page, limit)`, `update(id, item)`, `delete(id)`
|
|
42
|
+
- Returns `IDataPaginator<T>` for paginated results
|
|
43
|
+
|
|
44
|
+
**AuthDAO Additional Methods**:
|
|
45
|
+
|
|
46
|
+
- `getByUserId(userId: number)` - Find auth record by user ID
|
|
47
|
+
- `getByEmailToken(emailToken: string)` - Find auth record by email verification/reset token
|
|
48
|
+
|
|
49
|
+
### Entity Structure
|
|
50
|
+
|
|
51
|
+
Each entity has:
|
|
52
|
+
|
|
53
|
+
- Interface in `src/interfaces/[entity]/[entity].interfaces.ts`
|
|
54
|
+
- DAO implementation in `src/dao/[entity]/[entity].dao.ts`
|
|
55
|
+
|
|
56
|
+
Current entities: User, Study, Folder, Video
|
|
57
|
+
|
|
58
|
+
### Database Configuration
|
|
59
|
+
|
|
60
|
+
Environment variables (for development):
|
|
61
|
+
|
|
62
|
+
- `SQL_HOST`, `SQL_USER`, `SQL_PASSWORD`, `SQL_DB_NAME`, `SQL_PORT`
|
|
63
|
+
|
|
64
|
+
Environment variables (for staging/production):
|
|
65
|
+
|
|
66
|
+
- `PG_HOST`, `PG_USER`, `PG_PASSWORD`, `PG_DB`, `PG_PORT`
|
|
67
|
+
|
|
68
|
+
Knex configuration supports development, staging, and production environments in `knexfile.ts`.
|
|
69
|
+
|
|
70
|
+
### Migrations
|
|
71
|
+
|
|
72
|
+
Located in `migrations/` directory. Use TypeScript format with timestamp prefixes. Database uses `knex_migrations` table for tracking.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { IBaseDAO, IDataPaginator } from "../d.types";
|
|
2
|
+
import { IVideoMinuteResult, IVideoMinuteResultInput } from "../entities/VideoMinuteResult";
|
|
3
|
+
export declare class VideoMinuteResultDAO implements IBaseDAO<IVideoMinuteResult> {
|
|
4
|
+
private knex;
|
|
5
|
+
private tableName;
|
|
6
|
+
getAll(page?: number, limit?: number): Promise<IDataPaginator<IVideoMinuteResult>>;
|
|
7
|
+
getById(id: number): Promise<IVideoMinuteResult | null>;
|
|
8
|
+
getByUuid(uuid: string): Promise<IVideoMinuteResult | null>;
|
|
9
|
+
create(data: IVideoMinuteResultInput): Promise<IVideoMinuteResult>;
|
|
10
|
+
update(id: number, data: IVideoMinuteResult): Promise<IVideoMinuteResult | null>;
|
|
11
|
+
delete(id: number): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Get minute results for a specific video with optional time range filtering
|
|
14
|
+
*/
|
|
15
|
+
getMinuteResultsForVideo(videoId: number, startMinute?: number, endMinute?: number, page?: number, limit?: number): Promise<IDataPaginator<IVideoMinuteResult>>;
|
|
16
|
+
/**
|
|
17
|
+
* Create batch of minute results for efficient bulk insertion
|
|
18
|
+
*/
|
|
19
|
+
createBatch(videoId: number, minuteResults: IVideoMinuteResultInput[]): Promise<IVideoMinuteResult[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Delete all minute results for a specific video
|
|
22
|
+
*/
|
|
23
|
+
deleteByVideoId(videoId: number): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Get the minute range for a video (min and max minute numbers)
|
|
26
|
+
*/
|
|
27
|
+
getVideoMinuteRange(videoId: number): Promise<{
|
|
28
|
+
minMinute: number;
|
|
29
|
+
maxMinute: number;
|
|
30
|
+
} | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Map database row to entity (snake_case -> camelCase)
|
|
33
|
+
*/
|
|
34
|
+
private mapDbRowToEntity;
|
|
35
|
+
/**
|
|
36
|
+
* Map multiple database rows to entities
|
|
37
|
+
*/
|
|
38
|
+
private mapDbRowsToEntities;
|
|
39
|
+
/**
|
|
40
|
+
* Map entity to database row (camelCase -> snake_case)
|
|
41
|
+
*/
|
|
42
|
+
private mapEntityToDbRow;
|
|
43
|
+
/**
|
|
44
|
+
* Get minute results by video UUID (convenience method)
|
|
45
|
+
*/
|
|
46
|
+
getMinuteResultsByVideoUuid(videoUuid: string, startMinute?: number, endMinute?: number, page?: number, limit?: number): Promise<IDataPaginator<IVideoMinuteResult>>;
|
|
47
|
+
}
|
|
48
|
+
export default VideoMinuteResultDAO;
|
|
@@ -0,0 +1,238 @@
|
|
|
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.VideoMinuteResultDAO = void 0;
|
|
16
|
+
const KnexConnection_1 = __importDefault(require("../KnexConnection"));
|
|
17
|
+
class VideoMinuteResultDAO {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.knex = KnexConnection_1.default.getConnection();
|
|
20
|
+
this.tableName = "video_minute_results";
|
|
21
|
+
}
|
|
22
|
+
getAll() {
|
|
23
|
+
return __awaiter(this, arguments, void 0, function* (page = 1, limit = 10) {
|
|
24
|
+
const offset = (page - 1) * limit;
|
|
25
|
+
const [countResult] = yield this.knex(this.tableName).count("* as count");
|
|
26
|
+
const totalCount = +countResult.count;
|
|
27
|
+
const data = yield this.knex(this.tableName)
|
|
28
|
+
.select("*")
|
|
29
|
+
.orderBy("created_at", "desc")
|
|
30
|
+
.limit(limit)
|
|
31
|
+
.offset(offset);
|
|
32
|
+
return {
|
|
33
|
+
success: true,
|
|
34
|
+
data: this.mapDbRowsToEntities(data),
|
|
35
|
+
page,
|
|
36
|
+
limit,
|
|
37
|
+
count: data.length,
|
|
38
|
+
totalCount,
|
|
39
|
+
totalPages: Math.ceil(totalCount / limit),
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
getById(id) {
|
|
44
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
const result = yield this.knex(this.tableName).where("id", id).first();
|
|
46
|
+
return result ? this.mapDbRowToEntity(result) : null;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
getByUuid(uuid) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
const result = yield this.knex(this.tableName).where("uuid", uuid).first();
|
|
52
|
+
return result ? this.mapDbRowToEntity(result) : null;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
create(data) {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
const dbData = this.mapEntityToDbRow(data);
|
|
58
|
+
const [result] = yield this.knex(this.tableName)
|
|
59
|
+
.insert(dbData)
|
|
60
|
+
.returning("*");
|
|
61
|
+
return this.mapDbRowToEntity(result);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
update(id, data) {
|
|
65
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
const dbData = this.mapEntityToDbRow(data);
|
|
67
|
+
const [result] = yield this.knex(this.tableName)
|
|
68
|
+
.where("id", id)
|
|
69
|
+
.update(Object.assign(Object.assign({}, dbData), { updated_at: this.knex.fn.now() }))
|
|
70
|
+
.returning("*");
|
|
71
|
+
return result ? this.mapDbRowToEntity(result) : null;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
delete(id) {
|
|
75
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
76
|
+
const result = yield this.knex(this.tableName).where("id", id).del();
|
|
77
|
+
return result > 0;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get minute results for a specific video with optional time range filtering
|
|
82
|
+
*/
|
|
83
|
+
getMinuteResultsForVideo(videoId_1, startMinute_1, endMinute_1) {
|
|
84
|
+
return __awaiter(this, arguments, void 0, function* (videoId, startMinute, endMinute, page = 1, limit = 100) {
|
|
85
|
+
const offset = (page - 1) * limit;
|
|
86
|
+
const query = this.knex(this.tableName + " as vmr")
|
|
87
|
+
.innerJoin("video as v", "vmr.video_id", "v.id")
|
|
88
|
+
.select("vmr.*", "v.name as video_name", "v.uuid as video_uuid")
|
|
89
|
+
.where("vmr.video_id", videoId);
|
|
90
|
+
if (startMinute !== undefined) {
|
|
91
|
+
query.where("vmr.minute_number", ">=", startMinute);
|
|
92
|
+
}
|
|
93
|
+
if (endMinute !== undefined) {
|
|
94
|
+
query.where("vmr.minute_number", "<=", endMinute);
|
|
95
|
+
}
|
|
96
|
+
// Standard pagination logic with count optimization
|
|
97
|
+
const [{ count }] = yield query.clone().clearSelect().count("* as count");
|
|
98
|
+
const data = yield query
|
|
99
|
+
.orderBy("vmr.minute_number", "asc")
|
|
100
|
+
.limit(limit)
|
|
101
|
+
.offset(offset);
|
|
102
|
+
return {
|
|
103
|
+
success: true,
|
|
104
|
+
data: this.mapDbRowsToEntities(data),
|
|
105
|
+
page,
|
|
106
|
+
limit,
|
|
107
|
+
count: data.length,
|
|
108
|
+
totalCount: parseInt(count),
|
|
109
|
+
totalPages: Math.ceil(parseInt(count) / limit),
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create batch of minute results for efficient bulk insertion
|
|
115
|
+
*/
|
|
116
|
+
createBatch(videoId, minuteResults) {
|
|
117
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
const batchData = minuteResults.map((result) => this.mapEntityToDbRow(Object.assign(Object.assign({}, result), { videoId })));
|
|
119
|
+
const results = yield this.knex
|
|
120
|
+
.batchInsert(this.tableName, batchData, 50)
|
|
121
|
+
.returning("*");
|
|
122
|
+
return this.mapDbRowsToEntities(results);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Delete all minute results for a specific video
|
|
127
|
+
*/
|
|
128
|
+
deleteByVideoId(videoId) {
|
|
129
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
130
|
+
const result = yield this.knex(this.tableName)
|
|
131
|
+
.where("video_id", videoId)
|
|
132
|
+
.del();
|
|
133
|
+
return result > 0;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get the minute range for a video (min and max minute numbers)
|
|
138
|
+
*/
|
|
139
|
+
getVideoMinuteRange(videoId) {
|
|
140
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
141
|
+
const result = yield this.knex(this.tableName)
|
|
142
|
+
.where("video_id", videoId)
|
|
143
|
+
.min("minute_number as minMinute")
|
|
144
|
+
.max("minute_number as maxMinute")
|
|
145
|
+
.first();
|
|
146
|
+
if (!result || result.minMinute === null) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
minMinute: result.minMinute,
|
|
151
|
+
maxMinute: result.maxMinute,
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Map database row to entity (snake_case -> camelCase)
|
|
157
|
+
*/
|
|
158
|
+
mapDbRowToEntity(row) {
|
|
159
|
+
return {
|
|
160
|
+
id: row.id,
|
|
161
|
+
uuid: row.uuid,
|
|
162
|
+
videoId: row.video_id,
|
|
163
|
+
minuteNumber: row.minute_number,
|
|
164
|
+
results: row.results,
|
|
165
|
+
createdAt: row.created_at,
|
|
166
|
+
updatedAt: row.updated_at,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Map multiple database rows to entities
|
|
171
|
+
*/
|
|
172
|
+
mapDbRowsToEntities(rows) {
|
|
173
|
+
return rows.map((row) => this.mapDbRowToEntity(row));
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Map entity to database row (camelCase -> snake_case)
|
|
177
|
+
*/
|
|
178
|
+
mapEntityToDbRow(entity) {
|
|
179
|
+
const dbRow = {};
|
|
180
|
+
if (entity.videoId !== undefined)
|
|
181
|
+
dbRow.video_id = entity.videoId;
|
|
182
|
+
if ("minuteNumber" in entity && entity.minuteNumber !== undefined)
|
|
183
|
+
dbRow.minute_number = entity.minuteNumber;
|
|
184
|
+
if (entity.results !== undefined)
|
|
185
|
+
dbRow.results = entity.results;
|
|
186
|
+
if ("createdAt" in entity && entity.createdAt !== undefined)
|
|
187
|
+
dbRow.created_at = entity.createdAt;
|
|
188
|
+
if ("updatedAt" in entity && entity.updatedAt !== undefined)
|
|
189
|
+
dbRow.updated_at = entity.updatedAt;
|
|
190
|
+
return dbRow;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get minute results by video UUID (convenience method)
|
|
194
|
+
*/
|
|
195
|
+
getMinuteResultsByVideoUuid(videoUuid_1, startMinute_1, endMinute_1) {
|
|
196
|
+
return __awaiter(this, arguments, void 0, function* (videoUuid, startMinute, endMinute, page = 1, limit = 100) {
|
|
197
|
+
const offset = (page - 1) * limit;
|
|
198
|
+
const query = this.knex(this.tableName + " as vmr")
|
|
199
|
+
.innerJoin("video as v", "vmr.video_id", "v.id")
|
|
200
|
+
.select("vmr.*", "v.name as video_name", "v.uuid as video_uuid")
|
|
201
|
+
.where("v.uuid", videoUuid);
|
|
202
|
+
if (startMinute !== undefined) {
|
|
203
|
+
query.where("vmr.minute_number", ">=", startMinute);
|
|
204
|
+
}
|
|
205
|
+
if (endMinute !== undefined) {
|
|
206
|
+
query.where("vmr.minute_number", "<=", endMinute);
|
|
207
|
+
}
|
|
208
|
+
// Check if video exists and get count in single query
|
|
209
|
+
const [{ count }] = yield query.clone().clearSelect().count("* as count");
|
|
210
|
+
const totalCount = parseInt(count);
|
|
211
|
+
if (totalCount === 0) {
|
|
212
|
+
// Check if video exists by trying to find it
|
|
213
|
+
const videoExists = yield this.knex("video")
|
|
214
|
+
.where("uuid", videoUuid)
|
|
215
|
+
.first();
|
|
216
|
+
if (!videoExists) {
|
|
217
|
+
throw new Error(`Video with UUID ${videoUuid} not found`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
const data = yield query
|
|
221
|
+
.orderBy("vmr.minute_number", "asc")
|
|
222
|
+
.limit(limit)
|
|
223
|
+
.offset(offset);
|
|
224
|
+
return {
|
|
225
|
+
success: true,
|
|
226
|
+
data: this.mapDbRowsToEntities(data),
|
|
227
|
+
page,
|
|
228
|
+
limit,
|
|
229
|
+
count: data.length,
|
|
230
|
+
totalCount,
|
|
231
|
+
totalPages: Math.ceil(totalCount / limit),
|
|
232
|
+
};
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
exports.VideoMinuteResultDAO = VideoMinuteResultDAO;
|
|
237
|
+
exports.default = VideoMinuteResultDAO;
|
|
238
|
+
//# sourceMappingURL=VideoMinuteResultDAO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoMinuteResultDAO.js","sourceRoot":"","sources":["../../src/dao/VideoMinuteResultDAO.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,7 +50,10 @@ class AuthDAO {
|
|
|
50
50
|
}
|
|
51
51
|
update(id, item) {
|
|
52
52
|
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
-
const [updatedAuth] = yield this._knex("auth")
|
|
53
|
+
const [updatedAuth] = yield this._knex("auth")
|
|
54
|
+
.where({ id })
|
|
55
|
+
.update(item)
|
|
56
|
+
.returning("*");
|
|
54
57
|
return updatedAuth || null;
|
|
55
58
|
});
|
|
56
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.dao.js","sourceRoot":"","sources":["../../../src/dao/auth/auth.dao.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,0EAA+C;AAE/C,MAAa,OAAO;IAApB;
|
|
1
|
+
{"version":3,"file":"auth.dao.js","sourceRoot":"","sources":["../../../src/dao/auth/auth.dao.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,0EAA+C;AAE/C,MAAa,OAAO;IAApB;QACU,UAAK,GAAyB,wBAAW,CAAC,aAAa,EAAE,CAAC;IAyDpE,CAAC;IAvDO,MAAM,CAAC,IAAW;;YACtB,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC3E,OAAO,WAAW,CAAC;QACrB,CAAC;KAAA;IAEK,OAAO,CAAC,EAAU;;YACtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YAC5D,OAAO,IAAI,IAAI,IAAI,CAAC;QACtB,CAAC;KAAA;IAEK,SAAS,CAAC,IAAY;;YAC1B,oEAAoE;YACpE,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAEK,WAAW,CAAC,MAAc;;YAC9B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YAChE,OAAO,IAAI,IAAI,IAAI,CAAC;QACtB,CAAC;KAAA;IAEK,eAAe,CAAC,UAAkB;;YACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;YACpE,OAAO,IAAI,IAAI,IAAI,CAAC;QACtB,CAAC;KAAA;IAEK,MAAM,CAAC,EAAU,EAAE,IAAoB;;YAC3C,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;iBAC3C,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;iBACb,MAAM,CAAC,IAAI,CAAC;iBACZ,SAAS,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,WAAW,IAAI,IAAI,CAAC;QAC7B,CAAC;KAAA;IAEK,MAAM,CAAC,EAAU;;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;YAC5D,OAAO,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC;KAAA;IAEK,MAAM,CAAC,IAAY,EAAE,KAAa;;YACtC,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;YAElC,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAEnE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,KAAK;gBACX,IAAI;gBACJ,KAAK;gBACL,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,UAAU;gBACV,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;aAC1C,CAAC;QACJ,CAAC;KAAA;CACF;AA1DD,0BA0DC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IBaseDAO, IDataPaginator } from "../../d.types";
|
|
2
|
-
import { IChat, IChatCreate, IChatUpdate } from
|
|
2
|
+
import { IChat, IChatCreate, IChatUpdate } from "../../interfaces/chat/chat.interfaces";
|
|
3
3
|
export declare class ChatDAO implements IBaseDAO<IChat> {
|
|
4
4
|
private _knex;
|
|
5
5
|
create(item: IChatCreate): Promise<IChat>;
|
|
@@ -20,25 +20,19 @@ class ChatDAO {
|
|
|
20
20
|
}
|
|
21
21
|
create(item) {
|
|
22
22
|
return __awaiter(this, void 0, void 0, function* () {
|
|
23
|
-
const [result] = yield this._knex(
|
|
24
|
-
.insert(item)
|
|
25
|
-
.returning('*');
|
|
23
|
+
const [result] = yield this._knex("chat").insert(item).returning("*");
|
|
26
24
|
return result;
|
|
27
25
|
});
|
|
28
26
|
}
|
|
29
27
|
getById(id) {
|
|
30
28
|
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
-
const result = yield this._knex(
|
|
32
|
-
.where('id', id)
|
|
33
|
-
.first();
|
|
29
|
+
const result = yield this._knex("chat").where("id", id).first();
|
|
34
30
|
return result || null;
|
|
35
31
|
});
|
|
36
32
|
}
|
|
37
33
|
getByUuid(uuid) {
|
|
38
34
|
return __awaiter(this, void 0, void 0, function* () {
|
|
39
|
-
const result = yield this._knex(
|
|
40
|
-
.where('uuid', uuid)
|
|
41
|
-
.first();
|
|
35
|
+
const result = yield this._knex("chat").where("uuid", uuid).first();
|
|
42
36
|
return result || null;
|
|
43
37
|
});
|
|
44
38
|
}
|
|
@@ -46,11 +40,11 @@ class ChatDAO {
|
|
|
46
40
|
return __awaiter(this, arguments, void 0, function* (page = 1, limit = 10) {
|
|
47
41
|
const offset = (page - 1) * limit;
|
|
48
42
|
const [results, [{ count }]] = yield Promise.all([
|
|
49
|
-
this._knex(
|
|
50
|
-
.orderBy(
|
|
43
|
+
this._knex("chat")
|
|
44
|
+
.orderBy("created_at", "desc")
|
|
51
45
|
.limit(limit)
|
|
52
46
|
.offset(offset),
|
|
53
|
-
this._knex(
|
|
47
|
+
this._knex("chat").count("* as count"),
|
|
54
48
|
]);
|
|
55
49
|
const totalCount = parseInt(count);
|
|
56
50
|
return {
|
|
@@ -60,24 +54,22 @@ class ChatDAO {
|
|
|
60
54
|
limit,
|
|
61
55
|
count: results.length,
|
|
62
56
|
totalCount,
|
|
63
|
-
totalPages: Math.ceil(totalCount / limit)
|
|
57
|
+
totalPages: Math.ceil(totalCount / limit),
|
|
64
58
|
};
|
|
65
59
|
});
|
|
66
60
|
}
|
|
67
61
|
update(id, item) {
|
|
68
62
|
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
-
const [result] = yield this._knex(
|
|
70
|
-
.where(
|
|
63
|
+
const [result] = yield this._knex("chat")
|
|
64
|
+
.where("id", id)
|
|
71
65
|
.update(Object.assign(Object.assign({}, item), { updated_at: new Date() }))
|
|
72
|
-
.returning(
|
|
66
|
+
.returning("*");
|
|
73
67
|
return result || null;
|
|
74
68
|
});
|
|
75
69
|
}
|
|
76
70
|
delete(id) {
|
|
77
71
|
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
-
const result = yield this._knex(
|
|
79
|
-
.where('id', id)
|
|
80
|
-
.delete();
|
|
72
|
+
const result = yield this._knex("chat").where("id", id).delete();
|
|
81
73
|
return result > 0;
|
|
82
74
|
});
|
|
83
75
|
}
|
|
@@ -85,14 +77,12 @@ class ChatDAO {
|
|
|
85
77
|
return __awaiter(this, arguments, void 0, function* (userId, page = 1, limit = 10) {
|
|
86
78
|
const offset = (page - 1) * limit;
|
|
87
79
|
const [results, [{ count }]] = yield Promise.all([
|
|
88
|
-
this._knex(
|
|
89
|
-
.where(
|
|
90
|
-
.orderBy(
|
|
80
|
+
this._knex("chat")
|
|
81
|
+
.where("userId", userId)
|
|
82
|
+
.orderBy("created_at", "desc")
|
|
91
83
|
.limit(limit)
|
|
92
84
|
.offset(offset),
|
|
93
|
-
this._knex(
|
|
94
|
-
.where('userId', userId)
|
|
95
|
-
.count('* as count')
|
|
85
|
+
this._knex("chat").where("userId", userId).count("* as count"),
|
|
96
86
|
]);
|
|
97
87
|
const totalCount = parseInt(count);
|
|
98
88
|
return {
|
|
@@ -102,7 +92,7 @@ class ChatDAO {
|
|
|
102
92
|
limit,
|
|
103
93
|
count: results.length,
|
|
104
94
|
totalCount,
|
|
105
|
-
totalPages: Math.ceil(totalCount / limit)
|
|
95
|
+
totalPages: Math.ceil(totalCount / limit),
|
|
106
96
|
};
|
|
107
97
|
});
|
|
108
98
|
}
|
|
@@ -110,16 +100,16 @@ class ChatDAO {
|
|
|
110
100
|
return __awaiter(this, arguments, void 0, function* (userId, page = 1, limit = 10) {
|
|
111
101
|
const offset = (page - 1) * limit;
|
|
112
102
|
const [results, [{ count }]] = yield Promise.all([
|
|
113
|
-
this._knex(
|
|
114
|
-
.where(
|
|
115
|
-
.where(
|
|
116
|
-
.orderBy(
|
|
103
|
+
this._knex("chat")
|
|
104
|
+
.where("userId", userId)
|
|
105
|
+
.where("status", "active")
|
|
106
|
+
.orderBy("created_at", "desc")
|
|
117
107
|
.limit(limit)
|
|
118
108
|
.offset(offset),
|
|
119
|
-
this._knex(
|
|
120
|
-
.where(
|
|
121
|
-
.where(
|
|
122
|
-
.count(
|
|
109
|
+
this._knex("chat")
|
|
110
|
+
.where("userId", userId)
|
|
111
|
+
.where("status", "active")
|
|
112
|
+
.count("* as count"),
|
|
123
113
|
]);
|
|
124
114
|
const totalCount = parseInt(count);
|
|
125
115
|
return {
|
|
@@ -129,7 +119,7 @@ class ChatDAO {
|
|
|
129
119
|
limit,
|
|
130
120
|
count: results.length,
|
|
131
121
|
totalCount,
|
|
132
|
-
totalPages: Math.ceil(totalCount / limit)
|
|
122
|
+
totalPages: Math.ceil(totalCount / limit),
|
|
133
123
|
};
|
|
134
124
|
});
|
|
135
125
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.dao.js","sourceRoot":"","sources":["../../../src/dao/chat/chat.dao.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"chat.dao.js","sourceRoot":"","sources":["../../../src/dao/chat/chat.dao.ts"],"names":[],"mappings":"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"}
|