Skip to content

Commit fd67912

Browse files
authored
Merge pull request #259 from hypercerts-org/feat/separate_metadata_image_fetching
Separate metadata image fetching from metadata query
2 parents eba09e0 + 12038fc commit fd67912

File tree

10 files changed

+102
-16
lines changed

10 files changed

+102
-16
lines changed

src/graphql/schemas/resolvers/baseTypes.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,14 @@ export function createBaseResolver<T extends ClassType>(
3939
readonly supabaseCachingService = container.resolve(SupabaseCachingService);
4040
readonly supabaseDataService = container.resolve(SupabaseDataService);
4141

42-
getMetadata(args: GetMetadataArgs, single: boolean = false) {
42+
getMetadataWithoutImage(args: GetMetadataArgs, single: boolean = false) {
4343
console.debug(
4444
`[${entityFieldName}Resolver::getMetadata] Fetching metadata`,
4545
);
4646

4747
try {
48-
const queries = this.supabaseCachingService.getMetadata(args);
48+
const queries =
49+
this.supabaseCachingService.getMetadataWithoutImage(args);
4950
if (single) {
5051
return queries.data.executeTakeFirst();
5152
}

src/graphql/schemas/resolvers/fractionResolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class FractionResolver extends FractionBaseResolver {
2929
return;
3030
}
3131

32-
return await this.getMetadata(
32+
return await this.getMetadataWithoutImage(
3333
{
3434
where: { hypercerts: { id: { eq: fraction.claims_id } } },
3535
},

src/graphql/schemas/resolvers/hyperboardResolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class HyperboardResolver extends HyperboardBaseResolver {
4242
}).then((res) => res.data),
4343
]);
4444

45-
const metadata = await this.getMetadata({
45+
const metadata = await this.getMetadataWithoutImage({
4646
where: { hypercerts: { hypercert_id: { in: hypercertIds } } },
4747
})
4848
.then((res) => res.data)

src/graphql/schemas/resolvers/hypercertResolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class HypercertResolver extends HypercertBaseResolver {
3838
return;
3939
}
4040

41-
return await this.getMetadata(
41+
return await this.getMetadataWithoutImage(
4242
{ where: { uri: { eq: hypercert.uri } } },
4343
true,
4444
);

src/graphql/schemas/resolvers/metadataResolver.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,43 @@
1-
import { Args, ObjectType, Query, Resolver } from "type-graphql";
1+
import {
2+
Args,
3+
FieldResolver,
4+
ObjectType,
5+
Query,
6+
Resolver,
7+
Root,
8+
} from "type-graphql";
9+
import { inject, singleton } from "tsyringe";
210
import { Metadata } from "../typeDefs/metadataTypeDefs.js";
311
import { GetMetadataArgs } from "../args/metadataArgs.js";
412
import { createBaseResolver, DataResponse } from "./baseTypes.js";
13+
import { MetadataImageService } from "../../../services/MetadataImageService.js";
514

615
@ObjectType()
716
export class GetMetadataResponse extends DataResponse(Metadata) {}
817

918
const MetadataBaseResolver = createBaseResolver("metadata");
1019

20+
@singleton()
1121
@Resolver(() => Metadata)
1222
class MetadataResolver extends MetadataBaseResolver {
23+
constructor(
24+
@inject(MetadataImageService) private imageService: MetadataImageService,
25+
) {
26+
super();
27+
}
28+
1329
@Query(() => GetMetadataResponse)
1430
async metadata(@Args() args: GetMetadataArgs) {
15-
return await this.getMetadata(args);
31+
return await this.getMetadataWithoutImage(args);
32+
}
33+
34+
@FieldResolver(() => String, {
35+
nullable: true,
36+
description: "Base64 encoded representation of the image of the hypercert",
37+
})
38+
async image(@Root() metadata: Metadata) {
39+
if (!metadata.uri) return null;
40+
return await this.imageService.getImageByUri(metadata.uri);
1641
}
1742
}
1843

src/graphql/schemas/resolvers/orderResolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class OrderResolver extends OrderBaseResolver {
107107
true,
108108
);
109109

110-
const metadata = await this.getMetadata(
110+
const metadata = await this.getMetadataWithoutImage(
111111
{
112112
where: {
113113
hypercerts: {

src/graphql/schemas/resolvers/salesResolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class SalesResolver extends SalesBaseResolver {
4848
return null;
4949
}
5050

51-
const metadata = await this.getMetadata(
51+
const metadata = await this.getMetadataWithoutImage(
5252
{
5353
where: {
5454
hypercerts: {

src/graphql/schemas/typeDefs/metadataTypeDefs.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@ class Metadata extends BasicTypeDef {
1414
name?: string;
1515
@Field({ nullable: true, description: "Description of the hypercert" })
1616
description?: string;
17-
@Field({
18-
nullable: true,
19-
description: "Base64 encoded representation of the image of the hypercert",
20-
})
21-
image?: string;
2217
@Field({ nullable: true, description: "URI of the hypercert metadata" })
2318
uri?: string;
2419
@Field({
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { singleton } from "tsyringe";
2+
import { kyselyCaching } from "../client/kysely.js";
3+
import { CachingDatabase } from "../types/kyselySupabaseCaching.js";
4+
import { BaseSupabaseService } from "./BaseSupabaseService.js";
5+
6+
@singleton()
7+
export class MetadataImageService extends BaseSupabaseService<CachingDatabase> {
8+
constructor() {
9+
super(kyselyCaching);
10+
}
11+
12+
// TODO: remove these when we more refactor the services to improve typing and performance
13+
getDataQuery() {
14+
throw new Error("Method not implemented - not needed for image service");
15+
}
16+
17+
getCountQuery() {
18+
throw new Error("Method not implemented - not needed for image service");
19+
}
20+
21+
async getImageByUri(uri: string): Promise<string | null> {
22+
const result = await this.db
23+
.selectFrom("metadata")
24+
.select(["image"])
25+
.where("uri", "=", uri)
26+
.executeTakeFirst();
27+
28+
return result?.image ?? null;
29+
}
30+
}

src/services/SupabaseCachingService.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class SupabaseCachingService extends BaseSupabaseService<CachingDatabase>
5656
};
5757
}
5858

59-
getMetadata(args: GetMetadataArgs) {
59+
getMetadataWithoutImage(args: GetMetadataArgs) {
6060
return {
6161
data: this.handleGetData("metadata", args),
6262
count: this.handleGetCount("metadata", args),
@@ -138,9 +138,44 @@ export class SupabaseCachingService extends BaseSupabaseService<CachingDatabase>
138138
case "fractions_view":
139139
return this.db.selectFrom("fractions_view").selectAll();
140140
case "metadata":
141+
// Skip the image column
142+
// 1. id
143+
// 2. name
144+
// 3. description
145+
// 4. image
146+
// 5. external_url
147+
// 6. work_scope
148+
// 7. work_timeframe_from
149+
// 8. work_timeframe_to
150+
// 9. impact_scope
151+
// 10. impact_timeframe_from
152+
// 11. impact_timeframe_to
153+
// 12. contributors
154+
// 13. rights
155+
// 14. uri
156+
// 15. properties
157+
// 16. allow_list_uri
158+
// 17. parsed
141159
return this.db
142160
.selectFrom("metadata")
143-
.selectAll("metadata")
161+
.select([
162+
"id",
163+
"name",
164+
"description",
165+
"external_url",
166+
"work_scope",
167+
"work_timeframe_from",
168+
"work_timeframe_to",
169+
"impact_scope",
170+
"impact_timeframe_from",
171+
"impact_timeframe_to",
172+
"contributors",
173+
"rights",
174+
"uri",
175+
"properties",
176+
"allow_list_uri",
177+
"parsed",
178+
])
144179
.$if(args.where?.hypercerts, (qb) =>
145180
qb.innerJoin("claims", "claims.uri", "metadata.uri"),
146181
);

0 commit comments

Comments
 (0)