Skip to content

Commit cc05f4f

Browse files
committed
fix(count): count rows matching filters instead of rows returned
1 parent 91cd905 commit cc05f4f

File tree

11 files changed

+349
-146
lines changed

11 files changed

+349
-146
lines changed

src/graphql/schemas/args/baseArgs.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { Field, ArgsType, ClassType, Int } from "type-graphql";
22
import { WhereOptions } from "../inputs/whereOptions.js";
3-
import { SortOptions } from "../inputs/sortOptions.js";
3+
import { OrderOptions } from "../inputs/orderOptions.js";
44

55
export type BaseArgs<T extends object> = {
66
where?: WhereOptions<T>;
7-
sort?: SortOptions<T>;
7+
sort?: OrderOptions<T>;
88
};
99

1010
export function withPagination<TItem extends ClassType>(TItemClass: TItem) {
@@ -13,6 +13,9 @@ export function withPagination<TItem extends ClassType>(TItemClass: TItem) {
1313
@Field(() => Int, { nullable: true })
1414
first?: number;
1515

16+
@Field(() => Int, { nullable: true })
17+
first?: number;
18+
1619
@Field(() => Int, { nullable: true })
1720
offset?: number;
1821
}

src/graphql/schemas/resolvers/attestationResolver.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,24 +31,20 @@ const AttestationBaseResolver = createBaseResolver("attestations");
3131
class AttestationResolver extends AttestationBaseResolver {
3232
@Query(() => GetAttestationsResponse)
3333
async attestations(@Args() args: GetAttestationsArgs) {
34-
const res = await this.getAttestations(args);
35-
36-
const data = Array.isArray(res) ? res : [];
37-
38-
return { data, count: data.length };
34+
return await this.getAttestations(args);
3935
}
4036

4137
@FieldResolver({ nullable: true })
4238
async hypercerts(@Root() attestation: Attestation) {
4339
if (!attestation.data) return null;
4440

45-
const _att = attestation.data;
41+
const { success, data } = HypercertPointer.safeParse(attestation.data);
4642

47-
if (!HypercertPointer.safeParse(_att).success) return null;
43+
if (!success) return null;
4844

49-
const pointer = HypercertPointer.parse(_att);
45+
const { chain_id, contract_address, token_id } = data;
46+
const hypercertId = `${chain_id}-${getAddress(contract_address)}-${token_id.toString()}`;
5047

51-
const hypercertId = `${pointer.chain_id}-${getAddress(pointer.contract_address)}-${pointer.token_id.toString()}`;
5248
return await this.getHypercerts(
5349
{
5450
where: {

src/graphql/schemas/resolvers/baseTypes.ts

Lines changed: 96 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,21 @@ export function createBaseResolver<T extends ClassType>(
4040
);
4141

4242
try {
43+
const queries = this.supabaseCachingService.getMetadata(args);
4344
if (single) {
44-
return this.supabaseCachingService
45-
.getMetadata(args)
46-
.executeTakeFirst();
45+
return queries.data.executeTakeFirst();
4746
}
4847

49-
return this.supabaseCachingService.getMetadata(args).execute();
48+
return this.supabaseCachingService.db
49+
.transaction()
50+
.execute(async (transaction) => {
51+
const dataRes = await transaction.executeQuery(queries.data);
52+
const countRes = await transaction.executeQuery(queries.count);
53+
return {
54+
data: dataRes.rows,
55+
count: countRes.rows[0].count,
56+
};
57+
});
5058
} catch (e) {
5159
const error = e as Error;
5260
throw new Error(
@@ -61,13 +69,21 @@ export function createBaseResolver<T extends ClassType>(
6169
);
6270

6371
try {
72+
const queries = this.supabaseCachingService.getContracts(args);
6473
if (single) {
65-
return this.supabaseCachingService
66-
.getContracts(args)
67-
.executeTakeFirst();
74+
return queries.data.executeTakeFirst();
6875
}
6976

70-
return this.supabaseCachingService.getContracts(args).execute();
77+
return this.supabaseCachingService.db
78+
.transaction()
79+
.execute(async (transaction) => {
80+
const dataRes = await transaction.executeQuery(queries.data);
81+
const countRes = await transaction.executeQuery(queries.count);
82+
return {
83+
data: dataRes.rows,
84+
count: countRes.rows[0].count,
85+
};
86+
});
7187
} catch (e) {
7288
const error = e as Error;
7389
throw new Error(
@@ -82,13 +98,21 @@ export function createBaseResolver<T extends ClassType>(
8298
);
8399

84100
try {
101+
const queries = this.supabaseCachingService.getHypercerts(args);
85102
if (single) {
86-
return this.supabaseCachingService
87-
.getHypercerts(args)
88-
.executeTakeFirst();
103+
return queries.data.executeTakeFirst();
89104
}
90105

91-
return this.supabaseCachingService.getHypercerts(args).execute();
106+
return this.supabaseCachingService.db
107+
.transaction()
108+
.execute(async (transaction) => {
109+
const dataRes = await transaction.executeQuery(queries.data);
110+
const countRes = await transaction.executeQuery(queries.count);
111+
return {
112+
data: dataRes.rows,
113+
count: countRes.rows[0].count,
114+
};
115+
});
92116
} catch (e) {
93117
const error = e as Error;
94118
throw new Error(
@@ -103,13 +127,21 @@ export function createBaseResolver<T extends ClassType>(
103127
);
104128

105129
try {
130+
const queries = this.supabaseCachingService.getFractions(args);
106131
if (single) {
107-
return this.supabaseCachingService
108-
.getFractions(args)
109-
.executeTakeFirst();
132+
return queries.data.executeTakeFirst();
110133
}
111134

112-
return this.supabaseCachingService.getFractions(args).execute();
135+
return this.supabaseCachingService.db
136+
.transaction()
137+
.execute(async (transaction) => {
138+
const dataRes = await transaction.executeQuery(queries.data);
139+
const countRes = await transaction.executeQuery(queries.count);
140+
return {
141+
data: dataRes.rows,
142+
count: countRes.rows[0].count,
143+
};
144+
});
113145
} catch (e) {
114146
const error = e as Error;
115147
throw new Error(
@@ -127,13 +159,21 @@ export function createBaseResolver<T extends ClassType>(
127159
);
128160

129161
try {
162+
const queries = this.supabaseCachingService.getAllowlistRecords(args);
130163
if (single) {
131-
return this.supabaseCachingService
132-
.getAllowlistRecords(args)
133-
.executeTakeFirst();
164+
return queries.data.executeTakeFirst();
134165
}
135166

136-
return this.supabaseCachingService.getAllowlistRecords(args).execute();
167+
return this.supabaseCachingService.db
168+
.transaction()
169+
.execute(async (transaction) => {
170+
const dataRes = await transaction.executeQuery(queries.data);
171+
const countRes = await transaction.executeQuery(queries.count);
172+
return {
173+
data: dataRes.rows,
174+
count: countRes.rows[0].count,
175+
};
176+
});
137177
} catch (e) {
138178
const error = e as Error;
139179
throw new Error(
@@ -151,15 +191,21 @@ export function createBaseResolver<T extends ClassType>(
151191
);
152192

153193
try {
194+
const queries = this.supabaseCachingService.getAttestationSchemas(args);
154195
if (single) {
155-
return this.supabaseCachingService
156-
.getAttestationSchemas(args)
157-
.executeTakeFirst();
196+
return queries.data.executeTakeFirst();
158197
}
159198

160-
return this.supabaseCachingService
161-
.getAttestationSchemas(args)
162-
.execute();
199+
return this.supabaseCachingService.db
200+
.transaction()
201+
.execute(async (transaction) => {
202+
const dataRes = await transaction.executeQuery(queries.data);
203+
const countRes = await transaction.executeQuery(queries.count);
204+
return {
205+
data: dataRes.rows,
206+
count: countRes.rows[0].count,
207+
};
208+
});
163209
} catch (e) {
164210
const error = e as Error;
165211
throw new Error(
@@ -174,17 +220,22 @@ export function createBaseResolver<T extends ClassType>(
174220
);
175221

176222
try {
223+
const queries = this.supabaseCachingService.getAttestations(args);
177224
if (single) {
178-
const res = await this.supabaseCachingService
179-
.getAttestations(args)
180-
.executeTakeFirst();
225+
const res = await queries.data.executeTakeFirst();
181226
return res ? this.parseAttestation(res) : null;
182227
}
183228

184-
const res = await this.supabaseCachingService
185-
.getAttestations(args)
186-
.execute();
187-
return res ? res?.map(this.parseAttestation) : [];
229+
return this.supabaseCachingService.db
230+
.transaction()
231+
.execute(async (transaction) => {
232+
const dataRes = await transaction.executeQuery(queries.data);
233+
const countRes = await transaction.executeQuery(queries.count);
234+
return {
235+
data: dataRes ? dataRes.rows?.map(this.parseAttestation) : [],
236+
count: countRes.rows[0].count,
237+
};
238+
});
188239
} catch (e) {
189240
const error = e as Error;
190241
throw new Error(
@@ -197,11 +248,21 @@ export function createBaseResolver<T extends ClassType>(
197248
console.debug(`[${entityFieldName}Resolver::getSales] Fetching sales`);
198249

199250
try {
251+
const queries = this.supabaseCachingService.getSales(args);
200252
if (single) {
201-
return this.supabaseCachingService.getSales(args).executeTakeFirst();
253+
return queries.data.executeTakeFirst();
202254
}
203255

204-
return this.supabaseCachingService.getSales(args).execute();
256+
return this.supabaseCachingService.db
257+
.transaction()
258+
.execute(async (transaction) => {
259+
const dataRes = await transaction.executeQuery(queries.data);
260+
const countRes = await transaction.executeQuery(queries.count);
261+
return {
262+
data: dataRes.rows,
263+
count: countRes.rows[0].count,
264+
};
265+
});
205266
} catch (e) {
206267
const error = e as Error;
207268
throw new Error(

src/graphql/schemas/resolvers/hypercertResolver.ts

Lines changed: 9 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,11 @@ const HypercertBaseResolver = createBaseResolver("hypercert");
2626
class HypercertResolver extends HypercertBaseResolver {
2727
@Query(() => GetHypercertsResponse)
2828
async hypercerts(@Args() args: GetHypercertsArgs) {
29-
const res = await this.getHypercerts(args);
30-
31-
const data = Array.isArray(res) ? res : [];
32-
33-
return { data, count: data.length };
29+
return await this.getHypercerts(args);
3430
}
3531

3632
@FieldResolver({ nullable: true })
37-
async metadata(@Root() hypercert: Partial<Hypercert>) {
33+
async metadata(@Root() hypercert: Hypercert) {
3834
if (!hypercert.uri) {
3935
return;
4036
}
@@ -46,7 +42,7 @@ class HypercertResolver extends HypercertBaseResolver {
4642
}
4743

4844
@FieldResolver()
49-
async contract(@Root() hypercert: Partial<Hypercert>) {
45+
async contract(@Root() hypercert: Hypercert) {
5046
if (!hypercert.contracts_id) {
5147
return;
5248
}
@@ -63,11 +59,9 @@ class HypercertResolver extends HypercertBaseResolver {
6359
return;
6460
}
6561

66-
const res = await this.getAttestations({
62+
return await this.getAttestations({
6763
where: { hypercerts: { id: { eq: hypercert.id } } },
6864
});
69-
70-
return { data: res, count: res?.length };
7165
}
7266

7367
@FieldResolver()
@@ -76,12 +70,10 @@ class HypercertResolver extends HypercertBaseResolver {
7670
return;
7771
}
7872

79-
const res = await this.getFractions(
73+
return await this.getFractions(
8074
{ where: { hypercerts: { id: { eq: hypercert.id } } } },
8175
false,
8276
);
83-
84-
return { data: res, count: res?.length };
8577
}
8678

8779
@FieldResolver()
@@ -97,7 +89,7 @@ class HypercertResolver extends HypercertBaseResolver {
9789
};
9890

9991
try {
100-
const fractionsRes = await this.getFractions({
92+
const { data: fractionsRes } = await this.getFractions({
10193
where: { hypercerts: { id: { eq: hypercert.id } } },
10294
});
10395

@@ -205,34 +197,9 @@ class HypercertResolver extends HypercertBaseResolver {
205197
return null;
206198
}
207199

208-
try {
209-
console.log(
210-
`[HypercertResolver::sales] Fetching orders for ${hypercert.hypercert_id}`,
211-
);
212-
213-
const salesRes = await this.supabaseCachingService
214-
.getSales({
215-
where: { hypercert_id: { eq: hypercert.hypercert_id } },
216-
})
217-
.execute();
218-
219-
if (!salesRes) {
220-
console.warn(
221-
`[HypercertResolver::sales] Error fetching sales for ${hypercert.hypercert_id}: `,
222-
salesRes,
223-
);
224-
return { data: [] };
225-
}
226-
227-
return {
228-
data: salesRes || [],
229-
count: salesRes?.length || 0,
230-
};
231-
} catch (e) {
232-
throw new Error(
233-
`[HypercertResolver::sales] Error fetching sales for ${hypercert.hypercert_id}: ${(e as Error).toString()}`,
234-
);
235-
}
200+
return await this.getSales({
201+
where: { hypercert_id: { eq: hypercert.hypercert_id } },
202+
});
236203
}
237204
}
238205

src/graphql/schemas/resolvers/orderResolver.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
import { Order } from "../typeDefs/orderTypeDefs.js";
1010
import { GetOrdersArgs } from "../args/orderArgs.js";
1111
import { getHypercertTokenId } from "../../../utils/tokenIds.js";
12-
import { HypercertBaseType } from "../typeDefs/baseTypes/hypercertBaseType.js";
1312
import { getAddress } from "viem";
1413
import { HypercertExchangeClient } from "@hypercerts-org/marketplace-sdk";
1514
import { ethers } from "ethers";
@@ -52,17 +51,16 @@ class OrderResolver extends OrderBaseResolver {
5251
// TODO: Update this once array filters are available
5352
const allHypercerts = await Promise.all(
5453
allHypercertIds.map(async (hypercertId) => {
55-
const hypercertRes = await this.getHypercerts({
56-
where: {
57-
hypercert_id: {
58-
eq: hypercertId,
54+
return await this.getHypercerts(
55+
{
56+
where: {
57+
hypercert_id: {
58+
eq: hypercertId,
59+
},
5960
},
6061
},
61-
});
62-
63-
console.log("Found hypercert for order: ", hypercertRes);
64-
65-
return hypercertRes?.[0] as HypercertBaseType;
62+
true,
63+
);
6664
}),
6765
).then((res) =>
6866
_.keyBy(

0 commit comments

Comments
 (0)