@cheqd/studio 3.12.1 → 3.13.0-develop.2
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 +18 -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/credential.d.ts +55 -0
- package/dist/controllers/api/credential.d.ts.map +1 -1
- package/dist/controllers/api/credential.js +105 -0
- package/dist/controllers/api/credential.js.map +1 -1
- package/dist/controllers/api/did.d.ts +6 -0
- package/dist/controllers/api/did.d.ts.map +1 -1
- package/dist/controllers/api/did.js +37 -20
- package/dist/controllers/api/did.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/controllers/validator/service-create-request.js +2 -2
- package/dist/controllers/validator/service-create-request.js.map +1 -1
- package/dist/controllers/validator/service.js +2 -2
- package/dist/controllers/validator/service.js.map +1 -1
- 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/credential-auth.d.ts.map +1 -1
- package/dist/middleware/auth/routes/api/credential-auth.js +2 -0
- package/dist/middleware/auth/routes/api/credential-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/credentials.d.ts.map +1 -1
- package/dist/services/api/credentials.js +26 -15
- package/dist/services/api/credentials.js.map +1 -1
- 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/providers/base-provider.service.d.ts +22 -0
- package/dist/services/api/providers/base-provider.service.d.ts.map +1 -0
- package/dist/services/api/providers/base-provider.service.js +60 -0
- package/dist/services/api/providers/base-provider.service.js.map +1 -0
- package/dist/services/api/providers/dock-api.service.d.ts +18 -0
- package/dist/services/api/providers/dock-api.service.d.ts.map +1 -0
- package/dist/services/api/providers/dock-api.service.js +95 -0
- package/dist/services/api/providers/dock-api.service.js.map +1 -0
- package/dist/services/api/providers/hovi-api.service.d.ts +16 -0
- package/dist/services/api/providers/hovi-api.service.d.ts.map +1 -0
- package/dist/services/api/providers/hovi-api.service.js +99 -0
- package/dist/services/api/providers/hovi-api.service.js.map +1 -0
- package/dist/services/api/providers/paradym-api.service.d.ts +16 -0
- package/dist/services/api/providers/paradym-api.service.d.ts.map +1 -0
- package/dist/services/api/providers/paradym-api.service.js +99 -0
- package/dist/services/api/providers/paradym-api.service.js.map +1 -0
- package/dist/services/api/providers/studio-api.service.d.ts +18 -0
- package/dist/services/api/providers/studio-api.service.d.ts.map +1 -0
- package/dist/services/api/providers/studio-api.service.js +104 -0
- package/dist/services/api/providers/studio-api.service.js.map +1 -0
- package/dist/services/api/resource.d.ts +2 -2
- package/dist/services/api/resource.d.ts.map +1 -1
- package/dist/services/api/resource.js.map +1 -1
- package/dist/services/connectors/resource.d.ts.map +1 -1
- package/dist/services/connectors/resource.js.map +1 -1
- package/dist/services/identity/abstract.d.ts +4 -1
- package/dist/services/identity/abstract.d.ts.map +1 -1
- package/dist/services/identity/abstract.js +5 -0
- package/dist/services/identity/abstract.js.map +1 -1
- package/dist/services/identity/default.js +1 -1
- package/dist/services/identity/default.js.map +1 -1
- package/dist/services/identity/index.d.ts +4 -3
- package/dist/services/identity/index.d.ts.map +1 -1
- package/dist/services/identity/index.js +2 -3
- package/dist/services/identity/index.js.map +1 -1
- package/dist/services/identity/providers/dock/identity.d.ts +19 -0
- package/dist/services/identity/providers/dock/identity.d.ts.map +1 -0
- package/dist/services/identity/providers/dock/identity.js +201 -0
- package/dist/services/identity/providers/dock/identity.js.map +1 -0
- package/dist/services/identity/providers/dock/types.d.ts +138 -0
- package/dist/services/identity/providers/dock/types.d.ts.map +1 -0
- package/dist/services/identity/providers/dock/types.js +2 -0
- package/dist/services/identity/providers/dock/types.js.map +1 -0
- package/dist/services/identity/providers/index.d.ts +3 -0
- package/dist/services/identity/providers/index.d.ts.map +1 -0
- package/dist/services/identity/providers/index.js +3 -0
- package/dist/services/identity/providers/index.js.map +1 -0
- package/dist/services/identity/{agent.d.ts → providers/studio/agent.d.ts} +8 -8
- package/dist/services/identity/providers/studio/agent.d.ts.map +1 -0
- package/dist/services/identity/{agent.js → providers/studio/agent.js} +6 -5
- package/dist/services/identity/providers/studio/agent.js.map +1 -0
- package/dist/services/identity/providers/studio/index.d.ts +3 -0
- package/dist/services/identity/providers/studio/index.d.ts.map +1 -0
- package/dist/services/identity/providers/studio/index.js +3 -0
- package/dist/services/identity/providers/studio/index.js.map +1 -0
- package/dist/services/identity/{local.d.ts → providers/studio/local.d.ts} +9 -9
- package/dist/services/identity/providers/studio/local.d.ts.map +1 -0
- package/dist/services/identity/{local.js → providers/studio/local.js} +3 -3
- package/dist/services/identity/providers/studio/local.js.map +1 -0
- package/dist/services/identity/{postgres.d.ts → providers/studio/postgres.d.ts} +18 -17
- package/dist/services/identity/providers/studio/postgres.d.ts.map +1 -0
- package/dist/services/identity/{postgres.js → providers/studio/postgres.js} +51 -11
- package/dist/services/identity/providers/studio/postgres.js.map +1 -0
- package/dist/services/identity/providers/studio/unauthorized.d.ts +6 -0
- package/dist/services/identity/providers/studio/unauthorized.d.ts.map +1 -0
- package/dist/services/identity/{unauthorized.js → providers/studio/unauthorized.js} +2 -2
- package/dist/services/identity/providers/studio/unauthorized.js.map +1 -0
- package/dist/static/swagger-api.json +330 -0
- package/dist/types/credential.d.ts +33 -2
- package/dist/types/credential.d.ts.map +1 -1
- package/dist/types/credential.js +4 -2
- package/dist/types/credential.js.map +1 -1
- package/dist/types/did.d.ts +2 -0
- package/dist/types/did.d.ts.map +1 -1
- 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/dist/types/swagger-api-types.d.ts +28 -0
- package/dist/types/swagger-api-types.d.ts.map +1 -1
- package/dist/types/swagger-api-types.js +28 -0
- package/dist/types/swagger-api-types.js.map +1 -1
- package/example.env +6 -0
- package/package.json +3 -2
- package/dist/services/identity/agent.d.ts.map +0 -1
- package/dist/services/identity/agent.js.map +0 -1
- package/dist/services/identity/local.d.ts.map +0 -1
- package/dist/services/identity/local.js.map +0 -1
- package/dist/services/identity/postgres.d.ts.map +0 -1
- package/dist/services/identity/postgres.js.map +0 -1
- package/dist/services/identity/unauthorized.d.ts +0 -6
- package/dist/services/identity/unauthorized.d.ts.map +0 -1
- package/dist/services/identity/unauthorized.js.map +0 -1
|
@@ -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,iCAAiC,CAAC,CAAC;QAC3E,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,iCAAiC,CAAC,CAAC;QAC3E,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,oCAAoC,CAAC,CAAC;QACjF,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,mCAAmC,CAAC,CAAC;QAC/E,OAAO,gBAAgB,CAAC,QAAQ,CAAC;IAClC,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { FindOptionsWhere, 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, filter?: FindOptionsWhere<CredentialProviderEntity>): 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,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEvD,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,CAChB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,gBAAgB,CAAC,wBAAwB,CAAC,GACjD,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAMrC,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, filter) {
|
|
22
|
+
return await this.providerRepository.findOne({
|
|
23
|
+
where: { providerId, ...filter },
|
|
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,22 @@
|
|
|
1
|
+
import { CustomerEntity } from '../../../database/entities/customer.entity.js';
|
|
2
|
+
import { ProviderConfigurationEntity } from '../../../database/entities/provider-configuration.entity.js';
|
|
3
|
+
import { IProviderService, ProviderAccountResponse, ProviderApiKeyResponse, ConnectionTestResult, ProviderActivationResult } from '../../../types/provider.types.js';
|
|
4
|
+
export declare abstract class BaseProviderService implements IProviderService {
|
|
5
|
+
protected masterApiKey: string;
|
|
6
|
+
constructor(envKeyName: string);
|
|
7
|
+
abstract getProviderId(): string;
|
|
8
|
+
protected abstract createAccount(customerId: string, customerName?: string): Promise<ProviderAccountResponse>;
|
|
9
|
+
protected abstract createApiKey(accountId: string, customerName?: string): Promise<ProviderApiKeyResponse>;
|
|
10
|
+
protected abstract deleteAccount(accountId: string): Promise<void>;
|
|
11
|
+
protected abstract testConnection(apiKey: string, accountId: string, config?: ProviderConfigurationEntity): Promise<ConnectionTestResult>;
|
|
12
|
+
protected requiresMasterKey(): boolean;
|
|
13
|
+
activateProvider(customer: CustomerEntity): Promise<ProviderActivationResult>;
|
|
14
|
+
testProviderConfiguration(config: ProviderConfigurationEntity): Promise<ConnectionTestResult>;
|
|
15
|
+
cleanupProviderResources(config: ProviderConfigurationEntity): Promise<void>;
|
|
16
|
+
protected getBaseUrl(): Promise<string>;
|
|
17
|
+
protected getBaseUrlFromConfig(config?: ProviderConfigurationEntity): string;
|
|
18
|
+
protected abstract getDefaultApiUrl(): string;
|
|
19
|
+
protected abstract extractAccountId(config: ProviderConfigurationEntity): string;
|
|
20
|
+
protected getProviderSpecificSettings(account: ProviderAccountResponse, apiKey: ProviderApiKeyResponse): Record<string, any>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=base-provider.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-provider.service.d.ts","sourceRoot":"","sources":["../../../../src/services/api/providers/base-provider.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAC1G,OAAO,EACN,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,MAAM,kCAAkC,CAAC;AAE1C,8BAAsB,mBAAoB,YAAW,gBAAgB;IACpE,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;gBAEnB,UAAU,EAAE,MAAM;IAQ9B,QAAQ,CAAC,aAAa,IAAI,MAAM;IAChC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAC7G,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAC1G,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAClE,SAAS,CAAC,QAAQ,CAAC,cAAc,CAChC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,2BAA2B,GAClC,OAAO,CAAC,oBAAoB,CAAC;IAGhC,SAAS,CAAC,iBAAiB,IAAI,OAAO;IAKhC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAqB7E,yBAAyB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAM7F,wBAAwB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC;cAQlE,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAM7C,SAAS,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,2BAA2B,GAAG,MAAM;IAS5E,SAAS,CAAC,QAAQ,CAAC,gBAAgB,IAAI,MAAM;IAC7C,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,GAAG,MAAM;IAChF,SAAS,CAAC,2BAA2B,CACpC,OAAO,EAAE,uBAAuB,EAChC,MAAM,EAAE,sBAAsB,GAC5B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAGtB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ProviderService } from '../provider.service.js';
|
|
2
|
+
export class BaseProviderService {
|
|
3
|
+
masterApiKey;
|
|
4
|
+
constructor(envKeyName) {
|
|
5
|
+
this.masterApiKey = process.env[envKeyName] || '';
|
|
6
|
+
if (!this.masterApiKey && this.requiresMasterKey()) {
|
|
7
|
+
throw new Error(`${envKeyName} environment variable is required`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
// Optional override - some providers might not need master keys
|
|
11
|
+
requiresMasterKey() {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
// Common provider configuration management (consolidates duplicate logic)
|
|
15
|
+
async activateProvider(customer) {
|
|
16
|
+
const customerName = customer.name || customer.email || `Customer ${customer.customerId}`;
|
|
17
|
+
// Step 1: Create account
|
|
18
|
+
const account = await this.createAccount(customer.customerId, customerName);
|
|
19
|
+
// Step 2: Create API key for that account
|
|
20
|
+
const apiKeyResponse = await this.createApiKey(account.id, customerName);
|
|
21
|
+
// Step 3: Return standardized result
|
|
22
|
+
return {
|
|
23
|
+
apiKey: apiKeyResponse.key,
|
|
24
|
+
settings: {
|
|
25
|
+
tenantId: account.id,
|
|
26
|
+
tenantName: account.name,
|
|
27
|
+
apiKeyId: apiKeyResponse.id,
|
|
28
|
+
...this.getProviderSpecificSettings(account, apiKeyResponse),
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
async testProviderConfiguration(config) {
|
|
33
|
+
const apiKey = await ProviderService.instance.getDecryptedApiKey(config);
|
|
34
|
+
const accountId = this.extractAccountId(config);
|
|
35
|
+
return this.testConnection(apiKey, accountId, config);
|
|
36
|
+
}
|
|
37
|
+
async cleanupProviderResources(config) {
|
|
38
|
+
const accountId = this.extractAccountId(config);
|
|
39
|
+
if (accountId) {
|
|
40
|
+
await this.deleteAccount(accountId);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Helper method to get provider URL
|
|
44
|
+
async getBaseUrl() {
|
|
45
|
+
const provider = await ProviderService.instance.getProvider(this.getProviderId());
|
|
46
|
+
return provider?.metadata.apiUrl || this.getDefaultApiUrl();
|
|
47
|
+
}
|
|
48
|
+
// Helper method to get base URL with configuration-specific endpoint support
|
|
49
|
+
getBaseUrlFromConfig(config) {
|
|
50
|
+
if (config?.apiEndpoint) {
|
|
51
|
+
return config.apiEndpoint;
|
|
52
|
+
}
|
|
53
|
+
// Fallback to provider default - note: this is async, so providers should override if they need this
|
|
54
|
+
return this.getDefaultApiUrl();
|
|
55
|
+
}
|
|
56
|
+
getProviderSpecificSettings(account, apiKey) {
|
|
57
|
+
return {};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=base-provider.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-provider.service.js","sourceRoot":"","sources":["../../../../src/services/api/providers/base-provider.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAWzD,MAAM,OAAgB,mBAAmB;IAC9B,YAAY,CAAS;IAE/B,YAAY,UAAkB;QAC7B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,mCAAmC,CAAC,CAAC;QACnE,CAAC;IACF,CAAC;IAaD,gEAAgE;IACtD,iBAAiB;QAC1B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,gBAAgB,CAAC,QAAwB;QAC9C,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK,IAAI,YAAY,QAAQ,CAAC,UAAU,EAAE,CAAC;QAE1F,yBAAyB;QACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAE5E,0CAA0C;QAC1C,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAEzE,qCAAqC;QACrC,OAAO;YACN,MAAM,EAAE,cAAc,CAAC,GAAG;YAC1B,QAAQ,EAAE;gBACT,QAAQ,EAAE,OAAO,CAAC,EAAE;gBACpB,UAAU,EAAE,OAAO,CAAC,IAAI;gBACxB,QAAQ,EAAE,cAAc,CAAC,EAAE;gBAC3B,GAAG,IAAI,CAAC,2BAA2B,CAAC,OAAO,EAAE,cAAc,CAAC;aAC5D;SACD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,MAAmC;QAClE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,MAAmC;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;IACF,CAAC;IAED,oCAAoC;IAC1B,KAAK,CAAC,UAAU;QACzB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAClF,OAAO,QAAQ,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC7D,CAAC;IAED,6EAA6E;IACnE,oBAAoB,CAAC,MAAoC;QAClE,IAAI,MAAM,EAAE,WAAW,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,WAAW,CAAC;QAC3B,CAAC;QACD,qGAAqG;QACrG,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAChC,CAAC;IAKS,2BAA2B,CACpC,OAAgC,EAChC,MAA8B;QAE9B,OAAO,EAAE,CAAC;IACX,CAAC;CACD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
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
|
+
import { DockIdentityService } from '../../identity/providers/dock/identity.js';
|
|
5
|
+
export declare class DockApiService extends BaseProviderService {
|
|
6
|
+
static instance: DockApiService;
|
|
7
|
+
identityService: DockIdentityService;
|
|
8
|
+
constructor();
|
|
9
|
+
getProviderId(): string;
|
|
10
|
+
protected getDefaultApiUrl(): string;
|
|
11
|
+
protected extractAccountId(config: ProviderConfigurationEntity): string;
|
|
12
|
+
protected getProviderSpecificSettings(account: ProviderAccountResponse, apiKey: ProviderApiKeyResponse): Record<string, any>;
|
|
13
|
+
protected createAccount(customerId: string): Promise<ProviderAccountResponse>;
|
|
14
|
+
protected createApiKey(accountId: string): Promise<ProviderApiKeyResponse>;
|
|
15
|
+
protected deleteAccount(accountId: string): Promise<void>;
|
|
16
|
+
protected testConnection(apiKey: string, accountId: string, config?: ProviderConfigurationEntity): Promise<ConnectionTestResult>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=dock-api.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dock-api.service.d.ts","sourceRoot":"","sources":["../../../../src/services/api/providers/dock-api.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACN,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAC1G,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAShF,qBAAa,cAAe,SAAQ,mBAAmB;IACtD,OAAc,QAAQ,iBAAwB;IACvC,eAAe,sBAA6B;;IAMnD,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;cASN,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC;cAsBnE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;cAuBhE,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,95 @@
|
|
|
1
|
+
import * as dotenv from 'dotenv';
|
|
2
|
+
import { BaseProviderService } from './base-provider.service.js';
|
|
3
|
+
import { DockIdentityService } from '../../identity/providers/dock/identity.js';
|
|
4
|
+
dotenv.config();
|
|
5
|
+
export class DockApiService extends BaseProviderService {
|
|
6
|
+
static instance = new DockApiService();
|
|
7
|
+
identityService = new DockIdentityService();
|
|
8
|
+
constructor() {
|
|
9
|
+
super('DOCK_MASTER_API_KEY');
|
|
10
|
+
}
|
|
11
|
+
getProviderId() {
|
|
12
|
+
return 'dock';
|
|
13
|
+
}
|
|
14
|
+
getDefaultApiUrl() {
|
|
15
|
+
return 'https://api-testnet.truvera.io';
|
|
16
|
+
}
|
|
17
|
+
extractAccountId(config) {
|
|
18
|
+
return config.defaultSettings?.subaccountId || '';
|
|
19
|
+
}
|
|
20
|
+
getProviderSpecificSettings(account, apiKey) {
|
|
21
|
+
return {
|
|
22
|
+
subaccountId: account.id,
|
|
23
|
+
subaccountName: account.name,
|
|
24
|
+
dockApiKeyId: apiKey.id,
|
|
25
|
+
parentId: account.parentId,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
async createAccount(customerId) {
|
|
29
|
+
const baseUrl = await this.getBaseUrl();
|
|
30
|
+
const response = await fetch(`${baseUrl}/subaccounts`, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: {
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
Authorization: `Bearer ${this.masterApiKey}`,
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify({
|
|
37
|
+
name: `${customerId}`,
|
|
38
|
+
image: `Subaccount for cheqd-studio ${customerId}`,
|
|
39
|
+
}),
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) {
|
|
42
|
+
const error = await response.text();
|
|
43
|
+
throw new Error(`Failed to create Dock subaccount: ${response.status} ${error}`);
|
|
44
|
+
}
|
|
45
|
+
return await response.json();
|
|
46
|
+
}
|
|
47
|
+
async createApiKey(accountId) {
|
|
48
|
+
const baseUrl = await this.getBaseUrl();
|
|
49
|
+
const response = await fetch(`${baseUrl}/subaccounts/${accountId}/keys`, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
headers: {
|
|
52
|
+
'Content-Type': 'application/json',
|
|
53
|
+
Authorization: `Bearer ${this.masterApiKey}`,
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify({}),
|
|
56
|
+
});
|
|
57
|
+
if (!response.ok) {
|
|
58
|
+
const error = await response.text();
|
|
59
|
+
throw new Error(`Failed to create Dock API key: ${response.status} ${error}`);
|
|
60
|
+
}
|
|
61
|
+
const dockResponse = await response.json();
|
|
62
|
+
return {
|
|
63
|
+
id: dockResponse.id,
|
|
64
|
+
key: dockResponse.token,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async deleteAccount(accountId) {
|
|
68
|
+
const baseUrl = await this.getBaseUrl();
|
|
69
|
+
const response = await fetch(`${baseUrl}/subaccounts/${accountId}`, {
|
|
70
|
+
method: 'DELETE',
|
|
71
|
+
headers: {
|
|
72
|
+
Authorization: `Bearer ${this.masterApiKey}`,
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
if (!response.ok && response.status !== 404) {
|
|
76
|
+
const error = await response.text();
|
|
77
|
+
throw new Error(`Failed to delete Dock subaccount: ${response.status} ${error}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async testConnection(apiKey, accountId, config) {
|
|
81
|
+
try {
|
|
82
|
+
const baseUrl = config ? this.getBaseUrlFromConfig(config) : await this.getBaseUrl();
|
|
83
|
+
const response = await fetch(`${baseUrl}/subaccounts`, {
|
|
84
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
85
|
+
});
|
|
86
|
+
return response.ok
|
|
87
|
+
? { success: true, message: 'Dock connection successful' }
|
|
88
|
+
: { success: false, message: `Dock API returned ${response.status}` };
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return { success: false, message: `Dock connection failed: ${error.message}` };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=dock-api.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dock-api.service.js","sourceRoot":"","sources":["../../../../src/services/api/providers/dock-api.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAOjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAEhF,MAAM,CAAC,MAAM,EAAE,CAAC;AAOhB,MAAM,OAAO,cAAe,SAAQ,mBAAmB;IAC/C,MAAM,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IACvC,eAAe,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAEnD;QACC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC9B,CAAC;IAED,aAAa;QACZ,OAAO,MAAM,CAAC;IACf,CAAC;IAES,gBAAgB;QACzB,OAAO,gCAAgC,CAAC;IACzC,CAAC;IAES,gBAAgB,CAAC,MAAmC;QAC7D,OAAO,MAAM,CAAC,eAAe,EAAE,YAAY,IAAI,EAAE,CAAC;IACnD,CAAC;IAES,2BAA2B,CACpC,OAAgC,EAChC,MAA8B;QAE9B,OAAO;YACN,YAAY,EAAE,OAAO,CAAC,EAAE;YACxB,cAAc,EAAE,OAAO,CAAC,IAAI;YAC5B,YAAY,EAAE,MAAM,CAAC,EAAE;YACvB,QAAQ,EAAG,OAAe,CAAC,QAAQ;SACnC,CAAC;IACH,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,UAAkB;QAC/C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,cAAc,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,YAAY,EAAE;aAC5C;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,IAAI,EAAE,GAAG,UAAU,EAAE;gBACrB,KAAK,EAAE,+BAA+B,UAAU,EAAE;aAClD,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QAClF,CAAC;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAES,KAAK,CAAC,YAAY,CAAC,SAAiB;QAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,gBAAgB,SAAS,OAAO,EAAE;YACxE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,YAAY,EAAE;aAC5C;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,YAAY,GAAuB,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/D,OAAO;YACN,EAAE,EAAE,YAAY,CAAC,EAAE;YACnB,GAAG,EAAE,YAAY,CAAC,KAAK;SACvB,CAAC;IACH,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,SAAiB;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,gBAAgB,SAAS,EAAE,EAAE;YACnE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE;gBACR,aAAa,EAAE,UAAU,IAAI,CAAC,YAAY,EAAE;aAC5C;SACD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,qCAAqC,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QAClF,CAAC;IACF,CAAC;IAES,KAAK,CAAC,cAAc,CAC7B,MAAc,EACd,SAAiB,EACjB,MAAoC;QAEpC,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACrF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,cAAc,EAAE;gBACtD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;aAC9C,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC,EAAE;gBACjB,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,4BAA4B,EAAE;gBAC1D,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,2BAA4B,KAAe,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3F,CAAC;IACF,CAAC"}
|
|
@@ -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 HoviApiService extends BaseProviderService {
|
|
5
|
+
static instance: HoviApiService;
|
|
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=hovi-api.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hovi-api.service.d.ts","sourceRoot":"","sources":["../../../../src/services/api/providers/hovi-api.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACN,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAY1G,qBAAa,cAAe,SAAQ,mBAAmB;IACtD,OAAc,QAAQ,iBAAwB;;IAM9C,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 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/providers/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/providers/paradym-api.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACN,oBAAoB,EACpB,uBAAuB,EACvB,sBAAsB,EACtB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAY1G,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"}
|