Skip to content

Commit 12038fc

Browse files
committed
feat(service): introduce image fetching service
Refactors the SupabaseCachingService to get all hypercert columns except for the image. Renamed the getMetadata method to getMetadataWithoutImage to make this explicit. Introduces MetadataImageService for fetching the image when the field is selected in a metadata query.
1 parent 028f072 commit 12038fc

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
@@ -38,13 +38,14 @@ export function createBaseResolver<T extends ClassType>(
3838
readonly supabaseCachingService = container.resolve(SupabaseCachingService);
3939
readonly supabaseDataService = container.resolve(SupabaseDataService);
4040

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

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

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)