feat: make team creator a captain of the new team

This commit is contained in:
Bastian Wagner
2026-08-03 15:44:12 +02:00
parent 92eacbc5bb
commit c1478f07f1
2 changed files with 80 additions and 0 deletions

View File

@@ -29,6 +29,7 @@ describe('TeamsService#getOverviewStats theoretical balance', () => {
{} as any, {} as any,
{ info: jest.fn(), debug: jest.fn(), warn: jest.fn() } as any, { info: jest.fn(), debug: jest.fn(), warn: jest.fn() } as any,
access as any, access as any,
{} as any,
); );
}); });
@@ -286,6 +287,7 @@ describe('TeamsService#getTeamTransactionsJournal', () => {
{} as any, {} as any,
{ info: jest.fn(), debug: jest.fn(), warn: jest.fn() } as any, { info: jest.fn(), debug: jest.fn(), warn: jest.fn() } as any,
access as any, access as any,
{} as any,
); );
}); });
@@ -362,3 +364,59 @@ describe('TeamsService#getTeamTransactionsJournal', () => {
expect(repository.findOneOrFail).not.toHaveBeenCalled(); expect(repository.findOneOrFail).not.toHaveBeenCalled();
}); });
}); });
describe('TeamsService#createNewTeam', () => {
const repository = { create: jest.fn(), save: jest.fn() };
const playerRepository = { create: jest.fn(), save: jest.fn() };
const rolesRepository = { findOneBy: jest.fn() };
const settingsRepository = { create: jest.fn(), save: jest.fn() };
const usersRepository = { findOneBy: jest.fn() };
const logger = { info: jest.fn(), debug: jest.fn(), warn: jest.fn() };
let service: TeamsService;
beforeEach(() => {
jest.resetAllMocks();
service = new TeamsService(
repository as any,
playerRepository as any,
{} as any,
rolesRepository as any,
settingsRepository as any,
{} as any,
logger as any,
{} as any,
usersRepository as any,
);
});
it('creates the team, its default settings, and a captain membership for the creator', async () => {
const savedTeam = { id: 7, name: '1. Herren' };
repository.create.mockReturnValue({ name: '1. Herren' });
repository.save.mockResolvedValue(savedTeam);
settingsRepository.create.mockImplementation((s: unknown) => s);
settingsRepository.save.mockResolvedValue([]);
usersRepository.findOneBy.mockResolvedValue({
id: 42,
firstName: 'Alex',
lastName: 'Muster',
});
rolesRepository.findOneBy.mockResolvedValue({ id: 3, name: 'captain' });
playerRepository.create.mockImplementation((p: unknown) => p);
playerRepository.save.mockResolvedValue({});
const result = await service.createNewTeam({ name: '1. Herren' } as any, '42');
expect(result).toBe(savedTeam);
expect(rolesRepository.findOneBy).toHaveBeenCalledWith({ id: 3 });
expect(usersRepository.findOneBy).toHaveBeenCalledWith({ id: 42 });
expect(playerRepository.create).toHaveBeenCalledWith(
expect.objectContaining({
firstName: 'Alex',
lastName: 'Muster',
team: savedTeam,
teamRole: { id: 3, name: 'captain' },
}),
);
expect(playerRepository.save).toHaveBeenCalled();
});
});

View File

@@ -8,6 +8,8 @@ import { TeamSetting } from 'src/team-settings/entities/team-setting.entity';
import { TEAM_SETTING_DEFAULTS } from 'src/team-settings/team-setting-defaults'; import { TEAM_SETTING_DEFAULTS } from 'src/team-settings/team-setting-defaults';
import { TeamWalletTransaction } from 'src/team-wallet-transactions/entities/team-wallet-transaction.entity'; import { TeamWalletTransaction } from 'src/team-wallet-transactions/entities/team-wallet-transaction.entity';
import { Transaction } from 'src/transactions/entitites/transaction.entity'; import { Transaction } from 'src/transactions/entitites/transaction.entity';
import { TeamRolesEnum } from 'src/team-roles/team-roles.enum';
import { User } from 'src/users/entities/user.entity';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { import {
TransactionsQueryDto, TransactionsQueryDto,
@@ -46,6 +48,8 @@ export class TeamsService {
private teamWalletTransactionRepository: Repository<TeamWalletTransaction>, private teamWalletTransactionRepository: Repository<TeamWalletTransaction>,
private logger: LoggingService, private logger: LoggingService,
private access: TeamAccessService, private access: TeamAccessService,
@InjectRepository(User)
private usersRepository: Repository<User>,
) {} ) {}
async getOverview(teamId: string, actorUserId: string) { async getOverview(teamId: string, actorUserId: string) {
@@ -168,6 +172,7 @@ export class TeamsService {
const team = await this.repository.save(createTeam); const team = await this.repository.save(createTeam);
await this.generateBasicTeamSettings(team); await this.generateBasicTeamSettings(team);
await this.addCreatorAsCaptain(team, userId);
await this.logger.info({ await this.logger.info({
event: 'team_create', event: 'team_create',
@@ -177,6 +182,23 @@ export class TeamsService {
return team; return team;
} }
private async addCreatorAsCaptain(team: Team, userId: string): Promise<void> {
const [user, captainRole] = await Promise.all([
this.usersRepository.findOneBy({ id: Number(userId) }),
this.rolesRepository.findOneBy({ id: TeamRolesEnum.captain }),
]);
const player = this.playerRepository.create({
firstName: user?.firstName ?? '',
lastName: user?.lastName ?? '',
team,
teamRole: captainRole,
user: user ?? undefined,
});
await this.playerRepository.save(player);
}
private async generateBasicTeamSettings(team: Team): Promise<void> { private async generateBasicTeamSettings(team: Team): Promise<void> {
const settings: CreateTeamSettingDTO[] = Object.entries( const settings: CreateTeamSettingDTO[] = Object.entries(
TEAM_SETTING_DEFAULTS, TEAM_SETTING_DEFAULTS,