add config option, if dlt-connector is enabled, write communities list for dlt gradido node server out in its home folder as communities.json on each validate communities run

This commit is contained in:
einhornimmond 2025-10-24 08:28:53 +02:00
parent 80f19dbb47
commit 8983bc52eb
6 changed files with 63 additions and 0 deletions

View File

@ -43,6 +43,7 @@ const DLT_CONNECTOR_PORT = process.env.DLT_CONNECTOR_PORT ?? 6010
const dltConnector = {
DLT_CONNECTOR: process.env.DLT_CONNECTOR === 'true' || false,
DLT_CONNECTOR_URL: process.env.DLT_CONNECTOR_URL ?? `${COMMUNITY_URL}:${DLT_CONNECTOR_PORT}`,
DLT_GRADIDO_NODE_SERVER_HOME_FOLDER: process.env.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER ?? '~/.gradido',
}
const community = {

View File

@ -79,6 +79,10 @@ export const schema = Joi.object({
.when('DLT_CONNECTOR', { is: true, then: Joi.required() })
.description('The URL for GDT API endpoint'),
DLT_GRADIDO_NODE_SERVER_HOME_FOLDER: Joi.string()
.default('~/.gradido')
.description('The home folder for the gradido dlt node server'),
EMAIL: Joi.boolean()
.default(false)
.description('Enable or disable email functionality')

View File

@ -4,4 +4,5 @@ export interface PublicCommunityInfo {
creationDate: Date
publicKey: string
publicJwtKey: string
hieroTopicId: string | null
}

View File

@ -2,6 +2,7 @@ import {
Community as DbCommunity,
FederatedCommunity as DbFederatedCommunity,
getHomeCommunity,
getReachableCommunities,
} from 'database'
import { IsNull } from 'typeorm'
@ -15,6 +16,9 @@ import { getLogger } from 'log4js'
import { startCommunityAuthentication } from './authenticateCommunities'
import { PublicCommunityInfoLoggingView } from './client/1_0/logging/PublicCommunityInfoLogging.view'
import { ApiVersionType } from 'core'
import { CONFIG } from '@/config'
import * as path from 'node:path'
import * as fs from 'node:fs'
const logger = getLogger(`${LOG4JS_BASE_CATEGORY_NAME}.federation.validateCommunities`)
@ -83,6 +87,8 @@ export async function validateCommunities(): Promise<void> {
logger.error(`Error:`, err)
}
}
// export communities for gradido dlt node server
await exportCommunitiesToDltNodeServer()
}
export async function writeJwtKeyPairInHomeCommunity(): Promise<DbCommunity> {
@ -138,6 +144,52 @@ async function writeForeignCommunity(
com.publicKey = dbCom.publicKey
com.publicJwtKey = pubInfo.publicJwtKey
com.url = dbCom.endPoint
com.hieroTopicId = pubInfo.hieroTopicId
await DbCommunity.save(com)
}
}
// prototype, later add api call to gradido dlt node server for adding/updating communities
type CommunityForDltNodeServer = {
communityId: string
hieroTopicId: string
alias: string
folder: string
}
async function exportCommunitiesToDltNodeServer(): Promise<void> {
if (!CONFIG.DLT_CONNECTOR) {
return Promise.resolve()
}
const folder = CONFIG.DLT_GRADIDO_NODE_SERVER_HOME_FOLDER
try {
fs.accessSync(folder, fs.constants.R_OK | fs.constants.W_OK)
} catch (err) {
logger.error(`Error: home folder for DLT Gradido Node Server ${folder} does not exist`)
return
}
const dbComs = await getReachableCommunities(CONFIG.FEDERATION_VALIDATE_COMMUNITY_TIMER * 4)
const communitiesForDltNodeServer: CommunityForDltNodeServer[] = []
// make sure communityName is unique
const communityName = new Set<string>()
dbComs.forEach((com) => {
if (!com.communityUuid || !com.hieroTopicId) {
return
}
let alias = com.name
if (!alias || communityName.has(alias)) {
alias = com.communityUuid
}
communityName.add(alias)
communitiesForDltNodeServer.push({
communityId: com.communityUuid,
hieroTopicId: com.hieroTopicId,
alias,
// use only alpha-numeric chars for folder name
folder: alias.replace(/[^a-zA-Z0-9]/g, '_')
})
})
const dltNodeServerCommunitiesFile = path.join(folder, 'communities.json')
fs.writeFileSync(dltNodeServerCommunitiesFile, JSON.stringify(communitiesForDltNodeServer, null, 2))
logger.debug(`Written communitiesForDltNodeServer to ${dltNodeServerCommunitiesFile}`)
}

View File

@ -88,6 +88,7 @@ GDT_ACTIVE=false
# DLT-Connector (still in develop)
DLT_CONNECTOR=false
DLT_CONNECTOR_PORT=6010
DLT_GRADIDO_NODE_SERVER_HOME_FOLDER=/home/gradido/.gradido
# used for combining a newsletter on klicktipp with this gradido community
# if used, user will be subscribed on register and can unsubscribe in his account

View File

@ -12,6 +12,7 @@ export class GetPublicCommunityInfoResult {
this.name = dbCom.name
this.description = dbCom.description
this.creationDate = dbCom.creationDate
this.hieroTopicId = dbCom.hieroTopicId
}
@Field(() => String)
@ -28,4 +29,7 @@ export class GetPublicCommunityInfoResult {
@Field(() => String)
publicJwtKey: string
@Field(() => String)
hieroTopicId: string | null
}