@sphereon/ssi-sdk.vc-status-list-issuer-rest-api 0.32.1-feature.VDX.341.56 → 0.32.1-feature.oid4vp.rest.api.improv.bootcamp.187
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/api-functions.d.ts +1 -1
- package/dist/api-functions.d.ts.map +1 -1
- package/dist/api-functions.js +73 -51
- package/dist/api-functions.js.map +1 -1
- package/dist/statuslist-management-api-server.js +1 -1
- package/dist/statuslist-management-api-server.js.map +1 -1
- package/dist/types.d.ts +7 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +11 -10
- package/src/api-functions.ts +110 -50
- package/src/statuslist-management-api-server.ts +2 -2
- package/src/types.ts +8 -1
package/dist/api-functions.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ import { ICredentialStatusListEndpointOpts, IRequiredContext, IW3CredentialStatu
|
|
|
3
3
|
export declare function createNewStatusListEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts): void;
|
|
4
4
|
export declare function getStatusListCredentialEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts): void;
|
|
5
5
|
export declare function getStatusListCredentialIndexStatusEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts): void;
|
|
6
|
-
export declare function
|
|
6
|
+
export declare function updateStatusEndpoint(router: Router, context: IRequiredContext, opts: IW3CredentialStatusEndpointOpts): void;
|
|
7
7
|
//# sourceMappingURL=api-functions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-functions.d.ts","sourceRoot":"","sources":["../src/api-functions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-functions.d.ts","sourceRoot":"","sources":["../src/api-functions.ts"],"names":[],"mappings":"AASA,OAAO,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAA;AACnD,OAAO,EACL,iCAAiC,EACjC,gBAAgB,EAChB,+BAA+B,EAGhC,MAAM,SAAS,CAAA;AAqBhB,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,iCAAiC,QAoB7H;AAgBD,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,iCAAiC,QAsBjI;AAED,wBAAgB,0CAA0C,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,iCAAiC,QA0D5I;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,+BAA+B,QA0FpH"}
|
package/dist/api-functions.js
CHANGED
|
@@ -15,12 +15,25 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.createNewStatusListEndpoint = createNewStatusListEndpoint;
|
|
16
16
|
exports.getStatusListCredentialEndpoint = getStatusListCredentialEndpoint;
|
|
17
17
|
exports.getStatusListCredentialIndexStatusEndpoint = getStatusListCredentialIndexStatusEndpoint;
|
|
18
|
-
exports.
|
|
18
|
+
exports.updateStatusEndpoint = updateStatusEndpoint;
|
|
19
19
|
const ssi_express_support_1 = require("@sphereon/ssi-express-support");
|
|
20
20
|
const ssi_sdk_vc_status_list_1 = require("@sphereon/ssi-sdk.vc-status-list");
|
|
21
21
|
const ssi_sdk_vc_status_list_issuer_drivers_1 = require("@sphereon/ssi-sdk.vc-status-list-issuer-drivers");
|
|
22
22
|
const debug_1 = __importDefault(require("debug"));
|
|
23
|
+
const ssi_types_1 = require("@sphereon/ssi-types");
|
|
23
24
|
const debug = (0, debug_1.default)('sphereon:ssi-sdk:status-list');
|
|
25
|
+
function sendStatuslistResponse(details, statuslistPayload, response) {
|
|
26
|
+
let payload;
|
|
27
|
+
switch (details.proofFormat) {
|
|
28
|
+
case 'jwt':
|
|
29
|
+
case 'cbor':
|
|
30
|
+
payload = Buffer.from(statuslistPayload, 'ascii');
|
|
31
|
+
break;
|
|
32
|
+
default:
|
|
33
|
+
payload = statuslistPayload;
|
|
34
|
+
}
|
|
35
|
+
return response.status(200).setHeader('Content-Type', details.statuslistContentType).send(payload);
|
|
36
|
+
}
|
|
24
37
|
function createNewStatusListEndpoint(router, context, opts) {
|
|
25
38
|
var _a;
|
|
26
39
|
if ((opts === null || opts === void 0 ? void 0 : opts.enabled) === false) {
|
|
@@ -34,8 +47,9 @@ function createNewStatusListEndpoint(router, context, opts) {
|
|
|
34
47
|
if (!statusListArgs) {
|
|
35
48
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, 'No statusList details supplied');
|
|
36
49
|
}
|
|
37
|
-
const
|
|
38
|
-
|
|
50
|
+
const details = yield context.agent.slCreateStatusList(statusListArgs);
|
|
51
|
+
const statuslistPayload = details.statusListCredential;
|
|
52
|
+
return sendStatuslistResponse(details, statuslistPayload, response);
|
|
39
53
|
}
|
|
40
54
|
catch (e) {
|
|
41
55
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 500, e.message, e);
|
|
@@ -43,14 +57,15 @@ function createNewStatusListEndpoint(router, context, opts) {
|
|
|
43
57
|
}));
|
|
44
58
|
}
|
|
45
59
|
const buildStatusListId = (request) => {
|
|
46
|
-
var _a, _b, _c, _d, _e;
|
|
60
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
47
61
|
const protocol = (_b = (_a = request.headers['x-forwarded-proto']) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : request.protocol;
|
|
48
62
|
let host = (_d = (_c = request.headers['x-forwarded-host']) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : request.get('host');
|
|
49
63
|
const forwardedPort = (_e = request.headers['x-forwarded-port']) === null || _e === void 0 ? void 0 : _e.toString();
|
|
50
64
|
if (forwardedPort && !(protocol === 'https' && forwardedPort === '443') && !(protocol === 'http' && forwardedPort === '80')) {
|
|
51
65
|
host += `:${forwardedPort}`;
|
|
52
66
|
}
|
|
53
|
-
|
|
67
|
+
const forwardedPrefix = (_g = (_f = request.headers['x-forwarded-prefix']) === null || _f === void 0 ? void 0 : _f.toString()) !== null && _g !== void 0 ? _g : '';
|
|
68
|
+
return `${protocol}://${host}${forwardedPrefix}${request.originalUrl.split('?')[0].replace(/\/status\/index\/.*/, '')}`;
|
|
54
69
|
};
|
|
55
70
|
function getStatusListCredentialEndpoint(router, context, opts) {
|
|
56
71
|
var _a;
|
|
@@ -60,14 +75,15 @@ function getStatusListCredentialEndpoint(router, context, opts) {
|
|
|
60
75
|
}
|
|
61
76
|
const path = (_a = opts === null || opts === void 0 ? void 0 : opts.path) !== null && _a !== void 0 ? _a : '/status-lists/:index';
|
|
62
77
|
router.get(path, (0, ssi_express_support_1.checkAuth)(opts === null || opts === void 0 ? void 0 : opts.endpoint), (request, response) => __awaiter(this, void 0, void 0, function* () {
|
|
63
|
-
var _a
|
|
78
|
+
var _a;
|
|
64
79
|
try {
|
|
65
80
|
//todo: Check index against correlationId first. Then match originalUrl against statusList id
|
|
66
|
-
const correlationId =
|
|
67
|
-
const
|
|
81
|
+
//const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these
|
|
82
|
+
const correlationId = (_a = request.query.correlationId) === null || _a === void 0 ? void 0 : _a.toString();
|
|
83
|
+
const driver = yield (0, ssi_sdk_vc_status_list_issuer_drivers_1.getDriver)(Object.assign(Object.assign({}, (correlationId ? { correlationId } : { id: buildStatusListId(request) })), { dbName: opts.dbName }));
|
|
68
84
|
const details = yield driver.getStatusList();
|
|
69
|
-
|
|
70
|
-
return
|
|
85
|
+
const statuslistPayload = details.statusListCredential;
|
|
86
|
+
return sendStatuslistResponse(details, statuslistPayload, response);
|
|
71
87
|
}
|
|
72
88
|
catch (e) {
|
|
73
89
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 500, e.message, e);
|
|
@@ -82,7 +98,7 @@ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
|
|
|
82
98
|
}
|
|
83
99
|
const path = (_a = opts === null || opts === void 0 ? void 0 : opts.path) !== null && _a !== void 0 ? _a : '/status-lists/:index/status/index/:statusListIndex';
|
|
84
100
|
router.get(path, (0, ssi_express_support_1.checkAuth)(opts === null || opts === void 0 ? void 0 : opts.endpoint), (request, response) => __awaiter(this, void 0, void 0, function* () {
|
|
85
|
-
var _a, _b, _c
|
|
101
|
+
var _a, _b, _c;
|
|
86
102
|
try {
|
|
87
103
|
//todo: Check index against correlationId first. Then match originalUrl against statusList id
|
|
88
104
|
const statusListIndexStr = request.params.statusListIndex;
|
|
@@ -96,23 +112,17 @@ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
|
|
|
96
112
|
if (!statusListIndex || statusListIndex < 0) {
|
|
97
113
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, `Please provide a proper statusListIndex`);
|
|
98
114
|
}
|
|
99
|
-
const correlationId =
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
correlationId,
|
|
103
|
-
dbName: opts.dbName,
|
|
104
|
-
});
|
|
115
|
+
//const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these
|
|
116
|
+
const statusListCorrelationId = (_a = request.query.correlationId) === null || _a === void 0 ? void 0 : _a.toString();
|
|
117
|
+
const driver = yield (0, ssi_sdk_vc_status_list_issuer_drivers_1.getDriver)(Object.assign(Object.assign({}, (statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) })), { dbName: opts.dbName }));
|
|
105
118
|
const details = yield driver.getStatusList();
|
|
106
119
|
if (statusListIndex > details.length) {
|
|
107
120
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, `Please provide a proper statusListIndex`);
|
|
108
121
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
errorOnNotFound: false,
|
|
114
|
-
});
|
|
115
|
-
const status = yield (0, ssi_sdk_vc_status_list_1.checkStatusIndexFromStatusListCredential)(Object.assign(Object.assign({}, details), { statusListIndex }));
|
|
122
|
+
const entityCorrelationId = (_b = request.query.entityCorrelationId) === null || _b === void 0 ? void 0 : _b.toString();
|
|
123
|
+
let entry = yield driver.getStatusListEntryByIndex(Object.assign(Object.assign({ statusListId: details.id }, (entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex: statusListIndex })), { errorOnNotFound: false }));
|
|
124
|
+
const type = details.type === ssi_types_1.StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type;
|
|
125
|
+
const status = yield (0, ssi_sdk_vc_status_list_1.checkStatusIndexFromStatusListCredential)(Object.assign(Object.assign({ statusListCredential: details.statusListCredential }, (details.type === ssi_types_1.StatusListType.StatusList2021 ? { statusPurpose: (_c = details.statusList2021) === null || _c === void 0 ? void 0 : _c.statusPurpose } : {})), { type, id: details.id, statusListIndex }));
|
|
116
126
|
if (!entry) {
|
|
117
127
|
// The fact we have nothing on it means the status is okay
|
|
118
128
|
entry = {
|
|
@@ -122,14 +132,14 @@ function getStatusListCredentialIndexStatusEndpoint(router, context, opts) {
|
|
|
122
132
|
};
|
|
123
133
|
}
|
|
124
134
|
response.statusCode = 200;
|
|
125
|
-
return response.send(Object.assign(Object.assign({}, entry), { status }));
|
|
135
|
+
return response.send(Object.assign(Object.assign({}, entry), { status })); // FIXME content type?
|
|
126
136
|
}
|
|
127
137
|
catch (e) {
|
|
128
138
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 500, e.message, e);
|
|
129
139
|
}
|
|
130
140
|
}));
|
|
131
141
|
}
|
|
132
|
-
function
|
|
142
|
+
function updateStatusEndpoint(router, context, opts) {
|
|
133
143
|
var _a;
|
|
134
144
|
if ((opts === null || opts === void 0 ? void 0 : opts.enabled) === false) {
|
|
135
145
|
console.log(`Update credential status endpoint is disabled`);
|
|
@@ -143,48 +153,60 @@ function updateW3CStatusEndpoint(router, context, opts) {
|
|
|
143
153
|
const statusListId = (_c = (_a = updateRequest.statusListId) !== null && _a !== void 0 ? _a : (_b = request.query.statusListId) === null || _b === void 0 ? void 0 : _b.toString()) !== null && _c !== void 0 ? _c : opts.statusListId;
|
|
144
154
|
const statusListCorrelationId = (_f = (_d = updateRequest.statusListCorrelationId) !== null && _d !== void 0 ? _d : (_e = request.query.statusListorrelationId) === null || _e === void 0 ? void 0 : _e.toString()) !== null && _f !== void 0 ? _f : opts.correlationId;
|
|
145
155
|
const entryCorrelationId = (_g = updateRequest.entryCorrelationId) !== null && _g !== void 0 ? _g : (_h = request.query.entryCorrelationId) === null || _h === void 0 ? void 0 : _h.toString();
|
|
146
|
-
const credentialId = updateRequest.credentialId;
|
|
147
156
|
// TODO: Move mostly to driver
|
|
148
|
-
if (!
|
|
149
|
-
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, 'No statusList
|
|
157
|
+
if (!statusListId && !statusListCorrelationId) {
|
|
158
|
+
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, 'No statusList id or correlation Id provided or deduced for the API or in the request');
|
|
150
159
|
}
|
|
151
160
|
else if (!updateRequest.credentialStatus || updateRequest.credentialStatus.length === 0) {
|
|
152
161
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, 'No statusList updates supplied');
|
|
153
162
|
}
|
|
154
|
-
|
|
155
|
-
|
|
163
|
+
const driver = yield (0, ssi_sdk_vc_status_list_issuer_drivers_1.getDriver)(Object.assign(Object.assign({}, (statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) })), { dbName: opts.dbName }));
|
|
164
|
+
// Get status list entry based on request type
|
|
165
|
+
let statusListEntry;
|
|
166
|
+
if ('credentialId' in updateRequest) {
|
|
167
|
+
if (!updateRequest.credentialId) {
|
|
168
|
+
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, 'No credentialId supplied');
|
|
169
|
+
}
|
|
170
|
+
// unfortunately the W3C API works by credentialId. Which means you will have to map listIndices during issuance
|
|
171
|
+
statusListEntry = yield driver.getStatusListEntryByCredentialId({
|
|
172
|
+
statusListId,
|
|
173
|
+
statusListCorrelationId,
|
|
174
|
+
entryCorrelationId,
|
|
175
|
+
credentialId: updateRequest.credentialId,
|
|
176
|
+
errorOnNotFound: true,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
if (!updateRequest.statusListIndex || updateRequest.statusListIndex < 0) {
|
|
181
|
+
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, 'Invalid statusListIndex supplied');
|
|
182
|
+
}
|
|
183
|
+
const driver = yield (0, ssi_sdk_vc_status_list_issuer_drivers_1.getDriver)(Object.assign(Object.assign({}, (statusListCorrelationId ? { statusListCorrelationId } : { id: buildStatusListId(request) })), { dbName: opts.dbName }));
|
|
184
|
+
const details = yield driver.getStatusList();
|
|
185
|
+
statusListEntry = yield driver.getStatusListEntryByIndex(Object.assign(Object.assign({ statusListId: details.id }, (entryCorrelationId ? { correlationId: entryCorrelationId } : { statusListIndex: updateRequest.statusListIndex })), { errorOnNotFound: true }));
|
|
156
186
|
}
|
|
157
|
-
const driver = yield (0, ssi_sdk_vc_status_list_issuer_drivers_1.getDriver)({ id: statusListId, correlationId: statusListCorrelationId, dbName: opts.dbName });
|
|
158
|
-
// unfortunately the W3C API works by credentialId. Which means you will have to map listIndices during issuance
|
|
159
|
-
const statusListEntry = yield driver.getStatusListEntryByCredentialId({
|
|
160
|
-
statusListId,
|
|
161
|
-
statusListCorrelationId,
|
|
162
|
-
entryCorrelationId,
|
|
163
|
-
credentialId,
|
|
164
|
-
errorOnNotFound: true,
|
|
165
|
-
});
|
|
166
187
|
if (!statusListEntry) {
|
|
167
|
-
|
|
188
|
+
const identifier = 'credentialId' in updateRequest ? updateRequest.credentialId : `index ${updateRequest.statusListIndex}`;
|
|
189
|
+
return (0, ssi_express_support_1.sendErrorResponse)(response, 404, `Status list entry for ${identifier} not found for ${statusListId}`);
|
|
168
190
|
}
|
|
169
|
-
const statusListIndex = statusListEntry.statusListIndex;
|
|
170
191
|
let details = yield driver.getStatusList();
|
|
171
192
|
let statusListCredential = details.statusListCredential;
|
|
172
193
|
for (const updateItem of updateRequest.credentialStatus) {
|
|
173
|
-
if (updateItem.type && updateItem.type !== 'StatusList2021') {
|
|
174
|
-
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, `Only the optional type 'StatusList2021' is currently supported`);
|
|
175
|
-
}
|
|
176
194
|
if (!updateItem.status) {
|
|
177
|
-
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, `Required 'status' value was missing in the credentialStatus array
|
|
195
|
+
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, `Required 'status' value was missing in the credentialStatus array`);
|
|
178
196
|
}
|
|
179
|
-
const value = updateItem.status === '0' || updateItem.status.toLowerCase() === 'false' ?
|
|
197
|
+
const value = updateItem.status === '0' || updateItem.status.toLowerCase() === 'false' ? '0' : '1';
|
|
180
198
|
const statusList = statusListId !== null && statusListId !== void 0 ? statusListId : statusListEntry.statusList;
|
|
181
|
-
yield driver.updateStatusListEntry(Object.assign(Object.assign({}, statusListEntry), {
|
|
199
|
+
yield driver.updateStatusListEntry(Object.assign(Object.assign({}, statusListEntry), { statusList, value }));
|
|
182
200
|
// todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well
|
|
183
|
-
details = yield (0, ssi_sdk_vc_status_list_1.updateStatusIndexFromStatusListCredential)({
|
|
201
|
+
details = yield (0, ssi_sdk_vc_status_list_1.updateStatusIndexFromStatusListCredential)({
|
|
202
|
+
statusListCredential: statusListCredential,
|
|
203
|
+
statusListIndex: statusListEntry.statusListIndex,
|
|
204
|
+
value: parseInt(value),
|
|
205
|
+
keyRef: opts.keyRef,
|
|
206
|
+
}, context);
|
|
184
207
|
details = yield driver.updateStatusList({ statusListCredential: details.statusListCredential });
|
|
185
208
|
}
|
|
186
|
-
|
|
187
|
-
return response.send(details.statusListCredential);
|
|
209
|
+
return sendStatuslistResponse(details, details.statusListCredential, response);
|
|
188
210
|
}
|
|
189
211
|
catch (e) {
|
|
190
212
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 500, e.message, e);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-functions.js","sourceRoot":"","sources":["../src/api-functions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"api-functions.js","sourceRoot":"","sources":["../src/api-functions.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,7 +36,7 @@ class StatuslistManagementApiServer {
|
|
|
36
36
|
(0, api_functions_1.getStatusListCredentialIndexStatusEndpoint)(this.router, context, opts.endpointOpts.getStatusList);
|
|
37
37
|
}
|
|
38
38
|
if (features.includes('w3c-vc-api-credential-status')) {
|
|
39
|
-
(0, api_functions_1.
|
|
39
|
+
(0, api_functions_1.updateStatusEndpoint)(this.router, context, opts.endpointOpts.vcApiCredentialStatus);
|
|
40
40
|
}
|
|
41
41
|
this._express.use((_d = (_c = opts === null || opts === void 0 ? void 0 : opts.endpointOpts) === null || _c === void 0 ? void 0 : _c.basePath) !== null && _d !== void 0 ? _d : '', this.router);
|
|
42
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"statuslist-management-api-server.js","sourceRoot":"","sources":["../src/statuslist-management-api-server.ts"],"names":[],"mappings":";;;;;;AAAA,uEAAwF;AACxF,yDAAqD;AAIrD,sDAAkD;AAClD,mDAKwB;AAIxB,MAAa,6BAA6B;IACxC,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAOD,YAAY,IAAoH;;QAC9H,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAY,0CAAE,UAAU,EAAE,CAAC;YACnC,IAAA,8CAAwB,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAC,CAAA;YAChE,IAAA,8CAAwB,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAC3D,IAAA,8CAAwB,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAA;QAC1D,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAA;QAC3C,IAAI,CAAC,OAAO,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;QAE/B,MAAM,OAAO,GAAG,IAAA,2BAAY,EAAC,KAAK,CAAC,CAAA;QAEnC,MAAM,QAAQ,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,cAAc,mCAAI,CAAC,wBAAwB,EAAE,qBAAqB,EAAE,8BAA8B,CAAC,CAAA;QAC1H,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAElF,qCAAqC;QACrC,IAAI,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAChD,IAAA,2CAA2B,EAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAA;QACvF,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC7C,IAAA,+CAA+B,EAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;YACtF,IAAA,0DAA0C,EAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;QACnG,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;YACtD,IAAA,
|
|
1
|
+
{"version":3,"file":"statuslist-management-api-server.js","sourceRoot":"","sources":["../src/statuslist-management-api-server.ts"],"names":[],"mappings":";;;;;;AAAA,uEAAwF;AACxF,yDAAqD;AAIrD,sDAAkD;AAClD,mDAKwB;AAIxB,MAAa,6BAA6B;IACxC,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAOD,YAAY,IAAoH;;QAC9H,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAY,0CAAE,UAAU,EAAE,CAAC;YACnC,IAAA,8CAAwB,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,uBAAuB,EAAE,CAAC,CAAA;YAChE,IAAA,8CAAwB,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,CAAA;YAC3D,IAAA,8CAAwB,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAA;QAC1D,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAA;QAC3C,IAAI,CAAC,OAAO,GAAG,iBAAO,CAAC,MAAM,EAAE,CAAA;QAE/B,MAAM,OAAO,GAAG,IAAA,2BAAY,EAAC,KAAK,CAAC,CAAA;QAEnC,MAAM,QAAQ,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,cAAc,mCAAI,CAAC,wBAAwB,EAAE,qBAAqB,EAAE,8BAA8B,CAAC,CAAA;QAC1H,OAAO,CAAC,GAAG,CAAC,2CAA2C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAElF,qCAAqC;QACrC,IAAI,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;YAChD,IAAA,2CAA2B,EAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAA;QACvF,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC7C,IAAA,+CAA+B,EAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;YACtF,IAAA,0DAA0C,EAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAA;QACnG,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE,CAAC;YACtD,IAAA,oCAAoB,EAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAA;QACrF,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAY,0CAAE,QAAQ,mCAAI,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IACpE,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;CACF;AArDD,sEAqDC;AAED;;;;;;;;;;;;EAYE"}
|
package/dist/types.d.ts
CHANGED
|
@@ -24,8 +24,13 @@ export interface IW3CredentialStatusEndpointOpts extends ICredentialStatusListEn
|
|
|
24
24
|
correlationId?: string;
|
|
25
25
|
keyRef?: string;
|
|
26
26
|
}
|
|
27
|
-
export interface UpdateCredentialStatusRequest {
|
|
27
|
+
export interface UpdateW3cCredentialStatusRequest extends UpdateCredentialStatusRequest {
|
|
28
28
|
credentialId: string;
|
|
29
|
+
}
|
|
30
|
+
export interface UpdateIndexedCredentialStatusRequest extends UpdateCredentialStatusRequest {
|
|
31
|
+
statusListIndex: number;
|
|
32
|
+
}
|
|
33
|
+
interface UpdateCredentialStatusRequest {
|
|
29
34
|
credentialStatus: UpdateCredentialStatusItem[];
|
|
30
35
|
statusListId?: string;
|
|
31
36
|
statusListCorrelationId?: string;
|
|
@@ -35,4 +40,5 @@ export interface UpdateCredentialStatusItem {
|
|
|
35
40
|
type?: StatusListType;
|
|
36
41
|
status: string;
|
|
37
42
|
}
|
|
43
|
+
export {};
|
|
38
44
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAA;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,CAAA;AAElF,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,uBAAuB,CAAA;IACrC,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAA;CACtC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,qBAAqB,EAAE,+BAA+B,CAAA;IACtD,gBAAgB,EAAE,iCAAiC,CAAA;IACnD,aAAa,EAAE,iCAAiC,CAAA;CACjD;AAED,MAAM,MAAM,kBAAkB,GAAG,8BAA8B,GAAG,wBAAwB,GAAG,qBAAqB,CAAA;AAElH,MAAM,WAAW,iCAAkC,SAAQ,mBAAmB;IAC5E,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,+BAAgC,SAAQ,iCAAiC;IACxF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,6BAA6B;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAA;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,CAAA;AAElF,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,uBAAuB,CAAA;IACrC,cAAc,CAAC,EAAE,kBAAkB,EAAE,CAAA;CACtC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,qBAAqB,EAAE,+BAA+B,CAAA;IACtD,gBAAgB,EAAE,iCAAiC,CAAA;IACnD,aAAa,EAAE,iCAAiC,CAAA;CACjD;AAED,MAAM,MAAM,kBAAkB,GAAG,8BAA8B,GAAG,wBAAwB,GAAG,qBAAqB,CAAA;AAElH,MAAM,WAAW,iCAAkC,SAAQ,mBAAmB;IAC5E,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,+BAAgC,SAAQ,iCAAiC;IACxF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,gCAAiC,SAAQ,6BAA6B;IACrF,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,oCAAqC,SAAQ,6BAA6B;IACzF,eAAe,EAAE,MAAM,CAAA;CACxB;AAED,UAAU,6BAA6B;IACrC,gBAAgB,EAAE,0BAA0B,EAAE,CAAA;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;CACf"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sphereon/ssi-sdk.vc-status-list-issuer-rest-api",
|
|
3
3
|
"description": "Sphereon SSI-SDK plugin for Status List management, like StatusList2021. Issuer drivers module",
|
|
4
|
-
"version": "0.32.1-feature.
|
|
4
|
+
"version": "0.32.1-feature.oid4vp.rest.api.improv.bootcamp.187+cb1cb474",
|
|
5
5
|
"source": "src/index.ts",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -12,14 +12,15 @@
|
|
|
12
12
|
"start:dev2": "node --experimental-specifier-resolution=node --loader ts-node/esm __tests__/agent.ts"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@sphereon/ssi-express-support": "0.32.1-feature.
|
|
15
|
+
"@sphereon/ssi-express-support": "0.32.1-feature.oid4vp.rest.api.improv.bootcamp.187+cb1cb474",
|
|
16
16
|
"@sphereon/ssi-sdk-ext.did-utils": "0.27.0",
|
|
17
17
|
"@sphereon/ssi-sdk-ext.identifier-resolution": "0.27.0",
|
|
18
|
-
"@sphereon/ssi-sdk.
|
|
19
|
-
"@sphereon/ssi-sdk.
|
|
20
|
-
"@sphereon/ssi-sdk.
|
|
21
|
-
"@sphereon/ssi-sdk.vc-status-list
|
|
22
|
-
"@sphereon/ssi-
|
|
18
|
+
"@sphereon/ssi-sdk-ext.jwt-service": "0.27.0",
|
|
19
|
+
"@sphereon/ssi-sdk.core": "0.32.1-feature.oid4vp.rest.api.improv.bootcamp.187+cb1cb474",
|
|
20
|
+
"@sphereon/ssi-sdk.data-store": "0.32.1-feature.oid4vp.rest.api.improv.bootcamp.187+cb1cb474",
|
|
21
|
+
"@sphereon/ssi-sdk.vc-status-list": "0.32.1-feature.oid4vp.rest.api.improv.bootcamp.187+cb1cb474",
|
|
22
|
+
"@sphereon/ssi-sdk.vc-status-list-issuer-drivers": "0.32.1-feature.oid4vp.rest.api.improv.bootcamp.187+cb1cb474",
|
|
23
|
+
"@sphereon/ssi-types": "0.32.1-feature.oid4vp.rest.api.improv.bootcamp.187+cb1cb474",
|
|
23
24
|
"@sphereon/vc-status-list": "7.0.0-next.0",
|
|
24
25
|
"@veramo/core": "4.2.0",
|
|
25
26
|
"debug": "^4.3.5",
|
|
@@ -33,9 +34,9 @@
|
|
|
33
34
|
"@sphereon/did-uni-client": "^0.6.3",
|
|
34
35
|
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.27.0",
|
|
35
36
|
"@sphereon/ssi-sdk-ext.did-resolver-jwk": "0.27.0",
|
|
36
|
-
"@sphereon/ssi-sdk.agent-config": "0.32.1-feature.
|
|
37
|
+
"@sphereon/ssi-sdk.agent-config": "0.32.1-feature.oid4vp.rest.api.improv.bootcamp.187+cb1cb474",
|
|
37
38
|
"@sphereon/ssi-sdk.data-store": "workspace:*",
|
|
38
|
-
"@sphereon/ssi-sdk.vc-handler-ld-local": "0.32.1-feature.
|
|
39
|
+
"@sphereon/ssi-sdk.vc-handler-ld-local": "0.32.1-feature.oid4vp.rest.api.improv.bootcamp.187+cb1cb474",
|
|
39
40
|
"@types/body-parser": "^1.19.5",
|
|
40
41
|
"@types/cookie-parser": "^1.4.7",
|
|
41
42
|
"@types/cors": "^2.8.17",
|
|
@@ -79,5 +80,5 @@
|
|
|
79
80
|
"StatusList2021"
|
|
80
81
|
],
|
|
81
82
|
"nx": {},
|
|
82
|
-
"gitHead": "
|
|
83
|
+
"gitHead": "cb1cb474f6b670933f9bd5ea40da9dc421d5585f"
|
|
83
84
|
}
|
package/src/api-functions.ts
CHANGED
|
@@ -2,15 +2,39 @@ import { checkAuth, sendErrorResponse } from '@sphereon/ssi-express-support'
|
|
|
2
2
|
import {
|
|
3
3
|
checkStatusIndexFromStatusListCredential,
|
|
4
4
|
CreateNewStatusListFuncArgs,
|
|
5
|
+
StatusListResult,
|
|
5
6
|
updateStatusIndexFromStatusListCredential,
|
|
6
7
|
} from '@sphereon/ssi-sdk.vc-status-list'
|
|
7
8
|
import { getDriver } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'
|
|
8
9
|
import Debug from 'debug'
|
|
9
10
|
import { Request, Response, Router } from 'express'
|
|
10
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
ICredentialStatusListEndpointOpts,
|
|
13
|
+
IRequiredContext,
|
|
14
|
+
IW3CredentialStatusEndpointOpts,
|
|
15
|
+
UpdateIndexedCredentialStatusRequest,
|
|
16
|
+
UpdateW3cCredentialStatusRequest,
|
|
17
|
+
} from './types'
|
|
18
|
+
import { StatusListCredential, StatusListType } from '@sphereon/ssi-types'
|
|
19
|
+
import { IStatusListEntryEntity } from '@sphereon/ssi-sdk.data-store'
|
|
11
20
|
|
|
12
21
|
const debug = Debug('sphereon:ssi-sdk:status-list')
|
|
13
22
|
|
|
23
|
+
function sendStatuslistResponse(details: StatusListResult, statuslistPayload: StatusListCredential, response: Response) {
|
|
24
|
+
let payload: Buffer | StatusListCredential
|
|
25
|
+
|
|
26
|
+
switch (details.proofFormat) {
|
|
27
|
+
case 'jwt':
|
|
28
|
+
case 'cbor':
|
|
29
|
+
payload = Buffer.from(statuslistPayload as string, 'ascii')
|
|
30
|
+
break
|
|
31
|
+
default:
|
|
32
|
+
payload = statuslistPayload
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return response.status(200).setHeader('Content-Type', details.statuslistContentType).send(payload)
|
|
36
|
+
}
|
|
37
|
+
|
|
14
38
|
export function createNewStatusListEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {
|
|
15
39
|
if (opts?.enabled === false) {
|
|
16
40
|
console.log(`Create new status list endpoint is disabled`)
|
|
@@ -24,8 +48,9 @@ export function createNewStatusListEndpoint(router: Router, context: IRequiredCo
|
|
|
24
48
|
if (!statusListArgs) {
|
|
25
49
|
return sendErrorResponse(response, 400, 'No statusList details supplied')
|
|
26
50
|
}
|
|
27
|
-
const
|
|
28
|
-
|
|
51
|
+
const details = await context.agent.slCreateStatusList(statusListArgs)
|
|
52
|
+
const statuslistPayload = details.statusListCredential
|
|
53
|
+
return sendStatuslistResponse(details, statuslistPayload, response)
|
|
29
54
|
} catch (e) {
|
|
30
55
|
return sendErrorResponse(response, 500, e.message as string, e)
|
|
31
56
|
}
|
|
@@ -41,7 +66,9 @@ const buildStatusListId = (request: Request): string => {
|
|
|
41
66
|
host += `:${forwardedPort}`
|
|
42
67
|
}
|
|
43
68
|
|
|
44
|
-
|
|
69
|
+
const forwardedPrefix = request.headers['x-forwarded-prefix']?.toString() ?? ''
|
|
70
|
+
|
|
71
|
+
return `${protocol}://${host}${forwardedPrefix}${request.originalUrl.split('?')[0].replace(/\/status\/index\/.*/, '')}`
|
|
45
72
|
}
|
|
46
73
|
|
|
47
74
|
export function getStatusListCredentialEndpoint(router: Router, context: IRequiredContext, opts: ICredentialStatusListEndpointOpts) {
|
|
@@ -53,11 +80,15 @@ export function getStatusListCredentialEndpoint(router: Router, context: IRequir
|
|
|
53
80
|
router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
|
|
54
81
|
try {
|
|
55
82
|
//todo: Check index against correlationId first. Then match originalUrl against statusList id
|
|
56
|
-
const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl
|
|
57
|
-
const
|
|
83
|
+
//const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these
|
|
84
|
+
const correlationId = request.query.correlationId?.toString()
|
|
85
|
+
const driver = await getDriver({
|
|
86
|
+
...(correlationId ? { correlationId } : { id: buildStatusListId(request) }),
|
|
87
|
+
dbName: opts.dbName,
|
|
88
|
+
})
|
|
58
89
|
const details = await driver.getStatusList()
|
|
59
|
-
|
|
60
|
-
return
|
|
90
|
+
const statuslistPayload = details.statusListCredential
|
|
91
|
+
return sendStatuslistResponse(details, statuslistPayload, response)
|
|
61
92
|
} catch (e) {
|
|
62
93
|
return sendErrorResponse(response, 500, e.message as string, e)
|
|
63
94
|
}
|
|
@@ -83,10 +114,10 @@ export function getStatusListCredentialIndexStatusEndpoint(router: Router, conte
|
|
|
83
114
|
if (!statusListIndex || statusListIndex < 0) {
|
|
84
115
|
return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)
|
|
85
116
|
}
|
|
86
|
-
const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl
|
|
117
|
+
//const correlationId = request.query.correlationId?.toString() ?? request.params.index?.toString() ?? request.originalUrl TODO I so not get these
|
|
118
|
+
const statusListCorrelationId = request.query.correlationId?.toString()
|
|
87
119
|
const driver = await getDriver({
|
|
88
|
-
|
|
89
|
-
correlationId,
|
|
120
|
+
...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),
|
|
90
121
|
dbName: opts.dbName,
|
|
91
122
|
})
|
|
92
123
|
const details = await driver.getStatusList()
|
|
@@ -94,13 +125,20 @@ export function getStatusListCredentialIndexStatusEndpoint(router: Router, conte
|
|
|
94
125
|
return sendErrorResponse(response, 400, `Please provide a proper statusListIndex`)
|
|
95
126
|
}
|
|
96
127
|
|
|
128
|
+
const entityCorrelationId = request.query.entityCorrelationId?.toString()
|
|
97
129
|
let entry = await driver.getStatusListEntryByIndex({
|
|
98
|
-
statusListIndex,
|
|
99
130
|
statusListId: details.id,
|
|
100
|
-
correlationId:
|
|
131
|
+
...(entityCorrelationId ? { correlationId: entityCorrelationId } : { statusListIndex: statusListIndex }),
|
|
101
132
|
errorOnNotFound: false,
|
|
102
133
|
})
|
|
103
|
-
const
|
|
134
|
+
const type = details.type === StatusListType.StatusList2021 ? 'StatusList2021Entry' : details.type
|
|
135
|
+
const status = await checkStatusIndexFromStatusListCredential({
|
|
136
|
+
statusListCredential: details.statusListCredential,
|
|
137
|
+
...(details.type === StatusListType.StatusList2021 ? { statusPurpose: details.statusList2021?.statusPurpose } : {}),
|
|
138
|
+
type,
|
|
139
|
+
id: details.id,
|
|
140
|
+
statusListIndex,
|
|
141
|
+
})
|
|
104
142
|
if (!entry) {
|
|
105
143
|
// The fact we have nothing on it means the status is okay
|
|
106
144
|
entry = {
|
|
@@ -110,13 +148,14 @@ export function getStatusListCredentialIndexStatusEndpoint(router: Router, conte
|
|
|
110
148
|
}
|
|
111
149
|
}
|
|
112
150
|
response.statusCode = 200
|
|
113
|
-
return response.send({ ...entry, status })
|
|
151
|
+
return response.send({ ...entry, status }) // FIXME content type?
|
|
114
152
|
} catch (e) {
|
|
115
153
|
return sendErrorResponse(response, 500, e.message as string, e)
|
|
116
154
|
}
|
|
117
155
|
})
|
|
118
156
|
}
|
|
119
|
-
|
|
157
|
+
|
|
158
|
+
export function updateStatusEndpoint(router: Router, context: IRequiredContext, opts: IW3CredentialStatusEndpointOpts) {
|
|
120
159
|
if (opts?.enabled === false) {
|
|
121
160
|
console.log(`Update credential status endpoint is disabled`)
|
|
122
161
|
return
|
|
@@ -124,63 +163,84 @@ export function updateW3CStatusEndpoint(router: Router, context: IRequiredContex
|
|
|
124
163
|
router.post(opts?.path ?? '/credentials/status', checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
|
|
125
164
|
try {
|
|
126
165
|
debug(JSON.stringify(request.body, null, 2))
|
|
127
|
-
const updateRequest = request.body as
|
|
166
|
+
const updateRequest = request.body as UpdateW3cCredentialStatusRequest | UpdateIndexedCredentialStatusRequest
|
|
128
167
|
const statusListId = updateRequest.statusListId ?? request.query.statusListId?.toString() ?? opts.statusListId
|
|
129
168
|
const statusListCorrelationId = updateRequest.statusListCorrelationId ?? request.query.statusListorrelationId?.toString() ?? opts.correlationId
|
|
130
169
|
const entryCorrelationId = updateRequest.entryCorrelationId ?? request.query.entryCorrelationId?.toString()
|
|
131
|
-
const credentialId = updateRequest.credentialId
|
|
132
170
|
|
|
133
171
|
// TODO: Move mostly to driver
|
|
134
|
-
if (!
|
|
135
|
-
return sendErrorResponse(response, 400, 'No statusList
|
|
172
|
+
if (!statusListId && !statusListCorrelationId) {
|
|
173
|
+
return sendErrorResponse(response, 400, 'No statusList id or correlation Id provided or deduced for the API or in the request')
|
|
136
174
|
} else if (!updateRequest.credentialStatus || updateRequest.credentialStatus.length === 0) {
|
|
137
175
|
return sendErrorResponse(response, 400, 'No statusList updates supplied')
|
|
138
|
-
} else if (!statusListId && !statusListCorrelationId) {
|
|
139
|
-
return sendErrorResponse(response, 400, 'No statusList id or correlation Id provided or deduced for the API or in the request')
|
|
140
176
|
}
|
|
141
|
-
const driver = await getDriver({
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
statusListId,
|
|
145
|
-
statusListCorrelationId,
|
|
146
|
-
entryCorrelationId,
|
|
147
|
-
credentialId,
|
|
148
|
-
errorOnNotFound: true,
|
|
177
|
+
const driver = await getDriver({
|
|
178
|
+
...(statusListCorrelationId ? { correlationId: statusListCorrelationId } : { id: buildStatusListId(request) }),
|
|
179
|
+
dbName: opts.dbName,
|
|
149
180
|
})
|
|
181
|
+
|
|
182
|
+
// Get status list entry based on request type
|
|
183
|
+
let statusListEntry: IStatusListEntryEntity | undefined
|
|
184
|
+
if ('credentialId' in updateRequest) {
|
|
185
|
+
if (!updateRequest.credentialId) {
|
|
186
|
+
return sendErrorResponse(response, 400, 'No credentialId supplied')
|
|
187
|
+
}
|
|
188
|
+
// unfortunately the W3C API works by credentialId. Which means you will have to map listIndices during issuance
|
|
189
|
+
statusListEntry = await driver.getStatusListEntryByCredentialId({
|
|
190
|
+
statusListId,
|
|
191
|
+
statusListCorrelationId,
|
|
192
|
+
entryCorrelationId,
|
|
193
|
+
credentialId: updateRequest.credentialId,
|
|
194
|
+
errorOnNotFound: true,
|
|
195
|
+
})
|
|
196
|
+
} else {
|
|
197
|
+
if (!updateRequest.statusListIndex || updateRequest.statusListIndex < 0) {
|
|
198
|
+
return sendErrorResponse(response, 400, 'Invalid statusListIndex supplied')
|
|
199
|
+
}
|
|
200
|
+
const driver = await getDriver({
|
|
201
|
+
...(statusListCorrelationId ? { statusListCorrelationId } : { id: buildStatusListId(request) }),
|
|
202
|
+
dbName: opts.dbName,
|
|
203
|
+
})
|
|
204
|
+
const details = await driver.getStatusList()
|
|
205
|
+
|
|
206
|
+
statusListEntry = await driver.getStatusListEntryByIndex({
|
|
207
|
+
statusListId: details.id,
|
|
208
|
+
...(entryCorrelationId ? { correlationId: entryCorrelationId } : { statusListIndex: updateRequest.statusListIndex }),
|
|
209
|
+
errorOnNotFound: true,
|
|
210
|
+
})
|
|
211
|
+
}
|
|
212
|
+
|
|
150
213
|
if (!statusListEntry) {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
404,
|
|
154
|
-
`status list index for credential id ${credentialId} was never recorded for ${statusListId}. This means the status will be 0`,
|
|
155
|
-
)
|
|
214
|
+
const identifier = 'credentialId' in updateRequest ? updateRequest.credentialId : `index ${updateRequest.statusListIndex}`
|
|
215
|
+
return sendErrorResponse(response, 404, `Status list entry for ${identifier} not found for ${statusListId}`)
|
|
156
216
|
}
|
|
157
|
-
|
|
217
|
+
|
|
158
218
|
let details = await driver.getStatusList()
|
|
159
219
|
let statusListCredential = details.statusListCredential
|
|
160
220
|
|
|
161
221
|
for (const updateItem of updateRequest.credentialStatus) {
|
|
162
|
-
if (updateItem.type && updateItem.type !== 'StatusList2021') {
|
|
163
|
-
return sendErrorResponse(response, 400, `Only the optional type 'StatusList2021' is currently supported`)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
222
|
if (!updateItem.status) {
|
|
167
|
-
return sendErrorResponse(
|
|
168
|
-
response,
|
|
169
|
-
400,
|
|
170
|
-
`Required 'status' value was missing in the credentialStatus array for credentialId ${credentialId}`,
|
|
171
|
-
)
|
|
223
|
+
return sendErrorResponse(response, 400, `Required 'status' value was missing in the credentialStatus array`)
|
|
172
224
|
}
|
|
173
|
-
|
|
225
|
+
|
|
226
|
+
const value = updateItem.status === '0' || updateItem.status.toLowerCase() === 'false' ? '0' : '1'
|
|
174
227
|
const statusList = statusListId ?? statusListEntry.statusList
|
|
175
|
-
await driver.updateStatusListEntry({ ...statusListEntry,
|
|
228
|
+
await driver.updateStatusListEntry({ ...statusListEntry, statusList, value })
|
|
176
229
|
|
|
177
230
|
// todo: optimize. We are now creating a new VC for every item passed in. Probably wise to look at DB as well
|
|
178
|
-
details = await updateStatusIndexFromStatusListCredential(
|
|
231
|
+
details = await updateStatusIndexFromStatusListCredential(
|
|
232
|
+
{
|
|
233
|
+
statusListCredential: statusListCredential,
|
|
234
|
+
statusListIndex: statusListEntry.statusListIndex,
|
|
235
|
+
value: parseInt(value),
|
|
236
|
+
keyRef: opts.keyRef,
|
|
237
|
+
},
|
|
238
|
+
context,
|
|
239
|
+
)
|
|
179
240
|
details = await driver.updateStatusList({ statusListCredential: details.statusListCredential })
|
|
180
241
|
}
|
|
181
242
|
|
|
182
|
-
|
|
183
|
-
return response.send(details.statusListCredential)
|
|
243
|
+
return sendStatuslistResponse(details, details.statusListCredential, response)
|
|
184
244
|
} catch (e) {
|
|
185
245
|
return sendErrorResponse(response, 500, e.message as string, e)
|
|
186
246
|
}
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
createNewStatusListEndpoint,
|
|
9
9
|
getStatusListCredentialEndpoint,
|
|
10
10
|
getStatusListCredentialIndexStatusEndpoint,
|
|
11
|
-
|
|
11
|
+
updateStatusEndpoint,
|
|
12
12
|
} from './api-functions'
|
|
13
13
|
import { IStatusListOpts } from './types'
|
|
14
14
|
import { IRequiredPlugins } from '@sphereon/ssi-sdk.vc-status-list-issuer-drivers'
|
|
@@ -50,7 +50,7 @@ export class StatuslistManagementApiServer {
|
|
|
50
50
|
getStatusListCredentialIndexStatusEndpoint(this.router, context, opts.endpointOpts.getStatusList)
|
|
51
51
|
}
|
|
52
52
|
if (features.includes('w3c-vc-api-credential-status')) {
|
|
53
|
-
|
|
53
|
+
updateStatusEndpoint(this.router, context, opts.endpointOpts.vcApiCredentialStatus)
|
|
54
54
|
}
|
|
55
55
|
this._express.use(opts?.endpointOpts?.basePath ?? '', this.router)
|
|
56
56
|
}
|
package/src/types.ts
CHANGED
|
@@ -31,8 +31,15 @@ export interface IW3CredentialStatusEndpointOpts extends ICredentialStatusListEn
|
|
|
31
31
|
keyRef?: string
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export interface UpdateCredentialStatusRequest {
|
|
34
|
+
export interface UpdateW3cCredentialStatusRequest extends UpdateCredentialStatusRequest {
|
|
35
35
|
credentialId: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface UpdateIndexedCredentialStatusRequest extends UpdateCredentialStatusRequest {
|
|
39
|
+
statusListIndex: number
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface UpdateCredentialStatusRequest {
|
|
36
43
|
credentialStatus: UpdateCredentialStatusItem[]
|
|
37
44
|
statusListId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default
|
|
38
45
|
statusListCorrelationId?: string // Non spec compliant. Allows us to manage multiple status lists. The VC API endpoint also has this config option, allowing for a default
|