module creation

This commit is contained in:
2025-12-15 21:44:06 +01:00
parent b834f88bbd
commit 7c7267da72
88 changed files with 12119 additions and 4241 deletions

View File

@@ -0,0 +1,19 @@
import { Controller, Get, Param } from '@nestjs/common';
import { ApiTags, ApiResponse, ApiOperation } from '@nestjs/swagger';
import { TeamService } from './TeamService';
import { AllTeamsViewModel } from './dto/TeamDto';
@ApiTags('teams')
@Controller('teams')
export class TeamController {
constructor(private readonly teamService: TeamService) {}
@Get('all')
@ApiOperation({ summary: 'Get all teams' })
@ApiResponse({ status: 200, description: 'List of all teams', type: AllTeamsViewModel })
async getAllTeams(): Promise<AllTeamsViewModel> {
return this.teamService.getAllTeams();
}
// Add other Team endpoints here based on other presenters
}

View File

@@ -0,0 +1,10 @@
import { Module } from '@nestjs/common';
import { TeamService } from './TeamService';
import { TeamController } from './TeamController';
@Module({
controllers: [TeamController],
providers: [TeamService],
exports: [TeamService],
})
export class TeamModule {}

View File

@@ -0,0 +1,5 @@
import { TeamService } from './TeamService';
export const TeamProviders = [
TeamService,
];

View File

@@ -0,0 +1,43 @@
import { Injectable } from '@nestjs/common';
import { AllTeamsViewModel, GetDriverTeamQuery, DriverTeamViewModel, TeamDto, MembershipDto, TeamLeagueDto, MembershipRole } from './dto/TeamDto';
@Injectable()
export class TeamService {
getAllTeams(): Promise<AllTeamsViewModel> {
// TODO: Implement actual logic to fetch all teams
return Promise.resolve({
teams: [],
totalCount: 0,
});
}
private teams: Map<string, TeamDto> = new Map(); // In-memory store for teams
async getDriverTeam(query: GetDriverTeamQuery): Promise<DriverTeamViewModel | null> {
const { teamId, driverId } = query;
const team = this.teams.get(teamId);
if (!team) {
return null;
}
// Mock membership and roles
const membership: MembershipDto = {
role: driverId === team.ownerId ? MembershipRole.OWNER : MembershipRole.MEMBER,
joinedAt: new Date(Date.now() - 86400000 * 30), // Joined 30 days ago
isActive: true, // Always active for mock
};
const isOwner = team.ownerId === driverId;
const canManage = isOwner || membership.role === MembershipRole.MANAGER;
return {
team: team,
membership,
isOwner,
canManage,
};
}
// Add other methods related to Team logic here based on other presenters
}

View File

@@ -0,0 +1,121 @@
import { ApiProperty } from '@nestjs/swagger';
export class TeamLeagueDto {
@ApiProperty()
id: string;
@ApiProperty()
name: string;
@ApiProperty({ nullable: true })
logoUrl?: string;
}
export class TeamListItemViewModel {
@ApiProperty()
id: string;
@ApiProperty()
name: string;
@ApiProperty({ nullable: true })
tag?: string;
@ApiProperty({ nullable: true })
description?: string;
@ApiProperty()
memberCount: number;
@ApiProperty({ type: [TeamLeagueDto] })
leagues: TeamLeagueDto[];
}
export class AllTeamsViewModel {
@ApiProperty({ type: [TeamListItemViewModel] })
teams: TeamListItemViewModel[];
@ApiProperty()
totalCount: number;
import { IsString, IsNotEmpty, IsEnum, IsBoolean, IsDate } from 'class-validator';
export class TeamDto {
@ApiProperty()
@IsString()
id: string;
@ApiProperty()
@IsString()
@IsNotEmpty()
name: string;
@ApiProperty()
@IsString()
@IsNotEmpty()
tag: string;
@ApiProperty({ required: false })
@IsOptional()
@IsString()
description?: string;
@ApiProperty()
@IsString()
ownerId: string;
@ApiProperty({ type: [TeamLeagueDto] })
leagues: TeamLeagueDto[];
}
export enum MembershipRole {
OWNER = 'owner',
MANAGER = 'manager',
MEMBER = 'member',
}
export enum MembershipStatus {
ACTIVE = 'active',
PENDING = 'pending',
INVITED = 'invited',
INACTIVE = 'inactive',
}
export class MembershipDto {
@ApiProperty({ enum: MembershipRole })
@IsEnum(MembershipRole)
role: MembershipRole;
@ApiProperty()
@IsDate()
joinedAt: Date;
@ApiProperty()
@IsBoolean()
isActive: boolean;
}
export class DriverTeamViewModel {
@ApiProperty({ type: TeamDto })
team: TeamDto;
@ApiProperty({ type: MembershipDto })
membership: MembershipDto;
@ApiProperty()
@IsBoolean()
isOwner: boolean;
@ApiProperty()
@IsBoolean()
canManage: boolean;
}
export class GetDriverTeamQuery {
@ApiProperty()
@IsString()
teamId: string;
@ApiProperty()
@IsString()
driverId: string;
}