Skip to content

Commit

Permalink
fix: fix error handling for metadata service; add optional support fo…
Browse files Browse the repository at this point in the history
…r CIP-119
  • Loading branch information
MSzalowski committed May 29, 2024
1 parent 3aefa67 commit 96e762f
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 8 deletions.
6 changes: 0 additions & 6 deletions govtool/metadata-validation/src/dto/validateMetadata.dto.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
import { IsUrl, IsNotEmpty, IsEnum, IsOptional } from 'class-validator';

import { MetadataStandard } from '@types';

export class ValidateMetadataDTO {
@IsNotEmpty()
hash: string;

@IsUrl()
url: string;

@IsOptional()
@IsEnum(MetadataStandard)
standard?: MetadataStandard;
}
7 changes: 6 additions & 1 deletion govtool/metadata-validation/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,12 @@ async function bootstrap() {
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('api', app, document);

app.useGlobalPipes(new ValidationPipe());
app.useGlobalPipes(
new ValidationPipe({
// Do not throw error on missing fields
exceptionFactory: () => ({ status: 200, valid: false }),
}),
);
await app.listen(process.env.PORT);
}
bootstrap();
38 changes: 38 additions & 0 deletions govtool/metadata-validation/src/schemas/cipStandardSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ const CIP100_URL =
const CIP108_URL =
'https://github.com/cardano-foundation/CIPs/blob/master/CIP-0108/README.md#';

// Temporary URL for the CIP-119 metadata
const CIPQQQ_URL =
'https://github.com/cardano-foundation/CIPs/blob/master/CIP-QQQ/README.md#';

export const cipStandardSchema: StandardSpecification = {
// Source of CIP-108: https://github.com/Ryun1/CIPs/blob/governance-metadata-actions/CIP-0108/README.md
[MetadataStandard.CIP108]: Joi.object({
Expand Down Expand Up @@ -46,4 +50,38 @@ export const cipStandardSchema: StandardSpecification = {
),
}),
}),
[MetadataStandard.CIPQQQ]: Joi.object({
'@context': Joi.object({
'@language': Joi.string().required(),
CIP100: Joi.string().valid(CIP100_URL).required(),
CIPQQQ: Joi.string().valid(CIPQQQ_URL).required(),
hashAlgorithm: Joi.string().valid('CIP100:hashAlgorithm').required(),
body: Joi.object(),
authors: Joi.object(),
}),
authors: Joi.array(),
hashAlgorithm: Joi.object({
'@value': Joi.string().valid('blake2b-256').required(),
}),
body: Joi.object({
bio: Joi.object({ '@value': Joi.string() }),
dRepName: Joi.object({ '@value': Joi.string() }),
email: Joi.object({ '@value': Joi.string() }),
references: Joi.array().items(
Joi.object({
'@type': Joi.string(),
'CIPQQQ:reference-label': Joi.object({
'@value': Joi.string().required(),
}),
'CIPQQQ:reference-uri': Joi.object({
'@value': Joi.string().uri().required(),
}),
'CIPQQQ:reference-hash': Joi.object({
hashDigest: Joi.string().required(),
hashAlgorithm: Joi.string().required(),
}),
}),
),
}),
}),
};
1 change: 1 addition & 0 deletions govtool/metadata-validation/src/types/validateMetadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { MetadataValidationStatus } from '@enums';

export enum MetadataStandard {
CIP108 = 'CIP108',
CIPQQQ = 'CIPQQQ',
}

export type ValidateMetadataResult = {
Expand Down
19 changes: 18 additions & 1 deletion govtool/metadata-validation/src/utils/parseMetadata.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { MetadataStandard } from '@/types';

const CIP_108_VALUE_KEYS = ['abstract', 'motivation', 'rationale', 'title'];
export const parseMetadata = (metadata: any, standard: MetadataStandard) => {
const CIP_QQQ_VALUE_KEYS = ['bio', 'dRepName', 'email', 'references'];
export const parseMetadata = (
metadata: any,
standard = MetadataStandard.CIP108,
) => {
const parsedMetadata = {};
switch (standard) {
case MetadataStandard.CIP108:
Expand All @@ -17,6 +21,19 @@ export const parseMetadata = (metadata: any, standard: MetadataStandard) => {
}
}
return parsedMetadata;

case MetadataStandard.CIPQQQ:
for (const [key, value] of Object.entries(metadata)) {
if (CIP_QQQ_VALUE_KEYS.includes(key)) {
parsedMetadata[key] = value['@value'];
}
if (key === 'references') {
parsedMetadata[key] = (Array.isArray(value) ? value : [])?.map(
(reference) => reference['CIPQQQ:reference-uri']['@value'],
);
}
}
return parsedMetadata;
default:
return;
}
Expand Down

0 comments on commit 96e762f

Please sign in to comment.