From d6d626c848bb2ff222069cc98f7fb6990b3d3715 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 13 Oct 2025 07:40:38 +0200 Subject: [PATCH] add community handshake states table and enum --- ...95-add_community_handshake_states_table.ts | 19 +++++++++ .../src/entity/CommunityHandshakeState.ts | 39 +++++++++++++++++++ database/src/entity/FederatedCommunity.ts | 6 +++ .../src/enum/CommunityHandshakeStateType.ts | 8 ++++ database/src/enum/index.ts | 1 + 5 files changed, 73 insertions(+) create mode 100644 database/migration/migrations/0095-add_community_handshake_states_table.ts create mode 100644 database/src/entity/CommunityHandshakeState.ts create mode 100644 database/src/enum/CommunityHandshakeStateType.ts create mode 100644 database/src/enum/index.ts diff --git a/database/migration/migrations/0095-add_community_handshake_states_table.ts b/database/migration/migrations/0095-add_community_handshake_states_table.ts new file mode 100644 index 000000000..a00d9f6d7 --- /dev/null +++ b/database/migration/migrations/0095-add_community_handshake_states_table.ts @@ -0,0 +1,19 @@ +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE community_handshake_states ( + id int unsigned NOT NULL AUTO_INCREMENT, + handshake_id int unsigned NOT NULL, + one_time_code int unsigned NOT NULL, + public_key binary(32) NOT NULL, + status varchar(255) NOT NULL DEFAULT 'OPEN_CONNECTION', + last_error text, + created_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + updated_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), + PRIMARY KEY (id), + KEY idx_public_key (public_key), + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(`DROP TABLE community_handshake_states;`) +} diff --git a/database/src/entity/CommunityHandshakeState.ts b/database/src/entity/CommunityHandshakeState.ts new file mode 100644 index 000000000..25352e2b4 --- /dev/null +++ b/database/src/entity/CommunityHandshakeState.ts @@ -0,0 +1,39 @@ +import { CommunityHandshakeStateType } from '../enum' +import { BaseEntity, Column, CreateDateColumn, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm' +import { FederatedCommunity } from './FederatedCommunity' + +@Entity('community_handshake_states') +export class CommunityHandshakeState extends BaseEntity { + @PrimaryGeneratedColumn({ unsigned: true }) + id: number + + @Column({ name: 'handshake_id', type: 'int', unsigned: true }) + handshakeId: number + + @Column({ name: 'one_time_code', type: 'int', unsigned: true }) + oneTimeCode: number + + @Column({ name: 'public_key', type: 'binary', length: 32 }) + publicKey: Buffer + + @Column({ + type: 'varchar', + length: 255, + default: CommunityHandshakeStateType.OPEN_CONNECTION, + nullable: false, + }) + status: CommunityHandshakeStateType + + @Column({ name: 'last_error', type: 'text', nullable: true }) + lastError?: string + + @CreateDateColumn({ name: 'created_at', type: 'datetime', precision: 3 }) + createdAt: Date + + @UpdateDateColumn({ name: 'updated_at', type: 'datetime', precision: 3 }) + updatedAt: Date + + @ManyToOne(() => FederatedCommunity, (federatedCommunity) => federatedCommunity.communityHandshakeStates) + @JoinColumn({ name: 'public_key', referencedColumnName: 'publicKey' }) + federatedCommunity: FederatedCommunity +} \ No newline at end of file diff --git a/database/src/entity/FederatedCommunity.ts b/database/src/entity/FederatedCommunity.ts index a6eaee80f..8993f0663 100644 --- a/database/src/entity/FederatedCommunity.ts +++ b/database/src/entity/FederatedCommunity.ts @@ -5,10 +5,12 @@ import { Entity, JoinColumn, ManyToOne, + OneToMany, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm' import { Community } from './Community' +import { CommunityHandshakeState } from './CommunityHandshakeState' @Entity('federated_communities') export class FederatedCommunity extends BaseEntity { @@ -60,4 +62,8 @@ export class FederatedCommunity extends BaseEntity { ) @JoinColumn({ name: 'public_key', referencedColumnName: 'publicKey' }) community?: Community + + @OneToMany(() => CommunityHandshakeState, (communityHandshakeState) => communityHandshakeState.federatedCommunity) + @JoinColumn({ name: 'public_key', referencedColumnName: 'publicKey' }) + communityHandshakeStates: CommunityHandshakeState[] } diff --git a/database/src/enum/CommunityHandshakeStateType.ts b/database/src/enum/CommunityHandshakeStateType.ts new file mode 100644 index 000000000..e79c4a04c --- /dev/null +++ b/database/src/enum/CommunityHandshakeStateType.ts @@ -0,0 +1,8 @@ +export enum CommunityHandshakeStateType { + OPEN_CONNECTION = 'OPEN_CONNECTION', + OPEN_CONNECTION_CALLBACK = 'OPEN_CONNECTION_CALLBACK', + + SUCCESS = 'SUCCESS', + FAILED = 'FAILED', + EXPIRED = 'EXPIRED' +} \ No newline at end of file diff --git a/database/src/enum/index.ts b/database/src/enum/index.ts new file mode 100644 index 000000000..c1d445299 --- /dev/null +++ b/database/src/enum/index.ts @@ -0,0 +1 @@ +export * from './CommunityHandshakeStateType' \ No newline at end of file