Skip to content

Commit

Permalink
refactor: Use AJV compilers (#209)
Browse files Browse the repository at this point in the history
Needed for #205
  • Loading branch information
gnarea authored Jul 30, 2023
1 parent 7a8e870 commit e53a732
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 105 deletions.
7 changes: 1 addition & 6 deletions src/awala/routes/awala.routes.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,6 @@ describe('Awala routes', () => {
expect(logs).toContainEqual(
partialPinoLog('info', 'Refused invalid member bundle request', {
publicKeyId: MEMBER_PUBLIC_KEY_MONGO_ID,
reason: expect.stringContaining('memberBundleStartDate'),
}),
);
});
Expand Down Expand Up @@ -214,7 +213,6 @@ describe('Awala routes', () => {
expect(logs).toContainEqual(
partialPinoLog('info', 'Refused invalid member bundle request', {
publicKeyId: MEMBER_PUBLIC_KEY_MONGO_ID,
reason: expect.stringContaining('peerId'),
}),
);
});
Expand All @@ -235,7 +233,6 @@ describe('Awala routes', () => {
expect(logs).toContainEqual(
partialPinoLog('info', 'Refused invalid member bundle request', {
publicKeyId: MEMBER_PUBLIC_KEY_MONGO_ID,
reason: expect.stringContaining('signature'),
}),
);
});
Expand Down Expand Up @@ -300,9 +297,7 @@ describe('Awala routes', () => {

expect(response).toHaveProperty('statusCode', HTTP_STATUS_CODES.BAD_REQUEST);
expect(logs).toContainEqual(
partialPinoLog('info', 'Refused invalid member bundle request', {
reason: expect.stringContaining('publicKeyImportToken'),
}),
partialPinoLog('info', 'Refused invalid member key import request'),
);
});

Expand Down
60 changes: 24 additions & 36 deletions src/awala/routes/awala.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,13 @@ import { HTTP_STATUS_CODES } from '../../utilities/http.js';
import type { PluginDone } from '../../utilities/fastify/PluginDone.js';
import type { FastifyTypedInstance } from '../../utilities/fastify/FastifyTypedInstance.js';
import {
MEMBER_BUNDLE_REQUEST_SCHEMA,
MEMBER_KEY_IMPORT_REQUEST_SCHEMA,
isMemberBundleRequest,
isMemberKeyImportRequest,
type MemberBundleRequest,
type MemberKeyImportRequest,
} from '../../schemas/awala.schema.js';
import type { ServiceOptions } from '../../serviceTypes.js';
import { processMemberKeyImportToken } from '../../memberKeyImportToken.js';
import { validateMessage } from '../../utilities/validateMessage.js';
import { createMemberBundleRequest } from '../../memberBundle.js';
import {
getIncomingServiceMessageEvent,
Expand All @@ -32,26 +31,18 @@ async function processMemberBundleRequest(
options.logger.info('Refused invalid json format');
return false;
}
const validationResult = validateMessage(
{
...data,
peerId: incomingMessage.senderId,
},
MEMBER_BUNDLE_REQUEST_SCHEMA,
);
if (typeof validationResult === 'string') {
options.logger.info(
{
publicKeyId: (data as MemberBundleRequest).publicKeyId,
reason: validationResult,
},
'Refused invalid member bundle request',
);
return false;

const finalData = { ...data, peerId: incomingMessage.senderId };
if (isMemberBundleRequest(finalData)) {
await createMemberBundleRequest(finalData, options);
return true;
}

await createMemberBundleRequest(validationResult, options);
return true;
options.logger.info(
{ publicKeyId: (data as MemberBundleRequest).publicKeyId },
'Refused invalid member bundle request',
);
return false;
}

async function processMemberKeyImportRequest(
Expand All @@ -64,28 +55,25 @@ async function processMemberKeyImportRequest(
options.logger.info('Refused invalid json format');
return false;
}
const validationResult = validateMessage(data, MEMBER_KEY_IMPORT_REQUEST_SCHEMA);
if (typeof validationResult === 'string') {
options.logger.info(
if (isMemberKeyImportRequest(data)) {
const result = await processMemberKeyImportToken(
incomingMessage.senderId,
{
publicKeyImportToken: (data as MemberKeyImportRequest).publicKeyImportToken,
reason: validationResult,
publicKey: data.publicKey,
publicKeyImportToken: data.publicKeyImportToken,
},
'Refused invalid member bundle request',
ceEmitter,
options,
);
return false;
return result.didSucceed;
}

const result = await processMemberKeyImportToken(
incomingMessage.senderId,
options.logger.info(
{
publicKey: validationResult.publicKey,
publicKeyImportToken: validationResult.publicKeyImportToken,
publicKeyImportToken: (data as MemberKeyImportRequest).publicKeyImportToken,
},
ceEmitter,
options,
'Refused invalid member key import request',
);
return result.didSucceed;
return false;
}

enum AwalaRequestMessageType {
Expand Down
9 changes: 7 additions & 2 deletions src/schemas/awala.schema.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import type { FromSchema } from 'json-schema-to-ts';

import { compileSchema } from '../utilities/ajv.js';

import { BASE_64_REGEX } from './validation.js';

export const MEMBER_BUNDLE_REQUEST_SCHEMA = {
const MEMBER_BUNDLE_REQUEST_SCHEMA = {
type: 'object',

properties: {
Expand All @@ -15,7 +17,7 @@ export const MEMBER_BUNDLE_REQUEST_SCHEMA = {
required: ['publicKeyId', 'memberBundleStartDate', 'signature', 'peerId'],
} as const;

export const MEMBER_KEY_IMPORT_REQUEST_SCHEMA = {
const MEMBER_KEY_IMPORT_REQUEST_SCHEMA = {
type: 'object',

properties: {
Expand All @@ -27,4 +29,7 @@ export const MEMBER_KEY_IMPORT_REQUEST_SCHEMA = {
} as const;

export type MemberBundleRequest = FromSchema<typeof MEMBER_BUNDLE_REQUEST_SCHEMA>;
export const isMemberBundleRequest = compileSchema(MEMBER_BUNDLE_REQUEST_SCHEMA);

export type MemberKeyImportRequest = FromSchema<typeof MEMBER_KEY_IMPORT_REQUEST_SCHEMA>;
export const isMemberKeyImportRequest = compileSchema(MEMBER_KEY_IMPORT_REQUEST_SCHEMA);
7 changes: 7 additions & 0 deletions src/utilities/ajv.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { type $Compiler, wrapCompilerAsTypeGuard } from 'json-schema-to-ts';
import addFormats from 'ajv-formats';
import Ajv from 'ajv';

const ajv = addFormats(new Ajv());
const $compile: $Compiler = (schema) => ajv.compile(schema);
export const compileSchema = wrapCompilerAsTypeGuard($compile);
43 changes: 0 additions & 43 deletions src/utilities/validateMessage.spec.ts

This file was deleted.

18 changes: 0 additions & 18 deletions src/utilities/validateMessage.ts

This file was deleted.

0 comments on commit e53a732

Please sign in to comment.