Skip to content

Commit 26c8aac

Browse files
committed
ticket all tests pass
1 parent 704c606 commit 26c8aac

26 files changed

+2802
-156
lines changed

src/app.module.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { APP_FILTER, APP_INTERCEPTOR } from '@nestjs/core';
88
import { HttpExceptionFilter } from './common/filters/http-exception.filter';
99
import { LoggingInterceptor } from './common/filters/logging.interceptor';
1010
import { TimeoutInterceptor } from './common/filters/timeout.interceptor';
11+
import { MovieModule } from './modules/movie/movie.module';
12+
import { TicketModule } from './modules/ticket/ticket.module';
1113

1214
@Module({
1315
imports: [
@@ -40,8 +42,8 @@ import { TimeoutInterceptor } from './common/filters/timeout.interceptor';
4042

4143
// Domain modules
4244
AuthModule,
43-
// MovieModule,
44-
// TicketModule,
45+
MovieModule,
46+
TicketModule
4547

4648
],
4749
controllers: [AppController],

src/modules/movie/adapters/secondary/persistence/typeorm-movie.repository.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export class TypeormMovieRepository implements IMovieRepository {
2121
async save(movie: Movie): Promise<Movie> {
2222
const movieEntity = this.movieMapper.toPersistence(movie);
2323
const savedMovie = await this.movieRepository.save(movieEntity);
24-
const domainMovie = this.movieMapper.toDomain(movieEntity);
24+
const domainMovie = this.movieMapper.toDomain(savedMovie);
2525

2626
if (!domainMovie) {
2727
throw new Error('Failed to map saved Entity back to domain model');

src/modules/movie/application/services/movie.service.ts

+25-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ConflictException, Injectable, NotFoundException } from "@nestjs/common";
1+
import { BadRequestException, ConflictException, Injectable, NotFoundException } from "@nestjs/common";
22
import { IMovieRepository } from "../ports/movie-repository.interface";
33
import { CreateMovieCommand } from "../commands/create-movie.command";
44
import { Movie } from "../../domain/models/movie.entity";
@@ -108,4 +108,28 @@ export class MovieService {
108108
async getAllMovies(filter?: Record<string, any>): Promise<Movie[]> {
109109
return await this.movieRepository.findAll(filter);
110110
}
111+
112+
// Method for use in Ticket module
113+
async bookSessionSeats(movieId: string, sessionId: string, numberOfSeats: number, userAge: number) {
114+
const movie = await this.movieRepository.findById(movieId);
115+
if (!movie) {
116+
throw new NotFoundException(`Movie with ID ${movieId} not found`);
117+
}
118+
119+
if (!movie.isAllowedForAge(userAge)) {
120+
throw new BadRequestException('User does not meet age requirement');
121+
}
122+
123+
const session = movie.getSession(sessionId);
124+
if (!session) {
125+
throw new NotFoundException(`Session ${sessionId} not found`);
126+
}
127+
128+
if (!session.hasAvailableSeats(numberOfSeats)) {
129+
throw new BadRequestException('Not enough available seats');
130+
}
131+
132+
session.bookSeats(numberOfSeats);
133+
await this.movieRepository.save(movie);
134+
}
111135
}

0 commit comments

Comments
 (0)