From ffe83a5d94564d2c0d751d5abc22f524a2337210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 7 Feb 2023 22:19:14 +0100 Subject: [PATCH] rework PR-comments --- .../federation/client/1_0/FederationClient.ts | 14 +++----- .../federation/client/1_1/FederationClient.ts | 14 +++----- .../src/federation/client/GraphQLGetClient.ts | 35 +++++++++++++++++++ backend/src/federation/validateCommunities.ts | 2 +- .../Community.ts | 4 +-- .../0061-update_communities_table.ts | 8 +++-- 6 files changed, 52 insertions(+), 25 deletions(-) create mode 100644 backend/src/federation/client/GraphQLGetClient.ts diff --git a/backend/src/federation/client/1_0/FederationClient.ts b/backend/src/federation/client/1_0/FederationClient.ts index 803f8dab5..2c6a77477 100644 --- a/backend/src/federation/client/1_0/FederationClient.ts +++ b/backend/src/federation/client/1_0/FederationClient.ts @@ -1,21 +1,15 @@ -import { GraphQLClient, gql } from 'graphql-request' +import { gql } from 'graphql-request' import { backendLogger as logger } from '@/server/logger' import { Community as DbCommunity } from '@entity/Community' +import { GraphQLGetClient } from '../GraphQLGetClient' -// eslint-disable-next-line camelcase export async function requestGetPublicKey(dbCom: DbCommunity): Promise { let endpoint = dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/' endpoint = `${endpoint}${dbCom.apiVersion}/` 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 graphQLClient = GraphQLGetClient.getInstance(endpoint) + logger.debug(`graphQLClient=${JSON.stringify(graphQLClient)}`) const query = gql` query { getPublicKey { diff --git a/backend/src/federation/client/1_1/FederationClient.ts b/backend/src/federation/client/1_1/FederationClient.ts index 803f8dab5..2c6a77477 100644 --- a/backend/src/federation/client/1_1/FederationClient.ts +++ b/backend/src/federation/client/1_1/FederationClient.ts @@ -1,21 +1,15 @@ -import { GraphQLClient, gql } from 'graphql-request' +import { gql } from 'graphql-request' import { backendLogger as logger } from '@/server/logger' import { Community as DbCommunity } from '@entity/Community' +import { GraphQLGetClient } from '../GraphQLGetClient' -// eslint-disable-next-line camelcase export async function requestGetPublicKey(dbCom: DbCommunity): Promise { let endpoint = dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/' endpoint = `${endpoint}${dbCom.apiVersion}/` 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 graphQLClient = GraphQLGetClient.getInstance(endpoint) + logger.debug(`graphQLClient=${JSON.stringify(graphQLClient)}`) const query = gql` query { getPublicKey { diff --git a/backend/src/federation/client/GraphQLGetClient.ts b/backend/src/federation/client/GraphQLGetClient.ts new file mode 100644 index 000000000..7e2d89b6c --- /dev/null +++ b/backend/src/federation/client/GraphQLGetClient.ts @@ -0,0 +1,35 @@ +import { GraphQLClient } from 'graphql-request' +import { PatchedRequestInit } from 'graphql-request/dist/types' + +export class GraphQLGetClient extends GraphQLClient { + private static instance: GraphQLGetClient + + /** + * The Singleton's constructor should always be private to prevent direct + * construction calls with the `new` operator. + */ + // eslint-disable-next-line no-useless-constructor + private constructor(url: string, options?: PatchedRequestInit) { + super(url, options) + } + + /** + * The static method that controls the access to the singleton instance. + * + * This implementation let you subclass the Singleton class while keeping + * just one instance of each subclass around. + */ + public static getInstance(url: string): GraphQLGetClient { + if (!GraphQLGetClient.instance) { + GraphQLGetClient.instance = new GraphQLGetClient(url, { + method: 'GET', + jsonSerializer: { + parse: JSON.parse, + stringify: JSON.stringify, + }, + }) + } + + return GraphQLGetClient.instance + } +} diff --git a/backend/src/federation/validateCommunities.ts b/backend/src/federation/validateCommunities.ts index ff0206bbc..c972383bb 100644 --- a/backend/src/federation/validateCommunities.ts +++ b/backend/src/federation/validateCommunities.ts @@ -20,7 +20,7 @@ export async function startValidateCommunities(timerInterval: number): Promise { const dbCommunities: DbCommunity[] = await DbCommunity.createQueryBuilder() - .where({ verifiedAt: IsNull() }) + .where({ foreign: true, verifiedAt: IsNull() }) .orWhere('verified_at < last_announced_at') .getMany() /* diff --git a/database/entity/0061-update_communities_table/Community.ts b/database/entity/0061-update_communities_table/Community.ts index 5ded76cf9..b4c86222e 100644 --- a/database/entity/0061-update_communities_table/Community.ts +++ b/database/entity/0061-update_communities_table/Community.ts @@ -15,7 +15,7 @@ export class Community extends BaseEntity { @Column({ name: 'foreign', type: 'bool', nullable: false, default: true }) foreign: boolean - @Column({ name: 'public_key', type: 'binary', length: 64, default: null, nullable: true }) + @Column({ name: 'public_key', type: 'binary', length: 64, default: null, nullable: false }) publicKey: Buffer @Column({ name: 'api_version', length: 10, nullable: false }) @@ -28,7 +28,7 @@ export class Community extends BaseEntity { lastAnnouncedAt: Date @Column({ name: 'verified_at', type: 'datetime', nullable: true }) - verifiedAt: Date + verifiedAt: Date | null @Column({ name: 'last_error_at', type: 'datetime', nullable: true }) lastErrorAt: Date diff --git a/database/migrations/0061-update_communities_table.ts b/database/migrations/0061-update_communities_table.ts index 312563a9f..b3cdab61d 100644 --- a/database/migrations/0061-update_communities_table.ts +++ b/database/migrations/0061-update_communities_table.ts @@ -14,13 +14,16 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis 'ALTER TABLE `communities` ADD COLUMN `foreign` tinyint(4) NOT NULL DEFAULT 1 AFTER `id`;', ) await queryFn( - 'ALTER TABLE `communities` ADD COLUMN `verified_at` datetime(3) AFTER `last_announced_at`;', + 'ALTER TABLE `communities` MODIFY COLUMN `public_key` binary(64) NOT NULL AFTER `foreign`;', ) /* await queryFn( - 'ALTER TABLE `communities` ADD COLUMN `last_error_at` datetime(3) AFTER `verified_at`;', + 'ALTER TABLE `communities` ADD COLUMN `verified_at` datetime(3) AFTER `last_announced_at`;', ) */ + await queryFn( + 'ALTER TABLE `communities` ADD COLUMN `last_error_at` datetime(3) AFTER `verified_at`;', + ) } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { @@ -28,6 +31,7 @@ export async function downgrade(queryFn: (query: string, values?: any[]) => Prom await queryFn( 'ALTER TABLE `communities` MODIFY COLUMN `last_announced_at` datetime(3) NOT NULL AFTER `end_point`;', ) + await queryFn('ALTER TABLE `communities` MODIFY COLUMN `public_key` binary(64) AFTER `id`;') await queryFn('ALTER TABLE `communities` DROP COLUMN `foreign`;') // await queryFn('ALTER TABLE `communities` DROP COLUMN `verified_at`;') await queryFn('ALTER TABLE `communities` DROP COLUMN `last_error_at`;')