rework graphql client and endpoint for community public info

This commit is contained in:
hrsof 2023-05-02 15:25:21 +02:00
parent f6b0998f4f
commit a824ff0876
9 changed files with 47 additions and 126 deletions

View File

@ -1,44 +0,0 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
import { FederatedCommunity as DbFederatedCommunity } from '@entity/FederatedCommunity'
import { gql } from 'graphql-request'
import { GraphQLGetClient } from '@/federation/client/GraphQLGetClient'
import { LogError } from '@/server/LogError'
import { backendLogger as logger } from '@/server/logger'
export async function requestGetPublicKey(
dbCom: DbFederatedCommunity,
): Promise<string | undefined> {
let endpoint = dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/'
endpoint = `${endpoint}${dbCom.apiVersion}/`
logger.info(`requestGetPublicKey with endpoint='${endpoint}'...`)
const graphQLClient = GraphQLGetClient.getInstance(endpoint)
logger.debug(`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:`, data, errors, extensions, headers, status)
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) {
throw new LogError(`Request-Error:`, err)
}
}

View File

@ -9,7 +9,7 @@ import { LogError } from '@/server/LogError'
import { backendLogger as logger } from '@/server/logger'
// eslint-disable-next-line import/no-relative-parent-imports
import { FederationClient, PublicInfo } from '../FederationClient'
import { FederationClient, PublicCommunityInfo } from '../FederationClient'
export class FederationClientImpl implements FederationClient {
public async requestGetPublicKey(dbCom: DbFederatedCommunity): Promise<string | undefined> {
@ -45,16 +45,18 @@ export class FederationClientImpl implements FederationClient {
}
}
public async requestGetPublicInfo(dbCom: DbFederatedCommunity): Promise<PublicInfo | undefined> {
public async requestGetPublicCommunityInfo(
dbCom: DbFederatedCommunity,
): Promise<PublicCommunityInfo | undefined> {
let endpoint = dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/'
endpoint = `${endpoint}${dbCom.apiVersion}/`
logger.info(`requestGetPublicInfo with endpoint='${endpoint}'...`)
logger.info(`requestGetPublicCommunityInfo with endpoint='${endpoint}'...`)
const graphQLClient = GraphQLGetClient.getInstance(endpoint)
logger.debug(`graphQLClient=${JSON.stringify(graphQLClient)}`)
const query = gql`
query {
getPublicInfo {
getPublicCommunityInfo {
name
description
createdAt
@ -71,8 +73,8 @@ export class FederationClientImpl implements FederationClient {
)
logger.debug(`Response-Data:`, data, errors, extensions, headers, status)
if (data) {
logger.debug(`Response-PublicInfo:`, data.getPublicInfo.publicInfo)
logger.info(`requestGetPublicInfo processed successfully`)
logger.debug(`Response-PublicCommunityInfo:`, data.getPublicInfo.publicInfo)
logger.info(`requestGetPublicCommunityInfo processed successfully`)
return data.getPublicInfo.publicInfo
}
logger.warn(`requestGetPublicInfo processed without response data`)

View File

@ -1,44 +0,0 @@
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
import { FederatedCommunity as DbFederatedCommunity } from '@entity/FederatedCommunity'
import { gql } from 'graphql-request'
import { GraphQLGetClient } from '@/federation/client/GraphQLGetClient'
import { LogError } from '@/server/LogError'
import { backendLogger as logger } from '@/server/logger'
export async function requestGetPublicKey(
dbCom: DbFederatedCommunity,
): Promise<string | undefined> {
let endpoint = dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/'
endpoint = `${endpoint}${dbCom.apiVersion}/`
logger.info(`requestGetPublicKey with endpoint='${endpoint}'...`)
const graphQLClient = GraphQLGetClient.getInstance(endpoint)
logger.debug(`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:`, data, errors, extensions, headers, status)
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) {
throw new LogError(`Request-Error:`, err)
}
}

View File

@ -9,7 +9,7 @@ import { LogError } from '@/server/LogError'
import { backendLogger as logger } from '@/server/logger'
// eslint-disable-next-line import/no-relative-parent-imports
import { FederationClient, PublicInfo } from '../FederationClient'
import { FederationClient, PublicCommunityInfo } from '../FederationClient'
export class FederationClientImpl implements FederationClient {
async requestGetPublicKey(dbCom: DbFederatedCommunity): Promise<string | undefined> {
@ -45,16 +45,18 @@ export class FederationClientImpl implements FederationClient {
}
}
async requestGetPublicInfo(dbCom: DbFederatedCommunity): Promise<PublicInfo | undefined> {
async requestGetPublicCommunityInfo(
dbCom: DbFederatedCommunity,
): Promise<PublicCommunityInfo | undefined> {
let endpoint = dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/'
endpoint = `${endpoint}${dbCom.apiVersion}/`
logger.info(`requestGetPublicInfo with endpoint='${endpoint}'...`)
logger.info(`requestGetPublicCommunityInfo with endpoint='${endpoint}'...`)
const graphQLClient = GraphQLGetClient.getInstance(endpoint)
logger.debug(`graphQLClient=${JSON.stringify(graphQLClient)}`)
const query = gql`
query {
getPublicInfo {
getPublicCommunityInfo {
name
description
createdAt
@ -71,9 +73,12 @@ export class FederationClientImpl implements FederationClient {
)
logger.debug(`Response-Data:`, data, errors, extensions, headers, status)
if (data) {
logger.debug(`Response-PublicInfo:`, data.getPublicInfo.publicInfo)
logger.debug(
`Response-PublicCommunityInfo:`,
data.getPublicCommunityInfo.publicCommunityInfo,
)
logger.info(`requestGetPublicInfo processed successfully`)
return data.getPublicInfo.publicInfo
return data.getPublicCommunityInfo.publicCommunityInfo
}
logger.warn(`requestGetPublicInfo processed without response data`)
} catch (err) {

View File

@ -1,6 +1,6 @@
import { FederatedCommunity as DbFederatedCommunity } from '@entity/FederatedCommunity'
export type PublicInfo = {
export type PublicCommunityInfo = {
name: string
description: string
createdAt: Date
@ -9,5 +9,7 @@ export type PublicInfo = {
export interface FederationClient {
requestGetPublicKey(dbCom: DbFederatedCommunity): Promise<string | undefined>
requestGetPublicInfo(dbCom: DbFederatedCommunity): Promise<PublicInfo | undefined>
requestGetPublicCommunityInfo(
dbCom: DbFederatedCommunity,
): Promise<PublicCommunityInfo | undefined>
}

View File

@ -11,7 +11,7 @@ import { backendLogger as logger } from '@/server/logger'
import { FederationClientImpl as V1_0_FederationClientImpl } from './client/1_0/FederationClientImpl'
// eslint-disable-next-line camelcase
import { FederationClientImpl as V1_1_FederationClientImpl } from './client/1_1/FederationClientImpl'
import { FederationClient, PublicInfo } from './client/FederationClient'
import { FederationClient, PublicCommunityInfo } from './client/FederationClient'
import { ApiVersionType } from './enum/apiVersionType'
export function startValidateCommunities(timerInterval: number): void {
@ -58,9 +58,9 @@ export async function validateCommunities(): Promise<void> {
logger.debug(`Federation: updated dbCom: ${JSON.stringify(dbCom)}`)
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const pubInfo = await getVersionedFederationClient(dbCom.apiVersion).requestGetPublicInfo(
dbCom,
)
const pubInfo = await getVersionedFederationClient(
dbCom.apiVersion,
).requestGetPublicCommunityInfo(dbCom)
logger.debug(`Federation: getPublicInfo pubInfo: ${JSON.stringify(pubInfo)}`)
if (pubInfo) {
logger.info(`Federation: write foreign community...`)
@ -91,7 +91,7 @@ export async function validateCommunities(): Promise<void> {
async function writeForeignCommunity(
dbCom: DbFederatedCommunity,
pubInfo: PublicInfo,
pubInfo: PublicCommunityInfo,
): Promise<void> {
if (dbCom && pubInfo) {
const foreignCom = DbCommunity.create()

View File

@ -4,7 +4,7 @@ import { Field, ObjectType } from 'type-graphql'
@ObjectType()
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export class GetPublicInfoResult {
export class GetPublicCommunityInfoResult {
constructor(dbCom: DbCommunity) {
this.publicKey = dbCom.publicKey.toString('hex')
this.name = dbCom.name

View File

@ -0,0 +1,18 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { Query, Resolver } from 'type-graphql'
import { federationLogger as logger } from '@/server/logger'
import { Community as DbCommunity } from '@entity/Community'
import { GetPublicCommunityInfoResult } from '../model/GetPublicCommunityInfoResult'
@Resolver()
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export class PublicCommunityInfoResolver {
@Query(() => GetPublicCommunityInfoResult)
async getPublicCommunityInfo(): Promise<GetPublicCommunityInfoResult> {
logger.debug(`getPublicCommunityInfo() via apiVersion=1_0 ...`)
const homeCom = await DbCommunity.findOneOrFail({ foreign: false })
const result = new GetPublicCommunityInfoResult(homeCom)
logger.info(`getPublicCommunityInfo()-1_0... return publicInfo=${result}`)
return result
}
}

View File

@ -1,18 +0,0 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { Query, Resolver } from 'type-graphql'
import { federationLogger as logger } from '@/server/logger'
import { Community as DbCommunity } from '@entity/Community'
import { GetPublicInfoResult } from '../model/GetPublicInfoResult'
@Resolver()
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export class PublicInfoResolver {
@Query(() => GetPublicInfoResult)
async getPublicInfo(): Promise<GetPublicInfoResult> {
logger.debug(`getPublicInfo() via apiVersion=1_0 ...`)
const homeCom = await DbCommunity.findOneOrFail({ foreign: false })
const result = new GetPublicInfoResult(homeCom)
logger.info(`getPublicInfo()-1_0... return publicInfo=${result}`)
return result
}
}