import { ApiProperty } from '@nestjs/swagger'; import { IsString, IsNotEmpty, IsBoolean, IsOptional } from 'class-validator'; export class TeamListItemViewModel { @ApiProperty() id: string; @ApiProperty() name: string; @ApiProperty() tag: string; @ApiProperty() description: string; @ApiProperty() memberCount: number; @ApiProperty({ type: [String] }) leagues: string[]; @ApiProperty({ required: false }) specialization?: 'endurance' | 'sprint' | 'mixed'; @ApiProperty({ required: false }) region?: string; @ApiProperty({ type: [String], required: false }) languages?: string[]; } export class AllTeamsViewModel { @ApiProperty({ type: [TeamListItemViewModel] }) teams: TeamListItemViewModel[]; @ApiProperty() totalCount: number; } export class TeamViewModel { @ApiProperty() id: string; @ApiProperty() name: string; @ApiProperty() tag: string; @ApiProperty() description: string; @ApiProperty() ownerId: string; @ApiProperty({ type: [String] }) leagues: string[]; @ApiProperty({ required: false }) createdAt?: string; @ApiProperty({ required: false }) specialization?: 'endurance' | 'sprint' | 'mixed'; @ApiProperty({ required: false }) region?: string; @ApiProperty({ type: [String], required: false }) languages?: string[]; } export enum MembershipRole { OWNER = 'owner', MANAGER = 'manager', MEMBER = 'member', } export enum MembershipStatus { ACTIVE = 'active', PENDING = 'pending', INVITED = 'invited', INACTIVE = 'inactive', } export class MembershipViewModel { @ApiProperty() role: 'owner' | 'manager' | 'member'; @ApiProperty() joinedAt: string; @ApiProperty() isActive: boolean; } export class DriverTeamViewModel { @ApiProperty({ type: TeamViewModel }) team: TeamViewModel; @ApiProperty({ type: MembershipViewModel }) membership: MembershipViewModel; @ApiProperty() isOwner: boolean; @ApiProperty() canManage: boolean; } export class GetDriverTeamQuery { @ApiProperty() @IsString() teamId: string; @ApiProperty() @IsString() driverId: string; } export class TeamDetailsViewModel { @ApiProperty({ type: TeamViewModel }) team: TeamViewModel; @ApiProperty({ type: MembershipViewModel, nullable: true }) membership: MembershipViewModel | null; @ApiProperty() canManage: boolean; } export class TeamMemberViewModel { @ApiProperty() driverId: string; @ApiProperty() driverName: string; @ApiProperty() role: 'owner' | 'manager' | 'member'; @ApiProperty() joinedAt: string; @ApiProperty() isActive: boolean; @ApiProperty() avatarUrl: string; } export class TeamMembersViewModel { @ApiProperty({ type: [TeamMemberViewModel] }) members: TeamMemberViewModel[]; @ApiProperty() totalCount: number; @ApiProperty() ownerCount: number; @ApiProperty() managerCount: number; @ApiProperty() memberCount: number; } export class TeamJoinRequestViewModel { @ApiProperty() requestId: string; @ApiProperty() driverId: string; @ApiProperty() driverName: string; @ApiProperty() teamId: string; @ApiProperty() status: 'pending' | 'approved' | 'rejected'; @ApiProperty() requestedAt: string; @ApiProperty() avatarUrl: string; } export class TeamJoinRequestsViewModel { @ApiProperty({ type: [TeamJoinRequestViewModel] }) requests: TeamJoinRequestViewModel[]; @ApiProperty() pendingCount: number; @ApiProperty() totalCount: number; } export class CreateTeamInput { @ApiProperty() @IsString() @IsNotEmpty() name: string; @ApiProperty() @IsString() @IsNotEmpty() tag: string; @ApiProperty({ required: false }) @IsOptional() @IsString() description?: string; @ApiProperty() @IsString() ownerId: string; } export class CreateTeamOutput { @ApiProperty() @IsString() teamId: string; @ApiProperty() @IsBoolean() success: boolean; } export class UpdateTeamInput { @ApiProperty({ required: false }) @IsOptional() @IsString() teamId?: string; @ApiProperty({ required: false }) @IsOptional() @IsString() name?: string; @ApiProperty({ required: false }) @IsOptional() @IsString() tag?: string; @ApiProperty({ required: false }) @IsOptional() @IsString() description?: string; @ApiProperty() @IsString() updatedBy: string; } export class UpdateTeamOutput { @ApiProperty() @IsBoolean() success: boolean; } export class ApproveTeamJoinRequestInput { @ApiProperty() @IsString() requestId: string; @ApiProperty({ required: false }) @IsOptional() @IsString() teamId?: string; } export class ApproveTeamJoinRequestOutput { @ApiProperty() @IsBoolean() success: boolean; } export class RejectTeamJoinRequestInput { @ApiProperty() @IsString() requestId: string; @ApiProperty({ required: false }) @IsOptional() @IsString() teamId?: string; } export class RejectTeamJoinRequestOutput { @ApiProperty() @IsBoolean() success: boolean; }