add user module

This commit is contained in:
liuyi 2025-06-22 10:30:50 +08:00
parent ee5af33a96
commit 92cfd94093
5 changed files with 99 additions and 1 deletions

View File

@ -0,0 +1,33 @@
/**
* DTO验证组
*/
export enum UserValidateGroup {
/**
*
*/
USER_CREATE = 'user_create',
/**
*
*/
USER_UPDATE = 'user_update',
/**
*
*/
USER_REGISTER = 'user_register',
/**
*
*/
ACCOUNT_UPDATE = 'account_update',
/**
*
*/
CHANGE_PASSWORD = 'change_password',
}
/**
*
*/
export enum UserOrderType {
CREATED = 'createdAt',
UPDATED = 'updatedAt',
}

View File

@ -11,6 +11,7 @@ import {
} from 'typeorm';
import { CommentEntity, PostEntity } from '@/modules/content/entities';
import { AccessTokenEntity } from '@/modules/user/entities/access.token.entity';
/**
*
@ -94,4 +95,10 @@ export class UserEntity {
*/
@OneToMany(() => CommentEntity, (comment) => comment.author, { cascade: true })
comments: Relation<CommentEntity>[];
/**
* token
*/
@OneToMany(() => AccessTokenEntity, (token) => token.user, { cascade: true })
accessTokens: Relation<AccessTokenEntity>[];
}

View File

@ -1,5 +1,6 @@
import { Entity, OneToOne } from 'typeorm';
import { Entity, ManyToOne, OneToOne, Relation } from 'typeorm';
import { UserEntity } from '@/modules/user/entities/UserEntity';
import { BaseToken } from '@/modules/user/entities/base.token';
import { RefreshTokenEntity } from '@/modules/user/entities/refresh.token.entity';
@ -13,4 +14,10 @@ export class AccessTokenEntity extends BaseToken {
*/
@OneToOne(() => RefreshTokenEntity, (token) => token.accessToken, { cascade: true })
refreshToken: string;
/**
*
*/
@ManyToOne(() => UserEntity, (user) => user.accessTokens, { onDelete: 'CASCADE' })
user: Relation<UserEntity>;
}

View File

@ -0,0 +1,12 @@
import { BaseRepository } from '@/modules/database/base/repository';
import { CustomRepository } from '@/modules/database/decorators/repository.decorator';
import { UserEntity } from '@/modules/user/entities/UserEntity';
@CustomRepository(UserEntity)
export class UserRepository extends BaseRepository<UserEntity> {
protected _qbName: string = 'user';
buildBaseQuery() {
return this.createQueryBuilder(this.qbName).orderBy(`${this.qbName}.createdAt`, 'DESC');
}
}

View File

@ -0,0 +1,39 @@
import { randomBytes } from 'node:crypto';
import { EventSubscriber, InsertEvent, UpdateEvent } from 'typeorm';
import { BaseSubscriber } from '@/modules/database/base/subscriber';
import { UserEntity } from '@/modules/user/entities/UserEntity';
import { encrypt } from '@/modules/user/utils';
@EventSubscriber()
export class UserSubscriber extends BaseSubscriber<UserEntity> {
protected entity = UserEntity;
/**
*
* @param event
* @protected
*/
protected async generateUserName(event: InsertEvent<UserEntity>): Promise<string> {
const username = `user_${randomBytes(4).toString('hex').slice(0, 8)}`;
const user = await event.manager.findOne(UserEntity, { where: { username } });
return user ? this.generateUserName(event) : username;
}
async beforeInsert(event: InsertEvent<UserEntity>): Promise<void> {
if (!event.entity.username) {
event.entity.username = await this.generateUserName(event);
}
if (!event.entity.password) {
event.entity.password = randomBytes(11).toString('hex').slice(0, 22);
}
event.entity.password = await encrypt(this.configure, event.entity.password);
}
async beforeUpdate(event: UpdateEvent<UserEntity>) {
if (this.isUpdated('password', event)) {
event.entity.password = await encrypt(this.configure, event.entity.password);
}
}
}