From 9d7224f128579c3e989b48bc048790948206d812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Thu, 5 Jan 2023 03:50:09 +0100 Subject: [PATCH] change raw-query back to querybuilder-statement --- .../federation/client/1_0/FederationClient.ts | 2 +- backend/src/federation/enum/apiVersionType.ts | 3 ++ .../graphql/1_0/model/FdCommunity.ts | 16 ++++---- backend/src/federation/validateCommunities.ts | 39 ++++++++++++------- 4 files changed, 37 insertions(+), 23 deletions(-) create mode 100644 backend/src/federation/enum/apiVersionType.ts diff --git a/backend/src/federation/client/1_0/FederationClient.ts b/backend/src/federation/client/1_0/FederationClient.ts index 6615d716e..8c3f13c77 100644 --- a/backend/src/federation/client/1_0/FederationClient.ts +++ b/backend/src/federation/client/1_0/FederationClient.ts @@ -4,7 +4,7 @@ import { FdCommunity } from '@/federation/graphql/1_0/model/FdCommunity' export async function requestGetPublicKey(fdCom: FdCommunity): Promise { let endpoint = fdCom.url.endsWith('/') ? fdCom.url : fdCom.url + '/' - endpoint = `${endpoint}graphql/${fdCom.apiVersion}/getPublicKey` + endpoint = `${endpoint}${fdCom.apiVersion}/getPublicKey` logger.info(`requestGetPublicKey with endpoint='${endpoint}'...`) const graphQLClient = new GraphQLClient(endpoint, { diff --git a/backend/src/federation/enum/apiVersionType.ts b/backend/src/federation/enum/apiVersionType.ts new file mode 100644 index 000000000..0322b67a7 --- /dev/null +++ b/backend/src/federation/enum/apiVersionType.ts @@ -0,0 +1,3 @@ +export enum ApiVersionType { + V1_0 = '1_0', +} diff --git a/backend/src/federation/graphql/1_0/model/FdCommunity.ts b/backend/src/federation/graphql/1_0/model/FdCommunity.ts index f08583490..2169a294c 100644 --- a/backend/src/federation/graphql/1_0/model/FdCommunity.ts +++ b/backend/src/federation/graphql/1_0/model/FdCommunity.ts @@ -1,18 +1,18 @@ /* 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() export class FdCommunity { - // using NOT the entity DbCommunity, because of necessary RAW-Sql to find the correct announced communities - constructor(dbCommunity: any) { - this.apiVersion = dbCommunity.api_version - this.createdAt = dbCommunity.created_at + constructor(dbCommunity: DbCommunity) { + this.apiVersion = dbCommunity.apiVersion + this.createdAt = dbCommunity.createdAt this.id = dbCommunity.id - this.lastAnnouncedAt = dbCommunity.last_announced_at - this.publicKey = dbCommunity.public_key.toString('hex') - this.updatedAt = dbCommunity.updated_at - this.url = dbCommunity.end_point + this.lastAnnouncedAt = dbCommunity.lastAnnouncedAt + this.publicKey = dbCommunity.publicKey.toString('hex') + this.updatedAt = dbCommunity.updatedAt + this.url = dbCommunity.endPoint } @Field(() => Number, { nullable: true }) diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index f0a6d3d2a..61f9e724f 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -1,35 +1,46 @@ import { Community as DbCommunity } from '@entity/Community' -// import { IsNull, LessThan, Raw } from '@dbTools/typeorm' +import { IsNull, LessThan, Raw } from '@dbTools/typeorm' import { requestGetPublicKey } from './client/1_0/FederationClient' import { FdCommunity } from './graphql/1_0/model/FdCommunity' import { backendLogger as logger } from '@/server/logger' +import { ApiVersionType } from './enum/apiVersionType' export async function startValidateCommunities(timerInterval: number): Promise { logger.info( `Federation: startValidateCommunities loop with an interval of ${timerInterval} ms...`, ) while (true) { + const dbCommunities: DbCommunity[] = await DbCommunity.createQueryBuilder() + .where({ verifiedAt: IsNull() }) + .orWhere('verified_at < last_announced_at') + .getMany() /* - const dbCommunities: DbCommunity[] = await DbCommunity.find({ - where: [{ verifiedAt: IsNull() }, { verifiedAt: LessThan('Community.last_announced_at') }], - }) - */ const dbCommunities: DbCommunity[] = await DbCommunity.getRepository().manager.query( 'SELECT * FROM `communities` `Community` WHERE (`Community`.`verified_at` IS NULL OR `Community`.`verified_at` < `Community`.`last_announced_at`)', ) - + */ logger.debug(`Federation: found ${dbCommunities.length} dbCommunities`) if (dbCommunities) { dbCommunities.forEach(async function (dbCom) { - logger.debug(`Federation: validate publicKey for dbCom: ${JSON.stringify(dbCom)}`) + logger.debug(`Federation: dbCom: ${JSON.stringify(dbCom)}`) const fdCom = new FdCommunity(dbCom) - const pubKey = await requestGetPublicKey(fdCom) - logger.debug(`Federation: received publicKey: ${pubKey}`) - if (pubKey && pubKey === dbCom.publicKey.toString('hex')) { - // if (!pubKey) { - logger.debug(`Federation: matching publicKey: ${pubKey}`) - DbCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() }) - logger.debug(`Federation: updated dbCom: ${JSON.stringify(dbCom)}`) + console.log(`ApiVersionType=`, ApiVersionType) + const apiValueStrings: string[] = Object.values(ApiVersionType) + if (apiValueStrings.includes(fdCom.apiVersion)) { + logger.debug( + `Federation: validate publicKey for dbCom: ${dbCom.id} with apiVersion=${dbCom.apiVersion}`, + ) + const pubKey = await requestGetPublicKey(fdCom) + logger.debug(`Federation: received publicKey: ${pubKey}`) + if (pubKey && pubKey === fdCom.publicKey) { + logger.debug(`Federation: matching publicKey: ${pubKey}`) + DbCommunity.update({ id: fdCom.id }, { verifiedAt: new Date() }) + logger.debug(`Federation: updated dbCom: ${JSON.stringify(dbCom)}`) + } + } else { + logger.debug( + `Federation: dbCom: ${fdCom.id} with unsupported apiVersion=${fdCom.apiVersion}; supported versions=${apiValueStrings}`, + ) } }) }