xpeditis2.0/apps/backend/src/domain/services/availability-validation.service.ts
David 3fc1091d31
Some checks failed
CI/CD Pipeline - Xpeditis PreProd / Deploy to PreProd Server (push) Blocked by required conditions
CI/CD Pipeline - Xpeditis PreProd / Run Smoke Tests (push) Blocked by required conditions
CI/CD Pipeline - Xpeditis PreProd / Backend - Build & Test (push) Failing after 5m59s
CI/CD Pipeline - Xpeditis PreProd / Backend - Docker Build & Push (push) Has been skipped
CI/CD Pipeline - Xpeditis PreProd / Frontend - Build & Test (push) Successful in 11m1s
CI/CD Pipeline - Xpeditis PreProd / Frontend - Docker Build & Push (push) Has been cancelled
fix: replace relative domain imports with TypeScript path aliases
- Replace all ../../domain/ imports with @domain/ across 67 files
- Configure NestJS to use tsconfig.build.json with rootDir
- Add tsc-alias to resolve path aliases after build
- This fixes 'Cannot find module' TypeScript compilation errors

Fixed files:
- 30 files in application layer
- 37 files in infrastructure layer
2025-11-16 19:31:37 +01:00

49 lines
1.5 KiB
TypeScript

/**
* AvailabilityValidationService
*
* Domain service for validating container availability
*
* Business Rules:
* - Check if rate quote is still valid (not expired)
* - Verify requested quantity is available
*/
import {
ValidateAvailabilityPort,
AvailabilityInput,
AvailabilityOutput,
} from '@domain/ports/in/validate-availability.port';
import { RateQuoteRepository } from '@domain/ports/out/rate-quote.repository';
import { InvalidRateQuoteException } from '../exceptions/invalid-rate-quote.exception';
import { RateQuoteExpiredException } from '../exceptions/rate-quote-expired.exception';
export class AvailabilityValidationService implements ValidateAvailabilityPort {
constructor(private readonly rateQuoteRepository: RateQuoteRepository) {}
async execute(input: AvailabilityInput): Promise<AvailabilityOutput> {
// Find rate quote
const rateQuote = await this.rateQuoteRepository.findById(input.rateQuoteId);
if (!rateQuote) {
throw new InvalidRateQuoteException(`Rate quote not found: ${input.rateQuoteId}`);
}
// Check if rate quote has expired
if (rateQuote.isExpired()) {
throw new RateQuoteExpiredException(rateQuote.id, rateQuote.validUntil);
}
// Check availability
const availableQuantity = rateQuote.availability;
const isAvailable = availableQuantity >= input.quantity;
return {
isAvailable,
availableQuantity,
requestedQuantity: input.quantity,
rateQuoteId: rateQuote.id,
validUntil: rateQuote.validUntil,
};
}
}