feat: secure admin user management

This commit is contained in:
Bastian Wagner
2026-07-31 23:37:54 +02:00
parent 4105460400
commit e6acfdcac7
22 changed files with 1598 additions and 148 deletions

View File

@@ -0,0 +1,31 @@
import { UserDirectoryReferenceDto } from './user-directory-response.dto';
export class AdminPlayerTeamDto {
id: number;
name: string;
alias: string;
}
export class AdminPlayerCurrentUserDto {
id: number;
firstName: string | null;
lastName: string | null;
status: UserDirectoryReferenceDto | null;
}
export class AdminPlayerSummaryDto {
id: number;
firstName: string;
lastName: string;
active: boolean;
team: AdminPlayerTeamDto;
currentUser: AdminPlayerCurrentUserDto | null;
}
export class AdminPlayerPageDto {
data: AdminPlayerSummaryDto[];
page: number;
limit: number;
total: number;
hasNextPage: boolean;
}

View File

@@ -0,0 +1,67 @@
import { Type } from 'class-transformer';
import {
IsIn,
IsInt,
IsOptional,
IsString,
Max,
MaxLength,
Min,
} from 'class-validator';
import { RoleEnum } from '../../roles/roles.enum';
import { StatusEnum } from '../../statuses/statuses.enum';
export class AdminUserProfileDto {
@IsOptional()
@IsString()
@MaxLength(255)
firstName?: string | null;
@IsOptional()
@IsString()
@MaxLength(255)
lastName?: string | null;
}
export class AdminUserRoleDto {
@Type(() => Number)
@IsIn([RoleEnum.admin, RoleEnum.user])
role: RoleEnum;
}
export class AdminUserStatusDto {
@Type(() => Number)
@IsIn([StatusEnum.active, StatusEnum.inactive])
status: StatusEnum;
}
export type AdminPlayerAssignmentFilter = 'all' | 'assigned' | 'unassigned';
export class AdminPlayerQueryDto {
@IsOptional()
@IsString()
search?: string;
@IsOptional()
@Type(() => Number)
@IsInt()
@Min(1)
teamId?: number;
@IsOptional()
@IsIn(['all', 'assigned', 'unassigned'])
assignment: AdminPlayerAssignmentFilter = 'all';
@IsOptional()
@Type(() => Number)
@IsInt()
@Min(1)
page = 1;
@IsOptional()
@Type(() => Number)
@IsInt()
@Min(1)
@Max(50)
limit = 20;
}