fix(api,ci): remove type-only imports for DI and isolate CI ports from dev
- Remove `type` keyword from NestJS injectable class imports across all modules to fix runtime DI resolution (330+ handler/listener files) - Offset CI docker-compose ports (5433/6380/8109/9002) to avoid conflicts with running dev containers - Update .env.test, playwright.config.ts, and e2e workflow to use isolated CI ports with configurable overrides - Fix prisma/seed.ts to use deterministic IDs for Prisma 7 upsert compatibility (phoneHash replaced phone as unique index) - Add dedicated Docker bridge network for CI service containers Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,7 +5,7 @@ import { createId } from '@paralleldrive/cuid2';
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-imports -- NestJS DI requires value imports for emitDecoratorMetadata
|
||||
import { ConflictException, DomainException, ValidationException, LoggerService } from '@modules/shared';
|
||||
import { ReviewEntity } from '../../../domain/entities/review.entity';
|
||||
import { REVIEW_REPOSITORY, type IReviewRepository } from '../../../domain/repositories/review.repository';
|
||||
import { REVIEW_REPOSITORY, IReviewRepository } from '../../../domain/repositories/review.repository';
|
||||
import { Rating } from '../../../domain/value-objects/rating.vo';
|
||||
import { CreateReviewCommand } from './create-review.command';
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ import { Inject, InternalServerErrorException } from '@nestjs/common';
|
||||
import { CommandHandler, EventBus, ICommandHandler } from '@nestjs/cqrs';
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-imports -- NestJS DI requires value imports for emitDecoratorMetadata
|
||||
import { DomainException, ForbiddenException, NotFoundException, LoggerService } from '@modules/shared';
|
||||
import { REVIEW_REPOSITORY, type IReviewRepository } from '../../../domain/repositories/review.repository';
|
||||
import { REVIEW_REPOSITORY, IReviewRepository } from '../../../domain/repositories/review.repository';
|
||||
import { DeleteReviewCommand } from './delete-review.command';
|
||||
|
||||
@CommandHandler(DeleteReviewCommand)
|
||||
|
||||
@@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common';
|
||||
import { OnEvent } from '@nestjs/event-emitter';
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-imports -- NestJS DI requires value imports for emitDecoratorMetadata
|
||||
import { LoggerService, PrismaService } from '@modules/shared';
|
||||
import { type ReviewDeletedEvent } from '../../domain/events/review-deleted.event';
|
||||
import { ReviewDeletedEvent } from '../../domain/events/review-deleted.event';
|
||||
|
||||
@Injectable()
|
||||
export class ReviewDeletedListener {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Inject, InternalServerErrorException } from '@nestjs/common';
|
||||
import { type IQueryHandler, QueryHandler } from '@nestjs/cqrs';
|
||||
import { DomainException, type LoggerService } from '@modules/shared';
|
||||
import { type ReviewStatsData } from '../../../domain/repositories/review-read.dto';
|
||||
import { REVIEW_REPOSITORY, type IReviewRepository } from '../../../domain/repositories/review.repository';
|
||||
import { IQueryHandler, QueryHandler } from '@nestjs/cqrs';
|
||||
import { DomainException, LoggerService } from '@modules/shared';
|
||||
import { ReviewStatsData } from '../../../domain/repositories/review-read.dto';
|
||||
import { REVIEW_REPOSITORY, IReviewRepository } from '../../../domain/repositories/review.repository';
|
||||
import { GetAverageRatingQuery } from './get-average-rating.query';
|
||||
|
||||
@QueryHandler(GetAverageRatingQuery)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Inject, InternalServerErrorException } from '@nestjs/common';
|
||||
import { type IQueryHandler, QueryHandler } from '@nestjs/cqrs';
|
||||
import { DomainException, type LoggerService } from '@modules/shared';
|
||||
import { type ReviewItemData } from '../../../domain/repositories/review-read.dto';
|
||||
import { REVIEW_REPOSITORY, type IReviewRepository, type PaginatedResult } from '../../../domain/repositories/review.repository';
|
||||
import { IQueryHandler, QueryHandler } from '@nestjs/cqrs';
|
||||
import { DomainException, LoggerService } from '@modules/shared';
|
||||
import { ReviewItemData } from '../../../domain/repositories/review-read.dto';
|
||||
import { REVIEW_REPOSITORY, IReviewRepository, PaginatedResult } from '../../../domain/repositories/review.repository';
|
||||
import { GetReviewsByTargetQuery } from './get-reviews-by-target.query';
|
||||
|
||||
@QueryHandler(GetReviewsByTargetQuery)
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Inject, InternalServerErrorException } from '@nestjs/common';
|
||||
import { type IQueryHandler, QueryHandler } from '@nestjs/cqrs';
|
||||
import { DomainException, type LoggerService } from '@modules/shared';
|
||||
import { type ReviewItemData } from '../../../domain/repositories/review-read.dto';
|
||||
import { REVIEW_REPOSITORY, type IReviewRepository, type PaginatedResult } from '../../../domain/repositories/review.repository';
|
||||
import { IQueryHandler, QueryHandler } from '@nestjs/cqrs';
|
||||
import { DomainException, LoggerService } from '@modules/shared';
|
||||
import { ReviewItemData } from '../../../domain/repositories/review-read.dto';
|
||||
import { REVIEW_REPOSITORY, IReviewRepository, PaginatedResult } from '../../../domain/repositories/review.repository';
|
||||
import { GetReviewsByUserQuery } from './get-reviews-by-user.query';
|
||||
|
||||
@QueryHandler(GetReviewsByUserQuery)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { AggregateRoot } from '@modules/shared';
|
||||
import { ReviewCreatedEvent } from '../events/review-created.event';
|
||||
import { ReviewDeletedEvent } from '../events/review-deleted.event';
|
||||
import { type Rating } from '../value-objects/rating.vo';
|
||||
import { Rating } from '../value-objects/rating.vo';
|
||||
|
||||
export interface ReviewProps {
|
||||
userId: string;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { type DomainEvent } from '@modules/shared';
|
||||
import { DomainEvent } from '@modules/shared';
|
||||
|
||||
export class ReviewCreatedEvent implements DomainEvent {
|
||||
readonly eventName = 'review.created';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { type DomainEvent } from '@modules/shared';
|
||||
import { DomainEvent } from '@modules/shared';
|
||||
|
||||
export class ReviewDeletedEvent implements DomainEvent {
|
||||
readonly eventName = 'review.deleted';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
export {
|
||||
REVIEW_REPOSITORY,
|
||||
type IReviewRepository,
|
||||
IReviewRepository,
|
||||
type PaginatedResult,
|
||||
} from './review.repository';
|
||||
export { type ReviewItemData, type ReviewStatsData } from './review-read.dto';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { type ReviewEntity } from '../entities/review.entity';
|
||||
import { type ReviewItemData, type ReviewStatsData } from './review-read.dto';
|
||||
import { ReviewEntity } from '../entities/review.entity';
|
||||
import { ReviewItemData, ReviewStatsData } from './review-read.dto';
|
||||
|
||||
export const REVIEW_REPOSITORY = Symbol('REVIEW_REPOSITORY');
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ export { ReviewCreatedEvent } from './domain/events/review-created.event';
|
||||
export { ReviewDeletedEvent } from './domain/events/review-deleted.event';
|
||||
export {
|
||||
REVIEW_REPOSITORY,
|
||||
type IReviewRepository,
|
||||
IReviewRepository,
|
||||
type PaginatedResult,
|
||||
} from './domain/repositories/review.repository';
|
||||
export { type ReviewItemData, type ReviewStatsData } from './domain/repositories/review-read.dto';
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { type Review as PrismaReview } from '@prisma/client';
|
||||
import { Review as PrismaReview } from '@prisma/client';
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-imports -- NestJS DI requires value imports for emitDecoratorMetadata
|
||||
import { PrismaService } from '@modules/shared';
|
||||
import { ReviewEntity } from '../../domain/entities/review.entity';
|
||||
import { type ReviewItemData, type ReviewStatsData } from '../../domain/repositories/review-read.dto';
|
||||
import { type IReviewRepository, type PaginatedResult } from '../../domain/repositories/review.repository';
|
||||
import { ReviewItemData, ReviewStatsData } from '../../domain/repositories/review-read.dto';
|
||||
import { IReviewRepository, PaginatedResult } from '../../domain/repositories/review.repository';
|
||||
import { Rating } from '../../domain/value-objects/rating.vo';
|
||||
|
||||
@Injectable()
|
||||
|
||||
@@ -17,17 +17,17 @@ import {
|
||||
ApiBearerAuth,
|
||||
ApiParam,
|
||||
} from '@nestjs/swagger';
|
||||
import { type JwtPayload, CurrentUser, JwtAuthGuard } from '@modules/auth';
|
||||
import { JwtPayload, CurrentUser, JwtAuthGuard } from '@modules/auth';
|
||||
import { CreateReviewCommand } from '../../application/commands/create-review/create-review.command';
|
||||
import { type CreateReviewResult } from '../../application/commands/create-review/create-review.handler';
|
||||
import { CreateReviewResult } from '../../application/commands/create-review/create-review.handler';
|
||||
import { DeleteReviewCommand } from '../../application/commands/delete-review/delete-review.command';
|
||||
import { GetAverageRatingQuery } from '../../application/queries/get-average-rating/get-average-rating.query';
|
||||
import { GetReviewsByTargetQuery } from '../../application/queries/get-reviews-by-target/get-reviews-by-target.query';
|
||||
import { GetReviewsByUserQuery } from '../../application/queries/get-reviews-by-user/get-reviews-by-user.query';
|
||||
import { type ReviewItemData, type ReviewStatsData } from '../../domain/repositories/review-read.dto';
|
||||
import { type PaginatedResult } from '../../domain/repositories/review.repository';
|
||||
import { type CreateReviewDto } from '../dto/create-review.dto';
|
||||
import { type ListReviewsByTargetDto, type ReviewStatsDto } from '../dto/list-reviews.dto';
|
||||
import { ReviewItemData, ReviewStatsData } from '../../domain/repositories/review-read.dto';
|
||||
import { PaginatedResult } from '../../domain/repositories/review.repository';
|
||||
import { CreateReviewDto } from '../dto/create-review.dto';
|
||||
import { ListReviewsByTargetDto, ReviewStatsDto } from '../dto/list-reviews.dto';
|
||||
|
||||
@ApiTags('reviews')
|
||||
@Controller('reviews')
|
||||
|
||||
Reference in New Issue
Block a user