revert client versioning back to directory based as decided with moritz

and hannes
This commit is contained in:
Claus-Peter Huebner 2023-05-19 15:53:26 +02:00
parent a81b05e85f
commit 2439663ea4
5 changed files with 41 additions and 32 deletions

View File

@ -5,7 +5,7 @@ import { getPublicKey } from '@/federation/query/getPublicKey'
import { backendLogger as logger } from '@/server/logger'
// eslint-disable-next-line camelcase
export class Client_1_0 {
export class FederationClient {
dbCom: DbFederatedCommunity
endpoint: string
client: GraphQLClient

View File

@ -0,0 +1,5 @@
// eslint-disable-next-line camelcase
import { FederationClient as Client_1_0 } from '@/federation/client/1_0/FederationClient'
// eslint-disable-next-line camelcase
export class FederationClient extends Client_1_0 {}

View File

@ -1,5 +0,0 @@
// eslint-disable-next-line camelcase
import { Client_1_0 } from './Client_1_0'
// eslint-disable-next-line camelcase
export class Client_1_1 extends Client_1_0 {}

View File

@ -1,24 +1,23 @@
import { FederatedCommunity as DbFederatedCommunity } from '@entity/FederatedCommunity'
// eslint-disable-next-line camelcase
import { FederationClient as V1_0_FederationClient } from '@/federation/client/1_0/FederationClient'
// eslint-disable-next-line camelcase
import { FederationClient as V1_1_FederationClient } from '@/federation/client/1_1/FederationClient'
import { ApiVersionType } from '@/federation/enum/apiVersionType'
// eslint-disable-next-line camelcase
import { Client_1_0 } from './Client_1_0'
// eslint-disable-next-line camelcase
import { Client_1_1 } from './Client_1_1'
type FederationClient = V1_0_FederationClient | V1_1_FederationClient
// eslint-disable-next-line camelcase
type FederationClient = Client_1_0 | Client_1_1
interface ClientInstance {
interface FederationClientInstance {
id: number
// eslint-disable-next-line no-use-before-define
client: FederationClient
}
// eslint-disable-next-line @typescript-eslint/no-extraneous-class
export class Client {
private static instanceArray: ClientInstance[] = []
export class FederationClientFactory {
private static instanceArray: FederationClientInstance[] = []
/**
* The Singleton's constructor should always be private to prevent direct
@ -30,9 +29,9 @@ export class Client {
private static createFederationClient = (dbCom: DbFederatedCommunity) => {
switch (dbCom.apiVersion) {
case ApiVersionType.V1_0:
return new Client_1_0(dbCom)
return new V1_0_FederationClient(dbCom)
case ApiVersionType.V1_1:
return new Client_1_1(dbCom)
return new V1_1_FederationClient(dbCom)
default:
return null
}
@ -45,13 +44,18 @@ export class Client {
* just one instance of each subclass around.
*/
public static getInstance(dbCom: DbFederatedCommunity): FederationClient | null {
const instance = Client.instanceArray.find((instance) => instance.id === dbCom.id)
const instance = FederationClientFactory.instanceArray.find(
(instance) => instance.id === dbCom.id,
)
if (instance) {
return instance.client
}
const client = Client.createFederationClient(dbCom)
const client = FederationClientFactory.createFederationClient(dbCom)
if (client) {
Client.instanceArray.push({ id: dbCom.id, client } as ClientInstance)
FederationClientFactory.instanceArray.push({
id: dbCom.id,
client,
} as FederationClientInstance)
}
return client
}

View File

@ -3,9 +3,11 @@
import { IsNull } from '@dbTools/typeorm'
import { FederatedCommunity as DbFederatedCommunity } from '@entity/FederatedCommunity'
// eslint-disable-next-line camelcase
import { FederationClient as V1_0_FederationClient } from '@/federation/client/1_0/FederationClient'
import { FederationClientFactory } from '@/federation/client/FederationClientFactory'
import { backendLogger as logger } from '@/server/logger'
import { Client } from './client/Client'
import { ApiVersionType } from './enum/apiVersionType'
export function startValidateCommunities(timerInterval: number): void {
@ -37,17 +39,20 @@ export async function validateCommunities(): Promise<void> {
continue
}
try {
const client = Client.getInstance(dbCom)
const pubKey = await client?.getPublicKey()
if (pubKey && pubKey === dbCom.publicKey.toString()) {
await DbFederatedCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() })
logger.info('Federation: verified community', dbCom)
} else {
logger.warn(
'Federation: received not matching publicKey:',
pubKey,
dbCom.publicKey.toString(),
)
const client = FederationClientFactory.getInstance(dbCom)
// eslint-disable-next-line camelcase
if (client instanceof V1_0_FederationClient) {
const pubKey = await client.getPublicKey()
if (pubKey && pubKey === dbCom.publicKey.toString()) {
await DbFederatedCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() })
logger.info('Federation: verified community', dbCom)
} else {
logger.warn(
'Federation: received not matching publicKey:',
pubKey,
dbCom.publicKey.toString(),
)
}
}
} catch (err) {
logger.error(`Error:`, err)