@trafficgroup/knex-rel 0.1.11-rc0 → 0.1.12

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 (71) hide show
  1. package/.claude/settings.local.json +2 -5
  2. package/CLAUDE.md +11 -2
  3. package/dist/constants/folder.constants.d.ts +12 -0
  4. package/dist/constants/folder.constants.js +28 -0
  5. package/dist/constants/folder.constants.js.map +1 -0
  6. package/dist/dao/folder/folder.dao.d.ts +10 -1
  7. package/dist/dao/folder/folder.dao.js +37 -4
  8. package/dist/dao/folder/folder.dao.js.map +1 -1
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.js +5 -1
  11. package/dist/index.js.map +1 -1
  12. package/migrations/20250717160737_migration.ts +1 -1
  13. package/migrations/20250717160908_migration.ts +5 -2
  14. package/migrations/20250717161310_migration.ts +1 -1
  15. package/migrations/20250717161406_migration.ts +3 -3
  16. package/migrations/20250717162431_migration.ts +1 -1
  17. package/migrations/20250717173228_migration.ts +2 -2
  18. package/migrations/20250717204731_migration.ts +1 -1
  19. package/migrations/20250722210109_migration.ts +8 -4
  20. package/migrations/20250722211019_migration.ts +1 -1
  21. package/migrations/20250723153852_migration.ts +13 -10
  22. package/migrations/20250723162257_migration.ts +4 -7
  23. package/migrations/20250723171109_migration.ts +4 -7
  24. package/migrations/20250723205331_migration.ts +6 -9
  25. package/migrations/20250724191345_migration.ts +8 -11
  26. package/migrations/20250730180932_migration.ts +14 -13
  27. package/migrations/20250730213625_migration.ts +8 -11
  28. package/migrations/20250804124509_migration.ts +26 -21
  29. package/migrations/20250804132053_migration.ts +5 -8
  30. package/migrations/20250804164518_migration.ts +7 -7
  31. package/migrations/20250823223016_migration.ts +32 -21
  32. package/migrations/20250910015452_migration.ts +18 -6
  33. package/migrations/20250911000000_migration.ts +18 -4
  34. package/migrations/20250917144153_migration.ts +14 -7
  35. package/migrations/20250930200521_migration.ts +8 -4
  36. package/migrations/20251010143500_migration.ts +27 -6
  37. package/migrations/20251020225758_migration.ts +51 -15
  38. package/migrations/20251112120000_migration.ts +10 -2
  39. package/migrations/20251112120200_migration.ts +19 -7
  40. package/migrations/20251112120300_migration.ts +7 -2
  41. package/package.json +1 -1
  42. package/src/constants/folder.constants.ts +29 -0
  43. package/src/constants/video.constants.ts +11 -7
  44. package/src/d.types.ts +18 -14
  45. package/src/dao/VideoMinuteResultDAO.ts +72 -49
  46. package/src/dao/auth/auth.dao.ts +58 -55
  47. package/src/dao/batch/batch.dao.ts +101 -98
  48. package/src/dao/camera/camera.dao.ts +124 -121
  49. package/src/dao/chat/chat.dao.ts +45 -45
  50. package/src/dao/folder/folder.dao.ts +112 -55
  51. package/src/dao/location/location.dao.ts +109 -87
  52. package/src/dao/message/message.dao.ts +32 -32
  53. package/src/dao/report-configuration/report-configuration.dao.ts +370 -342
  54. package/src/dao/study/study.dao.ts +88 -63
  55. package/src/dao/user/user.dao.ts +52 -50
  56. package/src/dao/user-push-notification-token/user-push-notification-token.dao.ts +80 -48
  57. package/src/dao/video/video.dao.ts +385 -334
  58. package/src/entities/BaseEntity.ts +1 -1
  59. package/src/index.ts +42 -17
  60. package/src/interfaces/auth/auth.interfaces.ts +10 -10
  61. package/src/interfaces/batch/batch.interfaces.ts +1 -1
  62. package/src/interfaces/camera/camera.interfaces.ts +9 -9
  63. package/src/interfaces/chat/chat.interfaces.ts +4 -4
  64. package/src/interfaces/folder/folder.interfaces.ts +2 -2
  65. package/src/interfaces/location/location.interfaces.ts +7 -7
  66. package/src/interfaces/message/message.interfaces.ts +3 -3
  67. package/src/interfaces/report-configuration/report-configuration.interfaces.ts +16 -16
  68. package/src/interfaces/study/study.interfaces.ts +3 -3
  69. package/src/interfaces/user/user.interfaces.ts +9 -9
  70. package/src/interfaces/user-push-notification-token/user-push-notification-token.interfaces.ts +9 -9
  71. package/src/interfaces/video/video.interfaces.ts +34 -34
@@ -1,9 +1,6 @@
1
1
  {
2
2
  "permissions": {
3
- "allow": [
4
- "Bash(npm run migrate:*)",
5
- "Bash(mkdir:*)"
6
- ],
3
+ "allow": ["Bash(npm run migrate:*)", "Bash(mkdir:*)"],
7
4
  "deny": []
8
5
  }
9
- }
6
+ }
package/CLAUDE.md CHANGED
@@ -9,18 +9,21 @@ This is `@trafficgroup/knex-rel` - a TypeScript-based Knex.js module for databas
9
9
  ## Development Commands
10
10
 
11
11
  ### Building and Formatting
12
+
12
13
  - `npm run build` - Compile TypeScript to JavaScript in dist/
13
14
  - `npm run format` - Format code with Prettier
14
15
  - `npm run clean` - Clean dist/, format, and rebuild
15
16
  - `npm test` - Run Jest tests
16
17
 
17
18
  ### Database Operations
19
+
18
20
  - `npm run migrate:create` - Create a new TypeScript migration file
19
21
  - `npm run migrate:deploy` - Run all pending migrations
20
- - `npm run seed:create` - Create a new TypeScript seed file
22
+ - `npm run seed:create` - Create a new TypeScript seed file
21
23
  - `npm run seed:run` - Execute all seed files
22
24
 
23
25
  ### Publishing
26
+
24
27
  - `npm run npm:publish` - Clean, build, and publish to npm
25
28
 
26
29
  ## Architecture
@@ -28,21 +31,25 @@ This is `@trafficgroup/knex-rel` - a TypeScript-based Knex.js module for databas
28
31
  ### Core Components
29
32
 
30
33
  **KnexManager** (`src/KnexConnection.ts`): Singleton connection manager
34
+
31
35
  - `connect(config?, connections?)` - Establish database connection
32
36
  - `getConnection()` - Get active connection instance
33
37
  - `disconnect()` - Close connection and cleanup
34
38
 
35
39
  **DAO Pattern**: All data access follows the `IBaseDAO<T>` interface with standard CRUD operations:
40
+
36
41
  - `create(item)`, `getById(id)`, `getByUuid(uuid)`, `getAll(page, limit)`, `update(id, item)`, `delete(id)`
37
42
  - Returns `IDataPaginator<T>` for paginated results
38
43
 
39
44
  **AuthDAO Additional Methods**:
45
+
40
46
  - `getByUserId(userId: number)` - Find auth record by user ID
41
47
  - `getByEmailToken(emailToken: string)` - Find auth record by email verification/reset token
42
48
 
43
49
  ### Entity Structure
44
50
 
45
51
  Each entity has:
52
+
46
53
  - Interface in `src/interfaces/[entity]/[entity].interfaces.ts`
47
54
  - DAO implementation in `src/dao/[entity]/[entity].dao.ts`
48
55
 
@@ -51,13 +58,15 @@ Current entities: User, Study, Folder, Video
51
58
  ### Database Configuration
52
59
 
53
60
  Environment variables (for development):
61
+
54
62
  - `SQL_HOST`, `SQL_USER`, `SQL_PASSWORD`, `SQL_DB_NAME`, `SQL_PORT`
55
63
 
56
64
  Environment variables (for staging/production):
65
+
57
66
  - `PG_HOST`, `PG_USER`, `PG_PASSWORD`, `PG_DB`, `PG_PORT`
58
67
 
59
68
  Knex configuration supports development, staging, and production environments in `knexfile.ts`.
60
69
 
61
70
  ### Migrations
62
71
 
63
- Located in `migrations/` directory. Use TypeScript format with timestamp prefixes. Database uses `knex_migrations` table for tracking.
72
+ Located in `migrations/` directory. Use TypeScript format with timestamp prefixes. Database uses `knex_migrations` table for tracking.
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Folder sorting and filtering constants
3
+ * Shared between DAO and API controller to ensure validation consistency
4
+ */
5
+ export declare const VALID_FOLDER_SORT_FIELDS: readonly ["created_at", "name", "status", "updated_at"];
6
+ export type FolderSortField = (typeof VALID_FOLDER_SORT_FIELDS)[number];
7
+ export declare const VALID_FOLDER_STATUSES: readonly ["UPLOADING", "COMPLETED", "FAILED"];
8
+ export type FolderStatus = (typeof VALID_FOLDER_STATUSES)[number];
9
+ /**
10
+ * Maps API sort field names to database column names with table aliases
11
+ */
12
+ export declare const FOLDER_SORT_COLUMN_MAP: Record<FolderSortField, string>;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * Folder sorting and filtering constants
4
+ * Shared between DAO and API controller to ensure validation consistency
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.FOLDER_SORT_COLUMN_MAP = exports.VALID_FOLDER_STATUSES = exports.VALID_FOLDER_SORT_FIELDS = void 0;
8
+ exports.VALID_FOLDER_SORT_FIELDS = [
9
+ "created_at",
10
+ "name",
11
+ "status",
12
+ "updated_at",
13
+ ];
14
+ exports.VALID_FOLDER_STATUSES = [
15
+ "UPLOADING",
16
+ "COMPLETED",
17
+ "FAILED",
18
+ ];
19
+ /**
20
+ * Maps API sort field names to database column names with table aliases
21
+ */
22
+ exports.FOLDER_SORT_COLUMN_MAP = {
23
+ created_at: "f.created_at",
24
+ name: "f.name",
25
+ status: "f.status",
26
+ updated_at: "f.updated_at",
27
+ };
28
+ //# sourceMappingURL=folder.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folder.constants.js","sourceRoot":"","sources":["../../src/constants/folder.constants.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEU,QAAA,wBAAwB,GAAG;IACtC,YAAY;IACZ,MAAM;IACN,QAAQ;IACR,YAAY;CACJ,CAAC;AAGE,QAAA,qBAAqB,GAAG;IACnC,WAAW;IACX,WAAW;IACX,QAAQ;CACA,CAAC;AAGX;;GAEG;AACU,QAAA,sBAAsB,GAAoC;IACrE,UAAU,EAAE,cAAc;IAC1B,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,UAAU;IAClB,UAAU,EAAE,cAAc;CAC3B,CAAC"}
@@ -1,5 +1,14 @@
1
1
  import { IBaseDAO, IDataPaginator } from "../../d.types";
2
2
  import { IFolder } from "../../interfaces/folder/folder.interfaces";
3
+ import { FolderSortField, FolderStatus } from "../../constants/folder.constants";
4
+ import { SortOrder } from "../../constants/video.constants";
5
+ export interface IFolderFilters {
6
+ studyId?: number | null;
7
+ status?: FolderStatus;
8
+ search?: string;
9
+ sortBy?: FolderSortField;
10
+ sortOrder?: SortOrder;
11
+ }
3
12
  export declare class FolderDAO implements IBaseDAO<IFolder> {
4
13
  private _knex;
5
14
  create(item: IFolder): Promise<IFolder>;
@@ -7,5 +16,5 @@ export declare class FolderDAO implements IBaseDAO<IFolder> {
7
16
  getByUuid(uuid: string): Promise<IFolder | null>;
8
17
  update(id: number, item: Partial<IFolder>): Promise<IFolder | null>;
9
18
  delete(id: number): Promise<boolean>;
10
- getAll(page: number, limit: number, studyId?: number | null): Promise<IDataPaginator<IFolder>>;
19
+ getAll(page: number, limit: number, filters?: IFolderFilters): Promise<IDataPaginator<IFolder>>;
11
20
  }
@@ -14,6 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.FolderDAO = void 0;
16
16
  const KnexConnection_1 = __importDefault(require("../../KnexConnection"));
17
+ const folder_constants_1 = require("../../constants/folder.constants");
17
18
  class FolderDAO {
18
19
  constructor() {
19
20
  this._knex = KnexConnection_1.default.getConnection();
@@ -61,17 +62,49 @@ class FolderDAO {
61
62
  return result > 0;
62
63
  });
63
64
  }
64
- getAll(page, limit, studyId) {
65
+ getAll(page, limit, filters) {
65
66
  return __awaiter(this, void 0, void 0, function* () {
66
67
  const offset = (page - 1) * limit;
67
68
  const query = this._knex("folders as f")
68
69
  .innerJoin("study as s", "f.studyId", "s.id")
69
70
  .leftJoin("locations as l", "s.locationId", "l.id")
70
71
  .select("f.*", this._knex.raw("to_jsonb(s.*) as study"), "l.name as locationName", "l.uuid as locationUuid");
71
- if (studyId !== undefined && studyId !== null) {
72
- query.where("f.studyId", studyId);
72
+ // Apply filters
73
+ if (filters) {
74
+ // Filter by studyId
75
+ if (filters.studyId !== undefined && filters.studyId !== null) {
76
+ query.where("f.studyId", filters.studyId);
77
+ }
78
+ // Filter by status
79
+ if (filters.status) {
80
+ query.where("f.status", filters.status);
81
+ }
82
+ // Search by name (case-insensitive)
83
+ if (filters.search) {
84
+ query.whereRaw("LOWER(f.name) LIKE ?", [
85
+ `%${filters.search.toLowerCase()}%`,
86
+ ]);
87
+ }
88
+ // Apply sorting
89
+ if (filters.sortBy) {
90
+ const columnName = folder_constants_1.FOLDER_SORT_COLUMN_MAP[filters.sortBy];
91
+ const order = filters.sortOrder || "DESC";
92
+ query.orderBy(columnName, order);
93
+ }
94
+ else {
95
+ // Default sort by created_at DESC
96
+ query.orderBy("f.created_at", "DESC");
97
+ }
73
98
  }
74
- const [countResult] = yield query.clone().clearSelect().count("* as count");
99
+ else {
100
+ // Default sort by created_at DESC
101
+ query.orderBy("f.created_at", "DESC");
102
+ }
103
+ const [countResult] = yield query
104
+ .clone()
105
+ .clearSelect()
106
+ .clearOrder()
107
+ .count("* as count");
75
108
  const totalCount = +countResult.count;
76
109
  const folders = yield query.clone().limit(limit).offset(offset);
77
110
  return {
@@ -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;IA0EpE,CAAC;IAxEO,MAAM,CAAC,IAAa;;YACxB,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;iBAChD,MAAM,CAAC,IAAI,CAAC;iBACZ,SAAS,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,aAAa,CAAC;QACvB,CAAC;KAAA;IAEK,OAAO,CAAC,EAAU;;YACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;iBAC5C,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,MAAM,CAAC;iBAC5C,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;iBACvD,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;iBACjB,KAAK,EAAE,CAAC;YACX,OAAO,MAAM,IAAI,IAAI,CAAC;QACxB,CAAC;KAAA;IAEK,SAAS,CAAC,IAAY;;YAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;iBAC5C,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,MAAM,CAAC;iBAC5C,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;iBACvD,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC;iBACrB,KAAK,EAAE,CAAC;YACX,OAAO,MAAM,IAAI,IAAI,CAAC;QACxB,CAAC;KAAA;IAEK,MAAM,CAAC,EAAU,EAAE,IAAsB;;YAC7C,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;iBAChD,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;iBACb,MAAM,CAAC,IAAI,CAAC;iBACZ,SAAS,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,aAAa,IAAI,IAAI,CAAC;QAC/B,CAAC;KAAA;IAEK,MAAM,CAAC,EAAU;;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/D,OAAO,MAAM,GAAG,CAAC,CAAC;QACpB,CAAC;KAAA;IAEK,MAAM,CACV,IAAY,EACZ,KAAa,EACb,OAAuB;;YAEvB,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;YAElC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;iBACrC,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,MAAM,CAAC;iBAC5C,QAAQ,CAAC,gBAAgB,EAAE,cAAc,EAAE,MAAM,CAAC;iBAClD,MAAM,CACL,KAAK,EACL,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,EACxC,wBAAwB,EACxB,wBAAwB,CACzB,CAAC;YACJ,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC9C,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACpC,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC5E,MAAM,UAAU,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAEhE,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,OAAO;gBACb,IAAI;gBACJ,KAAK;gBACL,KAAK,EAAE,OAAO,CAAC,MAAM;gBACrB,UAAU;gBACV,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;aAC1C,CAAC;QACJ,CAAC;KAAA;CACF;AA3ED,8BA2EC"}
1
+ {"version":3,"file":"folder.dao.js","sourceRoot":"","sources":["../../../src/dao/folder/folder.dao.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -13,6 +13,9 @@ export { VideoDAO } from "./dao/video/video.dao";
13
13
  export { VideoMinuteResultDAO } from "./dao/VideoMinuteResultDAO";
14
14
  export { VALID_VIDEO_SORT_FIELDS, VALID_SORT_ORDERS, VIDEO_SORT_COLUMN_MAP, } from "./constants/video.constants";
15
15
  export type { VideoSortField, SortOrder } from "./constants/video.constants";
16
+ export { VALID_FOLDER_SORT_FIELDS, VALID_FOLDER_STATUSES, FOLDER_SORT_COLUMN_MAP, } from "./constants/folder.constants";
17
+ export type { FolderSortField, FolderStatus, } from "./constants/folder.constants";
18
+ export type { IFolderFilters } from "./dao/folder/folder.dao";
16
19
  export { IDataPaginator } from "./d.types";
17
20
  export { IAuth } from "./interfaces/auth/auth.interfaces";
18
21
  export { IBatch } from "./interfaces/batch/batch.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.VIDEO_SORT_COLUMN_MAP = exports.VALID_SORT_ORDERS = exports.VALID_VIDEO_SORT_FIELDS = exports.VideoMinuteResultDAO = exports.VideoDAO = exports.UserPushNotificationTokenDAO = exports.UserDAO = exports.StudyDAO = exports.ReportConfigurationDAO = exports.MessageDAO = exports.LocationDAO = exports.FolderDAO = exports.ChatDAO = exports.CameraDAO = exports.BatchDAO = exports.AuthDAO = void 0;
6
+ exports.KnexManager = exports.FOLDER_SORT_COLUMN_MAP = exports.VALID_FOLDER_STATUSES = exports.VALID_FOLDER_SORT_FIELDS = exports.VIDEO_SORT_COLUMN_MAP = exports.VALID_SORT_ORDERS = exports.VALID_VIDEO_SORT_FIELDS = exports.VideoMinuteResultDAO = exports.VideoDAO = exports.UserPushNotificationTokenDAO = exports.UserDAO = exports.StudyDAO = exports.ReportConfigurationDAO = exports.MessageDAO = exports.LocationDAO = exports.FolderDAO = exports.ChatDAO = exports.CameraDAO = exports.BatchDAO = 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; } });
@@ -36,6 +36,10 @@ var video_constants_1 = require("./constants/video.constants");
36
36
  Object.defineProperty(exports, "VALID_VIDEO_SORT_FIELDS", { enumerable: true, get: function () { return video_constants_1.VALID_VIDEO_SORT_FIELDS; } });
37
37
  Object.defineProperty(exports, "VALID_SORT_ORDERS", { enumerable: true, get: function () { return video_constants_1.VALID_SORT_ORDERS; } });
38
38
  Object.defineProperty(exports, "VIDEO_SORT_COLUMN_MAP", { enumerable: true, get: function () { return video_constants_1.VIDEO_SORT_COLUMN_MAP; } });
39
+ var folder_constants_1 = require("./constants/folder.constants");
40
+ Object.defineProperty(exports, "VALID_FOLDER_SORT_FIELDS", { enumerable: true, get: function () { return folder_constants_1.VALID_FOLDER_SORT_FIELDS; } });
41
+ Object.defineProperty(exports, "VALID_FOLDER_STATUSES", { enumerable: true, get: function () { return folder_constants_1.VALID_FOLDER_STATUSES; } });
42
+ Object.defineProperty(exports, "FOLDER_SORT_COLUMN_MAP", { enumerable: true, get: function () { return folder_constants_1.FOLDER_SORT_COLUMN_MAP; } });
39
43
  const KnexConnection_1 = __importDefault(require("./KnexConnection"));
40
44
  exports.KnexManager = KnexConnection_1.default;
41
45
  //# sourceMappingURL=index.js.map
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,mDAAiD;AAAxC,qGAAA,QAAQ,OAAA;AACjB,sDAAoD;AAA3C,uGAAA,SAAS,OAAA;AAClB,gDAAsE;AAA7D,mGAAA,OAAO,OAAA;AAChB,sDAAoD;AAA3C,uGAAA,SAAS,OAAA;AAClB,4DAA0D;AAAjD,2GAAA,WAAW,OAAA;AACpB,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;AAE7B,YAAY;AACZ,+DAIqC;AAHnC,0HAAA,uBAAuB,OAAA;AACvB,oHAAA,iBAAiB,OAAA;AACjB,wHAAA,qBAAqB,OAAA;AA8CvB,sEAA2C;AAClC,sBADF,wBAAW,CACE"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO;AACP,gDAA8C;AAArC,mGAAA,OAAO,OAAA;AAChB,mDAAiD;AAAxC,qGAAA,QAAQ,OAAA;AACjB,sDAAoD;AAA3C,uGAAA,SAAS,OAAA;AAClB,gDAAsE;AAA7D,mGAAA,OAAO,OAAA;AAChB,sDAAoD;AAA3C,uGAAA,SAAS,OAAA;AAClB,4DAA0D;AAAjD,2GAAA,WAAW,OAAA;AACpB,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;AAE7B,YAAY;AACZ,+DAIqC;AAHnC,0HAAA,uBAAuB,OAAA;AACvB,oHAAA,iBAAiB,OAAA;AACjB,wHAAA,qBAAqB,OAAA;AAIvB,iEAIsC;AAHpC,4HAAA,wBAAwB,OAAA;AACxB,yHAAA,qBAAqB,OAAA;AACrB,0HAAA,sBAAsB,OAAA;AAoDxB,sEAA2C;AAClC,sBADF,wBAAW,CACE"}
@@ -12,4 +12,4 @@ export async function up(knex: Knex): Promise<void> {
12
12
 
13
13
  export async function down(knex: Knex): Promise<void> {
14
14
  await knex.schema.dropTableIfExists("user");
15
- }
15
+ }
@@ -13,7 +13,10 @@ export async function up(knex: Knex): Promise<void> {
13
13
  .inTable("user")
14
14
  .onDelete("CASCADE");
15
15
 
16
- table.enu("status", ["COMPLETE", "IN PROGRESS", "FAILED"]).notNullable().defaultTo("IN PROGRESS");
16
+ table
17
+ .enu("status", ["COMPLETE", "IN PROGRESS", "FAILED"])
18
+ .notNullable()
19
+ .defaultTo("IN PROGRESS");
17
20
 
18
21
  table.timestamps(true, true); // created_at, updated_at
19
22
  });
@@ -21,4 +24,4 @@ export async function up(knex: Knex): Promise<void> {
21
24
 
22
25
  export async function down(knex: Knex): Promise<void> {
23
26
  await knex.schema.dropTableIfExists("study");
24
- }
27
+ }
@@ -32,4 +32,4 @@ export async function up(knex: Knex): Promise<void> {
32
32
 
33
33
  export async function down(knex: Knex): Promise<void> {
34
34
  await knex.schema.dropTableIfExists("folders");
35
- }
35
+ }
@@ -19,13 +19,13 @@ export async function up(knex: Knex): Promise<void> {
19
19
  .enu("videoType", ["TMC", "ATR", "JUNCTION", "ROUNDABOUT", "PATHWAY"])
20
20
  .notNullable();
21
21
 
22
- table.jsonb("metadata").defaultTo('{}');
22
+ table.jsonb("metadata").defaultTo("{}");
23
23
  table
24
24
  .enu("status", ["QUEUED", "PROCESSING", "COMPLETED", "FAILED"])
25
25
  .notNullable()
26
26
  .defaultTo("QUEUE");
27
27
 
28
- table.jsonb("results").defaultTo('{}');
28
+ table.jsonb("results").defaultTo("{}");
29
29
 
30
30
  table.timestamps(true, true);
31
31
  });
@@ -33,4 +33,4 @@ export async function up(knex: Knex): Promise<void> {
33
33
 
34
34
  export async function down(knex: Knex): Promise<void> {
35
35
  await knex.schema.dropTableIfExists("video");
36
- }
36
+ }
@@ -56,4 +56,4 @@ export async function down(knex: Knex): Promise<void> {
56
56
  await knex.schema.alterTable("user", (table) => {
57
57
  table.dropColumn("uuid");
58
58
  });
59
- }
59
+ }
@@ -1,9 +1,9 @@
1
1
  import type { Knex } from "knex";
2
2
 
3
3
  export async function up(knex: Knex): Promise<void> {
4
- await knex.schema.renameTable("user", "users");
4
+ await knex.schema.renameTable("user", "users");
5
5
  }
6
6
 
7
7
  export async function down(knex: Knex): Promise<void> {
8
- await knex.schema.renameTable("users", "user");
8
+ await knex.schema.renameTable("users", "user");
9
9
  }
@@ -10,4 +10,4 @@ export async function down(knex: Knex): Promise<void> {
10
10
  await knex.schema.alterTable("video", (table) => {
11
11
  table.dropColumn("name");
12
12
  });
13
- }
13
+ }
@@ -1,9 +1,10 @@
1
1
  import type { Knex } from "knex";
2
2
 
3
-
4
3
  export async function up(knex: Knex): Promise<void> {
5
4
  // 1. Crear el tipo ENUM nativo
6
- await knex.raw(`CREATE TYPE "video_status" AS ENUM ('QUEUED', 'PROCESSING', 'COMPLETED', 'FAILED', 'PENDING');`);
5
+ await knex.raw(
6
+ `CREATE TYPE "video_status" AS ENUM ('QUEUED', 'PROCESSING', 'COMPLETED', 'FAILED', 'PENDING');`,
7
+ );
7
8
 
8
9
  // 2. Normalizar los valores existentes
9
10
  await knex.raw(`
@@ -53,8 +54,11 @@ export async function down(knex: Knex): Promise<void> {
53
54
  await knex.schema.alterTable("video", (table) => {
54
55
  table.dropColumn("progress");
55
56
  table.dropColumn("remainingTime");
56
- table.specificType("status", "varchar(255)").notNullable().defaultTo("QUEUED").alter();
57
+ table
58
+ .specificType("status", "varchar(255)")
59
+ .notNullable()
60
+ .defaultTo("QUEUED")
61
+ .alter();
57
62
  });
58
63
  await knex.raw('DROP TYPE IF EXISTS "video_status";');
59
64
  }
60
-
@@ -12,4 +12,4 @@ export async function down(knex: Knex): Promise<void> {
12
12
  ALTER TABLE "video"
13
13
  ALTER COLUMN "status" SET DEFAULT 'QUEUED';
14
14
  `);
15
- }
15
+ }
@@ -1,19 +1,22 @@
1
1
  import type { Knex } from "knex";
2
2
 
3
-
4
3
  export async function up(knex: Knex): Promise<void> {
5
- await knex.schema.createTable('auth', (table) => {
6
- table.increments('id').primary();
7
- table.integer('userId').unsigned().notNullable().references('id').inTable('users').onDelete('CASCADE');
8
- table.string('password', 255).notNullable();
9
- table.boolean('twofaEnabled').notNullable().defaultTo(false);
10
- table.string('twofaSecret', 255).nullable();
4
+ await knex.schema.createTable("auth", (table) => {
5
+ table.increments("id").primary();
6
+ table
7
+ .integer("userId")
8
+ .unsigned()
9
+ .notNullable()
10
+ .references("id")
11
+ .inTable("users")
12
+ .onDelete("CASCADE");
13
+ table.string("password", 255).notNullable();
14
+ table.boolean("twofaEnabled").notNullable().defaultTo(false);
15
+ table.string("twofaSecret", 255).nullable();
11
16
  table.timestamps(true, true);
12
17
  });
13
18
  }
14
19
 
15
-
16
20
  export async function down(knex: Knex): Promise<void> {
17
- await knex.schema.dropTableIfExists('auth');
21
+ await knex.schema.dropTableIfExists("auth");
18
22
  }
19
-
@@ -1,16 +1,13 @@
1
1
  import type { Knex } from "knex";
2
2
 
3
-
4
3
  export async function up(knex: Knex): Promise<void> {
5
- await knex.schema.alterTable('video', (table) => {
6
- table.boolean('generateVideoOutput').notNullable().defaultTo(false);
4
+ await knex.schema.alterTable("video", (table) => {
5
+ table.boolean("generateVideoOutput").notNullable().defaultTo(false);
7
6
  });
8
7
  }
9
8
 
10
-
11
9
  export async function down(knex: Knex): Promise<void> {
12
- await knex.schema.alterTable('video', (table) => {
13
- table.dropColumn('generateVideoOutput');
10
+ await knex.schema.alterTable("video", (table) => {
11
+ table.dropColumn("generateVideoOutput");
14
12
  });
15
13
  }
16
-
@@ -1,16 +1,13 @@
1
1
  import type { Knex } from "knex";
2
2
 
3
-
4
3
  export async function up(knex: Knex): Promise<void> {
5
- await knex.schema.alterTable('video', (table) => {
6
- table.string('videoOutputLocation').nullable();
4
+ await knex.schema.alterTable("video", (table) => {
5
+ table.string("videoOutputLocation").nullable();
7
6
  });
8
7
  }
9
8
 
10
-
11
9
  export async function down(knex: Knex): Promise<void> {
12
- await knex.schema.alterTable('video', (table) => {
13
- table.dropColumn('videoOutputLocation');
10
+ await knex.schema.alterTable("video", (table) => {
11
+ table.dropColumn("videoOutputLocation");
14
12
  });
15
13
  }
16
-
@@ -1,18 +1,15 @@
1
1
  import type { Knex } from "knex";
2
2
 
3
-
4
3
  export async function up(knex: Knex): Promise<void> {
5
- await knex.schema.alterTable('auth', (table) => {
6
- table.string('emailToken', 255).nullable();
7
- table.boolean('emailVerified').notNullable().defaultTo(false);
4
+ await knex.schema.alterTable("auth", (table) => {
5
+ table.string("emailToken", 255).nullable();
6
+ table.boolean("emailVerified").notNullable().defaultTo(false);
8
7
  });
9
8
  }
10
9
 
11
-
12
10
  export async function down(knex: Knex): Promise<void> {
13
- await knex.schema.alterTable('auth', (table) => {
14
- table.dropColumn('emailToken');
15
- table.dropColumn('emailVerified');
11
+ await knex.schema.alterTable("auth", (table) => {
12
+ table.dropColumn("emailToken");
13
+ table.dropColumn("emailVerified");
16
14
  });
17
15
  }
18
-
@@ -1,18 +1,15 @@
1
1
  import type { Knex } from "knex";
2
2
 
3
-
4
3
  export async function up(knex: Knex): Promise<void> {
5
- await knex.schema.alterTable('users', (table) => {
6
- table.string('profilePhoto').nullable();
7
- table.string('company').nullable();
8
- });
4
+ await knex.schema.alterTable("users", (table) => {
5
+ table.string("profilePhoto").nullable();
6
+ table.string("company").nullable();
7
+ });
9
8
  }
10
9
 
11
-
12
10
  export async function down(knex: Knex): Promise<void> {
13
- await knex.schema.alterTable('users', (table) => {
14
- table.dropColumn('profilePhoto');
15
- table.dropColumn('company');
16
- });
11
+ await knex.schema.alterTable("users", (table) => {
12
+ table.dropColumn("profilePhoto");
13
+ table.dropColumn("company");
14
+ });
17
15
  }
18
-
@@ -1,22 +1,23 @@
1
1
  import type { Knex } from "knex";
2
2
 
3
-
4
3
  export async function up(knex: Knex): Promise<void> {
5
- return knex.schema.createTable('user_push_notification_token', (table) => {
6
- table.increments('id').primary();
7
- table.integer('userId').unsigned().notNullable();
8
- table.string('token').notNullable();
9
- table.boolean('available').defaultTo(true);
4
+ return knex.schema.createTable("user_push_notification_token", (table) => {
5
+ table.increments("id").primary();
6
+ table.integer("userId").unsigned().notNullable();
7
+ table.string("token").notNullable();
8
+ table.boolean("available").defaultTo(true);
10
9
  table.timestamps(true, true);
11
-
12
- table.foreign('userId').references('id').inTable('users').onDelete('CASCADE');
13
- table.index(['userId']);
14
- table.index(['token']);
10
+
11
+ table
12
+ .foreign("userId")
13
+ .references("id")
14
+ .inTable("users")
15
+ .onDelete("CASCADE");
16
+ table.index(["userId"]);
17
+ table.index(["token"]);
15
18
  });
16
19
  }
17
20
 
18
-
19
21
  export async function down(knex: Knex): Promise<void> {
20
- return knex.schema.dropTable('user_push_notification_token');
22
+ return knex.schema.dropTable("user_push_notification_token");
21
23
  }
22
-
@@ -1,18 +1,15 @@
1
1
  import type { Knex } from "knex";
2
2
 
3
-
4
3
  export async function up(knex: Knex): Promise<void> {
5
- await knex.schema.alterTable('user_push_notification_token', (table) => {
6
- table.string('token_type').defaultTo('expo').notNullable();
7
- table.string('device_type');
8
- });
4
+ await knex.schema.alterTable("user_push_notification_token", (table) => {
5
+ table.string("token_type").defaultTo("expo").notNullable();
6
+ table.string("device_type");
7
+ });
9
8
  }
10
9
 
11
-
12
10
  export async function down(knex: Knex): Promise<void> {
13
- await knex.schema.alterTable('user_push_notification_token', (table) => {
14
- table.dropColumn('token_type');
15
- table.dropColumn('device_type');
16
- });
11
+ await knex.schema.alterTable("user_push_notification_token", (table) => {
12
+ table.dropColumn("token_type");
13
+ table.dropColumn("device_type");
14
+ });
17
15
  }
18
-