From 49c131a6847a9603c24186e30e58f9b9cf82b5af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Mon, 9 Jan 2023 22:46:38 +0100 Subject: [PATCH] use own versioned classes to request versioned publicKey --- .../federation/client/1_0/FederationClient.ts | 6 ++- .../federation/client/1_1/FederationClient.ts | 52 +++++++++++++++++++ backend/src/federation/enum/apiVersionType.ts | 1 + .../{FdCommunity.ts => V1_0_FdCommunity.ts} | 3 +- .../graphql/1_1/model/V1_1_FdCommunity.ts | 42 +++++++++++++++ backend/src/federation/validateCommunities.ts | 49 ++++++++++++++--- 6 files changed, 144 insertions(+), 9 deletions(-) create mode 100644 backend/src/federation/client/1_1/FederationClient.ts rename backend/src/federation/graphql/1_0/model/{FdCommunity.ts => V1_0_FdCommunity.ts} (93%) create mode 100644 backend/src/federation/graphql/1_1/model/V1_1_FdCommunity.ts diff --git a/backend/src/federation/client/1_0/FederationClient.ts b/backend/src/federation/client/1_0/FederationClient.ts index 8c3f13c77..77a8ec842 100644 --- a/backend/src/federation/client/1_0/FederationClient.ts +++ b/backend/src/federation/client/1_0/FederationClient.ts @@ -1,8 +1,10 @@ import { GraphQLClient, gql } from 'graphql-request' import { backendLogger as logger } from '@/server/logger' -import { FdCommunity } from '@/federation/graphql/1_0/model/FdCommunity' +// eslint-disable-next-line camelcase +import { V1_0_FdCommunity } from '@/federation/graphql/1_0/model/V1_0_FdCommunity' -export async function requestGetPublicKey(fdCom: FdCommunity): Promise { +// eslint-disable-next-line camelcase +export async function requestGetPublicKey(fdCom: V1_0_FdCommunity): Promise { let endpoint = fdCom.url.endsWith('/') ? fdCom.url : fdCom.url + '/' endpoint = `${endpoint}${fdCom.apiVersion}/getPublicKey` logger.info(`requestGetPublicKey with endpoint='${endpoint}'...`) diff --git a/backend/src/federation/client/1_1/FederationClient.ts b/backend/src/federation/client/1_1/FederationClient.ts new file mode 100644 index 000000000..798fb4a76 --- /dev/null +++ b/backend/src/federation/client/1_1/FederationClient.ts @@ -0,0 +1,52 @@ +import { GraphQLClient, gql } from 'graphql-request' +import { backendLogger as logger } from '@/server/logger' +// eslint-disable-next-line camelcase +import { V1_1_FdCommunity } from '@/federation/graphql/1_1/model/V1_1_FdCommunity' + +// eslint-disable-next-line camelcase +export async function requestGetPublicKey(fdCom: V1_1_FdCommunity): Promise { + let endpoint = fdCom.url.endsWith('/') ? fdCom.url : fdCom.url + '/' + endpoint = `${endpoint}${fdCom.apiVersion}/getPublicKey` + logger.info(`requestGetPublicKey with endpoint='${endpoint}'...`) + + const graphQLClient = new GraphQLClient(endpoint, { + method: 'GET', + jsonSerializer: { + parse: JSON.parse, + stringify: JSON.stringify, + }, + }) + logger.info(`graphQLClient=${JSON.stringify(graphQLClient)}`) + const query = gql` + query { + getPublicKey { + publicKey + } + } + ` + + const variables = {} + + try { + const { data, errors, extensions, headers, status } = await graphQLClient.rawRequest( + query, + variables, + ) + logger.debug( + `Response-Data: ${JSON.stringify( + { data, errors, extensions, headers, status }, + undefined, + 2, + )}`, + ) + if (data) { + logger.debug(`Response-PublicKey: ${data.getPublicKey.publicKey}`) + logger.info(`requestGetPublicKey processed successfully`) + return data.getPublicKey.publicKey + } + logger.warn(`requestGetPublicKey processed without response data`) + } catch (err) { + logger.error(`Request-Error:`, err) // ${JSON.stringify(err)}`) + } + return undefined +} diff --git a/backend/src/federation/enum/apiVersionType.ts b/backend/src/federation/enum/apiVersionType.ts index 0322b67a7..60da9de57 100644 --- a/backend/src/federation/enum/apiVersionType.ts +++ b/backend/src/federation/enum/apiVersionType.ts @@ -1,3 +1,4 @@ export enum ApiVersionType { V1_0 = '1_0', + V1_1 = '1_1', } diff --git a/backend/src/federation/graphql/1_0/model/FdCommunity.ts b/backend/src/federation/graphql/1_0/model/V1_0_FdCommunity.ts similarity index 93% rename from backend/src/federation/graphql/1_0/model/FdCommunity.ts rename to backend/src/federation/graphql/1_0/model/V1_0_FdCommunity.ts index 2169a294c..9c9ef305c 100644 --- a/backend/src/federation/graphql/1_0/model/FdCommunity.ts +++ b/backend/src/federation/graphql/1_0/model/V1_0_FdCommunity.ts @@ -4,7 +4,8 @@ import { ObjectType, Field } from 'type-graphql' import { Community as DbCommunity } from '@entity/Community' @ObjectType() -export class FdCommunity { +// eslint-disable-next-line camelcase +export class V1_0_FdCommunity { constructor(dbCommunity: DbCommunity) { this.apiVersion = dbCommunity.apiVersion this.createdAt = dbCommunity.createdAt diff --git a/backend/src/federation/graphql/1_1/model/V1_1_FdCommunity.ts b/backend/src/federation/graphql/1_1/model/V1_1_FdCommunity.ts new file mode 100644 index 000000000..4c44c3a2d --- /dev/null +++ b/backend/src/federation/graphql/1_1/model/V1_1_FdCommunity.ts @@ -0,0 +1,42 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +import { ObjectType, Field } from 'type-graphql' +import { Community as DbCommunity } from '@entity/Community' + +@ObjectType() +// eslint-disable-next-line camelcase +export class V1_1_FdCommunity { + constructor(dbCommunity: DbCommunity) { + this.apiVersion = dbCommunity.apiVersion + this.createdAt = dbCommunity.createdAt + this.id = dbCommunity.id + this.lastAnnouncedAt = dbCommunity.lastAnnouncedAt + this.publicKey = dbCommunity.publicKey.toString('hex') + this.updatedAt = dbCommunity.updatedAt + this.url = dbCommunity.endPoint + } + + @Field(() => Number, { nullable: true }) + id: number + + @Field(() => String) + publicKey: string + + @Field(() => String) + apiVersion: string + + @Field(() => String) + url: string + + @Field(() => Date) + createdAt: Date + + @Field(() => Date, { nullable: true }) + lastAnnouncedAt: Date | null + + @Field(() => Date, { nullable: true }) + verifiedAt: Date | null + + @Field(() => Date, { nullable: true }) + updatedAt: Date | null +} diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index 61f9e724f..398009d9a 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -1,7 +1,13 @@ import { Community as DbCommunity } from '@entity/Community' -import { IsNull, LessThan, Raw } from '@dbTools/typeorm' -import { requestGetPublicKey } from './client/1_0/FederationClient' -import { FdCommunity } from './graphql/1_0/model/FdCommunity' +import { IsNull } from '@dbTools/typeorm' +// eslint-disable-next-line camelcase +import { requestGetPublicKey as v1_0_requestGetPublicKey } from './client/1_0/FederationClient' +// eslint-disable-next-line camelcase +import { requestGetPublicKey as v1_1_requestGetPublicKey } from './client/1_1/FederationClient' +// eslint-disable-next-line camelcase +import { V1_0_FdCommunity } from './graphql/1_0/model/V1_0_FdCommunity' +// eslint-disable-next-line camelcase +import { V1_1_FdCommunity } from './graphql/1_1/model/V1_1_FdCommunity' import { backendLogger as logger } from '@/server/logger' import { ApiVersionType } from './enum/apiVersionType' @@ -23,14 +29,20 @@ export async function startValidateCommunities(timerInterval: number): Promise setTimeout(resolve, ms)) } + +function getVersionedFdCommunity(dbCom: DbCommunity) { + switch (dbCom.apiVersion) { + case ApiVersionType.V1_0: + // eslint-disable-next-line new-cap + return new V1_0_FdCommunity(dbCom) + case ApiVersionType.V1_1: + // eslint-disable-next-line new-cap + return new V1_1_FdCommunity(dbCom) + } + return undefined +} + +async function invokeVersionedRequestGetPublicKey( + // eslint-disable-next-line camelcase + fdCom: V1_0_FdCommunity | V1_1_FdCommunity, +): Promise { + switch (fdCom.apiVersion) { + case ApiVersionType.V1_0: + return v1_0_requestGetPublicKey(fdCom) + case ApiVersionType.V1_1: + return v1_1_requestGetPublicKey(fdCom) + } + return undefined +}