@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.
Files changed (75) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +17 -1
  3. package/dist/app.js.map +1 -1
  4. package/dist/controllers/admin/subscriptions.d.ts.map +1 -1
  5. package/dist/controllers/admin/subscriptions.js.map +1 -1
  6. package/dist/controllers/api/accreditation.js.map +1 -1
  7. package/dist/controllers/api/providers.controller.d.ts +152 -0
  8. package/dist/controllers/api/providers.controller.d.ts.map +1 -0
  9. package/dist/controllers/api/providers.controller.js +348 -0
  10. package/dist/controllers/api/providers.controller.js.map +1 -0
  11. package/dist/database/entities/credential-provider.entity.d.ts +16 -0
  12. package/dist/database/entities/credential-provider.entity.d.ts.map +1 -0
  13. package/dist/database/entities/credential-provider.entity.js +109 -0
  14. package/dist/database/entities/credential-provider.entity.js.map +1 -0
  15. package/dist/database/entities/provider-configuration.entity.d.ts +23 -0
  16. package/dist/database/entities/provider-configuration.entity.d.ts.map +1 -0
  17. package/dist/database/entities/provider-configuration.entity.js +139 -0
  18. package/dist/database/entities/provider-configuration.entity.js.map +1 -0
  19. package/dist/database/migrations/1758011998054-studio-migrations.d.ts +7 -0
  20. package/dist/database/migrations/1758011998054-studio-migrations.d.ts.map +1 -0
  21. package/dist/database/migrations/1758011998054-studio-migrations.js +18 -0
  22. package/dist/database/migrations/1758011998054-studio-migrations.js.map +1 -0
  23. package/dist/database/seeds/providers.seed.d.ts +2 -0
  24. package/dist/database/seeds/providers.seed.d.ts.map +1 -0
  25. package/dist/database/seeds/providers.seed.js +89 -0
  26. package/dist/database/seeds/providers.seed.js.map +1 -0
  27. package/dist/database/types/types.d.ts.map +1 -1
  28. package/dist/database/types/types.js +6 -0
  29. package/dist/database/types/types.js.map +1 -1
  30. package/dist/middleware/auth/routes/api/accreditation-auth.js.map +1 -1
  31. package/dist/middleware/auth/routes/api/provider-auth.d.ts +5 -0
  32. package/dist/middleware/auth/routes/api/provider-auth.d.ts.map +1 -0
  33. package/dist/middleware/auth/routes/api/provider-auth.js +27 -0
  34. package/dist/middleware/auth/routes/api/provider-auth.js.map +1 -0
  35. package/dist/middleware/authentication.d.ts.map +1 -1
  36. package/dist/middleware/authentication.js +2 -0
  37. package/dist/middleware/authentication.js.map +1 -1
  38. package/dist/services/api/base-provider.service.d.ts +22 -0
  39. package/dist/services/api/base-provider.service.d.ts.map +1 -0
  40. package/dist/services/api/base-provider.service.js +60 -0
  41. package/dist/services/api/base-provider.service.js.map +1 -0
  42. package/dist/services/api/dock-api.service.d.ts +16 -0
  43. package/dist/services/api/dock-api.service.d.ts.map +1 -0
  44. package/dist/services/api/dock-api.service.js +93 -0
  45. package/dist/services/api/dock-api.service.js.map +1 -0
  46. package/dist/services/api/hovi-api.service.d.ts +16 -0
  47. package/dist/services/api/hovi-api.service.d.ts.map +1 -0
  48. package/dist/services/api/hovi-api.service.js +99 -0
  49. package/dist/services/api/hovi-api.service.js.map +1 -0
  50. package/dist/services/api/paradym-api.service.d.ts +16 -0
  51. package/dist/services/api/paradym-api.service.d.ts.map +1 -0
  52. package/dist/services/api/paradym-api.service.js +99 -0
  53. package/dist/services/api/paradym-api.service.js.map +1 -0
  54. package/dist/services/api/provider.factory.d.ts +9 -0
  55. package/dist/services/api/provider.factory.d.ts.map +1 -0
  56. package/dist/services/api/provider.factory.js +41 -0
  57. package/dist/services/api/provider.factory.js.map +1 -0
  58. package/dist/services/api/provider.service.d.ts +25 -0
  59. package/dist/services/api/provider.service.d.ts.map +1 -0
  60. package/dist/services/api/provider.service.js +148 -0
  61. package/dist/services/api/provider.service.js.map +1 -0
  62. package/dist/services/api/studio-api.service.d.ts +18 -0
  63. package/dist/services/api/studio-api.service.d.ts.map +1 -0
  64. package/dist/services/api/studio-api.service.js +104 -0
  65. package/dist/services/api/studio-api.service.js.map +1 -0
  66. package/dist/services/connectors/resource.d.ts.map +1 -1
  67. package/dist/services/connectors/resource.js.map +1 -1
  68. package/dist/services/identity/postgres.js.map +1 -1
  69. package/dist/static/swagger-api.json +200 -0
  70. package/dist/types/provider.types.d.ts +30 -0
  71. package/dist/types/provider.types.d.ts.map +1 -0
  72. package/dist/types/provider.types.js +2 -0
  73. package/dist/types/provider.types.js.map +1 -0
  74. package/example.env +6 -0
  75. 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;CAwCtB"}
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"}