@cheqd/studio 3.12.1 → 3.13.0-develop.10
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 +21 -2
- 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.d.ts.map +1 -1
- package/dist/controllers/api/accreditation.js +2 -2
- 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 +145 -0
- package/dist/controllers/api/credential.js.map +1 -1
- package/dist/controllers/api/did.d.ts +77 -1
- package/dist/controllers/api/did.d.ts.map +1 -1
- package/dist/controllers/api/did.js +210 -93
- package/dist/controllers/api/did.js.map +1 -1
- package/dist/controllers/api/providers.controller.d.ts +214 -0
- package/dist/controllers/api/providers.controller.d.ts.map +1 -0
- package/dist/controllers/api/providers.controller.js +462 -0
- package/dist/controllers/api/providers.controller.js.map +1 -0
- package/dist/controllers/validator/service-create-request.js +3 -3
- 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/helpers/helpers.js +1 -1
- package/dist/helpers/helpers.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/did-auth.d.ts.map +1 -1
- package/dist/middleware/auth/routes/api/did-auth.js +2 -0
- package/dist/middleware/auth/routes/api/did-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 +29 -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 +36 -17
- package/dist/services/api/credentials.js.map +1 -1
- package/dist/services/api/identifier.d.ts +1 -1
- package/dist/services/api/identifier.d.ts.map +1 -1
- package/dist/services/api/identifier.js +2 -2
- package/dist/services/api/identifier.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 +7 -3
- package/dist/services/identity/abstract.d.ts.map +1 -1
- package/dist/services/identity/abstract.js +9 -1
- 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 +8 -4
- 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 +25 -0
- package/dist/services/identity/providers/dock/identity.d.ts.map +1 -0
- package/dist/services/identity/providers/dock/identity.js +307 -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} +7 -6
- 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} +24 -18
- package/dist/services/identity/providers/studio/postgres.d.ts.map +1 -0
- package/dist/services/identity/{postgres.js → providers/studio/postgres.js} +138 -17
- 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/services/track/api/resource-subscriber.js +1 -1
- package/dist/services/track/api/resource-subscriber.js.map +1 -1
- package/dist/static/swagger-api.json +623 -0
- package/dist/types/constants.d.ts +1 -0
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/constants.js +1 -0
- package/dist/types/constants.js.map +1 -1
- package/dist/types/credential.d.ts +35 -3
- 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 +20 -1
- 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 +94 -0
- package/dist/types/swagger-api-types.d.ts.map +1 -1
- package/dist/types/swagger-api-types.js +94 -0
- package/dist/types/swagger-api-types.js.map +1 -1
- package/example.env +6 -0
- package/package.json +4 -3
- 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,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":"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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 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":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAQjE,MAAM,CAAC,MAAM,EAAE,CAAC;AAUhB,MAAM,OAAO,cAAe,SAAQ,mBAAmB;IAC/C,MAAM,CAAC,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IAE9C;QACC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC9B,CAAC;IAED,aAAa;QACZ,OAAO,MAAM,CAAC;IACf,CAAC;IAES,gBAAgB;QACzB,OAAO,qBAAqB,CAAC;IAC9B,CAAC;IAES,gBAAgB,CAAC,MAAmC;QAC7D,OAAO,MAAM,CAAC,eAAe,EAAE,QAAQ,IAAI,EAAE,CAAC;IAC/C,CAAC;IAES,2BAA2B,CACpC,OAAgC,EAChC,MAA8B;QAE9B,OAAO;YACN,QAAQ,EAAE,OAAO,CAAC,EAAE;YACpB,UAAU,EAAE,OAAO,CAAC,IAAI;YACxB,YAAY,EAAE,MAAM,CAAC,EAAE;SACvB,CAAC;IACH,CAAC;IAES,KAAK,CAAC,aAAa,CAAC,UAAkB,EAAE,YAAqB;QACtE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,UAAU,EAAE;YAClD,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,YAAY,IAAI,YAAY,UAAU,EAAE;gBAC9C,WAAW,EAAE,uBAAuB,UAAU,EAAE;gBAChD,UAAU,EAAE,UAAU;aACtB,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,iCAAiC,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC9B,CAAC;IAES,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,YAAqB;QACpE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,YAAY,SAAS,OAAO,EAAE;YACpE,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,eAAe,YAAY,IAAI,UAAU,EAAE;gBACjD,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;aAC9B,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,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,GAAG;YACrB,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,SAAS,EAAE,YAAY,CAAC,SAAS;SACjC,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,YAAY,SAAS,EAAE,EAAE;YAC/D,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,iCAAiC,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QAC9E,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,YAAY,SAAS,EAAE,EAAE;gBAC/D,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 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"}
|
|
@@ -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/providers/paradym-api.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/providers/studio-api.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACN,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACpB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAQ1G,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/providers/studio-api.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FindOptionsRelations, Repository } from 'typeorm';
|
|
1
|
+
import type { FindOptionsRelations, FindOptionsWhere, Repository } from 'typeorm';
|
|
2
2
|
import type { IdentifierEntity } from '../../database/entities/identifier.entity.js';
|
|
3
3
|
import type { KeyEntity } from '../../database/entities/key.entity.js';
|
|
4
4
|
import type { CustomerEntity } from '../../database/entities/customer.entity.js';
|
|
@@ -11,7 +11,7 @@ export declare class ResourceService {
|
|
|
11
11
|
create(resourceId: string, resourceName: string, resourceType: string, mediaType: string, previousVersionId: string, nextVersionId: string, customer: CustomerEntity, identifier: IdentifierEntity, key: KeyEntity, encrypted: boolean, symmetricKey: string): Promise<ResourceEntity>;
|
|
12
12
|
update(resourceId: string, identifier?: IdentifierEntity, key?: KeyEntity, resourceName?: string, resourceType?: string, mediaType?: string, previousVersionId?: string, nextVersionId?: string, customer?: CustomerEntity, encrypted?: boolean, symmetricKey?: string, namespace?: string): Promise<ResourceEntity>;
|
|
13
13
|
get(resourceId: string, relations?: FindOptionsRelations<ResourceEntity>): Promise<ResourceEntity | null>;
|
|
14
|
-
find(where:
|
|
14
|
+
find(where: FindOptionsWhere<ResourceEntity> | FindOptionsWhere<ResourceEntity>[], page?: number, limit?: number, relations?: FindOptionsRelations<ResourceEntity>): Promise<[ResourceEntity[], number]>;
|
|
15
15
|
createFromLinkedResource(resource: LinkedResourceMetadataResolutionResult, customer: CustomerEntity, key: KeyEntity, identifier: IdentifierEntity, encrypted: boolean, symmetricKey: string, namespace: string): Promise<ResourceEntity>;
|
|
16
16
|
}
|
|
17
17
|
//# sourceMappingURL=resource.d.ts.map
|