@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,214 @@
|
|
|
1
|
+
import type { Request, Response } from 'express';
|
|
2
|
+
export declare class ProvidersController {
|
|
3
|
+
static importDIDValidator: import("express-validator").ValidationChainWithExtensions<"isDID" | "isDIDArray" | "isDIDDocument" | "isVerificationMethod" | "isCreateDIDDocumentService" | "isService" | "isCheqdDidLinkedAlsoKnownAs" | "isKeyDID" | "isW3CCheqdCredential" | "isW3CCheqdCredentials" | "isW3CCheqdPresentation" | "isVeridaDID">[];
|
|
4
|
+
/**
|
|
5
|
+
* @openapi
|
|
6
|
+
* /providers:
|
|
7
|
+
* get:
|
|
8
|
+
* tags: [Providers]
|
|
9
|
+
* summary: Get all available credential providers
|
|
10
|
+
* description: Returns list of available credential providers
|
|
11
|
+
* responses:
|
|
12
|
+
* 200:
|
|
13
|
+
* description: Successful response
|
|
14
|
+
* content:
|
|
15
|
+
* application/json:
|
|
16
|
+
* schema:
|
|
17
|
+
* type: object
|
|
18
|
+
* properties:
|
|
19
|
+
* providers:
|
|
20
|
+
* type: array
|
|
21
|
+
* items:
|
|
22
|
+
* type: object
|
|
23
|
+
*/
|
|
24
|
+
getProviders(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
25
|
+
/**
|
|
26
|
+
* @openapi
|
|
27
|
+
* /providers/activated:
|
|
28
|
+
* get:
|
|
29
|
+
* tags: [Providers]
|
|
30
|
+
* summary: Get customer's activated providers
|
|
31
|
+
* description: Returns list of providers activated by the customer
|
|
32
|
+
* responses:
|
|
33
|
+
* 200:
|
|
34
|
+
* description: Successful response
|
|
35
|
+
*/
|
|
36
|
+
getActiveProviders(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
37
|
+
/**
|
|
38
|
+
* @openapi
|
|
39
|
+
* /providers/{providerId}/configuration:
|
|
40
|
+
* get:
|
|
41
|
+
* tags: [Providers]
|
|
42
|
+
* summary: Get provider configuration
|
|
43
|
+
* parameters:
|
|
44
|
+
* - name: providerId
|
|
45
|
+
* in: path
|
|
46
|
+
* required: true
|
|
47
|
+
* schema:
|
|
48
|
+
* type: string
|
|
49
|
+
* responses:
|
|
50
|
+
* 200:
|
|
51
|
+
* description: Provider configuration
|
|
52
|
+
*/
|
|
53
|
+
getProviderConfiguration(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
54
|
+
/**
|
|
55
|
+
* @openapi
|
|
56
|
+
* /providers/{providerId}/activate:
|
|
57
|
+
* post:
|
|
58
|
+
* tags: [Providers]
|
|
59
|
+
* summary: Activate a provider for the customer
|
|
60
|
+
* parameters:
|
|
61
|
+
* - name: providerId
|
|
62
|
+
* in: path
|
|
63
|
+
* required: true
|
|
64
|
+
* schema:
|
|
65
|
+
* type: string
|
|
66
|
+
* responses:
|
|
67
|
+
* 200:
|
|
68
|
+
* description: Provider activated successfully
|
|
69
|
+
* 400:
|
|
70
|
+
* description: Invalid provider or already activated
|
|
71
|
+
* 404:
|
|
72
|
+
* description: Provider not found
|
|
73
|
+
*/
|
|
74
|
+
activateProvider(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
75
|
+
/**
|
|
76
|
+
* @openapi
|
|
77
|
+
* /providers/{providerId}/configuration:
|
|
78
|
+
* put:
|
|
79
|
+
* tags: [Providers]
|
|
80
|
+
* summary: Update provider configuration
|
|
81
|
+
* parameters:
|
|
82
|
+
* - name: providerId
|
|
83
|
+
* in: path
|
|
84
|
+
* required: true
|
|
85
|
+
* schema:
|
|
86
|
+
* type: string
|
|
87
|
+
* requestBody:
|
|
88
|
+
* required: true
|
|
89
|
+
* content:
|
|
90
|
+
* application/json:
|
|
91
|
+
* schema:
|
|
92
|
+
* type: object
|
|
93
|
+
* properties:
|
|
94
|
+
* apiEndpoint:
|
|
95
|
+
* type: string
|
|
96
|
+
* format: uri
|
|
97
|
+
* description: API endpoint URL
|
|
98
|
+
* webhookUrl:
|
|
99
|
+
* type: string
|
|
100
|
+
* format: uri
|
|
101
|
+
* description: Webhook URL for notifications
|
|
102
|
+
* defaultSettings:
|
|
103
|
+
* type: object
|
|
104
|
+
* description: Provider-specific default settings
|
|
105
|
+
* responses:
|
|
106
|
+
* 200:
|
|
107
|
+
* description: Configuration updated successfully
|
|
108
|
+
* 400:
|
|
109
|
+
* description: Invalid configuration data
|
|
110
|
+
* 404:
|
|
111
|
+
* description: Provider configuration not found
|
|
112
|
+
*/
|
|
113
|
+
updateProviderConfiguration(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
114
|
+
/**
|
|
115
|
+
* @openapi
|
|
116
|
+
* /providers/{providerId}/test:
|
|
117
|
+
* post:
|
|
118
|
+
* tags: [Providers]
|
|
119
|
+
* summary: Test connection to a provider
|
|
120
|
+
* parameters:
|
|
121
|
+
* - name: providerId
|
|
122
|
+
* in: path
|
|
123
|
+
* required: true
|
|
124
|
+
* schema:
|
|
125
|
+
* type: string
|
|
126
|
+
* responses:
|
|
127
|
+
* 200:
|
|
128
|
+
* description: Connection test completed
|
|
129
|
+
* 400:
|
|
130
|
+
* description: Connection test failed
|
|
131
|
+
* 404:
|
|
132
|
+
* description: Provider configuration not found
|
|
133
|
+
*/
|
|
134
|
+
testConnection(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
135
|
+
/**
|
|
136
|
+
* @openapi
|
|
137
|
+
* /providers/{providerId}:
|
|
138
|
+
* delete:
|
|
139
|
+
* tags: [Providers]
|
|
140
|
+
* summary: Remove provider configuration
|
|
141
|
+
* parameters:
|
|
142
|
+
* - name: providerId
|
|
143
|
+
* in: path
|
|
144
|
+
* required: true
|
|
145
|
+
* schema:
|
|
146
|
+
* type: string
|
|
147
|
+
* responses:
|
|
148
|
+
* 200:
|
|
149
|
+
* description: Configuration removed successfully
|
|
150
|
+
*/
|
|
151
|
+
removeProvider(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
|
|
152
|
+
/**
|
|
153
|
+
* @openapi
|
|
154
|
+
*
|
|
155
|
+
* /providers/{providerId}/did/import:
|
|
156
|
+
* post:
|
|
157
|
+
* tags: [ Providers ]
|
|
158
|
+
* summary: Import a DID into a Provider.
|
|
159
|
+
* description: This endpoint imports a decentralized identifier associated with the user's account with the custodied keys into a provider.
|
|
160
|
+
* parameters:
|
|
161
|
+
* - name: providerId
|
|
162
|
+
* in: path
|
|
163
|
+
* required: true
|
|
164
|
+
* schema:
|
|
165
|
+
* type: string
|
|
166
|
+
* requestBody:
|
|
167
|
+
* content:
|
|
168
|
+
* application/x-www-form-urlencoded:
|
|
169
|
+
* schema:
|
|
170
|
+
* type: object
|
|
171
|
+
* required:
|
|
172
|
+
* - did
|
|
173
|
+
* properties:
|
|
174
|
+
* did:
|
|
175
|
+
* description: DID identifier to resolve.
|
|
176
|
+
* type: string
|
|
177
|
+
* application/json:
|
|
178
|
+
* schema:
|
|
179
|
+
* type: object
|
|
180
|
+
* required:
|
|
181
|
+
* - did
|
|
182
|
+
* properties:
|
|
183
|
+
* did:
|
|
184
|
+
* description: DID identifier to resolve.
|
|
185
|
+
* type: string
|
|
186
|
+
* responses:
|
|
187
|
+
* 200:
|
|
188
|
+
* description: The request was successful.
|
|
189
|
+
* content:
|
|
190
|
+
* application/json:
|
|
191
|
+
* schema:
|
|
192
|
+
* $ref: '#/components/schemas/DidResult'
|
|
193
|
+
* 400:
|
|
194
|
+
* description: A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
|
|
195
|
+
* content:
|
|
196
|
+
* application/json:
|
|
197
|
+
* schema:
|
|
198
|
+
* $ref: '#/components/schemas/InvalidRequest'
|
|
199
|
+
* example:
|
|
200
|
+
* error: InvalidRequest
|
|
201
|
+
* 401:
|
|
202
|
+
* $ref: '#/components/schemas/UnauthorizedError'
|
|
203
|
+
* 500:
|
|
204
|
+
* description: An internal error has occurred. Additional state information plus metadata may be available in the response body.
|
|
205
|
+
* content:
|
|
206
|
+
* application/json:
|
|
207
|
+
* schema:
|
|
208
|
+
* $ref: '#/components/schemas/InvalidRequest'
|
|
209
|
+
* example:
|
|
210
|
+
* error: Internal Error
|
|
211
|
+
*/
|
|
212
|
+
importDid(request: Request, response: Response): Promise<Response<any, Record<string, any>>>;
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=providers.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.controller.d.ts","sourceRoot":"","sources":["../../../src/controllers/api/providers.controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAajD,qBAAa,mBAAmB;IAC/B,OAAc,kBAAkB,yTAG9B;IAEF;;;;;;;;;;;;;;;;;;;OAmBG;IACG,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAW9C;;;;;;;;;;OAUG;IACG,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IA6BpD;;;;;;;;;;;;;;;OAeG;IACG,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IA2C1D;;;;;;;;;;;;;;;;;;;OAmBG;IACG,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAgClD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqCG;IACG,2BAA2B,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAyE7D;;;;;;;;;;;;;;;;;;;OAmBG;IACG,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAsBhD;;;;;;;;;;;;;;;OAeG;IACG,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ;IAiBhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2DG;IAEU,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ;CA4C3D"}
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { StatusCodes } from 'http-status-codes';
|
|
8
|
+
import { ProviderService } from '../../services/api/provider.service.js';
|
|
9
|
+
import { validate } from '../validator/decorator.js';
|
|
10
|
+
import { DockIdentityService } from '../../services/identity/providers/index.js';
|
|
11
|
+
import { IdentityServiceStrategySetup } from '../../services/identity/index.js';
|
|
12
|
+
import { OperationCategoryNameEnum, OperationNameEnum } from '../../types/constants.js';
|
|
13
|
+
import { eventTracker } from '../../services/track/tracker.js';
|
|
14
|
+
import { check, param } from '../validator/index.js';
|
|
15
|
+
export class ProvidersController {
|
|
16
|
+
static importDIDValidator = [
|
|
17
|
+
check('did').exists().isDID().bail(),
|
|
18
|
+
param('providerId').exists().withMessage('providerId is required').isString().bail(),
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* @openapi
|
|
22
|
+
* /providers:
|
|
23
|
+
* get:
|
|
24
|
+
* tags: [Providers]
|
|
25
|
+
* summary: Get all available credential providers
|
|
26
|
+
* description: Returns list of available credential providers
|
|
27
|
+
* responses:
|
|
28
|
+
* 200:
|
|
29
|
+
* description: Successful response
|
|
30
|
+
* content:
|
|
31
|
+
* application/json:
|
|
32
|
+
* schema:
|
|
33
|
+
* type: object
|
|
34
|
+
* properties:
|
|
35
|
+
* providers:
|
|
36
|
+
* type: array
|
|
37
|
+
* items:
|
|
38
|
+
* type: object
|
|
39
|
+
*/
|
|
40
|
+
async getProviders(req, res) {
|
|
41
|
+
try {
|
|
42
|
+
const providers = await ProviderService.instance.getAllProviders();
|
|
43
|
+
return res.status(StatusCodes.OK).json({ providers });
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
47
|
+
error: `Internal error: ${error?.message || error}`,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @openapi
|
|
53
|
+
* /providers/activated:
|
|
54
|
+
* get:
|
|
55
|
+
* tags: [Providers]
|
|
56
|
+
* summary: Get customer's activated providers
|
|
57
|
+
* description: Returns list of providers activated by the customer
|
|
58
|
+
* responses:
|
|
59
|
+
* 200:
|
|
60
|
+
* description: Successful response
|
|
61
|
+
*/
|
|
62
|
+
async getActiveProviders(req, res) {
|
|
63
|
+
try {
|
|
64
|
+
const customer = res.locals.customer;
|
|
65
|
+
const configurations = await ProviderService.instance.getCustomerConfigurations(customer.customerId);
|
|
66
|
+
const configuredProviders = configurations.map((config) => ({
|
|
67
|
+
configId: config.configId,
|
|
68
|
+
providerId: config.providerId,
|
|
69
|
+
tenantId: config.tenantId,
|
|
70
|
+
providerName: config.provider.name,
|
|
71
|
+
providerType: config.provider.providerType,
|
|
72
|
+
apiEndpoint: config.apiEndpoint,
|
|
73
|
+
webhookUrl: config.webhookUrl,
|
|
74
|
+
validated: config.validated,
|
|
75
|
+
validatedAt: config.validatedAt,
|
|
76
|
+
active: config.active,
|
|
77
|
+
defaultSettings: config.defaultSettings,
|
|
78
|
+
createdAt: config.createdAt,
|
|
79
|
+
updatedAt: config.updatedAt,
|
|
80
|
+
}));
|
|
81
|
+
return res.status(StatusCodes.OK).json({ providers: configuredProviders });
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
85
|
+
error: `Internal error: ${error?.message || error}`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* @openapi
|
|
91
|
+
* /providers/{providerId}/configuration:
|
|
92
|
+
* get:
|
|
93
|
+
* tags: [Providers]
|
|
94
|
+
* summary: Get provider configuration
|
|
95
|
+
* parameters:
|
|
96
|
+
* - name: providerId
|
|
97
|
+
* in: path
|
|
98
|
+
* required: true
|
|
99
|
+
* schema:
|
|
100
|
+
* type: string
|
|
101
|
+
* responses:
|
|
102
|
+
* 200:
|
|
103
|
+
* description: Provider configuration
|
|
104
|
+
*/
|
|
105
|
+
async getProviderConfiguration(req, res) {
|
|
106
|
+
try {
|
|
107
|
+
const customer = res.locals.customer;
|
|
108
|
+
const { providerId } = req.params;
|
|
109
|
+
const config = await ProviderService.instance.getProviderConfiguration(customer.customerId, providerId);
|
|
110
|
+
if (!config) {
|
|
111
|
+
return res.status(StatusCodes.NOT_FOUND).json({
|
|
112
|
+
error: `No configuration found for provider ${providerId}`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// Don't return encrypted API key
|
|
116
|
+
const safeConfig = {
|
|
117
|
+
configId: config.configId,
|
|
118
|
+
providerId: config.providerId,
|
|
119
|
+
tenantId: config.tenantId,
|
|
120
|
+
apiEndpoint: config.apiEndpoint,
|
|
121
|
+
webhookUrl: config.webhookUrl,
|
|
122
|
+
validated: config.validated,
|
|
123
|
+
validatedAt: config.validatedAt,
|
|
124
|
+
active: config.active,
|
|
125
|
+
defaultSettings: config.defaultSettings,
|
|
126
|
+
hasApiKey: !!config.encryptedApiKey,
|
|
127
|
+
provider: {
|
|
128
|
+
name: config.provider.name,
|
|
129
|
+
description: config.provider.description,
|
|
130
|
+
providerType: config.provider.providerType,
|
|
131
|
+
supportedFormats: config.provider.supportedFormats,
|
|
132
|
+
supportedProtocols: config.provider.supportedProtocols,
|
|
133
|
+
metadata: config.provider.metadata,
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
return res.status(StatusCodes.OK).json({ configuration: safeConfig });
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
140
|
+
error: `Internal error: ${error?.message || error}`,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* @openapi
|
|
146
|
+
* /providers/{providerId}/activate:
|
|
147
|
+
* post:
|
|
148
|
+
* tags: [Providers]
|
|
149
|
+
* summary: Activate a provider for the customer
|
|
150
|
+
* parameters:
|
|
151
|
+
* - name: providerId
|
|
152
|
+
* in: path
|
|
153
|
+
* required: true
|
|
154
|
+
* schema:
|
|
155
|
+
* type: string
|
|
156
|
+
* responses:
|
|
157
|
+
* 200:
|
|
158
|
+
* description: Provider activated successfully
|
|
159
|
+
* 400:
|
|
160
|
+
* description: Invalid provider or already activated
|
|
161
|
+
* 404:
|
|
162
|
+
* description: Provider not found
|
|
163
|
+
*/
|
|
164
|
+
async activateProvider(req, res) {
|
|
165
|
+
try {
|
|
166
|
+
const customer = res.locals.customer;
|
|
167
|
+
const { providerId } = req.params;
|
|
168
|
+
const config = await ProviderService.instance.activateProvider(customer.customerId, providerId);
|
|
169
|
+
return res.status(StatusCodes.OK).json({
|
|
170
|
+
message: 'Provider activated successfully',
|
|
171
|
+
configuration: {
|
|
172
|
+
configId: config.configId,
|
|
173
|
+
providerId: config.providerId,
|
|
174
|
+
tenantId: config.tenantId,
|
|
175
|
+
providerName: config.provider.name,
|
|
176
|
+
apiEndpoint: config.apiEndpoint,
|
|
177
|
+
active: config.active,
|
|
178
|
+
createdAt: config.createdAt,
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
const status = error?.message.includes('not found')
|
|
184
|
+
? StatusCodes.NOT_FOUND
|
|
185
|
+
: error?.message.includes('already activated')
|
|
186
|
+
? StatusCodes.CONFLICT
|
|
187
|
+
: StatusCodes.BAD_REQUEST;
|
|
188
|
+
return res.status(status).json({
|
|
189
|
+
error: `Activation failed: ${error?.message || error}`,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* @openapi
|
|
195
|
+
* /providers/{providerId}/configuration:
|
|
196
|
+
* put:
|
|
197
|
+
* tags: [Providers]
|
|
198
|
+
* summary: Update provider configuration
|
|
199
|
+
* parameters:
|
|
200
|
+
* - name: providerId
|
|
201
|
+
* in: path
|
|
202
|
+
* required: true
|
|
203
|
+
* schema:
|
|
204
|
+
* type: string
|
|
205
|
+
* requestBody:
|
|
206
|
+
* required: true
|
|
207
|
+
* content:
|
|
208
|
+
* application/json:
|
|
209
|
+
* schema:
|
|
210
|
+
* type: object
|
|
211
|
+
* properties:
|
|
212
|
+
* apiEndpoint:
|
|
213
|
+
* type: string
|
|
214
|
+
* format: uri
|
|
215
|
+
* description: API endpoint URL
|
|
216
|
+
* webhookUrl:
|
|
217
|
+
* type: string
|
|
218
|
+
* format: uri
|
|
219
|
+
* description: Webhook URL for notifications
|
|
220
|
+
* defaultSettings:
|
|
221
|
+
* type: object
|
|
222
|
+
* description: Provider-specific default settings
|
|
223
|
+
* responses:
|
|
224
|
+
* 200:
|
|
225
|
+
* description: Configuration updated successfully
|
|
226
|
+
* 400:
|
|
227
|
+
* description: Invalid configuration data
|
|
228
|
+
* 404:
|
|
229
|
+
* description: Provider configuration not found
|
|
230
|
+
*/
|
|
231
|
+
async updateProviderConfiguration(req, res) {
|
|
232
|
+
try {
|
|
233
|
+
const customer = res.locals.customer;
|
|
234
|
+
const { providerId } = req.params;
|
|
235
|
+
const { apiEndpoint, webhookUrl, defaultSettings } = req.body;
|
|
236
|
+
// Validate input
|
|
237
|
+
if (apiEndpoint && typeof apiEndpoint !== 'string') {
|
|
238
|
+
return res.status(StatusCodes.BAD_REQUEST).json({
|
|
239
|
+
error: 'Invalid API endpoint: must be a string',
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
if (webhookUrl && typeof webhookUrl !== 'string') {
|
|
243
|
+
return res.status(StatusCodes.BAD_REQUEST).json({
|
|
244
|
+
error: 'Invalid webhook URL: must be a string',
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
if (process.env.APPLICATION_BASE_URL?.includes('localhost')) {
|
|
248
|
+
console.warn('Skipping URL validation in local development environment');
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
if (apiEndpoint && !apiEndpoint.startsWith('https://')) {
|
|
252
|
+
return res.status(StatusCodes.BAD_REQUEST).json({
|
|
253
|
+
error: 'API endpoint must be a valid HTTPS URL',
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
if (webhookUrl && webhookUrl.trim() && !webhookUrl.startsWith('https://')) {
|
|
257
|
+
return res.status(StatusCodes.BAD_REQUEST).json({
|
|
258
|
+
error: 'Webhook URL must be a valid HTTPS URL',
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const updatedConfig = await ProviderService.instance.updateProviderConfiguration(customer.customerId, providerId, {
|
|
263
|
+
apiEndpoint: apiEndpoint?.trim() || undefined,
|
|
264
|
+
webhookUrl: webhookUrl?.trim() || undefined,
|
|
265
|
+
defaultSettings: defaultSettings || undefined,
|
|
266
|
+
});
|
|
267
|
+
const safeConfig = {
|
|
268
|
+
configId: updatedConfig.configId,
|
|
269
|
+
providerId: updatedConfig.providerId,
|
|
270
|
+
apiEndpoint: updatedConfig.apiEndpoint,
|
|
271
|
+
webhookUrl: updatedConfig.webhookUrl,
|
|
272
|
+
validated: updatedConfig.validated,
|
|
273
|
+
validatedAt: updatedConfig.validatedAt,
|
|
274
|
+
active: updatedConfig.active,
|
|
275
|
+
defaultSettings: updatedConfig.defaultSettings,
|
|
276
|
+
hasApiKey: !!updatedConfig.encryptedApiKey,
|
|
277
|
+
updatedAt: updatedConfig.updatedAt,
|
|
278
|
+
};
|
|
279
|
+
return res.status(StatusCodes.OK).json({
|
|
280
|
+
message: 'Provider configuration updated successfully',
|
|
281
|
+
data: safeConfig,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
catch (error) {
|
|
285
|
+
const status = error?.message.includes('not found')
|
|
286
|
+
? StatusCodes.NOT_FOUND
|
|
287
|
+
: StatusCodes.BAD_REQUEST;
|
|
288
|
+
return res.status(status).json({
|
|
289
|
+
error: `Configuration update failed: ${error?.message || error}`,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* @openapi
|
|
295
|
+
* /providers/{providerId}/test:
|
|
296
|
+
* post:
|
|
297
|
+
* tags: [Providers]
|
|
298
|
+
* summary: Test connection to a provider
|
|
299
|
+
* parameters:
|
|
300
|
+
* - name: providerId
|
|
301
|
+
* in: path
|
|
302
|
+
* required: true
|
|
303
|
+
* schema:
|
|
304
|
+
* type: string
|
|
305
|
+
* responses:
|
|
306
|
+
* 200:
|
|
307
|
+
* description: Connection test completed
|
|
308
|
+
* 400:
|
|
309
|
+
* description: Connection test failed
|
|
310
|
+
* 404:
|
|
311
|
+
* description: Provider configuration not found
|
|
312
|
+
*/
|
|
313
|
+
async testConnection(req, res) {
|
|
314
|
+
try {
|
|
315
|
+
const customer = res.locals.customer;
|
|
316
|
+
const { providerId } = req.params;
|
|
317
|
+
const result = await ProviderService.instance.testConnection(customer.customerId, providerId);
|
|
318
|
+
const statusCode = result.success ? StatusCodes.OK : StatusCodes.BAD_REQUEST;
|
|
319
|
+
return res.status(statusCode).json({
|
|
320
|
+
providerId,
|
|
321
|
+
success: result.success,
|
|
322
|
+
message: result.message,
|
|
323
|
+
testedAt: new Date().toISOString(),
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
328
|
+
error: `Connection test failed: ${error?.message || error}`,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* @openapi
|
|
334
|
+
* /providers/{providerId}:
|
|
335
|
+
* delete:
|
|
336
|
+
* tags: [Providers]
|
|
337
|
+
* summary: Remove provider configuration
|
|
338
|
+
* parameters:
|
|
339
|
+
* - name: providerId
|
|
340
|
+
* in: path
|
|
341
|
+
* required: true
|
|
342
|
+
* schema:
|
|
343
|
+
* type: string
|
|
344
|
+
* responses:
|
|
345
|
+
* 200:
|
|
346
|
+
* description: Configuration removed successfully
|
|
347
|
+
*/
|
|
348
|
+
async removeProvider(req, res) {
|
|
349
|
+
try {
|
|
350
|
+
const customer = res.locals.customer;
|
|
351
|
+
const { providerId } = req.params;
|
|
352
|
+
await ProviderService.instance.deleteConfiguration(customer.customerId, providerId);
|
|
353
|
+
return res.status(StatusCodes.OK).json({
|
|
354
|
+
message: `Provider ${providerId} configuration removed successfully`,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
return res.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
359
|
+
error: `Internal error: ${error?.message || error}`,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* @openapi
|
|
365
|
+
*
|
|
366
|
+
* /providers/{providerId}/did/import:
|
|
367
|
+
* post:
|
|
368
|
+
* tags: [ Providers ]
|
|
369
|
+
* summary: Import a DID into a Provider.
|
|
370
|
+
* description: This endpoint imports a decentralized identifier associated with the user's account with the custodied keys into a provider.
|
|
371
|
+
* parameters:
|
|
372
|
+
* - name: providerId
|
|
373
|
+
* in: path
|
|
374
|
+
* required: true
|
|
375
|
+
* schema:
|
|
376
|
+
* type: string
|
|
377
|
+
* requestBody:
|
|
378
|
+
* content:
|
|
379
|
+
* application/x-www-form-urlencoded:
|
|
380
|
+
* schema:
|
|
381
|
+
* type: object
|
|
382
|
+
* required:
|
|
383
|
+
* - did
|
|
384
|
+
* properties:
|
|
385
|
+
* did:
|
|
386
|
+
* description: DID identifier to resolve.
|
|
387
|
+
* type: string
|
|
388
|
+
* application/json:
|
|
389
|
+
* schema:
|
|
390
|
+
* type: object
|
|
391
|
+
* required:
|
|
392
|
+
* - did
|
|
393
|
+
* properties:
|
|
394
|
+
* did:
|
|
395
|
+
* description: DID identifier to resolve.
|
|
396
|
+
* type: string
|
|
397
|
+
* responses:
|
|
398
|
+
* 200:
|
|
399
|
+
* description: The request was successful.
|
|
400
|
+
* content:
|
|
401
|
+
* application/json:
|
|
402
|
+
* schema:
|
|
403
|
+
* $ref: '#/components/schemas/DidResult'
|
|
404
|
+
* 400:
|
|
405
|
+
* description: A problem with the input fields has occurred. Additional state information plus metadata may be available in the response body.
|
|
406
|
+
* content:
|
|
407
|
+
* application/json:
|
|
408
|
+
* schema:
|
|
409
|
+
* $ref: '#/components/schemas/InvalidRequest'
|
|
410
|
+
* example:
|
|
411
|
+
* error: InvalidRequest
|
|
412
|
+
* 401:
|
|
413
|
+
* $ref: '#/components/schemas/UnauthorizedError'
|
|
414
|
+
* 500:
|
|
415
|
+
* description: An internal error has occurred. Additional state information plus metadata may be available in the response body.
|
|
416
|
+
* content:
|
|
417
|
+
* application/json:
|
|
418
|
+
* schema:
|
|
419
|
+
* $ref: '#/components/schemas/InvalidRequest'
|
|
420
|
+
* example:
|
|
421
|
+
* error: Internal Error
|
|
422
|
+
*/
|
|
423
|
+
async importDid(request, response) {
|
|
424
|
+
try {
|
|
425
|
+
const { providerId } = request.params;
|
|
426
|
+
const { did } = request.body;
|
|
427
|
+
let importedResult;
|
|
428
|
+
switch (providerId) {
|
|
429
|
+
case 'dock':
|
|
430
|
+
const identityServiceStrategySetup = new IdentityServiceStrategySetup(response.locals.customer);
|
|
431
|
+
const exportedResult = await identityServiceStrategySetup.agent.exportDid(did, process.env.PROVIDER_EXPORT_PASSWORD || '', response.locals.customer);
|
|
432
|
+
importedResult = await new DockIdentityService().importDidV2(did, exportedResult, process.env.PROVIDER_EXPORT_PASSWORD || '', response.locals.customer);
|
|
433
|
+
break;
|
|
434
|
+
default:
|
|
435
|
+
throw new Error(`Importing into provider ${providerId || 'studio'} is not supported`);
|
|
436
|
+
}
|
|
437
|
+
// Track the operation
|
|
438
|
+
eventTracker.emit('track', {
|
|
439
|
+
category: OperationCategoryNameEnum.DID,
|
|
440
|
+
name: OperationNameEnum.DID_EXPORT,
|
|
441
|
+
data: {
|
|
442
|
+
did: did,
|
|
443
|
+
},
|
|
444
|
+
customer: response.locals.customer,
|
|
445
|
+
user: response.locals.user,
|
|
446
|
+
});
|
|
447
|
+
return response.status(StatusCodes.OK).json({
|
|
448
|
+
status: true,
|
|
449
|
+
...importedResult,
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
catch (error) {
|
|
453
|
+
return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
454
|
+
error: `Internal error: ${error?.message || error}`,
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
__decorate([
|
|
460
|
+
validate
|
|
461
|
+
], ProvidersController.prototype, "importDid", null);
|
|
462
|
+
//# sourceMappingURL=providers.controller.js.map
|