@cheqd/studio 3.12.1-develop.1 → 3.13.0-develop.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +17 -1
- package/dist/app.js.map +1 -1
- package/dist/controllers/admin/subscriptions.d.ts.map +1 -1
- package/dist/controllers/admin/subscriptions.js.map +1 -1
- package/dist/controllers/api/accreditation.js.map +1 -1
- package/dist/controllers/api/providers.controller.d.ts +152 -0
- package/dist/controllers/api/providers.controller.d.ts.map +1 -0
- package/dist/controllers/api/providers.controller.js +348 -0
- package/dist/controllers/api/providers.controller.js.map +1 -0
- package/dist/database/entities/credential-provider.entity.d.ts +16 -0
- package/dist/database/entities/credential-provider.entity.d.ts.map +1 -0
- package/dist/database/entities/credential-provider.entity.js +109 -0
- package/dist/database/entities/credential-provider.entity.js.map +1 -0
- package/dist/database/entities/provider-configuration.entity.d.ts +23 -0
- package/dist/database/entities/provider-configuration.entity.d.ts.map +1 -0
- package/dist/database/entities/provider-configuration.entity.js +139 -0
- package/dist/database/entities/provider-configuration.entity.js.map +1 -0
- package/dist/database/migrations/1758011998054-studio-migrations.d.ts +7 -0
- package/dist/database/migrations/1758011998054-studio-migrations.d.ts.map +1 -0
- package/dist/database/migrations/1758011998054-studio-migrations.js +18 -0
- package/dist/database/migrations/1758011998054-studio-migrations.js.map +1 -0
- package/dist/database/seeds/providers.seed.d.ts +2 -0
- package/dist/database/seeds/providers.seed.d.ts.map +1 -0
- package/dist/database/seeds/providers.seed.js +89 -0
- package/dist/database/seeds/providers.seed.js.map +1 -0
- package/dist/database/types/types.d.ts.map +1 -1
- package/dist/database/types/types.js +6 -0
- package/dist/database/types/types.js.map +1 -1
- package/dist/middleware/auth/routes/api/accreditation-auth.js.map +1 -1
- package/dist/middleware/auth/routes/api/provider-auth.d.ts +5 -0
- package/dist/middleware/auth/routes/api/provider-auth.d.ts.map +1 -0
- package/dist/middleware/auth/routes/api/provider-auth.js +27 -0
- package/dist/middleware/auth/routes/api/provider-auth.js.map +1 -0
- package/dist/middleware/authentication.d.ts.map +1 -1
- package/dist/middleware/authentication.js +2 -0
- package/dist/middleware/authentication.js.map +1 -1
- package/dist/services/api/base-provider.service.d.ts +22 -0
- package/dist/services/api/base-provider.service.d.ts.map +1 -0
- package/dist/services/api/base-provider.service.js +60 -0
- package/dist/services/api/base-provider.service.js.map +1 -0
- package/dist/services/api/dock-api.service.d.ts +16 -0
- package/dist/services/api/dock-api.service.d.ts.map +1 -0
- package/dist/services/api/dock-api.service.js +93 -0
- package/dist/services/api/dock-api.service.js.map +1 -0
- package/dist/services/api/hovi-api.service.d.ts +16 -0
- package/dist/services/api/hovi-api.service.d.ts.map +1 -0
- package/dist/services/api/hovi-api.service.js +99 -0
- package/dist/services/api/hovi-api.service.js.map +1 -0
- package/dist/services/api/paradym-api.service.d.ts +16 -0
- package/dist/services/api/paradym-api.service.d.ts.map +1 -0
- package/dist/services/api/paradym-api.service.js +99 -0
- package/dist/services/api/paradym-api.service.js.map +1 -0
- package/dist/services/api/provider.factory.d.ts +9 -0
- package/dist/services/api/provider.factory.d.ts.map +1 -0
- package/dist/services/api/provider.factory.js +41 -0
- package/dist/services/api/provider.factory.js.map +1 -0
- package/dist/services/api/provider.service.d.ts +25 -0
- package/dist/services/api/provider.service.d.ts.map +1 -0
- package/dist/services/api/provider.service.js +148 -0
- package/dist/services/api/provider.service.js.map +1 -0
- package/dist/services/api/studio-api.service.d.ts +18 -0
- package/dist/services/api/studio-api.service.d.ts.map +1 -0
- package/dist/services/api/studio-api.service.js +104 -0
- package/dist/services/api/studio-api.service.js.map +1 -0
- package/dist/services/connectors/resource.d.ts.map +1 -1
- package/dist/services/connectors/resource.js.map +1 -1
- package/dist/services/identity/postgres.js.map +1 -1
- package/dist/static/swagger-api.json +200 -0
- package/dist/types/provider.types.d.ts +30 -0
- package/dist/types/provider.types.d.ts.map +1 -0
- package/dist/types/provider.types.js +2 -0
- package/dist/types/provider.types.js.map +1 -0
- package/example.env +6 -0
- package/package.json +2 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import * as dotenv from 'dotenv';
|
|
2
|
+
import { BaseProviderService } from './base-provider.service.js';
|
|
3
|
+
dotenv.config();
|
|
4
|
+
export class HoviApiService extends BaseProviderService {
|
|
5
|
+
static instance = new HoviApiService();
|
|
6
|
+
constructor() {
|
|
7
|
+
super('HOVI_MASTER_API_KEY');
|
|
8
|
+
}
|
|
9
|
+
getProviderId() {
|
|
10
|
+
return 'hovi';
|
|
11
|
+
}
|
|
12
|
+
getDefaultApiUrl() {
|
|
13
|
+
return 'https://api.hovi.id';
|
|
14
|
+
}
|
|
15
|
+
extractAccountId(config) {
|
|
16
|
+
return config.defaultSettings?.tenantId || '';
|
|
17
|
+
}
|
|
18
|
+
getProviderSpecificSettings(account, apiKey) {
|
|
19
|
+
return {
|
|
20
|
+
tenantId: account.id,
|
|
21
|
+
tenantName: account.name,
|
|
22
|
+
hoviApiKeyId: apiKey.id,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async createAccount(customerId, customerName) {
|
|
26
|
+
const baseUrl = await this.getBaseUrl();
|
|
27
|
+
const response = await fetch(`${baseUrl}/tenants`, {
|
|
28
|
+
method: 'POST',
|
|
29
|
+
headers: {
|
|
30
|
+
'Content-Type': 'application/json',
|
|
31
|
+
Authorization: `Bearer ${this.masterApiKey}`,
|
|
32
|
+
},
|
|
33
|
+
body: JSON.stringify({
|
|
34
|
+
name: customerName || `Customer ${customerId}`,
|
|
35
|
+
description: `Tenant for customer ${customerId}`,
|
|
36
|
+
customerId: customerId,
|
|
37
|
+
}),
|
|
38
|
+
});
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
const error = await response.text();
|
|
41
|
+
throw new Error(`Failed to create HOVI tenant: ${response.status} ${error}`);
|
|
42
|
+
}
|
|
43
|
+
return await response.json();
|
|
44
|
+
}
|
|
45
|
+
async createApiKey(accountId, customerName) {
|
|
46
|
+
const baseUrl = await this.getBaseUrl();
|
|
47
|
+
const response = await fetch(`${baseUrl}/tenants/${accountId}/keys`, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: {
|
|
50
|
+
'Content-Type': 'application/json',
|
|
51
|
+
Authorization: `Bearer ${this.masterApiKey}`,
|
|
52
|
+
},
|
|
53
|
+
body: JSON.stringify({
|
|
54
|
+
name: `API Key for ${customerName || 'Customer'}`,
|
|
55
|
+
permissions: ['read', 'write'],
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const error = await response.text();
|
|
60
|
+
throw new Error(`Failed to create HOVI API key: ${response.status} ${error}`);
|
|
61
|
+
}
|
|
62
|
+
const hoviResponse = await response.json();
|
|
63
|
+
return {
|
|
64
|
+
id: hoviResponse.id,
|
|
65
|
+
key: hoviResponse.key,
|
|
66
|
+
name: hoviResponse.name,
|
|
67
|
+
permissions: hoviResponse.permissions,
|
|
68
|
+
createdAt: hoviResponse.createdAt,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async deleteAccount(accountId) {
|
|
72
|
+
const baseUrl = await this.getBaseUrl();
|
|
73
|
+
const response = await fetch(`${baseUrl}/tenants/${accountId}`, {
|
|
74
|
+
method: 'DELETE',
|
|
75
|
+
headers: {
|
|
76
|
+
Authorization: `Bearer ${this.masterApiKey}`,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
if (!response.ok && response.status !== 404) {
|
|
80
|
+
const error = await response.text();
|
|
81
|
+
throw new Error(`Failed to delete HOVI tenant: ${response.status} ${error}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async testConnection(apiKey, accountId, config) {
|
|
85
|
+
try {
|
|
86
|
+
const baseUrl = config ? this.getBaseUrlFromConfig(config) : await this.getBaseUrl();
|
|
87
|
+
const response = await fetch(`${baseUrl}/tenants/${accountId}`, {
|
|
88
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
89
|
+
});
|
|
90
|
+
return response.ok
|
|
91
|
+
? { success: true, message: 'HOVI connection successful' }
|
|
92
|
+
: { success: false, message: `HOVI API returned ${response.status}` };
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
return { success: false, message: `HOVI connection failed: ${error.message}` };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=hovi-api.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hovi-api.service.js","sourceRoot":"","sources":["../../../src/services/api/hovi-api.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseProviderService } from './base-provider.service.js';
|
|
2
|
+
import { ConnectionTestResult, ProviderAccountResponse, ProviderApiKeyResponse } from '../../types/provider.types.js';
|
|
3
|
+
import { ProviderConfigurationEntity } from '../../database/entities/provider-configuration.entity.js';
|
|
4
|
+
export declare class ParadymApiService extends BaseProviderService {
|
|
5
|
+
static instance: ParadymApiService;
|
|
6
|
+
constructor();
|
|
7
|
+
getProviderId(): string;
|
|
8
|
+
protected getDefaultApiUrl(): string;
|
|
9
|
+
protected extractAccountId(config: ProviderConfigurationEntity): string;
|
|
10
|
+
protected getProviderSpecificSettings(account: ProviderAccountResponse, apiKey: ProviderApiKeyResponse): Record<string, any>;
|
|
11
|
+
protected createAccount(customerId: string, customerName?: string): Promise<ProviderAccountResponse>;
|
|
12
|
+
protected createApiKey(accountId: string, customerName?: string): Promise<ProviderApiKeyResponse>;
|
|
13
|
+
protected deleteAccount(accountId: string): Promise<void>;
|
|
14
|
+
protected testConnection(apiKey: string, accountId: string, config?: ProviderConfigurationEntity): Promise<ConnectionTestResult>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=paradym-api.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paradym-api.service.d.ts","sourceRoot":"","sources":["../../../src/services/api/paradym-api.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACtH,OAAO,EAAE,2BAA2B,EAAE,MAAM,0DAA0D,CAAC;AAYvG,qBAAa,iBAAkB,SAAQ,mBAAmB;IACzD,OAAc,QAAQ,oBAA2B;;IAMjD,aAAa,IAAI,MAAM;IAIvB,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,GAAG,MAAM;IAIvE,SAAS,CAAC,2BAA2B,CACpC,OAAO,EAAE,uBAAuB,EAChC,MAAM,EAAE,sBAAsB,GAC5B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;cAQN,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;cAuB1F,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;cA6BvF,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAe/C,cAAc,CAC7B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,2BAA2B,GAClC,OAAO,CAAC,oBAAoB,CAAC;CAahC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import * as dotenv from 'dotenv';
|
|
2
|
+
import { BaseProviderService } from './base-provider.service.js';
|
|
3
|
+
dotenv.config();
|
|
4
|
+
export class ParadymApiService extends BaseProviderService {
|
|
5
|
+
static instance = new ParadymApiService();
|
|
6
|
+
constructor() {
|
|
7
|
+
super('PARADYM_MASTER_API_KEY');
|
|
8
|
+
}
|
|
9
|
+
getProviderId() {
|
|
10
|
+
return 'paradym';
|
|
11
|
+
}
|
|
12
|
+
getDefaultApiUrl() {
|
|
13
|
+
return 'https://api.paradym.id';
|
|
14
|
+
}
|
|
15
|
+
extractAccountId(config) {
|
|
16
|
+
return config.defaultSettings?.organizationId || '';
|
|
17
|
+
}
|
|
18
|
+
getProviderSpecificSettings(account, apiKey) {
|
|
19
|
+
return {
|
|
20
|
+
organizationId: account.id,
|
|
21
|
+
organizationName: account.name,
|
|
22
|
+
paradymApiKeyId: apiKey.id,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async createAccount(customerId, customerName) {
|
|
26
|
+
const baseUrl = await this.getBaseUrl();
|
|
27
|
+
const response = await fetch(`${baseUrl}/organizations`, {
|
|
28
|
+
method: 'POST',
|
|
29
|
+
headers: {
|
|
30
|
+
'Content-Type': 'application/json',
|
|
31
|
+
Authorization: `Bearer ${this.masterApiKey}`,
|
|
32
|
+
},
|
|
33
|
+
body: JSON.stringify({
|
|
34
|
+
name: customerName || `Customer ${customerId}`,
|
|
35
|
+
description: `Organization for customer ${customerId}`,
|
|
36
|
+
customerId: customerId,
|
|
37
|
+
}),
|
|
38
|
+
});
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
const error = await response.text();
|
|
41
|
+
throw new Error(`Failed to create Paradym organization: ${response.status} ${error}`);
|
|
42
|
+
}
|
|
43
|
+
return await response.json();
|
|
44
|
+
}
|
|
45
|
+
async createApiKey(accountId, customerName) {
|
|
46
|
+
const baseUrl = await this.getBaseUrl();
|
|
47
|
+
const response = await fetch(`${baseUrl}/organizations/${accountId}/api-keys`, {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: {
|
|
50
|
+
'Content-Type': 'application/json',
|
|
51
|
+
Authorization: `Bearer ${this.masterApiKey}`,
|
|
52
|
+
},
|
|
53
|
+
body: JSON.stringify({
|
|
54
|
+
name: `API Key for ${customerName || 'Customer'}`,
|
|
55
|
+
scopes: ['credentials:read', 'credentials:write', 'connections:read'],
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
const error = await response.text();
|
|
60
|
+
throw new Error(`Failed to create Paradym API key: ${response.status} ${error}`);
|
|
61
|
+
}
|
|
62
|
+
const paradymResponse = await response.json();
|
|
63
|
+
return {
|
|
64
|
+
id: paradymResponse.id,
|
|
65
|
+
key: paradymResponse.key,
|
|
66
|
+
name: paradymResponse.name,
|
|
67
|
+
scopes: paradymResponse.scopes,
|
|
68
|
+
createdAt: paradymResponse.createdAt,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async deleteAccount(accountId) {
|
|
72
|
+
const baseUrl = await this.getBaseUrl();
|
|
73
|
+
const response = await fetch(`${baseUrl}/organizations/${accountId}`, {
|
|
74
|
+
method: 'DELETE',
|
|
75
|
+
headers: {
|
|
76
|
+
Authorization: `Bearer ${this.masterApiKey}`,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
if (!response.ok && response.status !== 404) {
|
|
80
|
+
const error = await response.text();
|
|
81
|
+
throw new Error(`Failed to delete Paradym organization: ${response.status} ${error}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async testConnection(apiKey, accountId, config) {
|
|
85
|
+
try {
|
|
86
|
+
const baseUrl = config ? this.getBaseUrlFromConfig(config) : await this.getBaseUrl();
|
|
87
|
+
const response = await fetch(`${baseUrl}/organizations/${accountId}`, {
|
|
88
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
89
|
+
});
|
|
90
|
+
return response.ok
|
|
91
|
+
? { success: true, message: 'Paradym connection successful' }
|
|
92
|
+
: { success: false, message: `Paradym API returned ${response.status}` };
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
return { success: false, message: `Paradym connection failed: ${error.message}` };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=paradym-api.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paradym-api.service.js","sourceRoot":"","sources":["../../../src/services/api/paradym-api.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IProviderService } from '../../types/provider.types';
|
|
2
|
+
export declare class ProviderFactory {
|
|
3
|
+
static registerProvider(providerId: string, factory: () => Promise<IProviderService>): void;
|
|
4
|
+
static getProviderService(providerId: string): Promise<IProviderService>;
|
|
5
|
+
static getRegisteredProviders(): string[];
|
|
6
|
+
static isProviderSupported(providerId: string): boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function initializeProviders(): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=provider.factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.factory.d.ts","sourceRoot":"","sources":["../../../src/services/api/provider.factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAK9D,qBAAa,eAAe;IAE3B,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;WAI9E,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAQ9E,MAAM,CAAC,sBAAsB,IAAI,MAAM,EAAE;IAIzC,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;CAGvD;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBzD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Provider registry - lazy loading to avoid circular imports
|
|
2
|
+
const providerRegistry = new Map();
|
|
3
|
+
export class ProviderFactory {
|
|
4
|
+
// Register providers - called by each provider service
|
|
5
|
+
static registerProvider(providerId, factory) {
|
|
6
|
+
providerRegistry.set(providerId, factory);
|
|
7
|
+
}
|
|
8
|
+
static async getProviderService(providerId) {
|
|
9
|
+
const factory = providerRegistry.get(providerId);
|
|
10
|
+
if (!factory) {
|
|
11
|
+
throw new Error(`Unsupported provider: ${providerId}`);
|
|
12
|
+
}
|
|
13
|
+
return await factory();
|
|
14
|
+
}
|
|
15
|
+
static getRegisteredProviders() {
|
|
16
|
+
return Array.from(providerRegistry.keys());
|
|
17
|
+
}
|
|
18
|
+
static isProviderSupported(providerId) {
|
|
19
|
+
return providerRegistry.has(providerId);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function initializeProviders() {
|
|
23
|
+
// Register all providers with lazy loading
|
|
24
|
+
ProviderFactory.registerProvider('dock', async () => {
|
|
25
|
+
const { DockApiService } = await import('./dock-api.service.js');
|
|
26
|
+
return DockApiService.instance;
|
|
27
|
+
});
|
|
28
|
+
ProviderFactory.registerProvider('hovi', async () => {
|
|
29
|
+
const { HoviApiService } = await import('./hovi-api.service.js');
|
|
30
|
+
return HoviApiService.instance;
|
|
31
|
+
});
|
|
32
|
+
ProviderFactory.registerProvider('paradym', async () => {
|
|
33
|
+
const { ParadymApiService } = await import('./paradym-api.service.js');
|
|
34
|
+
return ParadymApiService.instance;
|
|
35
|
+
});
|
|
36
|
+
ProviderFactory.registerProvider('studio', async () => {
|
|
37
|
+
const { StudioApiService } = await import('./studio-api.service.js');
|
|
38
|
+
return StudioApiService.instance;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=provider.factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.factory.js","sourceRoot":"","sources":["../../../src/services/api/provider.factory.ts"],"names":[],"mappings":"AAEA,6DAA6D;AAC7D,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA2C,CAAC;AAE5E,MAAM,OAAO,eAAe;IAC3B,uDAAuD;IACvD,MAAM,CAAC,gBAAgB,CAAC,UAAkB,EAAE,OAAwC;QACnF,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QACjD,MAAM,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,MAAM,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,sBAAsB;QAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,mBAAmB,CAAC,UAAkB;QAC5C,OAAO,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC;CACD;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACxC,2CAA2C;IAC3C,eAAe,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACjE,OAAO,cAAc,CAAC,QAAQ,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,eAAe,CAAC,gBAAgB,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACjE,OAAO,cAAc,CAAC,QAAQ,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,eAAe,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACvE,OAAO,iBAAiB,CAAC,QAAQ,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,eAAe,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACrE,OAAO,gBAAgB,CAAC,QAAQ,CAAC;IAClC,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Repository } from 'typeorm';
|
|
2
|
+
import { CredentialProviderEntity } from '../../database/entities/credential-provider.entity.js';
|
|
3
|
+
import { ProviderConfigurationEntity } from '../../database/entities/provider-configuration.entity.js';
|
|
4
|
+
import { ConnectionTestResult } from '../../types/provider.types.js';
|
|
5
|
+
export declare class ProviderService {
|
|
6
|
+
providerRepository: Repository<CredentialProviderEntity>;
|
|
7
|
+
configRepository: Repository<ProviderConfigurationEntity>;
|
|
8
|
+
static instance: ProviderService;
|
|
9
|
+
constructor();
|
|
10
|
+
getAllProviders(): Promise<CredentialProviderEntity[]>;
|
|
11
|
+
getProvider(providerId: string): Promise<CredentialProviderEntity | null>;
|
|
12
|
+
createProvider(providerData: Partial<CredentialProviderEntity>): Promise<CredentialProviderEntity>;
|
|
13
|
+
activateProvider(customerId: string, providerId: string, customApiEndpoint?: string): Promise<ProviderConfigurationEntity>;
|
|
14
|
+
getProviderConfiguration(customerId: string, providerId: string): Promise<ProviderConfigurationEntity | null>;
|
|
15
|
+
getCustomerConfigurations(customerId: string): Promise<ProviderConfigurationEntity[]>;
|
|
16
|
+
updateProviderConfiguration(customerId: string, providerId: string, updates: Partial<{
|
|
17
|
+
apiEndpoint: string;
|
|
18
|
+
webhookUrl: string;
|
|
19
|
+
defaultSettings: any;
|
|
20
|
+
}>): Promise<ProviderConfigurationEntity>;
|
|
21
|
+
deleteConfiguration(customerId: string, providerId: string): Promise<void>;
|
|
22
|
+
getDecryptedApiKey(config: ProviderConfigurationEntity): Promise<string>;
|
|
23
|
+
testConnection(customerId: string, providerId: string): Promise<ConnectionTestResult>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=provider.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.service.d.ts","sourceRoot":"","sources":["../../../src/services/api/provider.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,wBAAwB,EAAE,MAAM,uDAAuD,CAAC;AACjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,0DAA0D,CAAC;AAIvG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,qBAAa,eAAe;IACpB,kBAAkB,EAAE,UAAU,CAAC,wBAAwB,CAAC,CAAC;IACzD,gBAAgB,EAAE,UAAU,CAAC,2BAA2B,CAAC,CAAC;IAEjE,OAAc,QAAQ,kBAAyB;;IAQzC,eAAe,IAAI,OAAO,CAAC,wBAAwB,EAAE,CAAC;IAMtD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAMzE,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAMlG,gBAAgB,CACrB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,iBAAiB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,2BAA2B,CAAC;IAkDjC,wBAAwB,CAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC;IAUxC,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC;IAQrF,2BAA2B,CAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,GAAG,CAAC;KACrB,CAAC,GACA,OAAO,CAAC,2BAA2B,CAAC;IA4BjC,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1E,kBAAkB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,MAAM,CAAC;IAKxE,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAuB3F"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { Connection } from '../../database/connection/connection.js';
|
|
2
|
+
import { CredentialProviderEntity } from '../../database/entities/credential-provider.entity.js';
|
|
3
|
+
import { ProviderConfigurationEntity } from '../../database/entities/provider-configuration.entity.js';
|
|
4
|
+
import { CustomerEntity } from '../../database/entities/customer.entity.js';
|
|
5
|
+
import { APIKeyService } from '../admin/api-key.js';
|
|
6
|
+
import { ProviderFactory } from './provider.factory.js';
|
|
7
|
+
export class ProviderService {
|
|
8
|
+
providerRepository;
|
|
9
|
+
configRepository;
|
|
10
|
+
static instance = new ProviderService();
|
|
11
|
+
constructor() {
|
|
12
|
+
this.providerRepository = Connection.instance.dbConnection.getRepository(CredentialProviderEntity);
|
|
13
|
+
this.configRepository = Connection.instance.dbConnection.getRepository(ProviderConfigurationEntity);
|
|
14
|
+
}
|
|
15
|
+
// Provider Management
|
|
16
|
+
async getAllProviders() {
|
|
17
|
+
return await this.providerRepository.find({
|
|
18
|
+
order: { name: 'ASC' },
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async getProvider(providerId) {
|
|
22
|
+
return await this.providerRepository.findOne({
|
|
23
|
+
where: { providerId },
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async createProvider(providerData) {
|
|
27
|
+
const provider = this.providerRepository.create(providerData);
|
|
28
|
+
return await this.providerRepository.save(provider);
|
|
29
|
+
}
|
|
30
|
+
// Provider Activation - for fixed providers only
|
|
31
|
+
async activateProvider(customerId, providerId, customApiEndpoint) {
|
|
32
|
+
// Check if provider exists and is a valid default provider
|
|
33
|
+
const provider = await this.getProvider(providerId);
|
|
34
|
+
if (!provider) {
|
|
35
|
+
throw new Error(`Provider ${providerId} not found`);
|
|
36
|
+
}
|
|
37
|
+
// Get customer entity
|
|
38
|
+
const customerRepository = Connection.instance.dbConnection.getRepository(CustomerEntity);
|
|
39
|
+
const customer = await customerRepository.findOne({
|
|
40
|
+
where: { customerId },
|
|
41
|
+
});
|
|
42
|
+
if (!customer) {
|
|
43
|
+
throw new Error(`Customer ${customerId} not found`);
|
|
44
|
+
}
|
|
45
|
+
// Check if already activated
|
|
46
|
+
const existingConfig = await this.getProviderConfiguration(customerId, providerId);
|
|
47
|
+
if (existingConfig) {
|
|
48
|
+
throw new Error(`Provider ${providerId} is already activated for customer ${customerId}`);
|
|
49
|
+
}
|
|
50
|
+
// Use factory pattern
|
|
51
|
+
const providerService = await ProviderFactory.getProviderService(providerId);
|
|
52
|
+
const { apiKey, settings } = await providerService.activateProvider(customer);
|
|
53
|
+
// Encrypt API key
|
|
54
|
+
const encryptedApiKey = await APIKeyService.instance.encryptAPIKey(apiKey);
|
|
55
|
+
// Determine API endpoint (priority: custom > provider default > fallback)
|
|
56
|
+
const apiEndpoint = customApiEndpoint || provider.metadata.apiUrl || 'http://localhost:3000';
|
|
57
|
+
// Create configuration
|
|
58
|
+
const config = new ProviderConfigurationEntity(providerId, settings.tenantId, encryptedApiKey, apiEndpoint, customer, provider, undefined, settings);
|
|
59
|
+
config.active = true; // Mark as active after successful activation
|
|
60
|
+
return await this.configRepository.save(config);
|
|
61
|
+
}
|
|
62
|
+
// Configuration Management
|
|
63
|
+
async getProviderConfiguration(customerId, providerId) {
|
|
64
|
+
return await this.configRepository.findOne({
|
|
65
|
+
where: {
|
|
66
|
+
customer: { customerId },
|
|
67
|
+
providerId,
|
|
68
|
+
},
|
|
69
|
+
relations: ['provider', 'customer'],
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async getCustomerConfigurations(customerId) {
|
|
73
|
+
return await this.configRepository.find({
|
|
74
|
+
where: { customer: { customerId } },
|
|
75
|
+
relations: ['provider'],
|
|
76
|
+
order: { createdAt: 'DESC' },
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async updateProviderConfiguration(customerId, providerId, updates) {
|
|
80
|
+
const config = await this.getProviderConfiguration(customerId, providerId);
|
|
81
|
+
if (!config) {
|
|
82
|
+
throw new Error(`Provider configuration not found for provider ${providerId}`);
|
|
83
|
+
}
|
|
84
|
+
// Update fields
|
|
85
|
+
if (updates.apiEndpoint !== undefined) {
|
|
86
|
+
config.apiEndpoint = updates.apiEndpoint;
|
|
87
|
+
}
|
|
88
|
+
if (updates.webhookUrl !== undefined) {
|
|
89
|
+
config.webhookUrl = updates.webhookUrl;
|
|
90
|
+
}
|
|
91
|
+
if (updates.defaultSettings !== undefined) {
|
|
92
|
+
config.defaultSettings = { ...config.defaultSettings, ...updates.defaultSettings };
|
|
93
|
+
}
|
|
94
|
+
// Mark as updated
|
|
95
|
+
config.updatedAt = new Date();
|
|
96
|
+
// Reset validation status when configuration changes
|
|
97
|
+
config.validated = false;
|
|
98
|
+
config.validatedAt = undefined;
|
|
99
|
+
return await this.configRepository.save(config);
|
|
100
|
+
}
|
|
101
|
+
async deleteConfiguration(customerId, providerId) {
|
|
102
|
+
// Get the configuration before deleting to clean up provider resources
|
|
103
|
+
const config = await this.getProviderConfiguration(customerId, providerId);
|
|
104
|
+
if (config && ProviderFactory.isProviderSupported(providerId)) {
|
|
105
|
+
try {
|
|
106
|
+
const providerService = await ProviderFactory.getProviderService(providerId);
|
|
107
|
+
await providerService.cleanupProviderResources(config);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
console.warn(`Failed to clean up ${providerId} resources:`, error);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
await this.configRepository.delete({
|
|
114
|
+
customer: { customerId },
|
|
115
|
+
providerId,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// Decrypt API key for use
|
|
119
|
+
async getDecryptedApiKey(config) {
|
|
120
|
+
return await APIKeyService.instance.decryptAPIKey(config.encryptedApiKey);
|
|
121
|
+
}
|
|
122
|
+
// Test connection functionality
|
|
123
|
+
async testConnection(customerId, providerId) {
|
|
124
|
+
const config = await this.getProviderConfiguration(customerId, providerId);
|
|
125
|
+
if (!config) {
|
|
126
|
+
return { success: false, message: 'Provider not activated for this customer' };
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
if (ProviderFactory.isProviderSupported(providerId)) {
|
|
130
|
+
const providerService = await ProviderFactory.getProviderService(providerId);
|
|
131
|
+
const result = await providerService.testProviderConfiguration(config);
|
|
132
|
+
if (result.success) {
|
|
133
|
+
config.validated = true;
|
|
134
|
+
config.validatedAt = new Date();
|
|
135
|
+
await this.configRepository.save(config);
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
return { success: false, message: `Test connection not implemented for ${providerId}` };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
return { success: false, message: `Connection test failed: ${error.message}` };
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=provider.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.service.js","sourceRoot":"","sources":["../../../src/services/api/provider.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BaseProviderService } from './base-provider.service.js';
|
|
2
|
+
import { ProviderAccountResponse, ProviderApiKeyResponse, ConnectionTestResult } from '../../types/provider.types.js';
|
|
3
|
+
import { ProviderConfigurationEntity } from '../../database/entities/provider-configuration.entity.js';
|
|
4
|
+
export declare class StudioApiService extends BaseProviderService {
|
|
5
|
+
static instance: StudioApiService;
|
|
6
|
+
constructor();
|
|
7
|
+
protected requiresMasterKey(): boolean;
|
|
8
|
+
getProviderId(): string;
|
|
9
|
+
protected getDefaultApiUrl(): string;
|
|
10
|
+
protected extractAccountId(config: ProviderConfigurationEntity): string;
|
|
11
|
+
protected createAccount(customerId: string, customerName?: string): Promise<ProviderAccountResponse>;
|
|
12
|
+
protected createApiKey(accountId: string): Promise<ProviderApiKeyResponse>;
|
|
13
|
+
protected deleteAccount(accountId: string): Promise<void>;
|
|
14
|
+
protected testConnection(apiKey: string, accountId: string, config?: ProviderConfigurationEntity): Promise<ConnectionTestResult>;
|
|
15
|
+
private getOrCreateStudioApiKey;
|
|
16
|
+
private getDefaultUser;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=studio-api.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-api.service.d.ts","sourceRoot":"","sources":["../../../src/services/api/studio-api.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAEtH,OAAO,EAAE,2BAA2B,EAAE,MAAM,0DAA0D,CAAC;AAQvG,qBAAa,gBAAiB,SAAQ,mBAAmB;IACxD,OAAc,QAAQ,mBAA0B;;IAMhD,SAAS,CAAC,iBAAiB,IAAI,OAAO;IAItC,aAAa,IAAI,MAAM;IAIvB,SAAS,CAAC,gBAAgB,IAAI,MAAM;IAIpC,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,GAAG,MAAM;cAIvD,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;cAQ1F,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;cAiBhE,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cAM/C,cAAc,CAC7B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,2BAA2B,GAClC,OAAO,CAAC,oBAAoB,CAAC;YAelB,uBAAuB;YA0CvB,cAAc;CAc5B"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import * as dotenv from 'dotenv';
|
|
2
|
+
import { BaseProviderService } from './base-provider.service.js';
|
|
3
|
+
import { CustomerEntity } from '../../database/entities/customer.entity.js';
|
|
4
|
+
import { APIKeyService } from '../admin/api-key.js';
|
|
5
|
+
import { UserEntity } from '../../database/entities/user.entity.js';
|
|
6
|
+
import { Connection } from '../../database/connection/connection.js';
|
|
7
|
+
dotenv.config();
|
|
8
|
+
export class StudioApiService extends BaseProviderService {
|
|
9
|
+
static instance = new StudioApiService();
|
|
10
|
+
constructor() {
|
|
11
|
+
super('STUDIO_MASTER_API_KEY'); // This is optional, studio might not need master key
|
|
12
|
+
}
|
|
13
|
+
requiresMasterKey() {
|
|
14
|
+
return false; // Studio doesn't require a master API key
|
|
15
|
+
}
|
|
16
|
+
getProviderId() {
|
|
17
|
+
return 'studio';
|
|
18
|
+
}
|
|
19
|
+
getDefaultApiUrl() {
|
|
20
|
+
return process.env.APPLICATION_BASE_URL || 'http://localhost:3000';
|
|
21
|
+
}
|
|
22
|
+
extractAccountId(config) {
|
|
23
|
+
return config.customer.customerId;
|
|
24
|
+
}
|
|
25
|
+
async createAccount(customerId, customerName) {
|
|
26
|
+
return {
|
|
27
|
+
id: customerId,
|
|
28
|
+
name: customerName || `Customer ${customerId}`,
|
|
29
|
+
description: `Studio account for customer ${customerId}`,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
async createApiKey(accountId) {
|
|
33
|
+
const customerRepository = Connection.instance.dbConnection.getRepository(CustomerEntity);
|
|
34
|
+
const customer = await customerRepository.findOne({
|
|
35
|
+
where: { customerId: accountId },
|
|
36
|
+
});
|
|
37
|
+
if (!customer) {
|
|
38
|
+
throw new Error(`Customer ${accountId} not found`);
|
|
39
|
+
}
|
|
40
|
+
const apiKey = await this.getOrCreateStudioApiKey(customer);
|
|
41
|
+
return {
|
|
42
|
+
id: accountId,
|
|
43
|
+
key: apiKey,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async deleteAccount(accountId) {
|
|
47
|
+
// For studio, we don't actually delete the account
|
|
48
|
+
// Just revoke associated API keys
|
|
49
|
+
console.log(`Studio account cleanup for ${accountId} - revoking API keys`);
|
|
50
|
+
}
|
|
51
|
+
async testConnection(apiKey, accountId, config) {
|
|
52
|
+
try {
|
|
53
|
+
const baseUrl = config ? this.getBaseUrlFromConfig(config) : await this.getBaseUrl();
|
|
54
|
+
const response = await fetch(`${baseUrl}/account`, {
|
|
55
|
+
headers: { 'x-api-key': apiKey },
|
|
56
|
+
});
|
|
57
|
+
return response.ok
|
|
58
|
+
? { success: true, message: 'Studio connection successful' }
|
|
59
|
+
: { success: false, message: `Studio API returned ${response.status}` };
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return { success: false, message: `Studio connection failed: ${error.message}` };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Private helper methods
|
|
66
|
+
async getOrCreateStudioApiKey(customer) {
|
|
67
|
+
const options = { decryptionNeeded: true };
|
|
68
|
+
// Check if customer has any existing API keys
|
|
69
|
+
const existingApiKeys = await APIKeyService.instance.find({
|
|
70
|
+
customer,
|
|
71
|
+
revoked: false,
|
|
72
|
+
}, undefined, options);
|
|
73
|
+
// If existing API key found, use the first active one
|
|
74
|
+
if (existingApiKeys && existingApiKeys.length > 0) {
|
|
75
|
+
const activeKey = existingApiKeys.find((key) => key.expiresAt && key.expiresAt > new Date());
|
|
76
|
+
if (activeKey && activeKey.apiKey) {
|
|
77
|
+
return activeKey.apiKey;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// No active API key found, create a new one
|
|
81
|
+
// We need a user for API key creation - get or create a default user for this customer
|
|
82
|
+
const defaultUser = await this.getDefaultUser(customer);
|
|
83
|
+
// Generate new API key
|
|
84
|
+
const newApiKey = APIKeyService.generateAPIKey(customer.customerId);
|
|
85
|
+
// Create API key entity
|
|
86
|
+
const apiKeyEntity = await APIKeyService.instance.create(newApiKey, `Studio API Key for ${customer.name || customer.email}`, defaultUser, customer, undefined, // Use default expiration
|
|
87
|
+
false, // Not revoked
|
|
88
|
+
{ decryptionNeeded: true });
|
|
89
|
+
return apiKeyEntity.apiKey || newApiKey;
|
|
90
|
+
}
|
|
91
|
+
async getDefaultUser(customer) {
|
|
92
|
+
const userRepository = Connection.instance.dbConnection.getRepository(UserEntity);
|
|
93
|
+
// Try to find existing user for this customer
|
|
94
|
+
const user = await userRepository.findOne({
|
|
95
|
+
where: { customer: { customerId: customer.customerId } },
|
|
96
|
+
});
|
|
97
|
+
// If no user exists, throw error
|
|
98
|
+
if (!user) {
|
|
99
|
+
throw new Error(`logToId not found`);
|
|
100
|
+
}
|
|
101
|
+
return user;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=studio-api.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-api.service.js","sourceRoot":"","sources":["../../../src/services/api/studio-api.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../../src/services/connectors/resource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAA4B,MAAM,mCAAmC,CAAC;AAElG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAQjF;;;;GAIG;AACH,qBAAa,iBAAiB;IAC7B,MAAM,CAAC,QAAQ,oBAA2B;IAE1C;;;;;;;;OAQG;IACG,cAAc,CACnB,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,oBAAoB,EAChC,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,YAAY,CAAC,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../../src/services/connectors/resource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAA4B,MAAM,mCAAmC,CAAC;AAElG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAQjF;;;;GAIG;AACH,qBAAa,iBAAiB;IAC7B,MAAM,CAAC,QAAQ,oBAA2B;IAE1C;;;;;;;;OAQG;IACG,cAAc,CACnB,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,oBAAoB,EAChC,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,cAAc,EAAE,EAC9B,YAAY,CAAC,EAAE,MAAM;CA4CtB"}
|