Skip to content

Commit c4bf0e1

Browse files
feat: add bulk metadata to datasetorders
1 parent e7f9448 commit c4bf0e1

File tree

4 files changed

+59
-8
lines changed

4 files changed

+59
-8
lines changed

api/openapi.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,6 +1135,12 @@ components:
11351135
remaining:
11361136
type: number
11371137

1138+
OrderBulkMetadata:
1139+
properties:
1140+
bulk:
1141+
type: boolean
1142+
example: false
1143+
11381144
AppOrder:
11391145
properties:
11401146
app:
@@ -1248,6 +1254,7 @@ components:
12481254
DatasetOrderWithMetadata:
12491255
allOf:
12501256
- $ref: '#/components/schemas/OrderMetadata'
1257+
- $ref: '#/components/schemas/OrderBulkMetadata'
12511258
- type: object
12521259
properties:
12531260
order:

api/src/models/datasetorderModel.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Schema } from 'mongoose';
22
import { getMongoose } from '../loaders/mongoose.js';
33
import { logger } from '../utils/logger.js';
44
import { option, schema } from './common.js';
5+
import { isDatasetBulkOrder } from '../utils/order-utils.js';
56

67
const {
78
AddressSchema,
@@ -20,6 +21,16 @@ const log = logger.extend('models:datasetorderModel');
2021

2122
const connectedModels = {};
2223

24+
const toJSON = {
25+
...orderToJsonOption.toJSON,
26+
transform(doc, ret) {
27+
// Apply base transform
28+
orderToJsonOption.toJSON.transform(doc, ret);
29+
// Add bulk field
30+
ret.bulk = isDatasetBulkOrder(ret?.order);
31+
},
32+
};
33+
2334
const datasetorderSchema = new Schema(
2435
{
2536
orderHash: { ...Bytes32Schema, unique: true, index: true },
@@ -42,7 +53,7 @@ const datasetorderSchema = new Schema(
4253
signer: { ...AddressSchema, index: true },
4354
},
4455
{
45-
...orderToJsonOption,
56+
toJSON,
4657
},
4758
);
4859

api/src/utils/order-utils.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,16 @@ const excludeTagArray = (tagArray) =>
139139
})
140140
.filter((e) => e !== null);
141141

142+
const isDatasetBulkOrder = (order = {}) => {
143+
return order?.volume >= Number.MAX_SAFE_INTEGER && order?.datasetprice === 0;
144+
};
145+
142146
export {
143147
OBJ_MAP,
144148
STATUS_MAP,
145149
TAG_MAP,
146150
UNPUBLISH_TARGET_MAP,
147151
tagToArray,
148152
excludeTagArray,
153+
isDatasetBulkOrder,
149154
};

api/test/datasetorders.test.js

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,7 +1829,7 @@ describe('Offchain marketplace', () => {
18291829
});
18301830

18311831
test('GET /datasetorders (bulkOnly filter)', async () => {
1832-
const { data, status } = await request
1832+
const onlyBulkRes = await request
18331833
.get(
18341834
buildQuery('/datasetorders', {
18351835
chainId, // *
@@ -1838,12 +1838,40 @@ describe('Offchain marketplace', () => {
18381838
}),
18391839
)
18401840
.then(parseResult);
1841-
expect(status).toBe(OK_STATUS);
1842-
expect(data.ok).toBe(true);
1843-
expect(data.count).toBe(bulkOrders.length);
1844-
expect(data.orders).toBeDefined();
1845-
expect(Array.isArray(data.orders)).toBe(true);
1846-
expect(data.orders.length).toBe(bulkOrders.length);
1841+
expect(onlyBulkRes.status).toBe(OK_STATUS);
1842+
expect(onlyBulkRes.data.ok).toBe(true);
1843+
expect(onlyBulkRes.data.count).toBe(bulkOrders.length);
1844+
expect(onlyBulkRes.data.orders).toBeDefined();
1845+
expect(Array.isArray(onlyBulkRes.data.orders)).toBe(true);
1846+
expect(onlyBulkRes.data.orders.length).toBe(bulkOrders.length);
1847+
onlyBulkRes.data.orders.forEach((e) => {
1848+
expect(e.bulk).toBe(true);
1849+
});
1850+
1851+
const notOnlyBulkRes = await request
1852+
.get(
1853+
buildQuery('/datasetorders', {
1854+
chainId, // *
1855+
dataset: datasetAddress, // *
1856+
// bulkOnly: false,
1857+
}),
1858+
)
1859+
.then(parseResult);
1860+
expect(notOnlyBulkRes.status).toBe(OK_STATUS);
1861+
expect(notOnlyBulkRes.data.ok).toBe(true);
1862+
expect(notOnlyBulkRes.data.count).toBe(publicOrders.length);
1863+
expect(notOnlyBulkRes.data.orders).toBeDefined();
1864+
expect(Array.isArray(notOnlyBulkRes.data.orders)).toBe(true);
1865+
notOnlyBulkRes.data.orders.forEach((e) => {
1866+
if (
1867+
e.order.volume >= Number.MAX_SAFE_INTEGER &&
1868+
e.order.datasetprice === 0
1869+
) {
1870+
expect(e.bulk).toBe(true);
1871+
} else {
1872+
expect(e.bulk).toBe(false);
1873+
}
1874+
});
18471875
});
18481876

18491877
test('GET /datasetorders (isAppStrict = true & app = undefined): should return public orders including "any" app', async () => {

0 commit comments

Comments
 (0)