cadenlane-cli-2 1.0.0
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/CHANGELOG.md +6 -0
- package/LICENSE +21 -0
- package/README.md +333 -0
- package/bin.js +2 -0
- package/dist/application/config/config.manager.d.ts +62 -0
- package/dist/application/config/config.manager.d.ts.map +1 -0
- package/dist/application/config/config.manager.js +146 -0
- package/dist/application/config/config.manager.js.map +1 -0
- package/dist/application/services/application.service.d.ts +35 -0
- package/dist/application/services/application.service.d.ts.map +1 -0
- package/dist/application/services/application.service.js +174 -0
- package/dist/application/services/application.service.js.map +1 -0
- package/dist/application/services/download.service.d.ts +27 -0
- package/dist/application/services/download.service.d.ts.map +1 -0
- package/dist/application/services/download.service.js +197 -0
- package/dist/application/services/download.service.js.map +1 -0
- package/dist/application/services/file-naming.service.d.ts +34 -0
- package/dist/application/services/file-naming.service.d.ts.map +1 -0
- package/dist/application/services/file-naming.service.js +142 -0
- package/dist/application/services/file-naming.service.js.map +1 -0
- package/dist/application/services/queue.service.d.ts +53 -0
- package/dist/application/services/queue.service.d.ts.map +1 -0
- package/dist/application/services/queue.service.js +82 -0
- package/dist/application/services/queue.service.js.map +1 -0
- package/dist/cli/commands/start.command.d.ts +39 -0
- package/dist/cli/commands/start.command.d.ts.map +1 -0
- package/dist/cli/commands/start.command.js +196 -0
- package/dist/cli/commands/start.command.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +86 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/domain/constants/config.constants.d.ts +54 -0
- package/dist/domain/constants/config.constants.d.ts.map +1 -0
- package/dist/domain/constants/config.constants.js +142 -0
- package/dist/domain/constants/config.constants.js.map +1 -0
- package/dist/domain/dtos/index.d.ts +4 -0
- package/dist/domain/dtos/index.d.ts.map +1 -0
- package/dist/domain/dtos/index.js +10 -0
- package/dist/domain/dtos/index.js.map +1 -0
- package/dist/domain/dtos/log-entry.dto.d.ts +15 -0
- package/dist/domain/dtos/log-entry.dto.d.ts.map +1 -0
- package/dist/domain/dtos/log-entry.dto.js +64 -0
- package/dist/domain/dtos/log-entry.dto.js.map +1 -0
- package/dist/domain/dtos/message.dto.d.ts +27 -0
- package/dist/domain/dtos/message.dto.d.ts.map +1 -0
- package/dist/domain/dtos/message.dto.js +140 -0
- package/dist/domain/dtos/message.dto.js.map +1 -0
- package/dist/domain/dtos/queue-message.dto.d.ts +10 -0
- package/dist/domain/dtos/queue-message.dto.d.ts.map +1 -0
- package/dist/domain/dtos/queue-message.dto.js +39 -0
- package/dist/domain/dtos/queue-message.dto.js.map +1 -0
- package/dist/domain/entities/cli-instance.entity.d.ts +55 -0
- package/dist/domain/entities/cli-instance.entity.d.ts.map +1 -0
- package/dist/domain/entities/cli-instance.entity.js +132 -0
- package/dist/domain/entities/cli-instance.entity.js.map +1 -0
- package/dist/domain/entities/index.d.ts +3 -0
- package/dist/domain/entities/index.d.ts.map +1 -0
- package/dist/domain/entities/index.js +8 -0
- package/dist/domain/entities/index.js.map +1 -0
- package/dist/domain/entities/log-entry.entity.d.ts +60 -0
- package/dist/domain/entities/log-entry.entity.d.ts.map +1 -0
- package/dist/domain/entities/log-entry.entity.js +101 -0
- package/dist/domain/entities/log-entry.entity.js.map +1 -0
- package/dist/domain/entities/message.entity.d.ts +64 -0
- package/dist/domain/entities/message.entity.d.ts.map +1 -0
- package/dist/domain/entities/message.entity.js +110 -0
- package/dist/domain/entities/message.entity.js.map +1 -0
- package/dist/domain/enums/error-category.enum.d.ts +11 -0
- package/dist/domain/enums/error-category.enum.d.ts.map +1 -0
- package/dist/domain/enums/error-category.enum.js +15 -0
- package/dist/domain/enums/error-category.enum.js.map +1 -0
- package/dist/domain/enums/index.d.ts +4 -0
- package/dist/domain/enums/index.d.ts.map +1 -0
- package/dist/domain/enums/index.js +10 -0
- package/dist/domain/enums/index.js.map +1 -0
- package/dist/domain/enums/log-level.enum.d.ts +11 -0
- package/dist/domain/enums/log-level.enum.d.ts.map +1 -0
- package/dist/domain/enums/log-level.enum.js +15 -0
- package/dist/domain/enums/log-level.enum.js.map +1 -0
- package/dist/domain/enums/message-status.enum.d.ts +11 -0
- package/dist/domain/enums/message-status.enum.d.ts.map +1 -0
- package/dist/domain/enums/message-status.enum.js +15 -0
- package/dist/domain/enums/message-status.enum.js.map +1 -0
- package/dist/domain/interfaces/adapters/ifilesystem.adapter.d.ts +34 -0
- package/dist/domain/interfaces/adapters/ifilesystem.adapter.d.ts.map +1 -0
- package/dist/domain/interfaces/adapters/ifilesystem.adapter.js +3 -0
- package/dist/domain/interfaces/adapters/ifilesystem.adapter.js.map +1 -0
- package/dist/domain/interfaces/adapters/ihttp.adapter.d.ts +22 -0
- package/dist/domain/interfaces/adapters/ihttp.adapter.d.ts.map +1 -0
- package/dist/domain/interfaces/adapters/ihttp.adapter.js +3 -0
- package/dist/domain/interfaces/adapters/ihttp.adapter.js.map +1 -0
- package/dist/domain/interfaces/adapters/index.d.ts +4 -0
- package/dist/domain/interfaces/adapters/index.d.ts.map +1 -0
- package/dist/domain/interfaces/adapters/index.js +3 -0
- package/dist/domain/interfaces/adapters/index.js.map +1 -0
- package/dist/domain/interfaces/adapters/isupabase.adapter.d.ts +27 -0
- package/dist/domain/interfaces/adapters/isupabase.adapter.d.ts.map +1 -0
- package/dist/domain/interfaces/adapters/isupabase.adapter.js +3 -0
- package/dist/domain/interfaces/adapters/isupabase.adapter.js.map +1 -0
- package/dist/domain/interfaces/repositories/ilog.repository.d.ts +32 -0
- package/dist/domain/interfaces/repositories/ilog.repository.d.ts.map +1 -0
- package/dist/domain/interfaces/repositories/ilog.repository.js +3 -0
- package/dist/domain/interfaces/repositories/ilog.repository.js.map +1 -0
- package/dist/domain/interfaces/repositories/imessage.repository.d.ts +39 -0
- package/dist/domain/interfaces/repositories/imessage.repository.d.ts.map +1 -0
- package/dist/domain/interfaces/repositories/imessage.repository.js +3 -0
- package/dist/domain/interfaces/repositories/imessage.repository.js.map +1 -0
- package/dist/domain/interfaces/repositories/index.d.ts +4 -0
- package/dist/domain/interfaces/repositories/index.d.ts.map +1 -0
- package/dist/domain/interfaces/repositories/index.js +3 -0
- package/dist/domain/interfaces/repositories/index.js.map +1 -0
- package/dist/domain/interfaces/repositories/iqueue.repository.d.ts +75 -0
- package/dist/domain/interfaces/repositories/iqueue.repository.d.ts.map +1 -0
- package/dist/domain/interfaces/repositories/iqueue.repository.js +3 -0
- package/dist/domain/interfaces/repositories/iqueue.repository.js.map +1 -0
- package/dist/domain/interfaces/services/idownload.service.d.ts +28 -0
- package/dist/domain/interfaces/services/idownload.service.d.ts.map +1 -0
- package/dist/domain/interfaces/services/idownload.service.js +3 -0
- package/dist/domain/interfaces/services/idownload.service.js.map +1 -0
- package/dist/domain/interfaces/services/iqueue.service.d.ts +35 -0
- package/dist/domain/interfaces/services/iqueue.service.d.ts.map +1 -0
- package/dist/domain/interfaces/services/iqueue.service.js +3 -0
- package/dist/domain/interfaces/services/iqueue.service.js.map +1 -0
- package/dist/domain/services/path-resolver.service.d.ts +94 -0
- package/dist/domain/services/path-resolver.service.d.ts.map +1 -0
- package/dist/domain/services/path-resolver.service.js +332 -0
- package/dist/domain/services/path-resolver.service.js.map +1 -0
- package/dist/domain/validators/index.d.ts +4 -0
- package/dist/domain/validators/index.d.ts.map +1 -0
- package/dist/domain/validators/index.js +10 -0
- package/dist/domain/validators/index.js.map +1 -0
- package/dist/domain/validators/message.validator.d.ts +20 -0
- package/dist/domain/validators/message.validator.d.ts.map +1 -0
- package/dist/domain/validators/message.validator.js +31 -0
- package/dist/domain/validators/message.validator.js.map +1 -0
- package/dist/domain/validators/path.validator.d.ts +44 -0
- package/dist/domain/validators/path.validator.d.ts.map +1 -0
- package/dist/domain/validators/path.validator.js +156 -0
- package/dist/domain/validators/path.validator.js.map +1 -0
- package/dist/domain/validators/url.validator.d.ts +19 -0
- package/dist/domain/validators/url.validator.d.ts.map +1 -0
- package/dist/domain/validators/url.validator.js +46 -0
- package/dist/domain/validators/url.validator.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/filesystem.adapter.d.ts +35 -0
- package/dist/infrastructure/adapters/filesystem.adapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/filesystem.adapter.js +103 -0
- package/dist/infrastructure/adapters/filesystem.adapter.js.map +1 -0
- package/dist/infrastructure/adapters/http.adapter.d.ts +15 -0
- package/dist/infrastructure/adapters/http.adapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/http.adapter.js +80 -0
- package/dist/infrastructure/adapters/http.adapter.js.map +1 -0
- package/dist/infrastructure/adapters/index.d.ts +4 -0
- package/dist/infrastructure/adapters/index.d.ts.map +1 -0
- package/dist/infrastructure/adapters/index.js +10 -0
- package/dist/infrastructure/adapters/index.js.map +1 -0
- package/dist/infrastructure/adapters/pgmq.adapter.d.ts +29 -0
- package/dist/infrastructure/adapters/pgmq.adapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/pgmq.adapter.js +84 -0
- package/dist/infrastructure/adapters/pgmq.adapter.js.map +1 -0
- package/dist/infrastructure/adapters/supabase.adapter.d.ts +79 -0
- package/dist/infrastructure/adapters/supabase.adapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/supabase.adapter.js +97 -0
- package/dist/infrastructure/adapters/supabase.adapter.js.map +1 -0
- package/dist/infrastructure/database/supabase.client.d.ts +20 -0
- package/dist/infrastructure/database/supabase.client.d.ts.map +1 -0
- package/dist/infrastructure/database/supabase.client.js +36 -0
- package/dist/infrastructure/database/supabase.client.js.map +1 -0
- package/dist/infrastructure/di/container.d.ts +18 -0
- package/dist/infrastructure/di/container.d.ts.map +1 -0
- package/dist/infrastructure/di/container.js +103 -0
- package/dist/infrastructure/di/container.js.map +1 -0
- package/dist/infrastructure/repositories/cli-instance.repository.d.ts +64 -0
- package/dist/infrastructure/repositories/cli-instance.repository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/cli-instance.repository.js +154 -0
- package/dist/infrastructure/repositories/cli-instance.repository.js.map +1 -0
- package/dist/infrastructure/repositories/config.repository.d.ts +52 -0
- package/dist/infrastructure/repositories/config.repository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/config.repository.js +130 -0
- package/dist/infrastructure/repositories/config.repository.js.map +1 -0
- package/dist/infrastructure/repositories/index.d.ts +4 -0
- package/dist/infrastructure/repositories/index.d.ts.map +1 -0
- package/dist/infrastructure/repositories/index.js +10 -0
- package/dist/infrastructure/repositories/index.js.map +1 -0
- package/dist/infrastructure/repositories/log.repository.d.ts +44 -0
- package/dist/infrastructure/repositories/log.repository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/log.repository.js +108 -0
- package/dist/infrastructure/repositories/log.repository.js.map +1 -0
- package/dist/infrastructure/repositories/message.repository.d.ts +51 -0
- package/dist/infrastructure/repositories/message.repository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/message.repository.js +161 -0
- package/dist/infrastructure/repositories/message.repository.js.map +1 -0
- package/dist/infrastructure/repositories/queue.repository.d.ts +69 -0
- package/dist/infrastructure/repositories/queue.repository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/queue.repository.js +130 -0
- package/dist/infrastructure/repositories/queue.repository.js.map +1 -0
- package/dist/infrastructure/utils/connection-health.util.d.ts +23 -0
- package/dist/infrastructure/utils/connection-health.util.d.ts.map +1 -0
- package/dist/infrastructure/utils/connection-health.util.js +64 -0
- package/dist/infrastructure/utils/connection-health.util.js.map +1 -0
- package/package.json +105 -0
- package/pm2.config.js +104 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.SupabaseAdapter = void 0;
|
|
13
|
+
const supabase_js_1 = require("@supabase/supabase-js");
|
|
14
|
+
const tsyringe_1 = require("tsyringe");
|
|
15
|
+
/**
|
|
16
|
+
* Supabase Adapter
|
|
17
|
+
* Wraps Supabase client and provides abstraction for database operations
|
|
18
|
+
*/
|
|
19
|
+
let SupabaseAdapter = class SupabaseAdapter {
|
|
20
|
+
client;
|
|
21
|
+
constructor(client) {
|
|
22
|
+
this.client = client;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Gets the Supabase client instance
|
|
26
|
+
* @returns SupabaseClient
|
|
27
|
+
*/
|
|
28
|
+
getClient() {
|
|
29
|
+
return this.client;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Calls a Supabase RPC function
|
|
33
|
+
* @param functionName - Name of the RPC function
|
|
34
|
+
* @param params - Function parameters
|
|
35
|
+
* @returns Function result
|
|
36
|
+
*/
|
|
37
|
+
async rpc(functionName, params) {
|
|
38
|
+
return (await this.client.rpc(functionName, params));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Executes a raw SQL query (not implemented - use RPC instead)
|
|
42
|
+
* @param _query - SQL query to execute
|
|
43
|
+
* @param _params - Query parameters
|
|
44
|
+
* @returns Query result
|
|
45
|
+
*/
|
|
46
|
+
async executeQuery(_query, _params) {
|
|
47
|
+
throw new Error('executeQuery not implemented. Use RPC functions instead.');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Inserts data into a table
|
|
51
|
+
* @param tableName - Name of the table
|
|
52
|
+
* @param data - Data to insert
|
|
53
|
+
* @returns Insert result
|
|
54
|
+
*/
|
|
55
|
+
async insert(tableName, data) {
|
|
56
|
+
return await this.client.from(tableName).insert(data).select();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Updates data in a table
|
|
60
|
+
* @param tableName - Name of the table
|
|
61
|
+
* @param data - Data to update
|
|
62
|
+
* @param filter - Filter to apply
|
|
63
|
+
* @returns Update result
|
|
64
|
+
*/
|
|
65
|
+
async update(tableName, data, filter) {
|
|
66
|
+
return await this.client.from(tableName).update(data).eq(filter.column, filter.value).select();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Selects data from a table
|
|
70
|
+
* @param tableName - Name of the table
|
|
71
|
+
* @param columns - Columns to select
|
|
72
|
+
* @param filter - Optional filter to apply
|
|
73
|
+
* @returns Select result
|
|
74
|
+
*/
|
|
75
|
+
async select(tableName, columns = '*', filter) {
|
|
76
|
+
let query = this.client.from(tableName).select(columns);
|
|
77
|
+
if (filter) {
|
|
78
|
+
query = query.eq(filter.column, filter.value);
|
|
79
|
+
}
|
|
80
|
+
return (await query);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Deletes data from a table
|
|
84
|
+
* @param tableName - Name of the table
|
|
85
|
+
* @param filter - Filter to apply
|
|
86
|
+
* @returns Delete result
|
|
87
|
+
*/
|
|
88
|
+
async delete(tableName, filter) {
|
|
89
|
+
return await this.client.from(tableName).delete().eq(filter.column, filter.value);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
exports.SupabaseAdapter = SupabaseAdapter;
|
|
93
|
+
exports.SupabaseAdapter = SupabaseAdapter = __decorate([
|
|
94
|
+
(0, tsyringe_1.injectable)(),
|
|
95
|
+
__metadata("design:paramtypes", [supabase_js_1.SupabaseClient])
|
|
96
|
+
], SupabaseAdapter);
|
|
97
|
+
//# sourceMappingURL=supabase.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.adapter.js","sourceRoot":"","sources":["../../../src/infrastructure/adapters/supabase.adapter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uDAAuD;AAEvD,uCAAsC;AAUtC;;;GAGG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAe;IACN;IAApB,YAAoB,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAE9C;;;OAGG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAU,YAAoB,EAAE,MAA4B;QACnE,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,CAAM,CAAC;IAC5D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAU,MAAc,EAAE,OAAe;QACzD,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAU,SAAiB,EAAE,IAAS;QAChD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;IACjE,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,IAAS,EACT,MAAmB;QAEnB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;IACjG,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CACV,SAAiB,EACjB,UAAkB,GAAG,EACrB,MAAoB;QAEpB,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAExD,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,CAAC,MAAM,KAAK,CAAqC,CAAC;IAC3D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,MAAmB;QACjD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC;CACF,CAAA;AAtFY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,qBAAU,GAAE;qCAEiB,4BAAc;GAD/B,eAAe,CAsF3B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { SupabaseClient } from '@supabase/supabase-js';
|
|
2
|
+
/**
|
|
3
|
+
* Supabase Client Factory
|
|
4
|
+
* Creates and configures Supabase client instance
|
|
5
|
+
*/
|
|
6
|
+
export declare class SupabaseClientFactory {
|
|
7
|
+
private static instance;
|
|
8
|
+
/**
|
|
9
|
+
* Gets or creates a Supabase client instance
|
|
10
|
+
* @param url - Supabase URL
|
|
11
|
+
* @param serviceRoleKey - Service role key for authentication
|
|
12
|
+
* @returns SupabaseClient instance
|
|
13
|
+
*/
|
|
14
|
+
static getClient(url: string, serviceRoleKey: string): SupabaseClient;
|
|
15
|
+
/**
|
|
16
|
+
* Resets the client instance (useful for testing)
|
|
17
|
+
*/
|
|
18
|
+
static reset(): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=supabase.client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.client.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/database/supabase.client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAErE;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA+B;IAEtD;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,cAAc;IAYrE;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;CAGrB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SupabaseClientFactory = void 0;
|
|
4
|
+
const supabase_js_1 = require("@supabase/supabase-js");
|
|
5
|
+
/**
|
|
6
|
+
* Supabase Client Factory
|
|
7
|
+
* Creates and configures Supabase client instance
|
|
8
|
+
*/
|
|
9
|
+
class SupabaseClientFactory {
|
|
10
|
+
static instance = null;
|
|
11
|
+
/**
|
|
12
|
+
* Gets or creates a Supabase client instance
|
|
13
|
+
* @param url - Supabase URL
|
|
14
|
+
* @param serviceRoleKey - Service role key for authentication
|
|
15
|
+
* @returns SupabaseClient instance
|
|
16
|
+
*/
|
|
17
|
+
static getClient(url, serviceRoleKey) {
|
|
18
|
+
if (!this.instance) {
|
|
19
|
+
this.instance = (0, supabase_js_1.createClient)(url, serviceRoleKey, {
|
|
20
|
+
auth: {
|
|
21
|
+
autoRefreshToken: false,
|
|
22
|
+
persistSession: false,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return this.instance;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resets the client instance (useful for testing)
|
|
30
|
+
*/
|
|
31
|
+
static reset() {
|
|
32
|
+
this.instance = null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.SupabaseClientFactory = SupabaseClientFactory;
|
|
36
|
+
//# sourceMappingURL=supabase.client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supabase.client.js","sourceRoot":"","sources":["../../../src/infrastructure/database/supabase.client.ts"],"names":[],"mappings":";;;AAAA,uDAAqE;AAErE;;;GAGG;AACH,MAAa,qBAAqB;IACxB,MAAM,CAAC,QAAQ,GAA0B,IAAI,CAAC;IAEtD;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,GAAW,EAAE,cAAsB;QAClD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAA,0BAAY,EAAC,GAAG,EAAE,cAAc,EAAE;gBAChD,IAAI,EAAE;oBACJ,gBAAgB,EAAE,KAAK;oBACvB,cAAc,EAAE,KAAK;iBACtB;aACF,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACV,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;;AA1BH,sDA2BC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { container } from 'tsyringe';
|
|
3
|
+
/**
|
|
4
|
+
* Dependency Injection Container Setup
|
|
5
|
+
* Configures all dependencies for the application
|
|
6
|
+
*/
|
|
7
|
+
export declare class DIContainer {
|
|
8
|
+
/**
|
|
9
|
+
* Initializes and configures the DI container
|
|
10
|
+
* @returns Configured container
|
|
11
|
+
*/
|
|
12
|
+
static setup(): Promise<typeof container>;
|
|
13
|
+
/**
|
|
14
|
+
* Resets the container (useful for testing)
|
|
15
|
+
*/
|
|
16
|
+
static reset(): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAqBrC;;;GAGG;AACH,qBAAa,WAAW;IACtB;;;OAGG;WACU,KAAK,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC;IAoF/C;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;CAIrB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DIContainer = void 0;
|
|
4
|
+
require("reflect-metadata");
|
|
5
|
+
const tsyringe_1 = require("tsyringe");
|
|
6
|
+
const supabase_client_1 = require("../database/supabase.client");
|
|
7
|
+
const supabase_adapter_1 = require("../adapters/supabase.adapter");
|
|
8
|
+
const pgmq_adapter_1 = require("../adapters/pgmq.adapter");
|
|
9
|
+
const http_adapter_1 = require("../adapters/http.adapter");
|
|
10
|
+
const filesystem_adapter_1 = require("../adapters/filesystem.adapter");
|
|
11
|
+
const message_repository_1 = require("../repositories/message.repository");
|
|
12
|
+
const log_repository_1 = require("../repositories/log.repository");
|
|
13
|
+
const queue_repository_1 = require("../repositories/queue.repository");
|
|
14
|
+
const config_repository_1 = require("../repositories/config.repository");
|
|
15
|
+
const url_validator_1 = require("../../domain/validators/url.validator");
|
|
16
|
+
const path_validator_1 = require("../../domain/validators/path.validator");
|
|
17
|
+
const message_validator_1 = require("../../domain/validators/message.validator");
|
|
18
|
+
const config_manager_1 = require("../../application/config/config.manager");
|
|
19
|
+
const download_service_1 = require("../../application/services/download.service");
|
|
20
|
+
const queue_service_1 = require("../../application/services/queue.service");
|
|
21
|
+
const application_service_1 = require("../../application/services/application.service");
|
|
22
|
+
const file_naming_service_1 = require("../../application/services/file-naming.service");
|
|
23
|
+
const connection_health_util_1 = require("../utils/connection-health.util");
|
|
24
|
+
/**
|
|
25
|
+
* Dependency Injection Container Setup
|
|
26
|
+
* Configures all dependencies for the application
|
|
27
|
+
*/
|
|
28
|
+
class DIContainer {
|
|
29
|
+
/**
|
|
30
|
+
* Initializes and configures the DI container
|
|
31
|
+
* @returns Configured container
|
|
32
|
+
*/
|
|
33
|
+
static async setup() {
|
|
34
|
+
// Validate required environment variables
|
|
35
|
+
if (!process.env.SUPABASE_URL || !process.env.SUPABASE_SERVICE_ROLE_KEY) {
|
|
36
|
+
throw new Error('Missing required environment variables: SUPABASE_URL and/or SUPABASE_SERVICE_ROLE_KEY');
|
|
37
|
+
}
|
|
38
|
+
// Register Supabase client first (needed for ConfigRepository)
|
|
39
|
+
const tempClient = supabase_client_1.SupabaseClientFactory.getClient(process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_ROLE_KEY);
|
|
40
|
+
tsyringe_1.container.register('SupabaseClient', { useValue: tempClient });
|
|
41
|
+
// Validate database connection before proceeding (with shorter timeout for tests)
|
|
42
|
+
console.log('[DIContainer] Validating database connection...');
|
|
43
|
+
const isHealthy = await connection_health_util_1.ConnectionHealthUtil.waitForHealthy(tempClient, 2, 500);
|
|
44
|
+
if (!isHealthy) {
|
|
45
|
+
console.warn('[DIContainer] Database connection check failed, proceeding anyway...');
|
|
46
|
+
// Don't throw in test environment - let tests fail naturally if DB is down
|
|
47
|
+
if (process.env.NODE_ENV === 'production') {
|
|
48
|
+
throw new Error('Failed to connect to Supabase. Please ensure:\n' +
|
|
49
|
+
'1. Supabase is running (run: supabase start)\n' +
|
|
50
|
+
'2. SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY are correct\n' +
|
|
51
|
+
'3. Database migrations are applied');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log('[DIContainer] Database connection validated successfully');
|
|
56
|
+
}
|
|
57
|
+
// Register SupabaseAdapter (needed for ConfigRepository)
|
|
58
|
+
tsyringe_1.container.register(supabase_adapter_1.SupabaseAdapter, {
|
|
59
|
+
useFactory: (c) => {
|
|
60
|
+
const client = c.resolve('SupabaseClient');
|
|
61
|
+
return new supabase_adapter_1.SupabaseAdapter(client);
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
// Register ConfigRepository
|
|
65
|
+
tsyringe_1.container.registerSingleton(config_repository_1.ConfigRepository, config_repository_1.ConfigRepository);
|
|
66
|
+
// Load configuration from database
|
|
67
|
+
const configRepository = tsyringe_1.container.resolve(config_repository_1.ConfigRepository);
|
|
68
|
+
const configManager = new config_manager_1.ConfigManager(configRepository);
|
|
69
|
+
const config = await configManager.load();
|
|
70
|
+
// Register configuration
|
|
71
|
+
tsyringe_1.container.register('AppConfig', { useValue: config });
|
|
72
|
+
// Register Supabase client
|
|
73
|
+
const supabaseClient = supabase_client_1.SupabaseClientFactory.getClient(config.supabase.url, config.supabase.serviceRoleKey);
|
|
74
|
+
tsyringe_1.container.register('SupabaseClient', { useValue: supabaseClient });
|
|
75
|
+
// Adapters already registered above
|
|
76
|
+
tsyringe_1.container.registerSingleton(pgmq_adapter_1.PgmqAdapter, pgmq_adapter_1.PgmqAdapter);
|
|
77
|
+
tsyringe_1.container.registerSingleton(http_adapter_1.HttpAdapter, http_adapter_1.HttpAdapter);
|
|
78
|
+
tsyringe_1.container.registerSingleton(filesystem_adapter_1.FileSystemAdapter, filesystem_adapter_1.FileSystemAdapter);
|
|
79
|
+
// Register validators
|
|
80
|
+
tsyringe_1.container.registerSingleton(url_validator_1.UrlValidator, url_validator_1.UrlValidator);
|
|
81
|
+
tsyringe_1.container.registerSingleton(path_validator_1.PathValidator, path_validator_1.PathValidator);
|
|
82
|
+
tsyringe_1.container.registerSingleton(message_validator_1.MessageValidator, message_validator_1.MessageValidator);
|
|
83
|
+
// Register repositories (ConfigRepository already registered above)
|
|
84
|
+
tsyringe_1.container.registerSingleton(message_repository_1.MessageRepository, message_repository_1.MessageRepository);
|
|
85
|
+
tsyringe_1.container.registerSingleton(log_repository_1.LogRepository, log_repository_1.LogRepository);
|
|
86
|
+
tsyringe_1.container.registerSingleton(queue_repository_1.QueueRepository, queue_repository_1.QueueRepository);
|
|
87
|
+
// Register services
|
|
88
|
+
tsyringe_1.container.registerSingleton(file_naming_service_1.FileNamingService, file_naming_service_1.FileNamingService);
|
|
89
|
+
tsyringe_1.container.registerSingleton(download_service_1.DownloadService, download_service_1.DownloadService);
|
|
90
|
+
tsyringe_1.container.registerSingleton(queue_service_1.QueueService, queue_service_1.QueueService);
|
|
91
|
+
tsyringe_1.container.registerSingleton(application_service_1.ApplicationService, application_service_1.ApplicationService);
|
|
92
|
+
return tsyringe_1.container;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Resets the container (useful for testing)
|
|
96
|
+
*/
|
|
97
|
+
static reset() {
|
|
98
|
+
tsyringe_1.container.clearInstances();
|
|
99
|
+
supabase_client_1.SupabaseClientFactory.reset();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.DIContainer = DIContainer;
|
|
103
|
+
//# sourceMappingURL=container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../src/infrastructure/di/container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { SupabaseAdapter } from '../../infrastructure/adapters/supabase.adapter';
|
|
2
|
+
import { CliInstanceEntity } from '../../domain/entities/cli-instance.entity';
|
|
3
|
+
/**
|
|
4
|
+
* CLI Instance Repository
|
|
5
|
+
* Manages CLI instance registration and tracking
|
|
6
|
+
*/
|
|
7
|
+
export declare class CliInstanceRepository {
|
|
8
|
+
private supabase;
|
|
9
|
+
constructor(supabase: SupabaseAdapter);
|
|
10
|
+
/**
|
|
11
|
+
* Get or create a CLI instance
|
|
12
|
+
* @param instanceInfo - Instance information from system
|
|
13
|
+
* @returns Instance ID
|
|
14
|
+
*/
|
|
15
|
+
getOrCreate(instanceInfo: {
|
|
16
|
+
instanceName: string;
|
|
17
|
+
hostname: string;
|
|
18
|
+
platform: string;
|
|
19
|
+
platformVersion: string;
|
|
20
|
+
nodeVersion: string;
|
|
21
|
+
appVersion: string;
|
|
22
|
+
downloadDefaultPath: string;
|
|
23
|
+
downloadFallbackPath: string | null;
|
|
24
|
+
}): Promise<string>;
|
|
25
|
+
/**
|
|
26
|
+
* Update heartbeat for an instance
|
|
27
|
+
* @param instanceId - Instance ID
|
|
28
|
+
*/
|
|
29
|
+
updateHeartbeat(instanceId: string): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Record job completion for an instance
|
|
32
|
+
* @param instanceId - Instance ID
|
|
33
|
+
* @param success - Whether job succeeded
|
|
34
|
+
* @param bytesDownloaded - Bytes downloaded (if successful)
|
|
35
|
+
*/
|
|
36
|
+
recordJobCompletion(instanceId: string, success: boolean, bytesDownloaded?: number): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Get instance by ID
|
|
39
|
+
* @param instanceId - Instance ID
|
|
40
|
+
* @returns Instance entity or null
|
|
41
|
+
*/
|
|
42
|
+
getById(instanceId: string): Promise<CliInstanceEntity | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Get all active instances
|
|
45
|
+
* @returns Array of instance entities
|
|
46
|
+
*/
|
|
47
|
+
getAllActive(): Promise<CliInstanceEntity[]>;
|
|
48
|
+
/**
|
|
49
|
+
* Get instance health status
|
|
50
|
+
* @returns Array of instance health info
|
|
51
|
+
*/
|
|
52
|
+
getHealthStatus(): Promise<any[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Update instance status
|
|
55
|
+
* @param instanceId - Instance ID
|
|
56
|
+
* @param status - New status
|
|
57
|
+
*/
|
|
58
|
+
updateStatus(instanceId: string, status: 'active' | 'inactive' | 'maintenance'): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Map database row to entity
|
|
61
|
+
*/
|
|
62
|
+
private mapToEntity;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=cli-instance.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-instance.repository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/cli-instance.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E;;;GAGG;AACH,qBACa,qBAAqB;IACK,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEtE;;;;OAIG;IACG,WAAW,CAAC,YAAY,EAAE;QAC9B,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;KACrC,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBnB;;;OAGG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxD;;;;;OAKG;IACG,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,eAAe,GAAE,MAAU,GAC1B,OAAO,CAAC,IAAI,CAAC;IAYhB;;;;OAIG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAgBpE;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAelD;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAavC;;;;OAIG;IACG,YAAY,CAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,QAAQ,GAAG,UAAU,GAAG,aAAa,GAC5C,OAAO,CAAC,IAAI,CAAC;IAYhB;;OAEG;IACH,OAAO,CAAC,WAAW;CAqBpB"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.CliInstanceRepository = void 0;
|
|
16
|
+
const tsyringe_1 = require("tsyringe");
|
|
17
|
+
const supabase_adapter_1 = require("../../infrastructure/adapters/supabase.adapter");
|
|
18
|
+
const cli_instance_entity_1 = require("../../domain/entities/cli-instance.entity");
|
|
19
|
+
/**
|
|
20
|
+
* CLI Instance Repository
|
|
21
|
+
* Manages CLI instance registration and tracking
|
|
22
|
+
*/
|
|
23
|
+
let CliInstanceRepository = class CliInstanceRepository {
|
|
24
|
+
supabase;
|
|
25
|
+
constructor(supabase) {
|
|
26
|
+
this.supabase = supabase;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get or create a CLI instance
|
|
30
|
+
* @param instanceInfo - Instance information from system
|
|
31
|
+
* @returns Instance ID
|
|
32
|
+
*/
|
|
33
|
+
async getOrCreate(instanceInfo) {
|
|
34
|
+
const { data, error } = await this.supabase.rpc('get_or_create_cli_instance', {
|
|
35
|
+
p_instance_name: instanceInfo.instanceName,
|
|
36
|
+
p_hostname: instanceInfo.hostname,
|
|
37
|
+
p_platform: instanceInfo.platform,
|
|
38
|
+
p_platform_version: instanceInfo.platformVersion,
|
|
39
|
+
p_node_version: instanceInfo.nodeVersion,
|
|
40
|
+
p_app_version: instanceInfo.appVersion,
|
|
41
|
+
p_download_default_path: instanceInfo.downloadDefaultPath,
|
|
42
|
+
p_download_fallback_path: instanceInfo.downloadFallbackPath,
|
|
43
|
+
});
|
|
44
|
+
if (error) {
|
|
45
|
+
throw new Error(`Failed to get or create CLI instance: ${error.message}`);
|
|
46
|
+
}
|
|
47
|
+
return data;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Update heartbeat for an instance
|
|
51
|
+
* @param instanceId - Instance ID
|
|
52
|
+
*/
|
|
53
|
+
async updateHeartbeat(instanceId) {
|
|
54
|
+
const { error } = await this.supabase.rpc('update_instance_heartbeat', {
|
|
55
|
+
p_instance_id: instanceId,
|
|
56
|
+
});
|
|
57
|
+
if (error) {
|
|
58
|
+
throw new Error(`Failed to update heartbeat: ${error.message}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Record job completion for an instance
|
|
63
|
+
* @param instanceId - Instance ID
|
|
64
|
+
* @param success - Whether job succeeded
|
|
65
|
+
* @param bytesDownloaded - Bytes downloaded (if successful)
|
|
66
|
+
*/
|
|
67
|
+
async recordJobCompletion(instanceId, success, bytesDownloaded = 0) {
|
|
68
|
+
const { error } = await this.supabase.rpc('record_instance_job_completion', {
|
|
69
|
+
p_instance_id: instanceId,
|
|
70
|
+
p_success: success,
|
|
71
|
+
p_bytes_downloaded: bytesDownloaded,
|
|
72
|
+
});
|
|
73
|
+
if (error) {
|
|
74
|
+
throw new Error(`Failed to record job completion: ${error.message}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get instance by ID
|
|
79
|
+
* @param instanceId - Instance ID
|
|
80
|
+
* @returns Instance entity or null
|
|
81
|
+
*/
|
|
82
|
+
async getById(instanceId) {
|
|
83
|
+
const { data, error } = await this.supabase
|
|
84
|
+
.getClient()
|
|
85
|
+
.from('cli_instances')
|
|
86
|
+
.select('*')
|
|
87
|
+
.eq('id', instanceId)
|
|
88
|
+
.single();
|
|
89
|
+
if (error) {
|
|
90
|
+
if (error.code === 'PGRST116')
|
|
91
|
+
return null; // Not found
|
|
92
|
+
throw new Error(`Failed to get instance: ${error.message}`);
|
|
93
|
+
}
|
|
94
|
+
return this.mapToEntity(data);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get all active instances
|
|
98
|
+
* @returns Array of instance entities
|
|
99
|
+
*/
|
|
100
|
+
async getAllActive() {
|
|
101
|
+
const { data, error } = await this.supabase
|
|
102
|
+
.getClient()
|
|
103
|
+
.from('cli_instances')
|
|
104
|
+
.select('*')
|
|
105
|
+
.eq('status', 'active')
|
|
106
|
+
.order('last_heartbeat_at', { ascending: false });
|
|
107
|
+
if (error) {
|
|
108
|
+
throw new Error(`Failed to get active instances: ${error.message}`);
|
|
109
|
+
}
|
|
110
|
+
return (data || []).map((row) => this.mapToEntity(row));
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Get instance health status
|
|
114
|
+
* @returns Array of instance health info
|
|
115
|
+
*/
|
|
116
|
+
async getHealthStatus() {
|
|
117
|
+
const { data, error } = await this.supabase
|
|
118
|
+
.getClient()
|
|
119
|
+
.from('cli_instances_health')
|
|
120
|
+
.select('*');
|
|
121
|
+
if (error) {
|
|
122
|
+
throw new Error(`Failed to get health status: ${error.message}`);
|
|
123
|
+
}
|
|
124
|
+
return data || [];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Update instance status
|
|
128
|
+
* @param instanceId - Instance ID
|
|
129
|
+
* @param status - New status
|
|
130
|
+
*/
|
|
131
|
+
async updateStatus(instanceId, status) {
|
|
132
|
+
const { error } = await this.supabase
|
|
133
|
+
.getClient()
|
|
134
|
+
.from('cli_instances')
|
|
135
|
+
.update({ status, updated_at: new Date().toISOString() })
|
|
136
|
+
.eq('id', instanceId);
|
|
137
|
+
if (error) {
|
|
138
|
+
throw new Error(`Failed to update instance status: ${error.message}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Map database row to entity
|
|
143
|
+
*/
|
|
144
|
+
mapToEntity(row) {
|
|
145
|
+
return new cli_instance_entity_1.CliInstanceEntity(row.id, row.instance_name, row.hostname, row.platform, row.platform_version, row.node_version, row.app_version, row.download_default_path, row.download_fallback_path, row.status, row.last_heartbeat_at ? new Date(row.last_heartbeat_at) : null, row.last_job_at ? new Date(row.last_job_at) : null, row.total_jobs_processed || 0, row.total_jobs_failed || 0, row.total_bytes_downloaded || 0, new Date(row.created_at), new Date(row.updated_at));
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
exports.CliInstanceRepository = CliInstanceRepository;
|
|
149
|
+
exports.CliInstanceRepository = CliInstanceRepository = __decorate([
|
|
150
|
+
(0, tsyringe_1.injectable)(),
|
|
151
|
+
__param(0, (0, tsyringe_1.inject)(supabase_adapter_1.SupabaseAdapter)),
|
|
152
|
+
__metadata("design:paramtypes", [supabase_adapter_1.SupabaseAdapter])
|
|
153
|
+
], CliInstanceRepository);
|
|
154
|
+
//# sourceMappingURL=cli-instance.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-instance.repository.js","sourceRoot":"","sources":["../../../src/infrastructure/repositories/cli-instance.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { SupabaseAdapter } from '../../infrastructure/adapters/supabase.adapter';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration entry from database
|
|
4
|
+
*/
|
|
5
|
+
export interface ConfigEntry {
|
|
6
|
+
id: string;
|
|
7
|
+
config_key: string;
|
|
8
|
+
config_value: string;
|
|
9
|
+
config_type: 'string' | 'number' | 'boolean';
|
|
10
|
+
description?: string;
|
|
11
|
+
is_sensitive: boolean;
|
|
12
|
+
created_at: Date;
|
|
13
|
+
updated_at: Date;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Parsed configuration value
|
|
17
|
+
*/
|
|
18
|
+
export type ConfigValue = string | number | boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Configuration Repository
|
|
21
|
+
* Manages application configuration stored in the database
|
|
22
|
+
*/
|
|
23
|
+
export declare class ConfigRepository {
|
|
24
|
+
private adapter;
|
|
25
|
+
private readonly TABLE_NAME;
|
|
26
|
+
constructor(adapter: SupabaseAdapter);
|
|
27
|
+
/**
|
|
28
|
+
* Get a single configuration value by key
|
|
29
|
+
*/
|
|
30
|
+
get(key: string): Promise<ConfigValue | null>;
|
|
31
|
+
/**
|
|
32
|
+
* Get all configuration entries
|
|
33
|
+
*/
|
|
34
|
+
getAll(): Promise<Record<string, ConfigValue>>;
|
|
35
|
+
/**
|
|
36
|
+
* Get configuration entries by prefix (e.g., 'queue.' returns all queue configs)
|
|
37
|
+
*/
|
|
38
|
+
getByPrefix(prefix: string): Promise<Record<string, ConfigValue>>;
|
|
39
|
+
/**
|
|
40
|
+
* Set a configuration value
|
|
41
|
+
*/
|
|
42
|
+
set(key: string, value: ConfigValue): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Delete a configuration entry
|
|
45
|
+
*/
|
|
46
|
+
delete(key: string): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Parse configuration value based on its type
|
|
49
|
+
*/
|
|
50
|
+
private parseValue;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=config.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.repository.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/repositories/config.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD;;;GAGG;AACH,qBACa,gBAAgB;IAGU,OAAO,CAAC,OAAO;IAFpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;gBAEE,OAAO,EAAE,eAAe;IAErE;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAcnD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IA6BpD;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAsBvE;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BzD;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxC;;OAEG;IACH,OAAO,CAAC,UAAU;CAWnB"}
|