From 06e716be6027bb83f0bdb4098f43232bf93a5650 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Fri, 25 Oct 2024 11:07:51 +0200 Subject: [PATCH] fix(#2233): enforce validating metadata against the specified standard --- CHANGELOG.md | 2 +- .../molecules/GovernanceActionCard.tsx | 18 +++++++++-------- .../frontend/src/models/metadataValidation.ts | 6 ++++++ govtool/frontend/src/utils/mapDtoToDrep.ts | 8 +++++++- .../frontend/src/utils/mapDtoToProposal.ts | 20 +++++++++++++------ .../metadata-validation/src/app.service.ts | 6 +++++- .../src/dto/validateMetadata.dto.ts | 4 ++++ 7 files changed, 47 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58efefbbc..bec2beb03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ changes. ### Fixed -- +- Fix validating metadata against the CIP standard [Issue 2233](https://github.com/IntersectMBO/govtool/issues/2233) ### Changed diff --git a/govtool/frontend/src/components/molecules/GovernanceActionCard.tsx b/govtool/frontend/src/components/molecules/GovernanceActionCard.tsx index 89b802254..c70ede09a 100644 --- a/govtool/frontend/src/components/molecules/GovernanceActionCard.tsx +++ b/govtool/frontend/src/components/molecules/GovernanceActionCard.tsx @@ -87,14 +87,16 @@ export const GovernanceActionCard: FC = ({ ...props }) => { title={title} isDataMissing={metadataStatus} /> - + {!metadataStatus && ( + + )} = { status?: MetadataValidationStatus; valid: boolean; @@ -15,6 +20,7 @@ export type ValidateMetadataResult = { export type MetadataValidationDTO = { url: string; hash: string; + standard?: MetadataStandard; }; export type DRepMetadata = { diff --git a/govtool/frontend/src/utils/mapDtoToDrep.ts b/govtool/frontend/src/utils/mapDtoToDrep.ts index 923acf546..419973c14 100644 --- a/govtool/frontend/src/utils/mapDtoToDrep.ts +++ b/govtool/frontend/src/utils/mapDtoToDrep.ts @@ -1,4 +1,9 @@ -import { DRepData, DRepMetadata, DrepDataDTO } from "@/models"; +import { + DRepData, + DRepMetadata, + DrepDataDTO, + MetadataStandard, +} from "@/models"; import { postValidate } from "@/services"; import { fixViewForScriptBasedDRep } from "./dRep"; @@ -23,6 +28,7 @@ export const mapDtoToDrep = async (dto: DrepDataDTO): Promise => { const validationResponse = await postValidate({ url: dto.url, hash: dto.metadataHash, + standard: MetadataStandard.CIP119, }); return { ...dto, diff --git a/govtool/frontend/src/utils/mapDtoToProposal.ts b/govtool/frontend/src/utils/mapDtoToProposal.ts index 4c118c294..5324eb342 100644 --- a/govtool/frontend/src/utils/mapDtoToProposal.ts +++ b/govtool/frontend/src/utils/mapDtoToProposal.ts @@ -1,4 +1,9 @@ -import { ProposalData, ProposalDataDTO, ProposalMetadata } from "@/models"; +import { + MetadataStandard, + ProposalData, + ProposalDataDTO, + ProposalMetadata, +} from "@/models"; import { postValidate } from "@/services"; export const mapDtoToProposal = async ( @@ -8,15 +13,18 @@ export const mapDtoToProposal = async ( const validationResponse = await postValidate({ url: dto.url, hash: dto.metadataHash, + standard: MetadataStandard.CIP108, }); return { ...dto, - title: validationResponse.metadata?.title, - abstract: validationResponse.metadata?.abstract, - motivation: validationResponse.metadata?.motivation, - rationale: validationResponse.metadata?.rationale, - references: validationResponse.metadata?.references?.map(({ uri }) => uri), + title: dto.title || validationResponse.metadata?.title, + abstract: dto.abstract || validationResponse.metadata?.abstract, + motivation: dto.motivation || validationResponse.metadata?.motivation, + rationale: dto.rationale || validationResponse.metadata?.rationale, + references: validationResponse.metadata?.references?.map( + ({ uri }) => uri, + ), metadataStatus: validationResponse.status || null, metadataValid: validationResponse.valid, }; diff --git a/govtool/metadata-validation/src/app.service.ts b/govtool/metadata-validation/src/app.service.ts index 1ce809d1b..a948ef173 100644 --- a/govtool/metadata-validation/src/app.service.ts +++ b/govtool/metadata-validation/src/app.service.ts @@ -16,9 +16,11 @@ export class AppService { async validateMetadata({ hash, url, + standard: paramStandard, }: ValidateMetadataDTO): Promise { let status: MetadataValidationStatus; let metadata: Record; + let standard = paramStandard; try { const { data: rawData } = await firstValueFrom( @@ -42,7 +44,9 @@ export class AppService { throw MetadataValidationStatus.INCORRECT_FORMAT; } - const standard = getStandard(parsedData); + if (!standard) { + standard = getStandard(parsedData); + } if (standard) { await validateMetadataStandard(parsedData.body, standard); diff --git a/govtool/metadata-validation/src/dto/validateMetadata.dto.ts b/govtool/metadata-validation/src/dto/validateMetadata.dto.ts index c962d5679..edf5bf55a 100644 --- a/govtool/metadata-validation/src/dto/validateMetadata.dto.ts +++ b/govtool/metadata-validation/src/dto/validateMetadata.dto.ts @@ -1,5 +1,9 @@ +import { MetadataStandard } from '@/types'; + export class ValidateMetadataDTO { hash: string; url: string; + + standard?: MetadataStandard; }