From 3ef4c25ae8f51682ef56c4fa372f44c85df510f8 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 25 Feb 2026 12:12:58 +0100 Subject: [PATCH] adapt to GradidoNode Changes --- dlt-connector/src/bootstrap/init.ts | 2 +- .../src/client/GradidoNode/communities.ts | 21 +++++---------- .../src/client/GradidoNode/input.schema.ts | 6 ++--- .../src/client/backend/BackendClient.ts | 14 ++++++++++ dlt-connector/src/client/backend/graphql.ts | 11 ++++++++ dlt-connector/src/config/const.ts | 2 +- .../db-v2.7.0_to_blockchain-v3.7/bootstrap.ts | 27 ++++++++----------- .../db-v2.7.0_to_blockchain-v3.7/database.ts | 7 ----- dlt-connector/src/utils/filesystem.ts | 4 +++ 9 files changed, 52 insertions(+), 42 deletions(-) diff --git a/dlt-connector/src/bootstrap/init.ts b/dlt-connector/src/bootstrap/init.ts index 13b77783c..a1c599cea 100644 --- a/dlt-connector/src/bootstrap/init.ts +++ b/dlt-connector/src/bootstrap/init.ts @@ -83,7 +83,7 @@ export async function checkGradidoNode( if ( !(await clients.gradidoNode.getTransaction({ transactionId: 1, - topic: homeCommunity.hieroTopicId, + communityId: homeCommunity.uuid, })) ) { // if not exist, create community root transaction diff --git a/dlt-connector/src/client/GradidoNode/communities.ts b/dlt-connector/src/client/GradidoNode/communities.ts index a418255f7..b285eed92 100644 --- a/dlt-connector/src/client/GradidoNode/communities.ts +++ b/dlt-connector/src/client/GradidoNode/communities.ts @@ -5,7 +5,7 @@ import { getLogger } from 'log4js' import { CONFIG } from '../../config' import { GRADIDO_NODE_HOME_FOLDER_NAME, LOG4JS_BASE_CATEGORY } from '../../config/const' import { HieroId } from '../../schemas/typeGuard.schema' -import { checkFileExist, checkPathExist } from '../../utils/filesystem' +import { checkFileExist, checkPathExist, toFolderName } from '../../utils/filesystem' import { BackendClient } from '../backend/BackendClient' import { GradidoNodeProcess } from './GradidoNodeProcess' @@ -15,7 +15,7 @@ const ensureCommunitiesAvailableMutex: Mutex = new Mutex() // prototype, later add api call to gradido dlt node server for adding/updating communities type CommunityForDltNodeServer = { communityId: string - hieroTopicId: string + hieroTopicId?: string | null alias: string folder: string } @@ -38,28 +38,21 @@ export async function ensureCommunitiesAvailable(communityTopicIds: HieroId[]): } export async function exportCommunities(homeFolder: string, client: BackendClient): Promise { - const communities = await client.getReachableCommunities() + const communities = await client.getAuthorizedCommunities() + console.log(`communities: ${JSON.stringify(communities, null, 2)}`) const communitiesPath = path.join(homeFolder, 'communities.json') checkPathExist(path.dirname(communitiesPath), true) - // make sure communityName is unique - const communityName = new Set() const communitiesForDltNodeServer: CommunityForDltNodeServer[] = [] for (const com of communities) { - if (!com.uuid || !com.hieroTopicId) { + if (!com.uuid) { continue } - // use name as alias if not empty and unique, otherwise use uuid - let alias = com.name - if (!alias || communityName.has(alias)) { - alias = com.uuid - } - communityName.add(alias) communitiesForDltNodeServer.push({ communityId: com.uuid, hieroTopicId: com.hieroTopicId, - alias, + alias: com.name, // use only alpha-numeric chars for folder name - folder: alias.replace(/[^a-zA-Z0-9]/g, '_'), + folder: toFolderName(com.uuid), }) } fs.writeFileSync(communitiesPath, JSON.stringify(communitiesForDltNodeServer, null, 2)) diff --git a/dlt-connector/src/client/GradidoNode/input.schema.ts b/dlt-connector/src/client/GradidoNode/input.schema.ts index 16a8643f5..f8a21f562 100644 --- a/dlt-connector/src/client/GradidoNode/input.schema.ts +++ b/dlt-connector/src/client/GradidoNode/input.schema.ts @@ -1,12 +1,12 @@ import * as v from 'valibot' -import { hieroIdSchema, hieroTransactionIdStringSchema } from '../../schemas/typeGuard.schema' +import { uuidv4Schema, hieroTransactionIdStringSchema } from '../../schemas/typeGuard.schema' export const transactionsRangeSchema = v.object({ // default value is 1, from first transactions fromTransactionId: v.nullish(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 1), // default value is 100, max 100 transactions maxResultCount: v.nullish(v.pipe(v.number(), v.minValue(1, 'expect number >= 1')), 100), - topic: hieroIdSchema, + communityId: uuidv4Schema, }) export type TransactionsRangeInput = v.InferInput @@ -19,7 +19,7 @@ export const transactionIdentifierSchema = v.pipe( undefined, ), hieroTransactionId: v.nullish(hieroTransactionIdStringSchema, undefined), - topic: hieroIdSchema, + communityId: uuidv4Schema, }), v.custom((value: any) => { const setFieldsCount = diff --git a/dlt-connector/src/client/backend/BackendClient.ts b/dlt-connector/src/client/backend/BackendClient.ts index ce9660e36..7829e0e25 100644 --- a/dlt-connector/src/client/backend/BackendClient.ts +++ b/dlt-connector/src/client/backend/BackendClient.ts @@ -6,6 +6,7 @@ import { CONFIG } from '../../config' import { LOG4JS_BASE_CATEGORY } from '../../config/const' import { HieroId, Uuidv4 } from '../../schemas/typeGuard.schema' import { + getAuthorizedCommunities, getReachableCommunities, homeCommunityGraphqlQuery, setHomeCommunityTopicId, @@ -101,6 +102,19 @@ export class BackendClient { return v.parse(v.array(communitySchema), data.reachableCommunities) } + public async getAuthorizedCommunities(): Promise { + this.logger.info('get authorized communities on backend') + const { data, errors } = await this.client.rawRequest<{ authorizedCommunities: Community[] }>( + getAuthorizedCommunities, + {}, + await this.getRequestHeader(), + ) + if (errors) { + throw errors[0] + } + return v.parse(v.array(communitySchema), data.authorizedCommunities) + } + private async getRequestHeader(): Promise<{ authorization: string }> { diff --git a/dlt-connector/src/client/backend/graphql.ts b/dlt-connector/src/client/backend/graphql.ts index fafd77fcd..2f1fbec74 100644 --- a/dlt-connector/src/client/backend/graphql.ts +++ b/dlt-connector/src/client/backend/graphql.ts @@ -44,3 +44,14 @@ export const getReachableCommunities = gql` } ${communityFragment} ` + +export const getAuthorizedCommunities = gql` + query { + authorizedCommunities { + ...Community_common + } + } + ${communityFragment} +` + + diff --git a/dlt-connector/src/config/const.ts b/dlt-connector/src/config/const.ts index 5657f65ee..5dcd3d293 100644 --- a/dlt-connector/src/config/const.ts +++ b/dlt-connector/src/config/const.ts @@ -17,6 +17,6 @@ export const GRADIDO_NODE_RUNTIME_PATH = path.join( // if last start was less than this time, do not restart export const GRADIDO_NODE_MIN_RUNTIME_BEFORE_RESTART_MILLISECONDS = 1000 * 30 export const GRADIDO_NODE_MIN_RUNTIME_BEFORE_EXIT_MILLISECONDS = 1000 * 2 -export const GRADIDO_NODE_KILL_TIMEOUT_MILLISECONDS = 10000 +export const GRADIDO_NODE_KILL_TIMEOUT_MILLISECONDS = 60 * 1000 // currently hard coded in gradido node, update in future export const GRADIDO_NODE_HOME_FOLDER_NAME = '.gradido' diff --git a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/bootstrap.ts b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/bootstrap.ts index 3ffad58c8..3ccb24f1d 100644 --- a/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/bootstrap.ts +++ b/dlt-connector/src/migrations/db-v2.7.0_to_blockchain-v3.7/bootstrap.ts @@ -10,6 +10,7 @@ import { Context } from './Context' import { Balance } from './data/Balance' import { loadAdminUsersCache, loadCommunities, loadContributionLinkModeratorCache } from './database' import { CommunityContext } from './valibot.schema' +import { toFolderName } from '../../utils/filesystem' export async function bootstrap(): Promise { const context = await Context.create() @@ -24,20 +25,14 @@ export async function bootstrap(): Promise { async function bootstrapCommunities(context: Context): Promise> { const communities = new Map() const communitiesDb = await loadCommunities(context.db) - const communityNames = new Set() for (const communityDb of communitiesDb) { - let alias = communityDb.name.toLowerCase() - if (communityNames.has(alias)) { - alias = communityDb.communityUuid - } else { - communityNames.add(alias) - } - const blockchain = InMemoryBlockchainProvider.getInstance().getBlockchain(alias) + const communityId = communityDb.communityUuid + const blockchain = InMemoryBlockchainProvider.getInstance().getBlockchain(communityId) if (!blockchain) { - throw new Error(`Couldn't create Blockchain for community ${alias}`) + throw new Error(`Couldn't create Blockchain for community ${communityId}`) } - context.logger.info(`Blockchain for community '${alias}' created`) + context.logger.info(`Blockchain for community '${communityId}' created`) let seed: Hex32 if (!communityDb.foreign) { seed = v.parse(hex32Schema, CONFIG.HOME_COMMUNITY_SEED.convertToHex()) @@ -59,7 +54,7 @@ async function bootstrapCommunities(context: Context): Promise() export const adminUsers = new Map() -const transactionIdSet = new Set() export async function loadContributionLinkModeratorCache(db: MySql2Database): Promise { const result = await db diff --git a/dlt-connector/src/utils/filesystem.ts b/dlt-connector/src/utils/filesystem.ts index ea2d64e39..f01008a93 100644 --- a/dlt-connector/src/utils/filesystem.ts +++ b/dlt-connector/src/utils/filesystem.ts @@ -28,3 +28,7 @@ export function checkPathExist(path: string, createIfMissing: boolean = false): } return false } + +export function toFolderName(name: string): string { + return name.toLowerCase().replace(/[^a-z0-9]/g, '_') +} \ No newline at end of file