Skip to content

Commit 52c081a

Browse files
committed
fix: event repository logic
1 parent b64827d commit 52c081a

File tree

9 files changed

+379
-167
lines changed

9 files changed

+379
-167
lines changed

indexer/src/kadena-server/repository/infra/repository/event-db-repository.ts

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -227,12 +227,6 @@ export default class EventDbRepository implements EventRepository {
227227
eventConditions += `\nAND e.id < $${queryParams.length}`;
228228
}
229229

230-
if (requestKey) {
231-
blockQueryParams.push(requestKey);
232-
const op = localOperator(blockQueryParams.length);
233-
conditions += `${op} t."requestkey" = $${blockQueryParams.length + queryParams.length}`;
234-
}
235-
236230
if (blockHash) {
237231
blockQueryParams.push(blockHash);
238232
const op = localOperator(blockQueryParams.length);
@@ -272,8 +266,10 @@ export default class EventDbRepository implements EventRepository {
272266
conditions += `${op} b."height" <= $${blockQueryParams.length + queryParams.length}`;
273267
}
274268

269+
const isHeightChainOrBlockHash = fromHeight || toHeight || blockHash || chainId;
270+
275271
let query = '';
276-
if (fromHeight || toHeight || blockHash || chainId) {
272+
if (isHeightChainOrBlockHash) {
277273
query = `
278274
WITH block_filtered AS (
279275
select *
@@ -296,6 +292,35 @@ export default class EventDbRepository implements EventRepository {
296292
WHERE e.module = $2
297293
AND e.name = $3
298294
${eventConditions}
295+
ORDER BY b.height ${order}
296+
LIMIT $1
297+
`;
298+
} else if (requestKey) {
299+
queryParams.push(requestKey);
300+
query = `
301+
WITH event_transaction_filtered AS (
302+
SELECT e.*, t."blockId"
303+
FROM "Transactions" t
304+
JOIN "Events" e ON t.id = e."transactionId"
305+
WHERE e.module = $2
306+
AND e.name = $3
307+
AND t.requestkey = $${blockQueryParams.length + queryParams.length}
308+
${eventConditions}
309+
ORDER BY e.id ${order}
310+
)
311+
SELECT
312+
et.id as id,
313+
et.requestkey as "requestKey",
314+
et."chainId" as "chainId",
315+
b.height as height,
316+
et."orderIndex" as "orderIndex",
317+
et.module as "moduleName",
318+
et.name as name,
319+
et.params as parameters,
320+
b.hash as "blockHash"
321+
FROM event_transaction_filtered et
322+
JOIN "Blocks" b ON b.id = et."blockId"
323+
${conditions}
299324
LIMIT $1
300325
`;
301326
} else {
@@ -306,7 +331,7 @@ export default class EventDbRepository implements EventRepository {
306331
WHERE e.module = $2
307332
AND e.name = $3
308333
${eventConditions}
309-
ORDER BY e.module, e.name ${order}
334+
ORDER BY e.id ${order}
310335
)
311336
SELECT
312337
e.id as id,
@@ -329,7 +354,7 @@ export default class EventDbRepository implements EventRepository {
329354
const { rows } = await rootPgPool.query(query, [...queryParams, ...blockQueryParams]);
330355

331356
const edges = rows.map(row => ({
332-
cursor: row.id.toString(),
357+
cursor: isHeightChainOrBlockHash ? row.height.toString() : row.id.toString(),
333358
node: eventValidator.validate(row),
334359
}));
335360

indexer/tests/integration/builders/events.builder.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ export const getEventsQuery = (params: any): string => {
1212
const queryGql = gql`
1313
query {
1414
events(${query}) {
15+
pageInfo {
16+
hasNextPage
17+
hasPreviousPage
18+
startCursor
19+
endCursor
20+
}
1521
edges {
1622
cursor
1723
node {
Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,49 @@
11
import { GraphQLClient } from 'graphql-request';
22
import { getEventsQuery } from './builders/events.builder';
3-
import { eventsSeed001 } from './fixtures/events/events.fixture.001';
4-
import { eventsSeed002 } from './fixtures/events/events.fixture.002';
5-
import { eventsSeed003 } from './fixtures/events/events.fixture.003';
6-
import { eventsSeed004 } from './fixtures/events/events.fixture.004';
7-
3+
import { eventsFixture001 } from './fixtures/events/events.fixture.001';
4+
import { eventsFixture002 } from './fixtures/events/events.fixture.002';
5+
import { eventsFixture003 } from './fixtures/events/events.fixture.003';
6+
import { eventsFixture004 } from './fixtures/events/events.fixture.004';
7+
import { eventsFixture005 } from './fixtures/events/events.fixture.005';
8+
import { eventsFixture006 } from './fixtures/events/events.fixture.006';
89
const client = new GraphQLClient(process.env.API_URL ?? 'http://localhost:3001/graphql');
910

1011
describe('Events', () => {
1112
it('#001', async () => {
1213
const query = getEventsQuery({ qualifiedEventName: 'pact.X_YIELD', last: 10 });
1314
const data = await client.request(query);
14-
expect(eventsSeed001.data).toMatchObject(data);
15+
expect(eventsFixture001.data).toMatchObject(data);
1516
});
1617

1718
it('#002', async () => {
1819
const query = getEventsQuery({ qualifiedEventName: 'pact.X_YIELD', after: 'MjAy' });
1920
const data = await client.request(query);
20-
expect(eventsSeed002.data).toMatchObject(data);
21+
expect(eventsFixture002.data).toMatchObject(data);
2122
});
2223

24+
// blockHash
2325
it('#003', async () => {
2426
const query = getEventsQuery({
2527
qualifiedEventName: 'coin.TRANSFER',
2628
blockHash: 'ONd7stIjJbuwMqRmlyQ71XhT-xVvyVy-A0X2DBomw1g',
2729
first: 8,
2830
});
2931
const data = await client.request(query);
30-
expect(eventsSeed003.data).toMatchObject(data);
32+
expect(eventsFixture003.data).toMatchObject(data);
3133
});
3234

35+
// requestKey
3336
it('#004', async () => {
37+
const query = getEventsQuery({
38+
qualifiedEventName: 'free.crankk01.TRANSFER',
39+
requestKey: 'JVOE6mpjSHHOjkg9wdzqGsBoqRx9fiQMq83GEdoi92c',
40+
});
41+
const data = await client.request(query);
42+
expect(eventsFixture004.data).toMatchObject(data);
43+
});
44+
45+
// height
46+
it('#005', async () => {
3447
const query = getEventsQuery({
3548
qualifiedEventName: 'coin.TRANSFER',
3649
minHeight: 2000000,
@@ -39,6 +52,17 @@ describe('Events', () => {
3952
});
4053

4154
const data = await client.request(query);
42-
expect(eventsSeed004.data).toMatchObject(data);
55+
expect(eventsFixture005.data).toMatchObject(data);
4356
});
57+
58+
// before, last
59+
it('#006', async () => {
60+
const query = getEventsQuery({ qualifiedEventName: 'pact.X_YIELD', last: 5, before: 'MzA2' });
61+
const data = await client.request(query);
62+
expect(eventsFixture006.data).toMatchObject(data);
63+
});
64+
65+
// minimumDepth: Int
66+
// orderIndex: Int
67+
// parametersFilter: String
4468
});

indexer/tests/integration/fixtures/events/events.fixture.001.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
export const eventsSeed001 = {
1+
export const eventsFixture001 = {
22
data: {
33
events: {
4+
pageInfo: {
5+
hasNextPage: false,
6+
hasPreviousPage: true,
7+
startCursor: 'MzA2',
8+
endCursor: 'MjE=',
9+
},
410
edges: [
511
{
612
cursor: 'MzA2',

indexer/tests/integration/fixtures/events/events.fixture.002.ts

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,101 @@
1-
export const eventsSeed002 = {
1+
export const eventsFixture002 = {
22
data: {
33
events: {
4+
pageInfo: {
5+
hasNextPage: false,
6+
hasPreviousPage: true,
7+
startCursor: 'MTUz',
8+
endCursor: 'MjE=',
9+
},
410
edges: [
511
{
6-
cursor: 'MjE=',
12+
cursor: 'MTUz',
713
node: {
8-
id: 'RXZlbnQ6WyJRemk1OHZjcFc5N2R1MDFzckl3eHB3U1FVUERSTkJubDJFS3l1YlAtSVd3IiwiMyIsIkxJYkp4djJfU0xtdXlWT1dhd0hBdmFkMm9nNFFBaklnZUhRUFNyejh3Mk0iXQ==',
14+
id: 'RXZlbnQ6WyJzQjVuNVduanAwelZSZmpESURBZExTcnlTY3Z1OC1fdlRtLS1iUWJyUnBnIiwiMyIsInhuaVBEM0RjZVc5blc0RC1Id2RfOGZGVUJIaUg2LVZ5dTgtb0F3d3BtQ0kiXQ==',
915
chainId: 10,
10-
height: 5369899,
16+
height: 5365581,
1117
moduleName: 'pact',
1218
name: 'X_YIELD',
1319
orderIndex: 3,
1420
parameters:
15-
'["0","coin.transfer-crosschain",["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a","99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a",{"keys":["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a"],"pred":"keys-all"},"0",337.1879699]]',
21+
'["0","coin.transfer-crosschain",["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a","99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a",{"keys":["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a"],"pred":"keys-all"},"0",374.8684599]]',
1622
qualifiedName: 'pact.X_YIELD',
17-
requestKey: 'LIbJxv2_SLmuyVOWawHAvad2og4QAjIgeHQPSrz8w2M',
23+
requestKey: 'xniPD3DceW9nW4D-Hwd_8fFUBHiH6-Vyu8-oAwwpmCI',
1824
},
1925
},
2026
{
21-
cursor: 'NTc=',
27+
cursor: 'MTE4',
2228
node: {
23-
id: 'RXZlbnQ6WyIzSkg1bUJTdnB3azVhYzdjdFFrWDYwd2ExRHlvb055RHIxTnFzc01BVnMwIiwiMyIsImxwWURRN2llRDNvcmVVMlU2ZkhXUTdJYVotV3V2M2pLMHUySGZkc01wMzgiXQ==',
29+
id: 'RXZlbnQ6WyJWalF1MVV3by04XzhaT0FFRjNISmxFbkd2R3JhWTgwcWE5WnIyQnBIbmVJIiwiMyIsInZoWkx3MjllMWZoYWpZOGEzWndia2tfRGR6LVRaRThDaHJZSWNUcnFyWGciXQ==',
2430
chainId: 10,
25-
height: 5368456,
31+
height: 5366862,
2632
moduleName: 'pact',
2733
name: 'X_YIELD',
2834
orderIndex: 3,
2935
parameters:
30-
'["0","coin.transfer-crosschain",["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a","99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a",{"keys":["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a"],"pred":"keys-all"},"0",372.9301399]]',
36+
'["1","coin.transfer-crosschain",["k:4c65e9b761ae74dd68baa0cf652f61222292a08f1c505d6fd092867b6572f8f9","k:4c65e9b761ae74dd68baa0cf652f61222292a08f1c505d6fd092867b6572f8f9",{"keys":["4c65e9b761ae74dd68baa0cf652f61222292a08f1c505d6fd092867b6572f8f9"],"pred":"keys-all"},"1",0.034779]]',
3137
qualifiedName: 'pact.X_YIELD',
32-
requestKey: 'lpYDQ7ieD3oreU2U6fHWQ7IaZ-Wuv3jK0u2HfdsMp38',
38+
requestKey: 'vhZLw29e1fhajY8a3Zwbkk_Ddz-TZE8ChrYIcTrqrXg',
3339
},
3440
},
3541
{
36-
cursor: 'NjY=',
42+
cursor: 'MTA5',
3743
node: {
38-
id: 'RXZlbnQ6WyJPSFFUN1BpVmxyV2FhTmlsWktNWF9RUnRrazZDczVheVB4YmpuNVFMRHVrIiwiMyIsIlFkN1V4RnFSMmZlamxQVDYtblB5MnFicVNRRS1uY3hUaS1Ic0NfRHIwakEiXQ==',
44+
id: 'RXZlbnQ6WyJwRGxzcnRzU1BWaVNrei1XOUVGb1VEdFU4RzRZTk9yek53dVN1bl90Yk5FIiwiMyIsIi13c2U5UGM4ZkVRd2NuaFpqZzZ4ZWl1eTlpLXhtLTl5YjFySFdzc0R3OTAiXQ==',
3945
chainId: 10,
40-
height: 5368317,
46+
height: 5367016,
4147
moduleName: 'pact',
4248
name: 'X_YIELD',
4349
orderIndex: 3,
4450
parameters:
45-
'["2","coin.transfer-crosschain",["k:e3c89f0b944b11a4491d83b1303abfa7c7c7332cc86eba38a8aabb3ab5d7fecd","k:e3c89f0b944b11a4491d83b1303abfa7c7c7332cc86eba38a8aabb3ab5d7fecd",{"keys":["e3c89f0b944b11a4491d83b1303abfa7c7c7332cc86eba38a8aabb3ab5d7fecd"],"pred":"keys-all"},"2",0.39934589]]',
51+
'["0","coin.transfer-crosschain",["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a","99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a",{"keys":["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a"],"pred":"keys-all"},"0",359.4035599]]',
4652
qualifiedName: 'pact.X_YIELD',
47-
requestKey: 'Qd7UxFqR2fejlPT6-nPy2qbqSQE-ncxTi-HsC_Dr0jA',
53+
requestKey: '-wse9Pc8fEQwcnhZjg6xeiuy9i-xm-9yb1rHWssDw90',
4854
},
4955
},
5056
{
51-
cursor: 'MTA5',
57+
cursor: 'NjY=',
5258
node: {
53-
id: 'RXZlbnQ6WyJwRGxzcnRzU1BWaVNrei1XOUVGb1VEdFU4RzRZTk9yek53dVN1bl90Yk5FIiwiMyIsIi13c2U5UGM4ZkVRd2NuaFpqZzZ4ZWl1eTlpLXhtLTl5YjFySFdzc0R3OTAiXQ==',
59+
id: 'RXZlbnQ6WyJPSFFUN1BpVmxyV2FhTmlsWktNWF9RUnRrazZDczVheVB4YmpuNVFMRHVrIiwiMyIsIlFkN1V4RnFSMmZlamxQVDYtblB5MnFicVNRRS1uY3hUaS1Ic0NfRHIwakEiXQ==',
5460
chainId: 10,
55-
height: 5367016,
61+
height: 5368317,
5662
moduleName: 'pact',
5763
name: 'X_YIELD',
5864
orderIndex: 3,
5965
parameters:
60-
'["0","coin.transfer-crosschain",["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a","99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a",{"keys":["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a"],"pred":"keys-all"},"0",359.4035599]]',
66+
'["2","coin.transfer-crosschain",["k:e3c89f0b944b11a4491d83b1303abfa7c7c7332cc86eba38a8aabb3ab5d7fecd","k:e3c89f0b944b11a4491d83b1303abfa7c7c7332cc86eba38a8aabb3ab5d7fecd",{"keys":["e3c89f0b944b11a4491d83b1303abfa7c7c7332cc86eba38a8aabb3ab5d7fecd"],"pred":"keys-all"},"2",0.39934589]]',
6167
qualifiedName: 'pact.X_YIELD',
62-
requestKey: '-wse9Pc8fEQwcnhZjg6xeiuy9i-xm-9yb1rHWssDw90',
68+
requestKey: 'Qd7UxFqR2fejlPT6-nPy2qbqSQE-ncxTi-HsC_Dr0jA',
6369
},
6470
},
6571
{
66-
cursor: 'MTE4',
72+
cursor: 'NTc=',
6773
node: {
68-
id: 'RXZlbnQ6WyJWalF1MVV3by04XzhaT0FFRjNISmxFbkd2R3JhWTgwcWE5WnIyQnBIbmVJIiwiMyIsInZoWkx3MjllMWZoYWpZOGEzWndia2tfRGR6LVRaRThDaHJZSWNUcnFyWGciXQ==',
74+
id: 'RXZlbnQ6WyIzSkg1bUJTdnB3azVhYzdjdFFrWDYwd2ExRHlvb055RHIxTnFzc01BVnMwIiwiMyIsImxwWURRN2llRDNvcmVVMlU2ZkhXUTdJYVotV3V2M2pLMHUySGZkc01wMzgiXQ==',
6975
chainId: 10,
70-
height: 5366862,
76+
height: 5368456,
7177
moduleName: 'pact',
7278
name: 'X_YIELD',
7379
orderIndex: 3,
7480
parameters:
75-
'["1","coin.transfer-crosschain",["k:4c65e9b761ae74dd68baa0cf652f61222292a08f1c505d6fd092867b6572f8f9","k:4c65e9b761ae74dd68baa0cf652f61222292a08f1c505d6fd092867b6572f8f9",{"keys":["4c65e9b761ae74dd68baa0cf652f61222292a08f1c505d6fd092867b6572f8f9"],"pred":"keys-all"},"1",0.034779]]',
81+
'["0","coin.transfer-crosschain",["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a","99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a",{"keys":["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a"],"pred":"keys-all"},"0",372.9301399]]',
7682
qualifiedName: 'pact.X_YIELD',
77-
requestKey: 'vhZLw29e1fhajY8a3Zwbkk_Ddz-TZE8ChrYIcTrqrXg',
83+
requestKey: 'lpYDQ7ieD3oreU2U6fHWQ7IaZ-Wuv3jK0u2HfdsMp38',
7884
},
7985
},
8086
{
81-
cursor: 'MTUz',
87+
cursor: 'MjE=',
8288
node: {
83-
id: 'RXZlbnQ6WyJzQjVuNVduanAwelZSZmpESURBZExTcnlTY3Z1OC1fdlRtLS1iUWJyUnBnIiwiMyIsInhuaVBEM0RjZVc5blc0RC1Id2RfOGZGVUJIaUg2LVZ5dTgtb0F3d3BtQ0kiXQ==',
89+
id: 'RXZlbnQ6WyJRemk1OHZjcFc5N2R1MDFzckl3eHB3U1FVUERSTkJubDJFS3l1YlAtSVd3IiwiMyIsIkxJYkp4djJfU0xtdXlWT1dhd0hBdmFkMm9nNFFBaklnZUhRUFNyejh3Mk0iXQ==',
8490
chainId: 10,
85-
height: 5365581,
91+
height: 5369899,
8692
moduleName: 'pact',
8793
name: 'X_YIELD',
8894
orderIndex: 3,
8995
parameters:
90-
'["0","coin.transfer-crosschain",["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a","99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a",{"keys":["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a"],"pred":"keys-all"},"0",374.8684599]]',
96+
'["0","coin.transfer-crosschain",["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a","99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a",{"keys":["99cb7008d7d70c94f138cc366a825f0d9c83a8a2f4ba82c86c666e0ab6fecf3a"],"pred":"keys-all"},"0",337.1879699]]',
9197
qualifiedName: 'pact.X_YIELD',
92-
requestKey: 'xniPD3DceW9nW4D-Hwd_8fFUBHiH6-Vyu8-oAwwpmCI',
98+
requestKey: 'LIbJxv2_SLmuyVOWawHAvad2og4QAjIgeHQPSrz8w2M',
9399
},
94100
},
95101
],

0 commit comments

Comments
 (0)