website refactor
This commit is contained in:
@@ -15,7 +15,7 @@ import { FeatureAvailabilityGuard } from '../policy/FeatureAvailabilityGuard';
|
||||
describe('Team domain (HTTP, module-wiring)', () => {
|
||||
const originalEnv = { ...process.env };
|
||||
|
||||
let app: any;
|
||||
let app: import("@nestjs/common").INestApplication;
|
||||
|
||||
beforeAll(async () => {
|
||||
vi.resetModules();
|
||||
@@ -62,9 +62,9 @@ describe('Team domain (HTTP, module-wiring)', () => {
|
||||
};
|
||||
|
||||
app.useGlobalGuards(
|
||||
new AuthenticationGuard(sessionPort as any),
|
||||
new AuthorizationGuard(reflector, authorizationService as any),
|
||||
new FeatureAvailabilityGuard(reflector, policyService as any),
|
||||
new AuthenticationGuard(sessionPort as never),
|
||||
new AuthorizationGuard(reflector, authorizationService as never),
|
||||
new FeatureAvailabilityGuard(reflector, policyService as never),
|
||||
);
|
||||
|
||||
await app.init();
|
||||
|
||||
@@ -61,7 +61,7 @@ describe('TeamController', () => {
|
||||
const result = { team: { id: teamId, name: 'Team', tag: 'TAG', description: 'Desc', ownerId: 'owner', leagues: [], isRecruiting: false }, membership: null, canManage: false };
|
||||
service.getDetails.mockResolvedValue(result);
|
||||
|
||||
const mockReq = { user: { userId } } as any;
|
||||
const mockReq = { user: { userId } } as never;
|
||||
|
||||
const response = await controller.getDetails(teamId, mockReq);
|
||||
|
||||
@@ -103,7 +103,7 @@ describe('TeamController', () => {
|
||||
const result = { id: 'team-456', success: true };
|
||||
service.create.mockResolvedValue(result);
|
||||
|
||||
const mockReq = { user: { userId } } as any;
|
||||
const mockReq = { user: { userId } } as never;
|
||||
|
||||
const response = await controller.create(input, mockReq);
|
||||
|
||||
@@ -120,7 +120,7 @@ describe('TeamController', () => {
|
||||
const result = { success: true };
|
||||
service.update.mockResolvedValue(result);
|
||||
|
||||
const mockReq = { user: { userId } } as any;
|
||||
const mockReq = { user: { userId } } as never;
|
||||
|
||||
const response = await controller.update(teamId, input, mockReq);
|
||||
|
||||
@@ -157,7 +157,7 @@ describe('TeamController', () => {
|
||||
});
|
||||
|
||||
describe('auth guards (HTTP)', () => {
|
||||
let app: any;
|
||||
let app: import("@nestjs/common").INestApplication;
|
||||
|
||||
const sessionPort: { getCurrentSession: () => Promise<null | { token: string; user: { id: string } }> } = {
|
||||
getCurrentSession: vi.fn(async () => null),
|
||||
@@ -196,9 +196,9 @@ describe('TeamController', () => {
|
||||
|
||||
const reflector = new Reflector();
|
||||
app.useGlobalGuards(
|
||||
new AuthenticationGuard(sessionPort as any),
|
||||
new AuthorizationGuard(reflector, authorizationService as any),
|
||||
new FeatureAvailabilityGuard(reflector, policyService as any),
|
||||
new AuthenticationGuard(sessionPort as never),
|
||||
new AuthorizationGuard(reflector, authorizationService as never),
|
||||
new FeatureAvailabilityGuard(reflector, policyService as never),
|
||||
);
|
||||
|
||||
await app.init();
|
||||
|
||||
@@ -1,6 +1,24 @@
|
||||
import { Provider } from '@nestjs/common';
|
||||
|
||||
import { IMAGE_SERVICE_TOKEN, LOGGER_TOKEN, MEDIA_REPOSITORY_TOKEN, MEDIA_RESOLVER_TOKEN } from './TeamTokens';
|
||||
import {
|
||||
IMAGE_SERVICE_TOKEN,
|
||||
LOGGER_TOKEN,
|
||||
MEDIA_REPOSITORY_TOKEN,
|
||||
MEDIA_RESOLVER_TOKEN,
|
||||
TEAM_REPOSITORY_TOKEN,
|
||||
TEAM_MEMBERSHIP_REPOSITORY_TOKEN,
|
||||
DRIVER_REPOSITORY_TOKEN,
|
||||
TEAM_STATS_REPOSITORY_TOKEN,
|
||||
GET_ALL_TEAMS_USE_CASE_TOKEN,
|
||||
GET_TEAM_DETAILS_USE_CASE_TOKEN,
|
||||
GET_TEAM_MEMBERS_USE_CASE_TOKEN,
|
||||
GET_TEAM_JOIN_REQUESTS_USE_CASE_TOKEN,
|
||||
CREATE_TEAM_USE_CASE_TOKEN,
|
||||
UPDATE_TEAM_USE_CASE_TOKEN,
|
||||
GET_DRIVER_TEAM_USE_CASE_TOKEN,
|
||||
GET_TEAM_MEMBERSHIP_USE_CASE_TOKEN,
|
||||
JOIN_TEAM_USE_CASE_TOKEN,
|
||||
} from './TeamTokens';
|
||||
|
||||
export {
|
||||
TEAM_REPOSITORY_TOKEN,
|
||||
@@ -15,6 +33,10 @@ export {
|
||||
// Import core interfaces
|
||||
import type { Logger } from '@core/shared/application/Logger';
|
||||
import type { MediaResolverPort } from '@core/ports/media/MediaResolverPort';
|
||||
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 { ITeamStatsRepository } from '@core/racing/domain/repositories/ITeamStatsRepository';
|
||||
|
||||
// Import concrete implementations
|
||||
import { InMemoryImageServiceAdapter } from '@adapters/media/ports/InMemoryImageServiceAdapter';
|
||||
@@ -22,6 +44,17 @@ import { ConsoleLogger } from '@adapters/logging/ConsoleLogger';
|
||||
import { InMemoryMediaRepository } from '@adapters/racing/persistence/media/InMemoryMediaRepository';
|
||||
import { MediaResolverAdapter } from '@adapters/media/MediaResolverAdapter';
|
||||
|
||||
// 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';
|
||||
import { JoinTeamUseCase } from '@core/racing/application/use-cases/JoinTeamUseCase';
|
||||
|
||||
// Import presenters
|
||||
import { AllTeamsPresenter } from './presenters/AllTeamsPresenter';
|
||||
|
||||
@@ -69,4 +102,59 @@ export const TeamProviders: Provider[] = [
|
||||
},
|
||||
inject: [MEDIA_RESOLVER_TOKEN],
|
||||
},
|
||||
];
|
||||
// Use Cases
|
||||
{
|
||||
provide: GET_ALL_TEAMS_USE_CASE_TOKEN,
|
||||
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository, statsRepo: ITeamStatsRepository, logger: Logger) =>
|
||||
new GetAllTeamsUseCase(teamRepo, membershipRepo, statsRepo, logger),
|
||||
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN, TEAM_STATS_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: GET_TEAM_DETAILS_USE_CASE_TOKEN,
|
||||
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository) =>
|
||||
new GetTeamDetailsUseCase(teamRepo, membershipRepo),
|
||||
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: GET_TEAM_MEMBERS_USE_CASE_TOKEN,
|
||||
useFactory: (membershipRepo: ITeamMembershipRepository, driverRepo: IDriverRepository, teamRepo: ITeamRepository, logger: Logger) =>
|
||||
new GetTeamMembersUseCase(membershipRepo, driverRepo, teamRepo, logger),
|
||||
inject: [TEAM_MEMBERSHIP_REPOSITORY_TOKEN, DRIVER_REPOSITORY_TOKEN, TEAM_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: GET_TEAM_JOIN_REQUESTS_USE_CASE_TOKEN,
|
||||
useFactory: (membershipRepo: ITeamMembershipRepository, driverRepo: IDriverRepository, teamRepo: ITeamRepository) =>
|
||||
new GetTeamJoinRequestsUseCase(membershipRepo, driverRepo, teamRepo),
|
||||
inject: [TEAM_MEMBERSHIP_REPOSITORY_TOKEN, DRIVER_REPOSITORY_TOKEN, TEAM_REPOSITORY_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: CREATE_TEAM_USE_CASE_TOKEN,
|
||||
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository, logger: Logger) =>
|
||||
new CreateTeamUseCase(teamRepo, membershipRepo, logger),
|
||||
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: UPDATE_TEAM_USE_CASE_TOKEN,
|
||||
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository) =>
|
||||
new UpdateTeamUseCase(teamRepo, membershipRepo),
|
||||
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: GET_DRIVER_TEAM_USE_CASE_TOKEN,
|
||||
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository, logger: Logger) =>
|
||||
new GetDriverTeamUseCase(teamRepo, membershipRepo, logger),
|
||||
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: GET_TEAM_MEMBERSHIP_USE_CASE_TOKEN,
|
||||
useFactory: (membershipRepo: ITeamMembershipRepository, logger: Logger) =>
|
||||
new GetTeamMembershipUseCase(membershipRepo, logger),
|
||||
inject: [TEAM_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
||||
},
|
||||
{
|
||||
provide: JOIN_TEAM_USE_CASE_TOKEN,
|
||||
useFactory: (teamRepo: ITeamRepository, membershipRepo: ITeamMembershipRepository, logger: Logger) =>
|
||||
new JoinTeamUseCase(teamRepo, membershipRepo, logger),
|
||||
inject: [TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN, LOGGER_TOKEN],
|
||||
},
|
||||
];
|
||||
|
||||
@@ -23,7 +23,7 @@ type TeamEntityStub = {
|
||||
ownerId: ValueObjectStub;
|
||||
leagues: ValueObjectStub[];
|
||||
createdAt: { toDate(): Date };
|
||||
logoRef: any;
|
||||
logoRef: unknown;
|
||||
category: string | undefined;
|
||||
isRecruiting: boolean;
|
||||
update: Mock;
|
||||
@@ -124,13 +124,17 @@ describe('TeamService', () => {
|
||||
clear: vi.fn(),
|
||||
};
|
||||
|
||||
|
||||
service = new TeamService(
|
||||
teamRepository as unknown as never,
|
||||
membershipRepository as unknown as never,
|
||||
driverRepository as unknown as never,
|
||||
logger,
|
||||
teamStatsRepository as unknown as never
|
||||
new GetAllTeamsUseCase(teamRepository as never, membershipRepository as never, teamStatsRepository as never, logger),
|
||||
new GetTeamDetailsUseCase(teamRepository as never, membershipRepository as never),
|
||||
new GetTeamMembersUseCase(membershipRepository as never, driverRepository as never, teamRepository as never, logger),
|
||||
new GetTeamJoinRequestsUseCase(membershipRepository as never, driverRepository as never, teamRepository as never),
|
||||
new CreateTeamUseCase(teamRepository as never, membershipRepository as never, logger),
|
||||
new UpdateTeamUseCase(teamRepository as never, membershipRepository as never),
|
||||
new GetDriverTeamUseCase(teamRepository as never, membershipRepository as never, logger),
|
||||
new GetTeamMembershipUseCase(membershipRepository as never, logger),
|
||||
{ execute: vi.fn() } as never, // joinTeamUseCase
|
||||
logger
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -12,9 +12,6 @@ import { GetTeamMembershipOutputDTO } from './dtos/GetTeamMembershipOutputDTO';
|
||||
|
||||
// Core imports
|
||||
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';
|
||||
|
||||
// Use cases
|
||||
import { GetAllTeamsUseCase } from '@core/racing/application/use-cases/GetAllTeamsUseCase';
|
||||
@@ -28,39 +25,44 @@ import { GetTeamMembershipUseCase } from '@core/racing/application/use-cases/Get
|
||||
import { JoinTeamUseCase } from '@core/racing/application/use-cases/JoinTeamUseCase';
|
||||
|
||||
// Tokens
|
||||
import { TEAM_REPOSITORY_TOKEN, TEAM_MEMBERSHIP_REPOSITORY_TOKEN, DRIVER_REPOSITORY_TOKEN, LOGGER_TOKEN, TEAM_STATS_REPOSITORY_TOKEN } from './TeamTokens';
|
||||
import type { ITeamStatsRepository } from '@core/racing/domain/repositories/ITeamStatsRepository';
|
||||
import {
|
||||
LOGGER_TOKEN,
|
||||
GET_ALL_TEAMS_USE_CASE_TOKEN,
|
||||
GET_TEAM_DETAILS_USE_CASE_TOKEN,
|
||||
GET_TEAM_MEMBERS_USE_CASE_TOKEN,
|
||||
GET_TEAM_JOIN_REQUESTS_USE_CASE_TOKEN,
|
||||
CREATE_TEAM_USE_CASE_TOKEN,
|
||||
UPDATE_TEAM_USE_CASE_TOKEN,
|
||||
GET_DRIVER_TEAM_USE_CASE_TOKEN,
|
||||
GET_TEAM_MEMBERSHIP_USE_CASE_TOKEN,
|
||||
JOIN_TEAM_USE_CASE_TOKEN,
|
||||
} from './TeamTokens';
|
||||
|
||||
@Injectable()
|
||||
export class TeamService {
|
||||
constructor(
|
||||
@Inject(TEAM_REPOSITORY_TOKEN) private readonly teamRepository: ITeamRepository,
|
||||
@Inject(TEAM_MEMBERSHIP_REPOSITORY_TOKEN) private readonly membershipRepository: ITeamMembershipRepository,
|
||||
@Inject(DRIVER_REPOSITORY_TOKEN) private readonly driverRepository: IDriverRepository,
|
||||
@Inject(GET_ALL_TEAMS_USE_CASE_TOKEN) private readonly getAllTeamsUseCase: GetAllTeamsUseCase,
|
||||
@Inject(GET_TEAM_DETAILS_USE_CASE_TOKEN) private readonly getTeamDetailsUseCase: GetTeamDetailsUseCase,
|
||||
@Inject(GET_TEAM_MEMBERS_USE_CASE_TOKEN) private readonly getTeamMembersUseCase: GetTeamMembersUseCase,
|
||||
@Inject(GET_TEAM_JOIN_REQUESTS_USE_CASE_TOKEN) private readonly getTeamJoinRequestsUseCase: GetTeamJoinRequestsUseCase,
|
||||
@Inject(CREATE_TEAM_USE_CASE_TOKEN) private readonly createTeamUseCase: CreateTeamUseCase,
|
||||
@Inject(UPDATE_TEAM_USE_CASE_TOKEN) private readonly updateTeamUseCase: UpdateTeamUseCase,
|
||||
@Inject(GET_DRIVER_TEAM_USE_CASE_TOKEN) private readonly getDriverTeamUseCase: GetDriverTeamUseCase,
|
||||
@Inject(GET_TEAM_MEMBERSHIP_USE_CASE_TOKEN) private readonly getTeamMembershipUseCase: GetTeamMembershipUseCase,
|
||||
@Inject(JOIN_TEAM_USE_CASE_TOKEN) private readonly joinTeamUseCase: JoinTeamUseCase,
|
||||
@Inject(LOGGER_TOKEN) private readonly logger: Logger,
|
||||
@Inject(TEAM_STATS_REPOSITORY_TOKEN) private readonly teamStatsRepository: ITeamStatsRepository,
|
||||
) {}
|
||||
|
||||
async getAll(): Promise<GetAllTeamsOutputDTO> {
|
||||
this.logger.debug('[TeamService] Fetching all teams.');
|
||||
|
||||
const useCase = new GetAllTeamsUseCase(
|
||||
this.teamRepository,
|
||||
this.membershipRepository,
|
||||
this.teamStatsRepository,
|
||||
this.logger
|
||||
);
|
||||
const result = await useCase.execute({});
|
||||
const result = await this.getAllTeamsUseCase.execute({});
|
||||
if (result.isErr()) {
|
||||
this.logger.error('Error fetching all teams', new Error(result.error?.details?.message || 'Unknown error'));
|
||||
return { teams: [], totalCount: 0 };
|
||||
}
|
||||
|
||||
const value = result.value;
|
||||
if (!value) {
|
||||
this.logger.error('Error fetching all teams', new Error(result.unwrapErr().details?.message || 'Unknown error'));
|
||||
return { teams: [], totalCount: 0 };
|
||||
}
|
||||
|
||||
const value = result.unwrap();
|
||||
return {
|
||||
teams: value.teams.map(t => ({
|
||||
id: t.team.id,
|
||||
@@ -86,18 +88,13 @@ export class TeamService {
|
||||
async getDetails(teamId: string, userId?: string): Promise<GetTeamDetailsOutputDTO | null> {
|
||||
this.logger.debug(`[TeamService] Fetching team details for teamId: ${teamId}, userId: ${userId}`);
|
||||
|
||||
const useCase = new GetTeamDetailsUseCase(this.teamRepository, this.membershipRepository);
|
||||
const result = await useCase.execute({ teamId, driverId: userId || '' });
|
||||
const result = await this.getTeamDetailsUseCase.execute({ teamId, driverId: userId || '' });
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error fetching team details for teamId: ${teamId}: ${result.error?.details?.message || 'Unknown error'}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
const value = result.value;
|
||||
if (!value) {
|
||||
this.logger.error(`Error fetching team details for teamId: ${teamId}: ${result.unwrapErr().details?.message || 'Unknown error'}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
const value = result.unwrap();
|
||||
// Convert to DTO
|
||||
return {
|
||||
team: {
|
||||
@@ -123,21 +120,9 @@ export class TeamService {
|
||||
async getMembers(teamId: string): Promise<GetTeamMembersOutputDTO> {
|
||||
this.logger.debug(`[TeamService] Fetching team members for teamId: ${teamId}`);
|
||||
|
||||
const useCase = new GetTeamMembersUseCase(this.membershipRepository, this.driverRepository, this.teamRepository, this.logger);
|
||||
const result = await useCase.execute({ teamId });
|
||||
const result = await this.getTeamMembersUseCase.execute({ teamId });
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error fetching team members for teamId: ${teamId}: ${result.error?.details?.message || 'Unknown error'}`);
|
||||
return {
|
||||
members: [],
|
||||
totalCount: 0,
|
||||
ownerCount: 0,
|
||||
managerCount: 0,
|
||||
memberCount: 0,
|
||||
};
|
||||
}
|
||||
|
||||
const value = result.value;
|
||||
if (!value) {
|
||||
this.logger.error(`Error fetching team members for teamId: ${teamId}: ${result.unwrapErr().details?.message || 'Unknown error'}`);
|
||||
return {
|
||||
members: [],
|
||||
totalCount: 0,
|
||||
@@ -147,6 +132,7 @@ export class TeamService {
|
||||
};
|
||||
}
|
||||
|
||||
const value = result.unwrap();
|
||||
return {
|
||||
members: value.members.map(m => ({
|
||||
driverId: m.driver?.id || '',
|
||||
@@ -166,19 +152,9 @@ export class TeamService {
|
||||
async getJoinRequests(teamId: string): Promise<GetTeamJoinRequestsOutputDTO> {
|
||||
this.logger.debug(`[TeamService] Fetching team join requests for teamId: ${teamId}`);
|
||||
|
||||
const useCase = new GetTeamJoinRequestsUseCase(this.membershipRepository, this.driverRepository, this.teamRepository);
|
||||
const result = await useCase.execute({ teamId });
|
||||
const result = await this.getTeamJoinRequestsUseCase.execute({ teamId });
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error fetching team join requests for teamId: ${teamId}`, new Error(result.error?.details?.message || 'Unknown error'));
|
||||
return {
|
||||
requests: [],
|
||||
pendingCount: 0,
|
||||
totalCount: 0,
|
||||
};
|
||||
}
|
||||
|
||||
const value = result.value;
|
||||
if (!value) {
|
||||
this.logger.error(`Error fetching team join requests for teamId: ${teamId}`, new Error(result.unwrapErr().details?.message || 'Unknown error'));
|
||||
return {
|
||||
requests: [],
|
||||
pendingCount: 0,
|
||||
@@ -186,6 +162,7 @@ export class TeamService {
|
||||
};
|
||||
}
|
||||
|
||||
const value = result.unwrap();
|
||||
return {
|
||||
requests: value.joinRequests.map(r => ({
|
||||
requestId: r.id,
|
||||
@@ -212,18 +189,13 @@ export class TeamService {
|
||||
leagues: [],
|
||||
};
|
||||
|
||||
const useCase = new CreateTeamUseCase(this.teamRepository, this.membershipRepository, this.logger);
|
||||
const result = await useCase.execute(command);
|
||||
const result = await this.createTeamUseCase.execute(command);
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error creating team: ${result.error?.details?.message || 'Unknown error'}`);
|
||||
return { id: '', success: false };
|
||||
}
|
||||
|
||||
const value = result.value;
|
||||
if (!value) {
|
||||
this.logger.error(`Error creating team: ${result.unwrapErr().details?.message || 'Unknown error'}`);
|
||||
return { id: '', success: false };
|
||||
}
|
||||
|
||||
const value = result.unwrap();
|
||||
return { id: value.team.id, success: true };
|
||||
}
|
||||
|
||||
@@ -240,10 +212,9 @@ export class TeamService {
|
||||
updatedBy: userId || '',
|
||||
};
|
||||
|
||||
const useCase = new UpdateTeamUseCase(this.teamRepository, this.membershipRepository);
|
||||
const result = await useCase.execute(command);
|
||||
const result = await this.updateTeamUseCase.execute(command);
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error updating team ${teamId}: ${result.error?.details?.message || 'Unknown error'}`);
|
||||
this.logger.error(`Error updating team ${teamId}: ${result.unwrapErr().details?.message || 'Unknown error'}`);
|
||||
return { success: false };
|
||||
}
|
||||
|
||||
@@ -253,14 +224,13 @@ export class TeamService {
|
||||
async getDriverTeam(driverId: string): Promise<GetDriverTeamOutputDTO | null> {
|
||||
this.logger.debug(`[TeamService] Fetching team for driverId: ${driverId}`);
|
||||
|
||||
const useCase = new GetDriverTeamUseCase(this.teamRepository, this.membershipRepository, this.logger);
|
||||
const result = await useCase.execute({ driverId });
|
||||
const result = await this.getDriverTeamUseCase.execute({ driverId });
|
||||
if (result.isErr()) {
|
||||
this.logger.error(`Error fetching team for driverId: ${driverId}: ${result.error?.details?.message || 'Unknown error'}`);
|
||||
this.logger.error(`Error fetching team for driverId: ${driverId}: ${result.unwrapErr().details?.message || 'Unknown error'}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
const value = result.value;
|
||||
const value = result.unwrap();
|
||||
if (!value || !value.team) {
|
||||
return null;
|
||||
}
|
||||
@@ -290,18 +260,13 @@ export class TeamService {
|
||||
async getMembership(teamId: string, driverId: string): Promise<GetTeamMembershipOutputDTO | null> {
|
||||
this.logger.debug(`[TeamService] Fetching team membership for teamId: ${teamId}, driverId: ${driverId}`);
|
||||
|
||||
const useCase = new GetTeamMembershipUseCase(this.membershipRepository, this.logger);
|
||||
const result = await useCase.execute({ teamId, 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?.details?.message || 'Unknown error'}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
const value = result.value;
|
||||
if (!value) {
|
||||
this.logger.error(`Error fetching team membership for teamId: ${teamId}, driverId: ${driverId}: ${result.unwrapErr().details?.message || 'Unknown error'}`);
|
||||
return null;
|
||||
}
|
||||
|
||||
const value = result.unwrap();
|
||||
return value.membership ? {
|
||||
role: value.membership.role,
|
||||
joinedAt: value.membership.joinedAt,
|
||||
@@ -316,10 +281,9 @@ export class TeamService {
|
||||
throw new Error('User ID is required');
|
||||
}
|
||||
|
||||
const useCase = new JoinTeamUseCase(this.teamRepository, this.membershipRepository, this.logger);
|
||||
const result = await useCase.execute({ teamId, driverId: userId });
|
||||
const result = await this.joinTeamUseCase.execute({ teamId, driverId: userId });
|
||||
if (result.isErr()) {
|
||||
const error = result.error;
|
||||
const error = result.unwrapErr();
|
||||
this.logger.error(`Error joining team ${teamId}: ${error?.details?.message || 'Unknown error'}`);
|
||||
return { success: false, error: error?.details?.message || 'Unknown error' };
|
||||
}
|
||||
|
||||
@@ -6,4 +6,14 @@ export const LOGGER_TOKEN = 'Logger';
|
||||
export const TEAM_STATS_REPOSITORY_TOKEN = 'ITeamStatsRepository';
|
||||
export const MEDIA_REPOSITORY_TOKEN = 'IMediaRepository';
|
||||
export const MEDIA_RESOLVER_TOKEN = 'MediaResolverPort';
|
||||
export const RESULT_REPOSITORY_TOKEN = 'IResultRepository';
|
||||
export const RESULT_REPOSITORY_TOKEN = 'IResultRepository';
|
||||
|
||||
export const GET_ALL_TEAMS_USE_CASE_TOKEN = Symbol('GET_ALL_TEAMS_USE_CASE_TOKEN');
|
||||
export const GET_TEAM_DETAILS_USE_CASE_TOKEN = Symbol('GET_TEAM_DETAILS_USE_CASE_TOKEN');
|
||||
export const GET_TEAM_MEMBERS_USE_CASE_TOKEN = Symbol('GET_TEAM_MEMBERS_USE_CASE_TOKEN');
|
||||
export const GET_TEAM_JOIN_REQUESTS_USE_CASE_TOKEN = Symbol('GET_TEAM_JOIN_REQUESTS_USE_CASE_TOKEN');
|
||||
export const CREATE_TEAM_USE_CASE_TOKEN = Symbol('CREATE_TEAM_USE_CASE_TOKEN');
|
||||
export const UPDATE_TEAM_USE_CASE_TOKEN = Symbol('UPDATE_TEAM_USE_CASE_TOKEN');
|
||||
export const GET_DRIVER_TEAM_USE_CASE_TOKEN = Symbol('GET_DRIVER_TEAM_USE_CASE_TOKEN');
|
||||
export const GET_TEAM_MEMBERSHIP_USE_CASE_TOKEN = Symbol('GET_TEAM_MEMBERSHIP_USE_CASE_TOKEN');
|
||||
export const JOIN_TEAM_USE_CASE_TOKEN = Symbol('JOIN_TEAM_USE_CASE_TOKEN');
|
||||
@@ -12,7 +12,7 @@ describe('CreateTeamPresenter', () => {
|
||||
const result = {
|
||||
team: {
|
||||
id: 'team-123',
|
||||
} as any,
|
||||
} as never,
|
||||
};
|
||||
|
||||
presenter.present(result);
|
||||
@@ -27,7 +27,7 @@ describe('CreateTeamPresenter', () => {
|
||||
const result = {
|
||||
team: {
|
||||
id: 'team-456',
|
||||
} as any,
|
||||
} as never,
|
||||
};
|
||||
|
||||
presenter.present(result);
|
||||
@@ -41,7 +41,7 @@ describe('CreateTeamPresenter', () => {
|
||||
|
||||
describe('reset', () => {
|
||||
it('should clear the model', () => {
|
||||
presenter.present({ team: { id: 'team-123' } } as any);
|
||||
presenter.present({ team: { id: 'team-123' } } as never);
|
||||
expect(presenter.responseModel).toBeDefined();
|
||||
|
||||
presenter.reset();
|
||||
@@ -55,7 +55,7 @@ describe('CreateTeamPresenter', () => {
|
||||
});
|
||||
|
||||
it('should return model after present()', () => {
|
||||
presenter.present({ team: { id: 'team-123' } } as any);
|
||||
presenter.present({ team: { id: 'team-123' } } as never);
|
||||
expect(presenter.getResponseModel()).toEqual({
|
||||
id: 'team-123',
|
||||
success: true,
|
||||
@@ -69,7 +69,7 @@ describe('CreateTeamPresenter', () => {
|
||||
});
|
||||
|
||||
it('should return model after present()', () => {
|
||||
presenter.present({ team: { id: 'team-123' } } as any);
|
||||
presenter.present({ team: { id: 'team-123' } } as never);
|
||||
expect(presenter.responseModel).toEqual({
|
||||
id: 'team-123',
|
||||
success: true,
|
||||
|
||||
@@ -13,19 +13,19 @@ describe('DriverTeamPresenter', () => {
|
||||
driverId: 'driver-123',
|
||||
team: {
|
||||
id: 'team-456',
|
||||
name: { toString: () => 'Team Alpha' } as any,
|
||||
tag: { toString: () => 'TA' } as any,
|
||||
description: { toString: () => 'Best team' } as any,
|
||||
ownerId: { toString: () => 'driver-123' } as any,
|
||||
leagues: [{ toString: () => 'league-1' } as any],
|
||||
name: { toString: () => 'Team Alpha' } as never,
|
||||
tag: { toString: () => 'TA' } as never,
|
||||
description: { toString: () => 'Best team' } as never,
|
||||
ownerId: { toString: () => 'driver-123' } as never,
|
||||
leagues: [{ toString: () => 'league-1' } as never],
|
||||
isRecruiting: true,
|
||||
createdAt: { toDate: () => new Date('2024-01-01') } as any,
|
||||
} as any,
|
||||
createdAt: { toDate: () => new Date('2024-01-01') } as never,
|
||||
} as never,
|
||||
membership: {
|
||||
role: 'owner' as const,
|
||||
joinedAt: new Date('2024-01-01'),
|
||||
status: 'active' as const,
|
||||
} as any,
|
||||
} as never,
|
||||
};
|
||||
|
||||
presenter.present(result);
|
||||
@@ -57,19 +57,19 @@ describe('DriverTeamPresenter', () => {
|
||||
driverId: 'driver-456',
|
||||
team: {
|
||||
id: 'team-789',
|
||||
name: { toString: () => 'Team Beta' } as any,
|
||||
tag: { toString: () => 'TB' } as any,
|
||||
description: { toString: () => '' } as any,
|
||||
ownerId: { toString: () => 'driver-123' } as any,
|
||||
leagues: [] as any[],
|
||||
name: { toString: () => 'Team Beta' } as never,
|
||||
tag: { toString: () => 'TB' } as never,
|
||||
description: { toString: () => '' } as never,
|
||||
ownerId: { toString: () => 'driver-123' } as never,
|
||||
leagues: [] as never[],
|
||||
isRecruiting: false,
|
||||
createdAt: { toDate: () => new Date('2024-01-02') } as any,
|
||||
} as any,
|
||||
createdAt: { toDate: () => new Date('2024-01-02') } as never,
|
||||
} as never,
|
||||
membership: {
|
||||
role: 'manager' as const,
|
||||
joinedAt: new Date('2024-01-02'),
|
||||
status: 'active' as const,
|
||||
} as any,
|
||||
} as never,
|
||||
};
|
||||
|
||||
presenter.present(result);
|
||||
@@ -85,19 +85,19 @@ describe('DriverTeamPresenter', () => {
|
||||
driverId: 'driver-789',
|
||||
team: {
|
||||
id: 'team-abc',
|
||||
name: { toString: () => 'Team Gamma' } as any,
|
||||
tag: { toString: () => 'TG' } as any,
|
||||
description: { toString: () => 'Test team' } as any,
|
||||
ownerId: { toString: () => 'driver-123' } as any,
|
||||
leagues: [{ toString: () => 'league-2' } as any],
|
||||
name: { toString: () => 'Team Gamma' } as never,
|
||||
tag: { toString: () => 'TG' } as never,
|
||||
description: { toString: () => 'Test team' } as never,
|
||||
ownerId: { toString: () => 'driver-123' } as never,
|
||||
leagues: [{ toString: () => 'league-2' } as never],
|
||||
isRecruiting: false,
|
||||
createdAt: { toDate: () => new Date('2024-01-03') } as any,
|
||||
} as any,
|
||||
createdAt: { toDate: () => new Date('2024-01-03') } as never,
|
||||
} as never,
|
||||
membership: {
|
||||
role: 'driver' as const,
|
||||
joinedAt: new Date('2024-01-03'),
|
||||
status: 'active' as const,
|
||||
} as any,
|
||||
} as never,
|
||||
};
|
||||
|
||||
presenter.present(result);
|
||||
@@ -113,19 +113,19 @@ describe('DriverTeamPresenter', () => {
|
||||
driverId: 'driver-123',
|
||||
team: {
|
||||
id: 'team-456',
|
||||
name: { toString: () => 'Team' } as any,
|
||||
tag: { toString: () => 'T' } as any,
|
||||
description: { toString: () => '' } as any,
|
||||
ownerId: { toString: () => 'driver-123' } as any,
|
||||
leagues: [] as any[],
|
||||
name: { toString: () => 'Team' } as never,
|
||||
tag: { toString: () => 'T' } as never,
|
||||
description: { toString: () => '' } as never,
|
||||
ownerId: { toString: () => 'driver-123' } as never,
|
||||
leagues: [] as never[],
|
||||
isRecruiting: false,
|
||||
createdAt: { toDate: () => new Date('2024-01-01') } as any,
|
||||
} as any,
|
||||
createdAt: { toDate: () => new Date('2024-01-01') } as never,
|
||||
} as never,
|
||||
membership: {
|
||||
role: 'owner' as const,
|
||||
joinedAt: new Date('2024-01-01'),
|
||||
status: 'active' as const,
|
||||
} as any,
|
||||
} as never,
|
||||
};
|
||||
|
||||
presenter.present(result);
|
||||
@@ -139,19 +139,19 @@ describe('DriverTeamPresenter', () => {
|
||||
driverId: 'driver-123',
|
||||
team: {
|
||||
id: 'team-456',
|
||||
name: { toString: () => 'Team' } as any,
|
||||
tag: { toString: () => 'T' } as any,
|
||||
description: { toString: () => 'Test' } as any,
|
||||
ownerId: { toString: () => 'driver-123' } as any,
|
||||
leagues: [] as any[],
|
||||
name: { toString: () => 'Team' } as never,
|
||||
tag: { toString: () => 'T' } as never,
|
||||
description: { toString: () => 'Test' } as never,
|
||||
ownerId: { toString: () => 'driver-123' } as never,
|
||||
leagues: [] as never[],
|
||||
isRecruiting: false,
|
||||
createdAt: { toDate: () => new Date('2024-01-01') } as any,
|
||||
} as any,
|
||||
createdAt: { toDate: () => new Date('2024-01-01') } as never,
|
||||
} as never,
|
||||
membership: {
|
||||
role: 'owner' as const,
|
||||
joinedAt: new Date('2024-01-01'),
|
||||
status: 'active' as const,
|
||||
} as any,
|
||||
} as never,
|
||||
};
|
||||
|
||||
presenter.present(result);
|
||||
@@ -167,19 +167,19 @@ describe('DriverTeamPresenter', () => {
|
||||
driverId: 'driver-123',
|
||||
team: {
|
||||
id: 'team-456',
|
||||
name: { toString: () => 'Team' } as any,
|
||||
tag: { toString: () => 'T' } as any,
|
||||
description: { toString: () => '' } as any,
|
||||
ownerId: { toString: () => 'driver-123' } as any,
|
||||
leagues: [] as any[],
|
||||
name: { toString: () => 'Team' } as never,
|
||||
tag: { toString: () => 'T' } as never,
|
||||
description: { toString: () => '' } as never,
|
||||
ownerId: { toString: () => 'driver-123' } as never,
|
||||
leagues: [] as never[],
|
||||
isRecruiting: false,
|
||||
createdAt: { toDate: () => new Date('2024-01-01') } as any,
|
||||
} as any,
|
||||
createdAt: { toDate: () => new Date('2024-01-01') } as never,
|
||||
} as never,
|
||||
membership: {
|
||||
role: 'owner' as const,
|
||||
joinedAt: new Date('2024-01-01'),
|
||||
status: 'active' as const,
|
||||
} as any,
|
||||
} as never,
|
||||
});
|
||||
expect(presenter.getResponseModel()).toBeDefined();
|
||||
|
||||
@@ -198,19 +198,19 @@ describe('DriverTeamPresenter', () => {
|
||||
driverId: 'driver-123',
|
||||
team: {
|
||||
id: 'team-456',
|
||||
name: { toString: () => 'Team' } as any,
|
||||
tag: { toString: () => 'T' } as any,
|
||||
description: { toString: () => '' } as any,
|
||||
ownerId: { toString: () => 'driver-123' } as any,
|
||||
leagues: [] as any[],
|
||||
name: { toString: () => 'Team' } as never,
|
||||
tag: { toString: () => 'T' } as never,
|
||||
description: { toString: () => '' } as never,
|
||||
ownerId: { toString: () => 'driver-123' } as never,
|
||||
leagues: [] as never[],
|
||||
isRecruiting: false,
|
||||
createdAt: { toDate: () => new Date('2024-01-01') } as any,
|
||||
} as any,
|
||||
createdAt: { toDate: () => new Date('2024-01-01') } as never,
|
||||
} as never,
|
||||
membership: {
|
||||
role: 'owner' as const,
|
||||
joinedAt: new Date('2024-01-01'),
|
||||
status: 'active' as const,
|
||||
} as any,
|
||||
} as never,
|
||||
});
|
||||
expect(presenter.getResponseModel()).not.toBeNull();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user