From d269fb4799c2ac594952477daae83ddb4eb56587 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Sat, 21 Sep 2024 09:42:44 +0200 Subject: [PATCH] add dlt_users table analog to dlt_transactions --- .../0087-add_dlt_users_table/DltUser.ts | 33 ++++ .../entity/0087-add_dlt_users_table/User.ts | 181 ++++++++++++++++++ database/entity/DltUser.ts | 1 + database/entity/User.ts | 2 +- database/entity/index.ts | 2 + database/logging/DltUserLogging.view.ts | 23 +++ .../migrations/0087-add_dlt_users_table.ts | 19 ++ 7 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 database/entity/0087-add_dlt_users_table/DltUser.ts create mode 100644 database/entity/0087-add_dlt_users_table/User.ts create mode 100644 database/entity/DltUser.ts create mode 100644 database/logging/DltUserLogging.view.ts create mode 100644 database/migrations/0087-add_dlt_users_table.ts diff --git a/database/entity/0087-add_dlt_users_table/DltUser.ts b/database/entity/0087-add_dlt_users_table/DltUser.ts new file mode 100644 index 000000000..ca916e128 --- /dev/null +++ b/database/entity/0087-add_dlt_users_table/DltUser.ts @@ -0,0 +1,33 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' +import { User } from '../User' + +@Entity('dlt_users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class DltUser extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'user_id', type: 'int', unsigned: true, nullable: false }) + userId: number + + @Column({ + name: 'message_id', + length: 64, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + messageId: string + + @Column({ name: 'verified', type: 'bool', nullable: false, default: false }) + verified: boolean + + @Column({ name: 'created_at', default: () => 'CURRENT_TIMESTAMP(3)', nullable: false }) + createdAt: Date + + @Column({ name: 'verified_at', nullable: true, default: null, type: 'datetime' }) + verifiedAt: Date | null + + @OneToOne(() => User, (user) => user.dltUser) + @JoinColumn({ name: 'user_id' }) + user?: User | null +} diff --git a/database/entity/0087-add_dlt_users_table/User.ts b/database/entity/0087-add_dlt_users_table/User.ts new file mode 100644 index 000000000..8d5466241 --- /dev/null +++ b/database/entity/0087-add_dlt_users_table/User.ts @@ -0,0 +1,181 @@ +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + DeleteDateColumn, + OneToMany, + JoinColumn, + OneToOne, + Geometry, + ManyToOne, +} from 'typeorm' +import { Contribution } from '../Contribution' +import { ContributionMessage } from '../ContributionMessage' +import { UserContact } from '../UserContact' +import { UserRole } from '../UserRole' +import { GeometryTransformer } from '../../src/typeorm/GeometryTransformer' +import { Community } from '../Community' +import { DltUser } from '../DltUser' + +@Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class User extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ type: 'bool', default: false }) + foreign: boolean + + @Column({ + name: 'gradido_id', + length: 36, + nullable: false, + collation: 'utf8mb4_unicode_ci', + }) + gradidoID: string + + @Column({ + name: 'community_uuid', + type: 'char', + length: 36, + nullable: true, + collation: 'utf8mb4_unicode_ci', + }) + communityUuid: string + + @ManyToOne(() => Community, (community) => community.users) + @JoinColumn({ name: 'community_uuid', referencedColumnName: 'communityUuid' }) + community: Community | null + + @Column({ + name: 'alias', + length: 20, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + alias: string + + @OneToOne(() => UserContact, (emailContact: UserContact) => emailContact.user) + @JoinColumn({ name: 'email_id' }) + emailContact: UserContact + + @Column({ name: 'email_id', type: 'int', unsigned: true, nullable: true, default: null }) + emailId: number | null + + @Column({ + name: 'first_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + firstName: string + + @Column({ + name: 'last_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + lastName: string + + @Column({ name: 'gms_publish_name', type: 'int', unsigned: true, nullable: false, default: 0 }) + gmsPublishName: number + + @Column({ name: 'humhub_publish_name', type: 'int', unsigned: true, nullable: false, default: 0 }) + humhubPublishName: number + + @Column({ name: 'created_at', default: () => 'CURRENT_TIMESTAMP(3)', nullable: false }) + createdAt: Date + + @DeleteDateColumn({ name: 'deleted_at', nullable: true }) + deletedAt: Date | null + + @Column({ type: 'bigint', default: 0, unsigned: true }) + password: BigInt + + @Column({ + name: 'password_encryption_type', + type: 'int', + unsigned: true, + nullable: false, + default: 0, + }) + passwordEncryptionType: number + + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) + language: string + + @Column({ type: 'bool', default: false }) + hideAmountGDD: boolean + + @Column({ type: 'bool', default: false }) + hideAmountGDT: boolean + + @OneToMany(() => UserRole, (userRole) => userRole.user) + @JoinColumn({ name: 'user_id' }) + userRoles: UserRole[] + + @Column({ name: 'referrer_id', type: 'int', unsigned: true, nullable: true, default: null }) + referrerId?: number | null + + @Column({ + name: 'contribution_link_id', + type: 'int', + unsigned: true, + nullable: true, + default: null, + }) + contributionLinkId?: number | null + + @Column({ name: 'publisher_id', default: 0 }) + publisherId: number + + @Column({ name: 'gms_allowed', type: 'bool', default: true }) + gmsAllowed: boolean + + @Column({ + name: 'location', + type: 'geometry', + default: null, + nullable: true, + transformer: GeometryTransformer, + }) + location: Geometry | null + + @Column({ + name: 'gms_publish_location', + type: 'int', + unsigned: true, + nullable: false, + default: 2, + }) + gmsPublishLocation: number + + @Column({ name: 'gms_registered', type: 'bool', default: false }) + gmsRegistered: boolean + + @Column({ name: 'gms_registered_at', type: 'datetime', default: null, nullable: true }) + gmsRegisteredAt: Date | null + + @Column({ name: 'humhub_allowed', type: 'bool', default: false }) + humhubAllowed: boolean + + @OneToMany(() => Contribution, (contribution) => contribution.user) + @JoinColumn({ name: 'user_id' }) + contributions?: Contribution[] + + @OneToMany(() => ContributionMessage, (message) => message.user) + @JoinColumn({ name: 'user_id' }) + messages?: ContributionMessage[] + + @OneToMany(() => UserContact, (userContact: UserContact) => userContact.user) + @JoinColumn({ name: 'user_id' }) + userContacts?: UserContact[] + + @OneToOne(() => DltUser, (dlt) => dlt.userId) + @JoinColumn({ name: 'id', referencedColumnName: 'userId' }) + dltUser?: DltUser | null +} diff --git a/database/entity/DltUser.ts b/database/entity/DltUser.ts new file mode 100644 index 000000000..29c835233 --- /dev/null +++ b/database/entity/DltUser.ts @@ -0,0 +1 @@ +export { DltUser } from './0087-add_dlt_users_table/DltUser' diff --git a/database/entity/User.ts b/database/entity/User.ts index 993d983ef..5267c24cc 100644 --- a/database/entity/User.ts +++ b/database/entity/User.ts @@ -1 +1 @@ -export { User } from './0084-introduce_humhub_registration/User' +export { User } from './0087-add_dlt_users_table/User' diff --git a/database/entity/index.ts b/database/entity/index.ts index 3352abdb4..a5a988490 100644 --- a/database/entity/index.ts +++ b/database/entity/index.ts @@ -13,6 +13,7 @@ import { Community } from './Community' import { FederatedCommunity } from './FederatedCommunity' import { UserRole } from './UserRole' import { DltTransaction } from './DltTransaction' +import { DltUser } from './DltUser' import { PendingTransaction } from './0071-add-pending_transactions-table/PendingTransaction' export const entities = [ @@ -21,6 +22,7 @@ export const entities = [ ContributionLink, ContributionMessage, DltTransaction, + DltUser, Event, FederatedCommunity, LoginElopageBuys, diff --git a/database/logging/DltUserLogging.view.ts b/database/logging/DltUserLogging.view.ts new file mode 100644 index 000000000..c98c3f351 --- /dev/null +++ b/database/logging/DltUserLogging.view.ts @@ -0,0 +1,23 @@ +import { DltUser } from '../entity/DltUser' +import { AbstractLoggingView } from './AbstractLogging.view' +import { UserLoggingView } from './UserLogging.view' + +export class DltUserLoggingView extends AbstractLoggingView { + public constructor(private self: DltUser) { + super() + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public toJSON(): any { + return { + id: this.self.id, + user: this.self.user + ? new UserLoggingView(this.self.user).toJSON() + : { id: this.self.userId }, + messageId: this.self.messageId, + verified: this.self.verified, + createdAt: this.dateToString(this.self.createdAt), + verifiedAt: this.dateToString(this.self.verifiedAt), + } + } +} diff --git a/database/migrations/0087-add_dlt_users_table.ts b/database/migrations/0087-add_dlt_users_table.ts new file mode 100644 index 000000000..fdb310c67 --- /dev/null +++ b/database/migrations/0087-add_dlt_users_table.ts @@ -0,0 +1,19 @@ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(` + CREATE TABLE dlt_users ( + id int unsigned NOT NULL AUTO_INCREMENT, + user_id int(10) unsigned NOT NULL, + message_id varchar(64) NULL DEFAULT NULL, + verified tinyint(4) NOT NULL DEFAULT 0, + created_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + verified_at datetime(3), + PRIMARY KEY (id) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;`) +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn(`DROP TABLE dlt_users;`) +}