module cleanup
This commit is contained in:
149
apps/api/src/domain/team/TeamController.test.ts
Normal file
149
apps/api/src/domain/team/TeamController.test.ts
Normal file
@@ -0,0 +1,149 @@
|
||||
import { Test, TestingModule } from '@nestjs/testing';
|
||||
import { vi } from 'vitest';
|
||||
import { TeamController } from './TeamController';
|
||||
import { TeamService } from './TeamService';
|
||||
import type { Request } from 'express';
|
||||
import { CreateTeamInputDTO, UpdateTeamInputDTO } from './dtos/CreateTeamInputDTO';
|
||||
|
||||
describe('TeamController', () => {
|
||||
let controller: TeamController;
|
||||
let service: ReturnType<typeof vi.mocked<TeamService>>;
|
||||
|
||||
beforeEach(async () => {
|
||||
const module: TestingModule = await Test.createTestingModule({
|
||||
controllers: [TeamController],
|
||||
providers: [
|
||||
{
|
||||
provide: TeamService,
|
||||
useValue: {
|
||||
getAll: vi.fn(),
|
||||
getDetails: vi.fn(),
|
||||
getMembers: vi.fn(),
|
||||
getJoinRequests: vi.fn(),
|
||||
create: vi.fn(),
|
||||
update: vi.fn(),
|
||||
getDriverTeam: vi.fn(),
|
||||
getMembership: vi.fn(),
|
||||
},
|
||||
},
|
||||
],
|
||||
}).compile();
|
||||
|
||||
controller = module.get<TeamController>(TeamController);
|
||||
service = vi.mocked(module.get(TeamService));
|
||||
});
|
||||
|
||||
describe('getAll', () => {
|
||||
it('should return all teams', async () => {
|
||||
const result = { teams: [] };
|
||||
service.getAll.mockResolvedValue(result);
|
||||
|
||||
const response = await controller.getAll();
|
||||
|
||||
expect(service.getAll).toHaveBeenCalled();
|
||||
expect(response).toEqual(result);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getDetails', () => {
|
||||
it('should return team details', async () => {
|
||||
const teamId = 'team-123';
|
||||
const userId = 'user-456';
|
||||
const result = { id: teamId, name: 'Team' };
|
||||
service.getDetails.mockResolvedValue(result);
|
||||
|
||||
const mockReq: Partial<Request> = { ['user']: { userId } };
|
||||
|
||||
const response = await controller.getDetails(teamId, mockReq as Request);
|
||||
|
||||
expect(service.getDetails).toHaveBeenCalledWith(teamId, userId);
|
||||
expect(response).toEqual(result);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getMembers', () => {
|
||||
it('should return team members', async () => {
|
||||
const teamId = 'team-123';
|
||||
const result = { members: [] };
|
||||
service.getMembers.mockResolvedValue(result);
|
||||
|
||||
const response = await controller.getMembers(teamId);
|
||||
|
||||
expect(service.getMembers).toHaveBeenCalledWith(teamId);
|
||||
expect(response).toEqual(result);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getJoinRequests', () => {
|
||||
it('should return join requests', async () => {
|
||||
const teamId = 'team-123';
|
||||
const result = { requests: [] };
|
||||
service.getJoinRequests.mockResolvedValue(result);
|
||||
|
||||
const response = await controller.getJoinRequests(teamId);
|
||||
|
||||
expect(service.getJoinRequests).toHaveBeenCalledWith(teamId);
|
||||
expect(response).toEqual(result);
|
||||
});
|
||||
});
|
||||
|
||||
describe('create', () => {
|
||||
it('should create team', async () => {
|
||||
const input: CreateTeamInputDTO = { name: 'New Team' };
|
||||
const userId = 'user-123';
|
||||
const result = { teamId: 'team-456' };
|
||||
service.create.mockResolvedValue(result);
|
||||
|
||||
const mockReq: Partial<Request> = { ['user']: { userId } };
|
||||
|
||||
const response = await controller.create(input, mockReq as Request);
|
||||
|
||||
expect(service.create).toHaveBeenCalledWith(input, userId);
|
||||
expect(response).toEqual(result);
|
||||
});
|
||||
});
|
||||
|
||||
describe('update', () => {
|
||||
it('should update team', async () => {
|
||||
const teamId = 'team-123';
|
||||
const input: UpdateTeamInputDTO = { name: 'Updated Team' };
|
||||
const userId = 'user-456';
|
||||
const result = { success: true };
|
||||
service.update.mockResolvedValue(result);
|
||||
|
||||
const mockReq: Partial<Request> = { ['user']: { userId } };
|
||||
|
||||
const response = await controller.update(teamId, input, mockReq as Request);
|
||||
|
||||
expect(service.update).toHaveBeenCalledWith(teamId, input, userId);
|
||||
expect(response).toEqual(result);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getDriverTeam', () => {
|
||||
it('should return driver team', async () => {
|
||||
const driverId = 'driver-123';
|
||||
const result = { teamId: 'team-456' };
|
||||
service.getDriverTeam.mockResolvedValue(result);
|
||||
|
||||
const response = await controller.getDriverTeam(driverId);
|
||||
|
||||
expect(service.getDriverTeam).toHaveBeenCalledWith(driverId);
|
||||
expect(response).toEqual(result);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getMembership', () => {
|
||||
it('should return team membership', async () => {
|
||||
const teamId = 'team-123';
|
||||
const driverId = 'driver-456';
|
||||
const result = { role: 'member' };
|
||||
service.getMembership.mockResolvedValue(result);
|
||||
|
||||
const response = await controller.getMembership(teamId, driverId);
|
||||
|
||||
expect(service.getMembership).toHaveBeenCalledWith(teamId, driverId);
|
||||
expect(response).toEqual(result);
|
||||
});
|
||||
});
|
||||
});
|
||||
30
apps/api/src/domain/team/TeamModule.test.ts
Normal file
30
apps/api/src/domain/team/TeamModule.test.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { Test, TestingModule } from '@nestjs/testing';
|
||||
import { TeamModule } from './TeamModule';
|
||||
import { TeamController } from './TeamController';
|
||||
import { TeamService } from './TeamService';
|
||||
|
||||
describe('TeamModule', () => {
|
||||
let module: TestingModule;
|
||||
|
||||
beforeEach(async () => {
|
||||
module = await Test.createTestingModule({
|
||||
imports: [TeamModule],
|
||||
}).compile();
|
||||
});
|
||||
|
||||
it('should compile the module', () => {
|
||||
expect(module).toBeDefined();
|
||||
});
|
||||
|
||||
it('should provide TeamController', () => {
|
||||
const controller = module.get<TeamController>(TeamController);
|
||||
expect(controller).toBeDefined();
|
||||
expect(controller).toBeInstanceOf(TeamController);
|
||||
});
|
||||
|
||||
it('should provide TeamService', () => {
|
||||
const service = module.get<TeamService>(TeamService);
|
||||
expect(service).toBeDefined();
|
||||
expect(service).toBeInstanceOf(TeamService);
|
||||
});
|
||||
});
|
||||
@@ -1,6 +1,110 @@
|
||||
import { Provider } from '@nestjs/common';
|
||||
import { TeamService } from './TeamService';
|
||||
|
||||
// Import core interfaces
|
||||
import type { Logger } from '@core/shared/application/Logger';
|
||||
import type { ITeamRepository } from '@core/racing/domain/repositories/ITeamRepository';
|
||||
import type { ITeamMembershipRepository } from '@core/racing/domain/repositories/ITeamMembershipRepository';
|
||||
import type { IDriverRepository } from '@core/racing/domain/repositories/IDriverRepository';
|
||||
import type { IImageServicePort } from '@core/racing/application/ports/IImageServicePort';
|
||||
|
||||
// Import concrete in-memory implementations
|
||||
import { InMemoryTeamRepository } from '@adapters/racing/persistence/inmemory/InMemoryTeamRepository';
|
||||
import { InMemoryTeamMembershipRepository } from '@adapters/racing/persistence/inmemory/InMemoryTeamMembershipRepository';
|
||||
import { InMemoryDriverRepository } from '@adapters/racing/persistence/inmemory/InMemoryDriverRepository';
|
||||
import { InMemoryImageServiceAdapter } from '@adapters/media/ports/InMemoryImageServiceAdapter';
|
||||
import { ConsoleLogger } from '@adapters/logging/ConsoleLogger';
|
||||
|
||||
// Import use cases
|
||||
import { GetAllTeamsUseCase } from '@core/racing/application/use-cases/GetAllTeamsUseCase';
|
||||
import { GetTeamDetailsUseCase } from '@core/racing/application/use-cases/GetTeamDetailsUseCase';
|
||||
import { GetTeamMembersUseCase } from '@core/racing/application/use-cases/GetTeamMembersUseCase';
|
||||
import { GetTeamJoinRequestsUseCase } from '@core/racing/application/use-cases/GetTeamJoinRequestsUseCase';
|
||||
import { CreateTeamUseCase } from '@core/racing/application/use-cases/CreateTeamUseCase';
|
||||
import { UpdateTeamUseCase } from '@core/racing/application/use-cases/UpdateTeamUseCase';
|
||||
import { GetDriverTeamUseCase } from '@core/racing/application/use-cases/GetDriverTeamUseCase';
|
||||
import { GetTeamMembershipUseCase } from '@core/racing/application/use-cases/GetTeamMembershipUseCase';
|
||||
|
||||
// Define injection tokens
|
||||
export const TEAM_REPOSITORY_TOKEN = 'ITeamRepository';
|
||||
export const TEAM_MEMBERSHIP_REPOSITORY_TOKEN = 'ITeamMembershipRepository';
|
||||
export const DRIVER_REPOSITORY_TOKEN = 'IDriverRepository';
|
||||
export const IMAGE_SERVICE_TOKEN = 'IImageServicePort';
|
||||
export const LOGGER_TOKEN = 'Logger';
|
||||
|
||||
export const TeamProviders: Provider[] = [
|
||||
TeamService,
|
||||
TeamService, // Provide the service itself
|
||||
{
|
||||
provide: TEAM_REPOSITORY_TOKEN,
|
||||
useFactory: (logger: Logger) => new InMemoryTeamRepository(logger),
|
||||
inject: [LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: TEAM_MEMBERSHIP_REPOSITORY_TOKEN,
|
||||
useFactory: (logger: Logger) => new InMemoryTeamMembershipRepository(logger),
|
||||
inject: [LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: DRIVER_REPOSITORY_TOKEN,
|
||||
useFactory: (logger: Logger) => new InMemoryDriverRepository(logger),
|
||||
inject: [LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: IMAGE_SERVICE_TOKEN,
|
||||
useFactory: (logger: Logger) => new InMemoryImageServiceAdapter(logger),
|
||||
inject: [LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: LOGGER_TOKEN,
|
||||
useClass: ConsoleLogger,
|
||||
},
|
||||
// Use cases
|
||||
{
|
||||
provide: GetAllTeamsUseCase,
|
||||
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository, logger: Logger) =>
|
||||
new GetAllTeamsUseCase(teamRepo, membershipRepo, logger),
|
||||
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: GetTeamDetailsUseCase,
|
||||
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository) =>
|
||||
new GetTeamDetailsUseCase(teamRepo, membershipRepo),
|
||||
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: GetTeamMembersUseCase,
|
||||
useFactory: (membershipRepo: ITeamMembershipRepository, driverRepo: IDriverRepository, imageService: IImageServicePort, logger: Logger) =>
|
||||
new GetTeamMembersUseCase(membershipRepo, driverRepo, imageService, logger),
|
||||
inject: [TEAM_MEMBERSHIP_REPOSITORY_TOKEN, DRIVER_REPOSITORY_TOKEN, IMAGE_SERVICE_TOKEN, LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: GetTeamJoinRequestsUseCase,
|
||||
useFactory: (membershipRepo: ITeamMembershipRepository, driverRepo: IDriverRepository, imageService: IImageServicePort, logger: Logger) =>
|
||||
new GetTeamJoinRequestsUseCase(membershipRepo, driverRepo, imageService, logger),
|
||||
inject: [TEAM_MEMBERSHIP_REPOSITORY_TOKEN, DRIVER_REPOSITORY_TOKEN, IMAGE_SERVICE_TOKEN, LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: CreateTeamUseCase,
|
||||
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository) =>
|
||||
new CreateTeamUseCase(teamRepo, membershipRepo),
|
||||
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: UpdateTeamUseCase,
|
||||
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository) =>
|
||||
new UpdateTeamUseCase(teamRepo, membershipRepo),
|
||||
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: GetDriverTeamUseCase,
|
||||
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository, logger: Logger) =>
|
||||
new GetDriverTeamUseCase(teamRepo, membershipRepo, logger),
|
||||
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: GetTeamMembershipUseCase,
|
||||
useFactory: (membershipRepo: ITeamMembershipRepository, logger: Logger) =>
|
||||
new GetTeamMembershipUseCase(membershipRepo, logger),
|
||||
inject: [TEAM_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
||||
},
|
||||
];
|
||||
@@ -5,8 +5,7 @@ import { GetDriverTeamUseCase } from '@core/racing/application/use-cases/GetDriv
|
||||
import type { Logger } from '@core/shared/application/Logger';
|
||||
import { AllTeamsPresenter } from './presenters/AllTeamsPresenter';
|
||||
import { DriverTeamPresenter } from './presenters/DriverTeamPresenter';
|
||||
import { AllTeamsViewModel, DriverTeamViewModel, GetDriverTeamQuery } from './dto/TeamDto';
|
||||
import { TEAM_GET_ALL_USE_CASE_TOKEN, TEAM_GET_DRIVER_TEAM_USE_CASE_TOKEN, TEAM_LOGGER_TOKEN } from './TeamProviders';
|
||||
import { AllTeamsViewModel, DriverTeamViewModel } from './dtos/TeamDto';
|
||||
|
||||
describe('TeamService', () => {
|
||||
let service: TeamService;
|
||||
@@ -31,138 +30,72 @@ describe('TeamService', () => {
|
||||
providers: [
|
||||
TeamService,
|
||||
{
|
||||
provide: TEAM_GET_ALL_USE_CASE_TOKEN,
|
||||
provide: GetAllTeamsUseCase,
|
||||
useValue: mockGetAllTeamsUseCase,
|
||||
},
|
||||
{
|
||||
provide: TEAM_GET_DRIVER_TEAM_USE_CASE_TOKEN,
|
||||
provide: GetDriverTeamUseCase,
|
||||
useValue: mockGetDriverTeamUseCase,
|
||||
},
|
||||
{
|
||||
provide: TEAM_LOGGER_TOKEN,
|
||||
provide: 'Logger',
|
||||
useValue: mockLogger,
|
||||
},
|
||||
],
|
||||
}).compile();
|
||||
|
||||
service = module.get<TeamService>(TeamService);
|
||||
getAllTeamsUseCase = module.get(TEAM_GET_ALL_USE_CASE_TOKEN);
|
||||
getDriverTeamUseCase = module.get(TEAM_GET_DRIVER_TEAM_USE_CASE_TOKEN);
|
||||
logger = module.get(TEAM_LOGGER_TOKEN);
|
||||
getAllTeamsUseCase = module.get(GetAllTeamsUseCase);
|
||||
getDriverTeamUseCase = module.get(GetDriverTeamUseCase);
|
||||
logger = module.get('Logger');
|
||||
});
|
||||
|
||||
it('should be defined', () => {
|
||||
expect(service).toBeDefined();
|
||||
});
|
||||
|
||||
describe('getAllTeams', () => {
|
||||
it('should create presenter, call use case, and return view model', async () => {
|
||||
const mockViewModel: AllTeamsViewModel = {
|
||||
teams: [],
|
||||
totalCount: 0,
|
||||
};
|
||||
describe('getAll', () => {
|
||||
it('should call use case and return result', async () => {
|
||||
const mockResult = { isOk: () => true, value: { teams: [], totalCount: 0 } };
|
||||
getAllTeamsUseCase.execute.mockResolvedValue(mockResult as any);
|
||||
|
||||
const mockPresenter = {
|
||||
reset: jest.fn(),
|
||||
present: jest.fn(),
|
||||
get viewModel(): AllTeamsViewModel {
|
||||
return mockViewModel;
|
||||
},
|
||||
getViewModel: jest.fn().mockReturnValue({ teams: [], totalCount: 0 }),
|
||||
};
|
||||
|
||||
// Mock the presenter constructor
|
||||
const originalConstructor = AllTeamsPresenter;
|
||||
(AllTeamsPresenter as any) = jest.fn().mockImplementation(() => mockPresenter);
|
||||
|
||||
// Mock the use case to call the presenter
|
||||
getAllTeamsUseCase.execute.mockImplementation(async (input, presenter) => {
|
||||
presenter.present({ teams: [] });
|
||||
});
|
||||
const result = await service.getAll();
|
||||
|
||||
const result = await service.getAllTeams();
|
||||
|
||||
expect(AllTeamsPresenter).toHaveBeenCalled();
|
||||
expect(getAllTeamsUseCase.execute).toHaveBeenCalledWith(undefined, mockPresenter);
|
||||
expect(result).toBe(mockViewModel);
|
||||
|
||||
// Restore
|
||||
AllTeamsPresenter = originalConstructor;
|
||||
expect(getAllTeamsUseCase.execute).toHaveBeenCalled();
|
||||
expect(result).toEqual({ teams: [], totalCount: 0 });
|
||||
});
|
||||
});
|
||||
|
||||
describe('getDriverTeam', () => {
|
||||
it('should create presenter, call use case, and return view model', async () => {
|
||||
const query: GetDriverTeamQuery = { teamId: 'team1', driverId: 'driver1' };
|
||||
const mockViewModel: DriverTeamViewModel = {
|
||||
team: {
|
||||
id: 'team1',
|
||||
name: 'Team 1',
|
||||
tag: 'T1',
|
||||
description: 'Description',
|
||||
ownerId: 'driver1',
|
||||
leagues: [],
|
||||
},
|
||||
membership: {
|
||||
role: 'owner' as any,
|
||||
joinedAt: new Date(),
|
||||
isActive: true,
|
||||
},
|
||||
isOwner: true,
|
||||
canManage: true,
|
||||
};
|
||||
it('should call use case and return result', async () => {
|
||||
const mockResult = { isOk: () => true, value: {} };
|
||||
getDriverTeamUseCase.execute.mockResolvedValue(mockResult as any);
|
||||
|
||||
const mockPresenter = {
|
||||
reset: jest.fn(),
|
||||
present: jest.fn(),
|
||||
get viewModel(): DriverTeamViewModel {
|
||||
return mockViewModel;
|
||||
},
|
||||
getViewModel: jest.fn().mockReturnValue({} as DriverTeamViewModel),
|
||||
};
|
||||
|
||||
// Mock the presenter constructor
|
||||
const originalConstructor = DriverTeamPresenter;
|
||||
(DriverTeamPresenter as any) = jest.fn().mockImplementation(() => mockPresenter);
|
||||
|
||||
// Mock the use case to call the presenter
|
||||
getDriverTeamUseCase.execute.mockImplementation(async (input, presenter) => {
|
||||
presenter.present({
|
||||
team: {
|
||||
id: 'team1',
|
||||
name: 'Team 1',
|
||||
tag: 'T1',
|
||||
description: 'Description',
|
||||
ownerId: 'driver1',
|
||||
leagues: [],
|
||||
},
|
||||
membership: {
|
||||
role: 'owner',
|
||||
status: 'active',
|
||||
joinedAt: new Date(),
|
||||
},
|
||||
driverId: 'driver1',
|
||||
});
|
||||
});
|
||||
const result = await service.getDriverTeam('driver1');
|
||||
|
||||
const result = await service.getDriverTeam(query);
|
||||
|
||||
expect(DriverTeamPresenter).toHaveBeenCalled();
|
||||
expect(getDriverTeamUseCase.execute).toHaveBeenCalledWith({ driverId: 'driver1' }, mockPresenter);
|
||||
expect(result).toBe(mockViewModel);
|
||||
|
||||
// Restore
|
||||
DriverTeamPresenter = originalConstructor;
|
||||
expect(getDriverTeamUseCase.execute).toHaveBeenCalledWith({ driverId: 'driver1' });
|
||||
expect(result).toEqual({});
|
||||
});
|
||||
|
||||
it('should return null on error', async () => {
|
||||
const query: GetDriverTeamQuery = { teamId: 'team1', driverId: 'driver1' };
|
||||
const mockResult = { isErr: () => true, error: {} };
|
||||
getDriverTeamUseCase.execute.mockResolvedValue(mockResult as any);
|
||||
|
||||
// Mock the use case to throw an error
|
||||
getDriverTeamUseCase.execute.mockRejectedValue(new Error('Team not found'));
|
||||
|
||||
const result = await service.getDriverTeam(query);
|
||||
const result = await service.getDriverTeam('driver1');
|
||||
|
||||
expect(result).toBeNull();
|
||||
expect(logger.error).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { Injectable, Inject } from '@nestjs/common';
|
||||
import { GetAllTeamsOutputDTO } from './dtos/GetAllTeamsOutputDTO';
|
||||
import { GetTeamDetailsOutputDTO } from './dtos/GetTeamDetailsOutputDTO';
|
||||
import { GetTeamMembersOutputDTO } from './dtos/GetTeamMembersOutputDTO';
|
||||
@@ -10,63 +10,162 @@ import { UpdateTeamOutputDTO } from './dtos/UpdateTeamOutputDTO';
|
||||
import { GetDriverTeamOutputDTO } from './dtos/GetDriverTeamOutputDTO';
|
||||
import { GetTeamMembershipOutputDTO } from './dtos/GetTeamMembershipOutputDTO';
|
||||
|
||||
// Core imports
|
||||
import type { Logger } from '@core/shared/application/Logger';
|
||||
|
||||
// Use cases
|
||||
import { GetAllTeamsUseCase } from '@core/racing/application/use-cases/GetAllTeamsUseCase';
|
||||
import { GetTeamDetailsUseCase } from '@core/racing/application/use-cases/GetTeamDetailsUseCase';
|
||||
import { GetTeamMembersUseCase } from '@core/racing/application/use-cases/GetTeamMembersUseCase';
|
||||
import { GetTeamJoinRequestsUseCase } from '@core/racing/application/use-cases/GetTeamJoinRequestsUseCase';
|
||||
import { CreateTeamUseCase } from '@core/racing/application/use-cases/CreateTeamUseCase';
|
||||
import { UpdateTeamUseCase } from '@core/racing/application/use-cases/UpdateTeamUseCase';
|
||||
import { GetDriverTeamUseCase } from '@core/racing/application/use-cases/GetDriverTeamUseCase';
|
||||
import { GetTeamMembershipUseCase } from '@core/racing/application/use-cases/GetTeamMembershipUseCase';
|
||||
|
||||
// API Presenters
|
||||
import { AllTeamsPresenter } from './presenters/AllTeamsPresenter';
|
||||
import { TeamDetailsPresenter } from './presenters/TeamDetailsPresenter';
|
||||
import { TeamMembersPresenter } from './presenters/TeamMembersPresenter';
|
||||
import { TeamJoinRequestsPresenter } from './presenters/TeamJoinRequestsPresenter';
|
||||
import { DriverTeamPresenter } from './presenters/DriverTeamPresenter';
|
||||
|
||||
// Tokens
|
||||
import { LOGGER_TOKEN } from './TeamProviders';
|
||||
|
||||
@Injectable()
|
||||
export class TeamService {
|
||||
constructor(
|
||||
private readonly getAllTeamsUseCase: GetAllTeamsUseCase,
|
||||
private readonly getTeamDetailsUseCase: GetTeamDetailsUseCase,
|
||||
private readonly getTeamMembersUseCase: GetTeamMembersUseCase,
|
||||
private readonly getTeamJoinRequestsUseCase: GetTeamJoinRequestsUseCase,
|
||||
private readonly createTeamUseCase: CreateTeamUseCase,
|
||||
private readonly updateTeamUseCase: UpdateTeamUseCase,
|
||||
private readonly getDriverTeamUseCase: GetDriverTeamUseCase,
|
||||
private readonly getTeamMembershipUseCase: GetTeamMembershipUseCase,
|
||||
@Inject(LOGGER_TOKEN) private readonly logger: Logger,
|
||||
) {}
|
||||
|
||||
async getAll(): Promise<GetAllTeamsOutputDTO> {
|
||||
// TODO: Implement getAll teams logic
|
||||
return {
|
||||
teams: [],
|
||||
totalCount: 0,
|
||||
};
|
||||
this.logger.debug('[TeamService] Fetching all teams.');
|
||||
|
||||
const presenter = new AllTeamsPresenter();
|
||||
const result = await this.getAllTeamsUseCase.execute();
|
||||
if (result.isErr()) {
|
||||
this.logger.error('Error fetching all teams', result.error);
|
||||
return { teams: [], totalCount: 0 };
|
||||
}
|
||||
await presenter.present(result.value);
|
||||
return presenter.getViewModel()!;
|
||||
}
|
||||
|
||||
async getDetails(teamId: string, userId?: string): Promise<GetTeamDetailsOutputDTO | null> {
|
||||
// TODO: Implement get team details logic
|
||||
return null;
|
||||
this.logger.debug(`[TeamService] Fetching team details for teamId: ${teamId}, userId: ${userId}`);
|
||||
|
||||
const presenter = new TeamDetailsPresenter();
|
||||
const result = await this.getTeamDetailsUseCase.execute({ teamId, driverId: userId || '' });
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error fetching team details for teamId: ${teamId}`, result.error);
|
||||
return null;
|
||||
}
|
||||
await presenter.present(result.value);
|
||||
return presenter.getViewModel();
|
||||
}
|
||||
|
||||
async getMembers(teamId: string): Promise<GetTeamMembersOutputDTO> {
|
||||
// TODO: Implement get team members logic
|
||||
return {
|
||||
members: [],
|
||||
totalCount: 0,
|
||||
ownerCount: 0,
|
||||
managerCount: 0,
|
||||
memberCount: 0,
|
||||
};
|
||||
this.logger.debug(`[TeamService] Fetching team members for teamId: ${teamId}`);
|
||||
|
||||
const presenter = new TeamMembersPresenter();
|
||||
const result = await this.getTeamMembersUseCase.execute({ teamId });
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error fetching team members for teamId: ${teamId}`, result.error);
|
||||
return {
|
||||
members: [],
|
||||
totalCount: 0,
|
||||
ownerCount: 0,
|
||||
managerCount: 0,
|
||||
memberCount: 0,
|
||||
};
|
||||
}
|
||||
await presenter.present(result.value);
|
||||
return presenter.getViewModel()!;
|
||||
}
|
||||
|
||||
async getJoinRequests(teamId: string): Promise<GetTeamJoinRequestsOutputDTO> {
|
||||
// TODO: Implement get team join requests logic
|
||||
return {
|
||||
requests: [],
|
||||
pendingCount: 0,
|
||||
totalCount: 0,
|
||||
};
|
||||
this.logger.debug(`[TeamService] Fetching team join requests for teamId: ${teamId}`);
|
||||
|
||||
const presenter = new TeamJoinRequestsPresenter();
|
||||
const result = await this.getTeamJoinRequestsUseCase.execute({ teamId });
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error fetching team join requests for teamId: ${teamId}`, result.error);
|
||||
return {
|
||||
requests: [],
|
||||
pendingCount: 0,
|
||||
totalCount: 0,
|
||||
};
|
||||
}
|
||||
await presenter.present(result.value);
|
||||
return presenter.getViewModel()!;
|
||||
}
|
||||
|
||||
async create(input: CreateTeamInputDTO, userId?: string): Promise<CreateTeamOutputDTO> {
|
||||
// TODO: Implement create team logic
|
||||
return {
|
||||
id: 'placeholder-id',
|
||||
success: true,
|
||||
this.logger.debug('[TeamService] Creating team', { input, userId });
|
||||
|
||||
const command = {
|
||||
name: input.name,
|
||||
tag: input.tag,
|
||||
description: input.description,
|
||||
ownerId: userId || '',
|
||||
};
|
||||
const result = await this.createTeamUseCase.execute(command);
|
||||
if (result.isErr()) {
|
||||
this.logger.error('Error creating team', result.error);
|
||||
return { id: '', success: false };
|
||||
}
|
||||
return { id: result.value.id, success: true };
|
||||
}
|
||||
|
||||
async update(teamId: string, input: UpdateTeamInputDTO, userId?: string): Promise<UpdateTeamOutputDTO> {
|
||||
// TODO: Implement update team logic
|
||||
return {
|
||||
success: true,
|
||||
this.logger.debug(`[TeamService] Updating team ${teamId}`, { input, userId });
|
||||
|
||||
const command = {
|
||||
teamId,
|
||||
name: input.name,
|
||||
tag: input.tag,
|
||||
description: input.description,
|
||||
performerId: userId || '',
|
||||
};
|
||||
const result = await this.updateTeamUseCase.execute(command);
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error updating team ${teamId}`, result.error);
|
||||
return { success: false };
|
||||
}
|
||||
return { success: true };
|
||||
}
|
||||
|
||||
async getDriverTeam(driverId: string): Promise<GetDriverTeamOutputDTO | null> {
|
||||
// TODO: Implement get driver team logic
|
||||
return null;
|
||||
this.logger.debug(`[TeamService] Fetching driver team for driverId: ${driverId}`);
|
||||
|
||||
const result = await this.getDriverTeamUseCase.execute({ driverId });
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error fetching driver team for driverId: ${driverId}`, result.error);
|
||||
return null;
|
||||
}
|
||||
|
||||
const presenter = new DriverTeamPresenter();
|
||||
await presenter.present(result.value);
|
||||
return presenter.getViewModel();
|
||||
}
|
||||
|
||||
async getMembership(teamId: string, driverId: string): Promise<GetTeamMembershipOutputDTO | null> {
|
||||
// TODO: Implement get team membership logic
|
||||
return null;
|
||||
this.logger.debug(`[TeamService] Fetching team membership for teamId: ${teamId}, driverId: ${driverId}`);
|
||||
|
||||
const result = await this.getTeamMembershipUseCase.execute({ teamId, driverId });
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error fetching team membership for teamId: ${teamId}, driverId: ${driverId}`, result.error);
|
||||
return null;
|
||||
}
|
||||
return result.value;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import { ITeamsLeaderboardPresenter, TeamsLeaderboardResultDTO, TeamsLeaderboardViewModel } from '@core/racing/application/presenters/ITeamsLeaderboardPresenter';
|
||||
import { ITeamsLeaderboardPresenter, TeamsLeaderboardResultDTO, TeamsLeaderboardViewModel, TeamLeaderboardItemViewModel } from '@core/racing/application/presenters/ITeamsLeaderboardPresenter';
|
||||
|
||||
export class TeamsLeaderboardPresenter implements ITeamsLeaderboardPresenter {
|
||||
private result: TeamsLeaderboardViewModel | null = null;
|
||||
@@ -9,7 +9,7 @@ export class TeamsLeaderboardPresenter implements ITeamsLeaderboardPresenter {
|
||||
|
||||
present(dto: TeamsLeaderboardResultDTO) {
|
||||
this.result = {
|
||||
teams: dto.teams as any, // Cast to match the view model
|
||||
teams: dto.teams as TeamLeaderboardItemViewModel[],
|
||||
recruitingCount: dto.recruitingCount,
|
||||
groupsBySkillLevel: {
|
||||
beginner: [],
|
||||
@@ -17,7 +17,7 @@ export class TeamsLeaderboardPresenter implements ITeamsLeaderboardPresenter {
|
||||
advanced: [],
|
||||
pro: [],
|
||||
},
|
||||
topTeams: dto.teams.slice(0, 10) as any,
|
||||
topTeams: (dto.teams as TeamLeaderboardItemViewModel[]).slice(0, 10),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user