72 lines
2.4 KiB
TypeScript
72 lines
2.4 KiB
TypeScript
import { Driver } from '@core/racing/domain/entities/Driver';
|
|
import { League } from '@core/racing/domain/entities/League';
|
|
import { Team } from '@core/racing/domain/entities/Team';
|
|
import type { TeamMembership } from '@core/racing/domain/types/TeamMembership';
|
|
import { faker } from '@faker-js/faker';
|
|
|
|
export class RacingTeamFactory {
|
|
constructor(
|
|
private readonly baseDate: Date,
|
|
private readonly drivers: Driver[],
|
|
private readonly leagues: League[],
|
|
) {}
|
|
|
|
createTeams(): Team[] {
|
|
const teamCount = 15;
|
|
|
|
return Array.from({ length: teamCount }, (_, idx) => {
|
|
const i = idx + 1;
|
|
const owner = faker.helpers.arrayElement(this.drivers);
|
|
const teamLeagues = faker.helpers.arrayElements(
|
|
this.leagues.map(l => l.id.toString()),
|
|
{ min: 0, max: 3 }
|
|
);
|
|
|
|
return Team.create({
|
|
id: `team-${i}`,
|
|
name: faker.company.name() + ' Racing',
|
|
tag: faker.string.alpha({ length: 4, casing: 'upper' }),
|
|
description: faker.lorem.sentences(2),
|
|
ownerId: owner.id,
|
|
leagues: teamLeagues,
|
|
createdAt: faker.date.past({ years: 2, refDate: this.baseDate }),
|
|
});
|
|
});
|
|
}
|
|
|
|
createTeamMemberships(drivers: Driver[], teams: Team[]): TeamMembership[] {
|
|
const memberships: TeamMembership[] = [];
|
|
const usedDrivers = new Set<string>();
|
|
|
|
teams.forEach((team) => {
|
|
const availableDrivers = drivers.filter(d => !usedDrivers.has(d.id.toString()) && d.id.toString() !== team.ownerId.toString());
|
|
const memberCount = faker.number.int({ min: 1, max: 8 });
|
|
const members = faker.helpers.arrayElements(availableDrivers, memberCount);
|
|
|
|
// Add owner
|
|
memberships.push({
|
|
teamId: team.id.toString(),
|
|
driverId: team.ownerId.toString(),
|
|
role: 'owner',
|
|
status: 'active',
|
|
joinedAt: faker.date.past({ years: 1, refDate: team.createdAt.toDate() }),
|
|
});
|
|
usedDrivers.add(team.ownerId.toString());
|
|
|
|
// Add members
|
|
members.forEach((driver) => {
|
|
memberships.push({
|
|
teamId: team.id.toString(),
|
|
driverId: driver.id.toString(),
|
|
role: faker.helpers.arrayElement(['driver', 'manager']),
|
|
status: 'active',
|
|
joinedAt: faker.date.past({ years: 1, refDate: team.createdAt.toDate() }),
|
|
});
|
|
usedDrivers.add(driver.id.toString());
|
|
});
|
|
});
|
|
|
|
return memberships;
|
|
}
|
|
|
|
} |