Skip to content

Commit fe22f99

Browse files
SeddikBellaminePierreJeanjacquot
authored andcommitted
feat: add bulk order support to grantAccess
- Add createBulkOrder utility function for creating bulk dataset orders - Add allowBulk parameter to GrantAccessParams - Add bulk order creation flow in grantAccess function - Add CREATE_BULK_ORDER and PUBLISH_BULK_ORDER status types
1 parent 7a5e5d5 commit fe22f99

File tree

2 files changed

+115
-34
lines changed

2 files changed

+115
-34
lines changed

packages/sdk/src/lib/dataProtectorCore/grantAccess.ts

Lines changed: 87 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ZeroAddress } from 'ethers';
22
import { NULL_ADDRESS } from 'iexec/utils';
3+
import { createBulkOrder } from '../../utils/createBulkOrder.js';
34
import {
45
ValidationError,
56
WorkflowError,
@@ -9,6 +10,7 @@ import {
910
import { formatGrantedAccess } from '../../utils/formatGrantedAccess.js';
1011
import {
1112
addressOrEnsSchema,
13+
booleanSchema,
1214
isEnsTest,
1315
positiveIntegerStringSchema,
1416
positiveStrictIntegerStringSchema,
@@ -49,6 +51,7 @@ export const grantAccess = async ({
4951
authorizedUser,
5052
pricePerAccess,
5153
numberOfAccess,
54+
allowBulk = false,
5255
onStatusUpdate = () => {},
5356
}: IExecConsumer & GrantAccessParams): Promise<GrantedAccess> => {
5457
const vProtectedData = addressOrEnsSchema()
@@ -68,6 +71,7 @@ export const grantAccess = async ({
6871
const vNumberOfAccess = positiveStrictIntegerStringSchema()
6972
.label('numberOfAccess')
7073
.validateSync(numberOfAccess);
74+
const vAllowBulk = booleanSchema().label('allowBulk').validateSync(allowBulk);
7175
const vOnStatusUpdate =
7276
validateOnStatusUpdateCallback<OnStatusUpdateFn<GrantAccessStatuses>>(
7377
onStatusUpdate
@@ -123,48 +127,97 @@ export const grantAccess = async ({
123127
});
124128
}
125129

126-
vOnStatusUpdate({
127-
title: 'CREATE_DATASET_ORDER',
128-
isDone: false,
129-
});
130-
const datasetorder = await iexec.order
131-
.createDatasetorder({
130+
let datasetorder;
131+
132+
if (vAllowBulk) {
133+
vOnStatusUpdate({
134+
title: 'CREATE_BULK_ORDER',
135+
isDone: false,
136+
});
137+
138+
datasetorder = await createBulkOrder(iexec, {
132139
dataset: vProtectedData,
133-
apprestrict: vAuthorizedApp,
134-
requesterrestrict: vAuthorizedUser,
135-
datasetprice: vPricePerAccess,
136-
volume: vNumberOfAccess,
140+
app: vAuthorizedApp,
141+
requester: vAuthorizedUser,
142+
pricePerAccess: vPricePerAccess,
137143
tag,
138-
})
139-
.then((datasetorderTemplate) =>
140-
iexec.order.signDatasetorder(datasetorderTemplate)
141-
)
142-
.catch((e) => {
144+
}).catch((e) => {
143145
throw new WorkflowError({
144-
message: 'Failed to sign data access',
146+
message: 'Failed to create bulk order',
145147
errorCause: e,
146148
});
147149
});
148-
vOnStatusUpdate({
149-
title: 'CREATE_DATASET_ORDER',
150-
isDone: true,
151-
});
152150

153-
vOnStatusUpdate({
154-
title: 'PUBLISH_DATASET_ORDER',
155-
isDone: false,
156-
});
157-
await iexec.order.publishDatasetorder(datasetorder).catch((e) => {
158-
handleIfProtocolError(e);
159-
throw new WorkflowError({
160-
message: 'Failed to publish data access',
161-
errorCause: e,
151+
vOnStatusUpdate({
152+
title: 'CREATE_BULK_ORDER',
153+
isDone: true,
162154
});
163-
});
164-
vOnStatusUpdate({
165-
title: 'PUBLISH_DATASET_ORDER',
166-
isDone: true,
167-
});
168155

156+
vOnStatusUpdate({
157+
title: 'PUBLISH_BULK_ORDER',
158+
isDone: false,
159+
});
160+
161+
await iexec.order.publishDatasetorder(datasetorder).catch((e) => {
162+
handleIfProtocolError(e);
163+
throw new WorkflowError({
164+
message: 'Failed to publish bulk order',
165+
errorCause: e,
166+
});
167+
});
168+
169+
vOnStatusUpdate({
170+
title: 'PUBLISH_BULK_ORDER',
171+
isDone: true,
172+
});
173+
} else {
174+
vOnStatusUpdate({
175+
title: 'CREATE_DATASET_ORDER',
176+
isDone: false,
177+
});
178+
179+
datasetorder = await iexec.order
180+
.createDatasetorder({
181+
dataset: vProtectedData,
182+
apprestrict: vAuthorizedApp,
183+
requesterrestrict: vAuthorizedUser,
184+
datasetprice: vPricePerAccess,
185+
volume: vNumberOfAccess,
186+
tag,
187+
})
188+
.then((datasetorderTemplate) =>
189+
iexec.order.signDatasetorder(datasetorderTemplate)
190+
)
191+
.catch((e) => {
192+
throw new WorkflowError({
193+
message: 'Failed to sign data access',
194+
errorCause: e,
195+
});
196+
});
197+
198+
vOnStatusUpdate({
199+
title: 'CREATE_DATASET_ORDER',
200+
isDone: true,
201+
});
202+
203+
vOnStatusUpdate({
204+
title: 'PUBLISH_DATASET_ORDER',
205+
isDone: false,
206+
});
207+
208+
await iexec.order.publishDatasetorder(datasetorder).catch((e) => {
209+
handleIfProtocolError(e);
210+
throw new WorkflowError({
211+
message: 'Failed to publish data access',
212+
errorCause: e,
213+
});
214+
});
215+
216+
vOnStatusUpdate({
217+
title: 'PUBLISH_DATASET_ORDER',
218+
isDone: true,
219+
});
220+
}
221+
console.log(datasetorder);
169222
return formatGrantedAccess(datasetorder, parseInt(datasetorder.volume));
170223
};
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { IExec, utils } from 'iexec';
2+
3+
export interface CreateBulkOrderParams {
4+
dataset: string;
5+
app: string;
6+
requester: string;
7+
tag?: string[];
8+
}
9+
10+
export const createBulkOrder = async (
11+
iexec: IExec,
12+
{ dataset, app, requester, tag = ['tee', 'scone'] }: CreateBulkOrderParams
13+
) => {
14+
const bulkOrder = await iexec.order.createDatasetorder({
15+
dataset: dataset,
16+
datasetprice: 0,
17+
volume: utils.DATASET_INFINITE_VOLUME,
18+
apprestrict: app,
19+
requesterrestrict: requester,
20+
tag,
21+
});
22+
23+
const signedBulkOrder = await iexec.order.signDatasetorder(bulkOrder, {
24+
preflightCheck: false,
25+
});
26+
27+
return signedBulkOrder;
28+
};

0 commit comments

Comments
 (0)