Skip to content

Commit 5054fee

Browse files
committed
fix(metadata.test.ts): metadata validation handling and responses
Restores the metadata validation endpoint testing. Additionally the full metadata controller is using try catches and we updated the response types. The response types have been made more simple and flexible, for one to support the cases of validation where the processing can be successful but the data is invalid. Lastly, responses where data is set as null were cleaned so simply not return data.
1 parent 7ebfb2f commit 5054fee

File tree

4 files changed

+166
-145
lines changed

4 files changed

+166
-145
lines changed

src/controllers/HyperboardController.ts

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
import type {
1515
ApiResponse,
1616
HyperboardCreateRequest,
17-
HyperboardCreateResponse,
17+
HyperboardResponse,
1818
HyperboardUpdateRequest,
1919
} from "../types/api.js";
2020
import { z } from "zod";
@@ -43,7 +43,7 @@ export class HyperboardController extends Controller {
4343
})
4444
public async createHyperboard(
4545
@Body() requestBody: HyperboardCreateRequest,
46-
): Promise<HyperboardCreateResponse> {
46+
): Promise<HyperboardResponse> {
4747
const inputSchema = z
4848
.object({
4949
chainIds: z
@@ -175,7 +175,6 @@ export class HyperboardController extends Controller {
175175
return {
176176
success: false,
177177
message: "Invalid input",
178-
data: null,
179178
errors: JSON.parse(parsedBody.error.toString()),
180179
};
181180
}
@@ -228,7 +227,6 @@ export class HyperboardController extends Controller {
228227
return {
229228
success: false,
230229
message: "Invalid signature",
231-
data: null,
232230
};
233231
}
234232

@@ -262,7 +260,6 @@ export class HyperboardController extends Controller {
262260
return {
263261
success: false,
264262
message: "Error creating hyperboard",
265-
data: null,
266263
};
267264
}
268265

@@ -355,7 +352,6 @@ export class HyperboardController extends Controller {
355352
return {
356353
success: false,
357354
message: "Error updating collection",
358-
data: null,
359355
};
360356
}
361357
}
@@ -430,7 +426,6 @@ export class HyperboardController extends Controller {
430426
return {
431427
success: false,
432428
message: "Error creating collection",
433-
data: null,
434429
};
435430
}
436431
}
@@ -453,7 +448,7 @@ export class HyperboardController extends Controller {
453448
public async updateHyperboard(
454449
@Path() hyperboardId: string,
455450
@Body() requestBody: HyperboardUpdateRequest,
456-
): Promise<ApiResponse<{ id: string } | null>> {
451+
): Promise<HyperboardResponse> {
457452
const inputSchema = z
458453
.object({
459454
id: z.string().uuid(),
@@ -590,7 +585,6 @@ export class HyperboardController extends Controller {
590585
return {
591586
success: false,
592587
message: "Invalid input",
593-
data: null,
594588
errors: JSON.parse(parsedBody.error.toString()),
595589
};
596590
}
@@ -603,7 +597,6 @@ export class HyperboardController extends Controller {
603597
return {
604598
success: false,
605599
message: "Hyperboard not found",
606-
data: null,
607600
};
608601
}
609602

@@ -657,7 +650,6 @@ export class HyperboardController extends Controller {
657650
return {
658651
success: false,
659652
message: "Invalid signature",
660-
data: null,
661653
};
662654
}
663655

@@ -671,7 +663,6 @@ export class HyperboardController extends Controller {
671663
return {
672664
success: false,
673665
message: "Not authorized to update hyperboard",
674-
data: null,
675666
};
676667
}
677668

@@ -692,7 +683,6 @@ export class HyperboardController extends Controller {
692683
return {
693684
success: false,
694685
message: "Error updating hyperboard",
695-
data: null,
696686
};
697687
}
698688

@@ -794,7 +784,6 @@ export class HyperboardController extends Controller {
794784
return {
795785
success: false,
796786
message: "Error updating collection",
797-
data: null,
798787
};
799788
}
800789
}
@@ -867,7 +856,6 @@ export class HyperboardController extends Controller {
867856
return {
868857
success: false,
869858
message: "Error creating collection",
870-
data: null,
871859
};
872860
}
873861
}

src/controllers/MetadataController.ts

Lines changed: 129 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -116,57 +116,67 @@ export class MetadataController extends Controller {
116116
@Body() requestBody: StoreMetadataWithAllowlistRequest,
117117
): Promise<StorageResponse> {
118118
const storage = await StorageService.init();
119-
const metadataValidationResult = validateMetadataAndClaimdata(
120-
requestBody.metadata,
121-
);
119+
const { metadata } = requestBody;
120+
const { allowList, totalUnits } = requestBody;
122121

123-
if (!metadataValidationResult.valid) {
124-
this.setStatus(422);
125-
return {
126-
success: false,
127-
message: "Validation failed",
128-
errors: metadataValidationResult.errors,
129-
};
130-
}
122+
try {
123+
const metadataValidationResult = validateMetadataAndClaimdata(metadata);
131124

132-
if (requestBody.metadata.allowList) {
133-
this.setStatus(409);
134-
return {
135-
success: false,
136-
message: "Allow list detected in metadata",
137-
errors: { metadata: "Allowlist URI already present in metadata." },
138-
};
139-
}
125+
if (!metadataValidationResult.valid) {
126+
this.setStatus(422);
127+
return {
128+
success: false,
129+
message: "Validation failed",
130+
errors: metadataValidationResult.errors,
131+
};
132+
}
133+
134+
if (allowList) {
135+
this.setStatus(409);
136+
return {
137+
success: false,
138+
message: "Allow list detected in metadata",
139+
errors: { metadata: "Allowlist URI already present in metadata." },
140+
};
141+
}
142+
143+
const allowlistValidationResult = parseAndValidateMerkleTree({
144+
allowList,
145+
totalUnits,
146+
});
147+
148+
if (!allowlistValidationResult.valid) {
149+
this.setStatus(422);
150+
return {
151+
success: false,
152+
message: "Validation failed",
153+
errors: allowlistValidationResult.errors,
154+
};
155+
}
140156

141-
const allowlistValidationResult = parseAndValidateMerkleTree({
142-
allowList: requestBody.allowList,
143-
totalUnits: requestBody?.totalUnits,
144-
});
157+
const uploadResult = await storage.uploadFile({
158+
file: jsonToBlob(requestBody.allowList),
159+
});
160+
const cid = await storage.uploadFile({
161+
file: jsonToBlob({
162+
...metadataValidationResult.data,
163+
allowList: `ipfs://${uploadResult.cid}`,
164+
}),
165+
});
145166

146-
if (!allowlistValidationResult.valid) {
167+
this.setStatus(201);
168+
return {
169+
success: true,
170+
data: cid,
171+
};
172+
} catch (e) {
147173
this.setStatus(422);
148174
return {
149175
success: false,
150-
message: "Validation failed",
151-
errors: allowlistValidationResult.errors,
176+
message: "Error while storing metadata",
177+
errors: { metadata: (e as Error).message },
152178
};
153179
}
154-
155-
const uploadResult = await storage.uploadFile({
156-
file: jsonToBlob(requestBody.allowList),
157-
});
158-
const cid = await storage.uploadFile({
159-
file: jsonToBlob({
160-
...metadataValidationResult.data,
161-
allowList: `ipfs://${uploadResult.cid}`,
162-
}),
163-
});
164-
165-
this.setStatus(201);
166-
return {
167-
success: true,
168-
data: cid,
169-
};
170180
}
171181

172182
/**
@@ -185,39 +195,53 @@ export class MetadataController extends Controller {
185195
public async validateMetadata(
186196
@Body() requestBody: ValidateMetadataRequest,
187197
): Promise<ValidationResponse> {
188-
const metadataValidationResult = validateMetadataAndClaimdata(
189-
requestBody.metadata,
190-
);
191-
192-
if (!metadataValidationResult.valid) {
193-
this.setStatus(422);
194-
return {
195-
success: false,
196-
message: "Errors while validating metadata or allow list",
197-
errors: metadataValidationResult.errors,
198-
};
199-
}
198+
const { metadata } = requestBody;
200199

201-
if (requestBody.metadata.allowList) {
202-
const allowListValidationResult = await validateRemoteAllowList(
203-
requestBody.metadata.allowList,
204-
);
200+
try {
201+
const metadataValidationResult = validateMetadataAndClaimdata(metadata);
205202

206-
if (!allowListValidationResult.valid) {
203+
if (!metadataValidationResult.valid) {
207204
this.setStatus(422);
208205
return {
209-
success: false,
210-
message: "Errors while validating allow list reference in metadata",
211-
errors: allowListValidationResult.errors,
206+
success: true,
207+
valid: false,
208+
message: "Errors while validating metadata",
209+
errors: metadataValidationResult.errors,
212210
};
213211
}
214-
}
215212

216-
this.setStatus(200);
217-
return {
218-
success: true,
219-
message: "Validation successful",
220-
};
213+
if (metadata.allowList) {
214+
const allowListValidationResult = await validateRemoteAllowList(
215+
metadata.allowList,
216+
);
217+
218+
if (!allowListValidationResult.valid) {
219+
this.setStatus(422);
220+
return {
221+
success: true,
222+
valid: false,
223+
message:
224+
"Errors while validating allow list referenced in metadata",
225+
errors: allowListValidationResult.errors,
226+
};
227+
}
228+
}
229+
230+
this.setStatus(200);
231+
return {
232+
success: true,
233+
valid: true,
234+
message: "Metadata is valid hypercert metadata",
235+
};
236+
} catch (e) {
237+
this.setStatus(422);
238+
return {
239+
success: false,
240+
valid: false,
241+
message: "Error while validating metadata",
242+
errors: { metadata: (e as Error).message },
243+
};
244+
}
221245
}
222246

223247
/**
@@ -236,37 +260,50 @@ export class MetadataController extends Controller {
236260
public async validateMetadataWithAllowlist(
237261
@Body() requestBody: StoreMetadataWithAllowlistRequest,
238262
): Promise<ValidationResponse> {
239-
const metadataValidationResult = validateMetadataAndClaimdata(
240-
requestBody.metadata,
241-
);
263+
const { metadata, allowList, totalUnits } = requestBody;
242264

243-
if (!metadataValidationResult.valid) {
244-
this.setStatus(422);
245-
return {
246-
success: false,
247-
message: "Validation failed",
248-
errors: metadataValidationResult.errors,
249-
};
250-
}
265+
try {
266+
const metadataValidationResult = validateMetadataAndClaimdata(metadata);
267+
268+
if (!metadataValidationResult.valid) {
269+
this.setStatus(422);
270+
return {
271+
success: true,
272+
valid: false,
273+
message: "Validation failed",
274+
errors: metadataValidationResult.errors,
275+
};
276+
}
277+
278+
const allowlistValidationResult = parseAndValidateMerkleTree({
279+
allowList,
280+
totalUnits,
281+
});
251282

252-
const allowlistValidationResult = parseAndValidateMerkleTree({
253-
allowList: requestBody.allowList,
254-
totalUnits: requestBody?.totalUnits,
255-
});
283+
if (!allowlistValidationResult.valid) {
284+
this.setStatus(422);
285+
return {
286+
success: true,
287+
valid: false,
288+
message: "Validation failed",
289+
errors: allowlistValidationResult.errors,
290+
};
291+
}
256292

257-
if (!allowlistValidationResult.valid) {
293+
this.setStatus(200);
294+
return {
295+
success: true,
296+
valid: true,
297+
message: "Metadata is valid hypercert metadata",
298+
};
299+
} catch (e) {
258300
this.setStatus(422);
259301
return {
260302
success: false,
261-
message: "Validation failed",
262-
errors: allowlistValidationResult.errors,
303+
valid: false,
304+
message: "Error while validating metadata",
305+
errors: { metadata: (e as Error).message },
263306
};
264307
}
265-
266-
this.setStatus(200);
267-
return {
268-
success: true,
269-
message: "Validation successful",
270-
};
271308
}
272309
}

0 commit comments

Comments
 (0)