diff --git a/build.gradle b/build.gradle index 3d7f7607..f34a107e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.3.1' - id 'io.spring.dependency-management' version '1.1.5' + id 'org.springframework.boot' version '3.4.1' + id 'io.spring.dependency-management' version '1.1.7' } group = 'com.booleanuk' @@ -13,6 +13,12 @@ java { } } +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + repositories { mavenCentral() } @@ -20,12 +26,15 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' +// compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' - runtimeOnly 'org.postgresql:postgresql' +// runtimeOnly 'org.postgresql:postgresql' + implementation 'org.postgresql:postgresql:42.7.4' +// annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() -} \ No newline at end of file +} diff --git a/src/main/java/com/booleanuk/api/cinema/Main.java b/src/main/java/com/booleanuk/api/cinema/Main.java new file mode 100644 index 00000000..c4fb60ea --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Main.java @@ -0,0 +1,11 @@ +package com.booleanuk.api.cinema; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Main { + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/controller/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/controller/CustomerController.java new file mode 100644 index 00000000..1360c353 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/controller/CustomerController.java @@ -0,0 +1,119 @@ +package com.booleanuk.api.cinema.controller; + +import com.booleanuk.api.cinema.model.Customer; +import com.booleanuk.api.cinema.model.Screening; +import com.booleanuk.api.cinema.model.Ticket; +import com.booleanuk.api.cinema.repository.CustomerRepository; +import com.booleanuk.api.cinema.repository.ScreeningRepository; +import com.booleanuk.api.cinema.repository.TicketRepository; +import com.booleanuk.api.cinema.responses.ErrorResponse; +import com.booleanuk.api.cinema.responses.Response; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.time.LocalDateTime; +import java.util.List; + +@RestController +@RequestMapping("/customers") +public class CustomerController { + private CustomerRepository customerRepository; + private TicketRepository ticketRepository; + private ScreeningRepository screeningRepository; + + public CustomerController(CustomerRepository customerRepository, TicketRepository ticketRepository, ScreeningRepository screeningRepository) { + this.customerRepository = customerRepository; + this.ticketRepository = ticketRepository; + this.screeningRepository = screeningRepository; + } + + @PostMapping + public ResponseEntity> create(@RequestBody Customer customer) { + Customer addedCustomer = customerRepository.save(customer); + if (addedCustomer == null) { + return new ResponseEntity<>(new ErrorResponse("bad request"), HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(new Response<>("success", addedCustomer), HttpStatus.CREATED); + } + + @GetMapping("/{id}") + public ResponseEntity> getOne(@PathVariable int id) { +// return ResponseEntity.ok(customerRepository.findById(id).orElseThrow( +// () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No customer with that ID was found.") +// )); + Customer customer = customerRepository.findById(id).orElse(null); + if (customer == null) { + ErrorResponse error = new ErrorResponse("not found"); + return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); + } + Response response = new Response<>(); + response.set(customer); + return ResponseEntity.ok(response); + } + + @GetMapping + public ResponseEntity> getAll() { + return ResponseEntity.ok(new Response<>("success", customerRepository.findAll())); + + } + + @PutMapping("/{id}") + public ResponseEntity> update(@PathVariable int id, @RequestBody Customer customer) { + Customer customerToUpdate = customerRepository.findById(id).orElse(null); + if (customerToUpdate == null) { + return new ResponseEntity<>(new ErrorResponse("not found"), HttpStatus.NOT_FOUND); + } + if (customer.getName() != null) + customerToUpdate.setName(customer.getName()); + if (customer.getEmail() != null) + customerToUpdate.setEmail(customer.getEmail()); + if (customer.getPhone() != null) + customerToUpdate.setPhone(customer.getPhone()); + customerToUpdate.setUpdatedAt(LocalDateTime.now()); + // todo error 400 + return new ResponseEntity<>(new Response<>(customerRepository.save(customerToUpdate)), HttpStatus.CREATED); + } + + @DeleteMapping("/{id}") + public ResponseEntity> deleteCustomer(@PathVariable int id) { + Customer customer = customerRepository.findById(id).orElse(null); + if (customer == null) { + return new ResponseEntity<>(new ErrorResponse("not found"), HttpStatus.NOT_FOUND); + } + + customerRepository.deleteById(id); + return ResponseEntity.ok(new Response<>("success", customer)); + } + + @PostMapping("/{c_id}/screenings/{s_id}") + public ResponseEntity> bookTicket(@PathVariable(name = "c_id") int customerId, @PathVariable(name = "s_id") int screeningId, @RequestBody Ticket ticket) { + Customer customer = customerRepository.findById(customerId).orElse(null); + Screening screening = screeningRepository.findById(screeningId).orElse(null); + + if (customer == null || screening == null) { + return new ResponseEntity<>(new ErrorResponse("not found"), HttpStatus.NOT_FOUND); + } + + ticket.setCustomer(customer); + ticket.setScreening(screening); + ticket.setCreatedAt(LocalDateTime.now()); + ticket.setUpdatedAt(LocalDateTime.now()); + return new ResponseEntity<>(new Response<>("success", ticketRepository.save(ticket)), HttpStatus.CREATED); + } + + @GetMapping("/{c_id}/screenings/{s_id}") + public ResponseEntity> getAllTickets(@PathVariable(name = "c_id") int customerId, @PathVariable(name = "s_id") int screeningId) { + Customer customer = customerRepository.findById(customerId).orElse(null); + Screening screening = screeningRepository.findById(screeningId).orElse(null); + + if (customer == null || screening == null) { + return new ResponseEntity<>(new ErrorResponse("not found"), HttpStatus.NOT_FOUND); + } + + return new ResponseEntity<>(new Response<>("success", ticketRepository.findAll().stream().filter( + t -> t.getCustomerId() == customer.getId() && t.getScreeningId() == screening.getId() + ).toList()), HttpStatus.OK); + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/controller/MovieController.java b/src/main/java/com/booleanuk/api/cinema/controller/MovieController.java new file mode 100644 index 00000000..0dc544bb --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/controller/MovieController.java @@ -0,0 +1,118 @@ +package com.booleanuk.api.cinema.controller; + +import com.booleanuk.api.cinema.model.Movie; +import com.booleanuk.api.cinema.model.Screening; +import com.booleanuk.api.cinema.repository.MovieRepository; +import com.booleanuk.api.cinema.repository.ScreeningRepository; +import com.booleanuk.api.cinema.responses.ErrorResponse; +import com.booleanuk.api.cinema.responses.Response; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; +import java.util.List; + +@RestController +@RequestMapping("/movies") +public class MovieController { + private MovieRepository movieRepository; + private ScreeningRepository screeningRepository; + + public MovieController(MovieRepository movieRepository, ScreeningRepository screeningRepository) { + this.movieRepository = movieRepository; + this.screeningRepository = screeningRepository; + } + + private record MovieWithScreenings(String title, String rating, String description, int runtimeMins, List screenings) {}; + + @PostMapping + public ResponseEntity> createMovie(@RequestBody MovieWithScreenings movieWithScreenings) { + Movie movie = new Movie(movieWithScreenings.title, movieWithScreenings.rating, movieWithScreenings.description, movieWithScreenings.runtimeMins); + Movie createdMovie = movieRepository.save(movie); + if (createdMovie == null) { + return new ResponseEntity<>(new ErrorResponse("bad request"), HttpStatus.BAD_REQUEST); + } + if (movieWithScreenings.screenings != null) { + for (Screening s : movieWithScreenings.screenings) { + s.setMovie(createdMovie); + screeningRepository.save(s); + } + } + return new ResponseEntity<>(new Response<>("success", createdMovie), HttpStatus.CREATED); + } + + @GetMapping("/{id}") + public ResponseEntity> getOne(@PathVariable int id) { + Movie movie = movieRepository.findById(id).orElse(null); + if (movie == null) { + return new ResponseEntity<>(new ErrorResponse("not found"), HttpStatus.NOT_FOUND); + } + return new ResponseEntity<>(new Response<>("success", movie), HttpStatus.OK); + } + + @GetMapping + public ResponseEntity> getAll() { + return new ResponseEntity<>(new Response<>("success", movieRepository.findAll()), HttpStatus.OK); + } + + @PostMapping("{id}/screenings") + public ResponseEntity> createScreening(@PathVariable(name = "id") int movieId, @RequestBody Screening screening) { + Movie movie = movieRepository.findById(movieId).orElse(null); + if (movie == null) { + return new ResponseEntity<>(new ErrorResponse("not found"), HttpStatus.NOT_FOUND); + } + + screening.setMovie(movie); + screening.setCreatedAt(LocalDateTime.now()); + screening.setUpdatedAt(LocalDateTime.now()); + Screening createdScreening = screeningRepository.save(screening); + + if (createdScreening == null) { + return new ResponseEntity<>(new ErrorResponse("bad request"), HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(new Response<>("success", createdScreening), HttpStatus.CREATED); + } + + @GetMapping("/{id}/screenings") + public ResponseEntity> getAllScreenings(@PathVariable(name = "id") int movieId) { + Movie movie = movieRepository.findById(movieId).orElse(null); + if (movie == null) + return new ResponseEntity<>(new ErrorResponse("not found"), HttpStatus.NOT_FOUND); + + return new ResponseEntity<>(new Response<>("success", screeningRepository.findAll().stream().filter( + s -> s.getMovieId() == movie.getId()).toList()), HttpStatus.OK); + } + + @PutMapping("/{id}") + public ResponseEntity> updateMovie(@PathVariable int id, @RequestBody Movie movie) { + Movie movieToUpdate = movieRepository.findById(id).orElse(null); + if (movieToUpdate == null) { + return new ResponseEntity<>(new ErrorResponse("not found"), HttpStatus.NOT_FOUND); + } + + if (movie.getTitle() != null) + movieToUpdate.setTitle(movie.getTitle()); + if (movie.getRating() != null) + movieToUpdate.setRating(movie.getRating()); + if (movie.getDescription() != null) + movieToUpdate.setDescription(movie.getDescription()); + if (movie.getRuntimeMins() > 0) + movieToUpdate.setRuntimeMins(movie.getRuntimeMins()); + movieToUpdate.setUpdatedAt(LocalDateTime.now()); + + if (movieRepository.save(movieToUpdate) == null) { + return new ResponseEntity<>(new ErrorResponse("bad request"), HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(new Response<>("success", movieToUpdate), HttpStatus.CREATED); + } + + @DeleteMapping("/{id}") + public ResponseEntity> deleteMovie(@PathVariable int id) { + Movie movie = movieRepository.findById(id).orElse(null); + if (movie == null) + return new ResponseEntity<>(new ErrorResponse("not found"), HttpStatus.NOT_FOUND); + movieRepository.deleteById(id); + return ResponseEntity.ok(new Response<>("success", movie)); + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/controller/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/controller/ScreeningController.java new file mode 100644 index 00000000..7a33d7b8 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/controller/ScreeningController.java @@ -0,0 +1,30 @@ +package com.booleanuk.api.cinema.controller; + +import com.booleanuk.api.cinema.model.Screening; +import com.booleanuk.api.cinema.repository.MovieRepository; +import com.booleanuk.api.cinema.repository.ScreeningRepository; +import com.booleanuk.api.cinema.responses.ErrorResponse; +import com.booleanuk.api.cinema.responses.Response; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/screenings") +public class ScreeningController { + ScreeningRepository screeningRepository; + MovieRepository movieRepository; + + public ScreeningController(ScreeningRepository screeningRepository, MovieRepository movieRepository) { + this.screeningRepository = screeningRepository; + this.movieRepository = movieRepository; + } + + @GetMapping("/{id}") + public ResponseEntity> getOne(@PathVariable(name = "id") int id) { + Screening screening = screeningRepository.findById(id).orElse(null); + if (screening == null) + return new ResponseEntity<>(new ErrorResponse("not found"), HttpStatus.NOT_FOUND); + return ResponseEntity.ok(new Response<>("success", screening)); + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/controller/TicketController.java b/src/main/java/com/booleanuk/api/cinema/controller/TicketController.java new file mode 100644 index 00000000..94fa5786 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/controller/TicketController.java @@ -0,0 +1,33 @@ +package com.booleanuk.api.cinema.controller; + +import com.booleanuk.api.cinema.model.Ticket; +import com.booleanuk.api.cinema.repository.MovieRepository; +import com.booleanuk.api.cinema.repository.ScreeningRepository; +import com.booleanuk.api.cinema.repository.TicketRepository; +import com.booleanuk.api.cinema.responses.Response; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/tickets") +public class TicketController { + private TicketRepository ticketRepository; + private MovieRepository movieRepository; + private ScreeningRepository screeningRepository; + + public TicketController(TicketRepository ticketRepository, MovieRepository movieRepository, ScreeningRepository screeningRepository) { + this.ticketRepository = ticketRepository; + this.movieRepository = movieRepository; + this.screeningRepository = screeningRepository; + } + + @GetMapping + public ResponseEntity> getAll() { + return new ResponseEntity<>(new Response<>("success", ticketRepository.findAll()), HttpStatus.OK); + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/model/Customer.java b/src/main/java/com/booleanuk/api/cinema/model/Customer.java new file mode 100644 index 00000000..b3e96be2 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/model/Customer.java @@ -0,0 +1,113 @@ +package com.booleanuk.api.cinema.model; + +import jakarta.persistence.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name="customers") +public class Customer { + @Id + @GeneratedValue(strategy=GenerationType.IDENTITY) + private int id; + + @Column + private String name; + @Column private String email; + @Column private String phone; + @Column private LocalDateTime createdAt; + @Column private LocalDateTime updatedAt; + + public Customer(int id, String name, String email, String phone, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.id = id; + this.name = name; + this.email = email; + this.phone = phone; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public Customer(String name, String email, String phone, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.name = name; + this.email = email; + this.phone = phone; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public Customer(int id, String name, String email, String phone) { + this.id = id; + this.name = name; + this.email = email; + this.phone = phone; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public Customer(String name, String email, String phone) { + this.name = name; + this.email = email; + this.phone = phone; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public Customer(int id) { + this.id = id; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public Customer() { + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(LocalDateTime updatedAt) { + this.updatedAt = updatedAt; + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/model/Movie.java b/src/main/java/com/booleanuk/api/cinema/model/Movie.java new file mode 100644 index 00000000..e76b3fc3 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/model/Movie.java @@ -0,0 +1,125 @@ +package com.booleanuk.api.cinema.model; + +import jakarta.persistence.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name="movies") +public class Movie { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column private String title; + @Column private String rating; + @Column private String description; + @Column private int runtimeMins; + @Column private LocalDateTime createdAt; + @Column private LocalDateTime updatedAt; + + public Movie(int id, String title, String rating, String description, int runtimeMins, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.id = id; + this.title = title; + this.rating = rating; + this.description = description; + this.runtimeMins = runtimeMins; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public Movie(String title, String rating, String description, int runtimeMins, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.title = title; + this.rating = rating; + this.description = description; + this.runtimeMins = runtimeMins; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public Movie(int id, String title, String rating, String description, int runtimeMins) { + this.id = id; + this.title = title; + this.rating = rating; + this.description = description; + this.runtimeMins = runtimeMins; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public Movie(String title, String rating, String description, int runtimeMins) { + this.title = title; + this.rating = rating; + this.description = description; + this.runtimeMins = runtimeMins; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public Movie(int id) { + this.id = id; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public Movie() { + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getRating() { + return rating; + } + + public void setRating(String rating) { + this.rating = rating; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public int getRuntimeMins() { + return runtimeMins; + } + + public void setRuntimeMins(int runtimeMins) { + this.runtimeMins = runtimeMins; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(LocalDateTime updatedAt) { + this.updatedAt = updatedAt; + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/model/Screening.java b/src/main/java/com/booleanuk/api/cinema/model/Screening.java new file mode 100644 index 00000000..2ea0963c --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/model/Screening.java @@ -0,0 +1,150 @@ +package com.booleanuk.api.cinema.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.persistence.*; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import java.time.LocalDateTime; + +@Entity +@Table(name="screenings") +public class Screening { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @ManyToOne + @OnDelete(action = OnDeleteAction.CASCADE) + @JsonIgnore + private Movie movie; + + @Column private int screenNumber; + @Column private int capacity; + + @JsonFormat(shape=JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss[+SS][:SS]") + @Column private LocalDateTime startsAt; + + @Column private LocalDateTime createdAt; + @Column private LocalDateTime updatedAt; + + public Screening(int id, Movie movie, int screenNumber, int capacity, LocalDateTime startsAt, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.id = id; + this.movie = movie; + this.screenNumber = screenNumber; + this.capacity = capacity; + this.startsAt = startsAt; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public Screening(Movie movie, int screenNumber, int capacity, LocalDateTime startsAt, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.movie = movie; + this.screenNumber = screenNumber; + this.capacity = capacity; + this.startsAt = startsAt; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public Screening(int id, Movie movie, int screenNumber, int capacity, LocalDateTime startsAt) { + this.id = id; + this.movie = movie; + this.screenNumber = screenNumber; + this.capacity = capacity; + this.startsAt = startsAt; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public Screening(Movie movie, int screenNumber, int capacity, LocalDateTime startsAt) { + this.movie = movie; + this.screenNumber = screenNumber; + this.capacity = capacity; + this.startsAt = startsAt; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public Screening(int id, int screenNumber, int capacity, LocalDateTime startsAt, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.id = id; + this.screenNumber = screenNumber; + this.capacity = capacity; + this.startsAt = startsAt; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public Screening(int id) { + this.id = id; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public Screening() { + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Movie getMovie() { + return movie; + } + + public void setMovie(Movie movie) { + this.movie = movie; + } + + public int getScreenNumber() { + return screenNumber; + } + + public void setScreenNumber(int screenNumber) { + this.screenNumber = screenNumber; + } + + public int getCapacity() { + return capacity; + } + + public void setCapacity(int capacity) { + this.capacity = capacity; + } + + public LocalDateTime getStartsAt() { + return startsAt; + } + + public void setStartsAt(LocalDateTime startsAt) { + this.startsAt = startsAt; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(LocalDateTime updatedAt) { + this.updatedAt = updatedAt; + } + + @JsonIgnore + public int getMovieId() { + return this.movie.getId(); + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/model/Ticket.java b/src/main/java/com/booleanuk/api/cinema/model/Ticket.java new file mode 100644 index 00000000..c8b32799 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/model/Ticket.java @@ -0,0 +1,119 @@ +package com.booleanuk.api.cinema.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.persistence.*; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; + +import java.time.LocalDateTime; + +@Entity +@Table(name="tickets") +public class Ticket { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @ManyToOne + @JsonIgnore + private Customer customer; + + @ManyToOne + @JsonIgnore + @OnDelete(action = OnDeleteAction.CASCADE) + private Screening screening; + + @Column int numSeats; + @Column LocalDateTime createdAt; + @Column LocalDateTime updatedAt; + + public Ticket(int id, Customer customer, Screening screening, int numSeats, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.id = id; + this.customer = customer; + this.screening = screening; + this.numSeats = numSeats; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public Ticket(Customer customer, Screening screening, int numSeats, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.customer = customer; + this.screening = screening; + this.numSeats = numSeats; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public Ticket(int numSeats, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.numSeats = numSeats; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public Ticket(int id) { + this.id = id; + } + + public Ticket() { + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @JsonIgnore + public Customer getCustomer() { + return customer; + } + + public void setCustomer(Customer customer) { + this.customer = customer; + } + + @JsonIgnore + public Screening getScreening() { + return screening; + } + + public void setScreening(Screening screening) { + this.screening = screening; + } + + public int getNumSeats() { + return numSeats; + } + + public void setNumSeats(int numSeats) { + this.numSeats = numSeats; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public LocalDateTime getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(LocalDateTime updatedAt) { + this.updatedAt = updatedAt; + } + + @JsonIgnore + public int getCustomerId() { + return this.customer.getId(); + } + + @JsonIgnore + public int getScreeningId() { + return this.screening.getId(); + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/repository/CustomerRepository.java b/src/main/java/com/booleanuk/api/cinema/repository/CustomerRepository.java new file mode 100644 index 00000000..5ddf67bc --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/repository/CustomerRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.repository; + +import com.booleanuk.api.cinema.model.Customer; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CustomerRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/cinema/repository/MovieRepository.java b/src/main/java/com/booleanuk/api/cinema/repository/MovieRepository.java new file mode 100644 index 00000000..c689e162 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/repository/MovieRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.repository; + +import com.booleanuk.api.cinema.model.Movie; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MovieRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/cinema/repository/ScreeningRepository.java b/src/main/java/com/booleanuk/api/cinema/repository/ScreeningRepository.java new file mode 100644 index 00000000..1235edbd --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/repository/ScreeningRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.repository; + +import com.booleanuk.api.cinema.model.Screening; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ScreeningRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/cinema/repository/TicketRepository.java b/src/main/java/com/booleanuk/api/cinema/repository/TicketRepository.java new file mode 100644 index 00000000..ee891c02 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/repository/TicketRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.repository; + +import com.booleanuk.api.cinema.model.Ticket; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TicketRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/cinema/responses/ErrorResponse.java b/src/main/java/com/booleanuk/api/cinema/responses/ErrorResponse.java new file mode 100644 index 00000000..05bf381a --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/ErrorResponse.java @@ -0,0 +1,21 @@ +package com.booleanuk.api.cinema.responses; + +import java.util.HashMap; +import java.util.Map; + +public class ErrorResponse extends Response> { + public ErrorResponse(String message) { + this.status = "error"; + Map reply = new HashMap<>(); + reply.put("message", message); + this.data = reply; + } + + public void set(String message) { + this.status = "error"; + Map reply = new HashMap<>(); + reply.put("message", message); + this.data = reply; + } + +} diff --git a/src/main/java/com/booleanuk/api/cinema/responses/Response.java b/src/main/java/com/booleanuk/api/cinema/responses/Response.java new file mode 100644 index 00000000..a41594af --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/Response.java @@ -0,0 +1,39 @@ +package com.booleanuk.api.cinema.responses; + +public class Response { + protected String status; + protected T data; + + public Response(String status, T data) { + this.status = status; + this.data = data; + } + + public Response(T data) { + this("success", data); + } + + public Response() { + } + + public void set(T data) { + this.status = "success"; + this.data = data; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +}