From 1db5dc845aa091c0571a72343c40bd90ffacb253 Mon Sep 17 00:00:00 2001 From: Ludwig J Lundborg Date: Wed, 11 Sep 2024 16:41:20 +0200 Subject: [PATCH 01/11] git push --- .gitignore | 3 + build.gradle | 2 +- .../java/com/booleanuk/api/cinema/Main.java | 11 ++ .../controllers/CustomerController.java | 62 +++++++++ .../cinema/controllers/MovieController.java | 55 ++++++++ .../controllers/ScreeningController.java | 45 +++++++ .../booleanuk/api/cinema/models/Customer.java | 91 +++++++++++++ .../booleanuk/api/cinema/models/Movie.java | 121 ++++++++++++++++++ .../api/cinema/models/Screening.java | 116 +++++++++++++++++ .../booleanuk/api/cinema/models/Ticket.java | 4 + .../cinema/repository/CustomerRepository.java | 7 + .../cinema/repository/MovieRepository.java | 8 ++ .../repository/ScreeningRepository.java | 7 + src/main/resources/application.yml.example | 23 ---- 14 files changed, 531 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/booleanuk/api/cinema/Main.java create mode 100644 src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java create mode 100644 src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java create mode 100644 src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java create mode 100644 src/main/java/com/booleanuk/api/cinema/models/Customer.java create mode 100644 src/main/java/com/booleanuk/api/cinema/models/Movie.java create mode 100644 src/main/java/com/booleanuk/api/cinema/models/Screening.java create mode 100644 src/main/java/com/booleanuk/api/cinema/models/Ticket.java create mode 100644 src/main/java/com/booleanuk/api/cinema/repository/CustomerRepository.java create mode 100644 src/main/java/com/booleanuk/api/cinema/repository/MovieRepository.java create mode 100644 src/main/java/com/booleanuk/api/cinema/repository/ScreeningRepository.java delete mode 100644 src/main/resources/application.yml.example diff --git a/.gitignore b/.gitignore index dc01f204..660ee6a8 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ out/ ### VS Code ### .vscode/ + +src/main/resources/application.yml + diff --git a/build.gradle b/build.gradle index 3d7f7607..5a4443e1 100644 --- a/build.gradle +++ b/build.gradle @@ -21,7 +21,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' developmentOnly 'org.springframework.boot:spring-boot-devtools' - runtimeOnly 'org.postgresql:postgresql' + implementation 'org.postgresql:postgresql:42.7.3' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } 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/controllers/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java new file mode 100644 index 00000000..323ef1ff --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java @@ -0,0 +1,62 @@ +package com.booleanuk.api.cinema.controllers; + +import com.booleanuk.api.cinema.models.Customer; +import com.booleanuk.api.cinema.repository.CustomerRepository; +import org.springframework.beans.factory.annotation.Autowired; +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 { + + @Autowired + private CustomerRepository customerRepository; + + @GetMapping + public List getAllCustomers () { + return this.customerRepository.findAll(); + } + + @GetMapping("{id}") + public ResponseEntity getCustomer (@PathVariable int id) { + Customer customer = this.customerRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found..")); + + return ResponseEntity.ok(customer); + } + + @PostMapping + public ResponseEntity createCustomer(@RequestBody Customer customer){ + customer.setCreatedAt(LocalDateTime.now()); + customer.setUpdatedAt(LocalDateTime.now()); + + return new ResponseEntity(this.customerRepository.save(customer), HttpStatus.CREATED); + } + + @PutMapping("{id}") + public ResponseEntity updateCustomer(@PathVariable int id, @RequestBody Customer customer){ + Customer customerToUpdate = this.customerRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found..")); + + customerToUpdate.setName(customer.getName()); + customerToUpdate.setEmail(customer.getEmail()); + customerToUpdate.setPhone(customer.getPhone()); + + customerToUpdate.setUpdatedAt(LocalDateTime.now()); + + return new ResponseEntity(this.customerRepository.save(customerToUpdate), HttpStatus.CREATED); + } + + @DeleteMapping("{id}") + public ResponseEntity deleteCustomer(@PathVariable int id){ + Customer customerToDelete = this.customerRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); + + this.customerRepository.delete(customerToDelete); + return ResponseEntity.ok(customerToDelete); + } + +} diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java new file mode 100644 index 00000000..2c7f87e2 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java @@ -0,0 +1,55 @@ +package com.booleanuk.api.cinema.controllers; + +import com.booleanuk.api.cinema.models.Customer; +import com.booleanuk.api.cinema.models.Movie; +import com.booleanuk.api.cinema.repository.MovieRepository; +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.springframework.beans.factory.annotation.Autowired; +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("movies") +public class MovieController { + + @Autowired + private MovieRepository movieRepository; + + @GetMapping + public List getAllMovies(){ + return this.movieRepository.findAll(); + } + + @PostMapping + public ResponseEntity createMovie(@RequestBody Movie movie){ + movie.setCreatedTime(LocalDateTime.now()); + movie.setUpdatedTime(LocalDateTime.now()); + + return new ResponseEntity(this.movieRepository.save(movie), HttpStatus.CREATED); + } + + @PutMapping("{id}") + public ResponseEntity updateMovie(@PathVariable int id, @RequestBody Movie movie){ + Movie movieToUpdate = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); + + movieToUpdate.setTitle(movie.getTitle()); + movieToUpdate.setRating(movie.getRating()); + movieToUpdate.setDescription(movie.getDescription()); + movieToUpdate.setRuntimeMins(movie.getRuntimeMins()); + + return new ResponseEntity(this.movieRepository.save(movieToUpdate), HttpStatus.CREATED); + } + + @DeleteMapping("{id}") + public ResponseEntity deleteMovie(@PathVariable int id){ + Movie movieToDelete = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); + + this.movieRepository.delete(movieToDelete); + return ResponseEntity.ok(movieToDelete); + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java new file mode 100644 index 00000000..2d280393 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java @@ -0,0 +1,45 @@ +package com.booleanuk.api.cinema.controllers; + +import com.booleanuk.api.cinema.models.Customer; +import com.booleanuk.api.cinema.models.Movie; +import com.booleanuk.api.cinema.models.Screening; +import com.booleanuk.api.cinema.repository.MovieRepository; +import com.booleanuk.api.cinema.repository.ScreeningRepository; +import org.springframework.beans.factory.annotation.Autowired; +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("movies/{id}/screenings") +public class ScreeningController { + + @Autowired + private ScreeningRepository screeningRepository; + + @Autowired + private MovieRepository movieRepository; + + @GetMapping + public List getAllCustomers (@PathVariable int id) { + return this.screeningRepository.findAll(); + } + + @PostMapping + public ResponseEntity createScreening(@PathVariable int id, @RequestBody Screening screening){ + Movie movie = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found..")); + + screening.setMovie(movie); + screening.setCreatedAt(LocalDateTime.now()); + screening.setUpdatedAt(LocalDateTime.now()); + + return new ResponseEntity(this.screeningRepository.save(screening), HttpStatus.CREATED); + } + + + +} diff --git a/src/main/java/com/booleanuk/api/cinema/models/Customer.java b/src/main/java/com/booleanuk/api/cinema/models/Customer.java new file mode 100644 index 00000000..0d8e14b6 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/models/Customer.java @@ -0,0 +1,91 @@ +package com.booleanuk.api.cinema.models; + +import jakarta.persistence.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "customers") +public class Customer { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column(name = "name") + private String name; + + @Column(name = "email") + private String email; + + @Column(name = "phone") + private String phone; + + @Column(name = "created_at") + private LocalDateTime createdAt = LocalDateTime.now(); + + @Column(name = "updated_at") + private LocalDateTime updatedAt = LocalDateTime.now(); + + public Customer(){ + } + + public Customer(int id){ + this.id = id; + } + + 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; + } + + 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/models/Movie.java b/src/main/java/com/booleanuk/api/cinema/models/Movie.java new file mode 100644 index 00000000..95ae9d44 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/models/Movie.java @@ -0,0 +1,121 @@ +package com.booleanuk.api.cinema.models; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.persistence.*; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Entity +@Table(name = "movies") +public class Movie { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column(name = "title") + private String title; + + @Column(name = "rating") + private String rating; + + @Column(name = "description") + private String description; + + @Column(name = "run_time_mins") + private int runtimeMins; + + @Column(name = "created_at") + private LocalDateTime createdTime = LocalDateTime.now(); + + @Column(name = "updated_at") + private LocalDateTime updatedTime = LocalDateTime.now(); + + @OneToMany(mappedBy = "movie") + @JsonIgnoreProperties("movie") + private List screenings; + + + public Movie(){ + + } + + public Movie(int id){ + this.id = id; + } + + public Movie(int id, String title, String rating, String description, int runtimeMins, LocalDateTime createdTime, LocalDateTime updatedTime){ + this.id = id; + this.title = title; + this.rating = rating; + this.description = description; + this.createdTime = createdTime; + this.updatedTime = updatedTime; + } + + 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 getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(LocalDateTime createdTime) { + this.createdTime = createdTime; + } + + public LocalDateTime getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(LocalDateTime updatedTime) { + this.updatedTime = updatedTime; + } + + public List getScreenings() { + return screenings; + } + + public void setScreenings(List screenings) { + this.screenings = screenings; + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/models/Screening.java b/src/main/java/com/booleanuk/api/cinema/models/Screening.java new file mode 100644 index 00000000..71fb546b --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/models/Screening.java @@ -0,0 +1,116 @@ +package com.booleanuk.api.cinema.models; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIncludeProperties; +import jakarta.persistence.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "screenings") +public class Screening { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @ManyToOne + @JoinColumn(name = "movie_id") + @JsonIncludeProperties(value = {"title", "rating", "description", "run_time_mins", "created_at", "updated_at"}) + private Movie movie; + + @Column(name = "screen_number") + private int screenNumber; + + @Column(name = "starts_at") + private LocalDateTime startsAt = LocalDateTime.now(); + + @Column(name = "capacity") + private int capacity; + + @Column(name = "created_at") + @JsonFormat(pattern = "yyyy-MM-ddTHH:mm:ss") + private LocalDateTime createdAt = LocalDateTime.now(); + + @Column(name = "updated_at") + @JsonFormat(pattern = "yyyy-MM-ddTHH:mm:ss") + private LocalDateTime updatedAt = LocalDateTime.now(); + + public Screening() { + } + + public Screening(int id) { + this.id = id; + } + + public Screening(int screenNumber, LocalDateTime startsAt, int capacity) { + this.capacity = capacity; + this.screenNumber = screenNumber; + this.startsAt = startsAt; + } + + public Screening(int id, int screenNumber, LocalDateTime startsAt, int capacity, LocalDateTime createdAt, LocalDateTime updatedAt) { + this.id = id; + this.screenNumber = screenNumber; + this.startsAt = startsAt; + this.capacity = capacity; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public LocalDateTime getStartsAt() { + return startsAt; + } + + public void setStartsAt(LocalDateTime startsAt) { + this.startsAt = startsAt; + } + + public int getCapacity() { + return capacity; + } + + public void setCapacity(int capacity) { + this.capacity = capacity; + } + + 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; + } + + 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; + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/models/Ticket.java b/src/main/java/com/booleanuk/api/cinema/models/Ticket.java new file mode 100644 index 00000000..c8def85a --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/models/Ticket.java @@ -0,0 +1,4 @@ +package com.booleanuk.api.cinema.models; + +public class Ticket { +} 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..e69f07f0 --- /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.models.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..c6041f12 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/repository/MovieRepository.java @@ -0,0 +1,8 @@ +package com.booleanuk.api.cinema.repository; + +import com.booleanuk.api.cinema.models.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..dea5ac67 --- /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.models.Screening; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ScreeningRepository extends JpaRepository { +} diff --git a/src/main/resources/application.yml.example b/src/main/resources/application.yml.example deleted file mode 100644 index 275ec30f..00000000 --- a/src/main/resources/application.yml.example +++ /dev/null @@ -1,23 +0,0 @@ -server: - port: 4000 - error: - include-message: always - include-binding-errors: always - include-stacktrace: never - include-exception: false - -spring: - datasource: - url: jdbc:postgresql://DATABASE_URL:5432/DATABASE_NAME - username: DATABASE_USERNAME - password: DATABASE_PASSWORD - max-active: 3 - max-idle: 3 - jpa: - hibernate: - ddl-auto: update - properties: - hibernate: - dialect: org.hibernate.dialect.PostgreSQLDialect - format_sql: true - show-sql: true From f60f5b8df0e3471d0953884ee39906b70697560e Mon Sep 17 00:00:00 2001 From: Ludwig J Lundborg Date: Thu, 12 Sep 2024 08:58:52 +0200 Subject: [PATCH 02/11] Core finished --- .../api/cinema/controllers/ScreeningController.java | 3 ++- .../com/booleanuk/api/cinema/models/Customer.java | 7 +++++-- .../java/com/booleanuk/api/cinema/models/Movie.java | 11 +++++++++-- .../com/booleanuk/api/cinema/models/Screening.java | 12 +++++++----- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java index 2d280393..e7a6ea57 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java @@ -1,6 +1,5 @@ package com.booleanuk.api.cinema.controllers; -import com.booleanuk.api.cinema.models.Customer; import com.booleanuk.api.cinema.models.Movie; import com.booleanuk.api.cinema.models.Screening; import com.booleanuk.api.cinema.repository.MovieRepository; @@ -36,6 +35,8 @@ public ResponseEntity createScreening(@PathVariable int id, @RequestB screening.setMovie(movie); screening.setCreatedAt(LocalDateTime.now()); screening.setUpdatedAt(LocalDateTime.now()); + movie.addScreening(screening); + return new ResponseEntity(this.screeningRepository.save(screening), HttpStatus.CREATED); } diff --git a/src/main/java/com/booleanuk/api/cinema/models/Customer.java b/src/main/java/com/booleanuk/api/cinema/models/Customer.java index 0d8e14b6..6a56ac67 100644 --- a/src/main/java/com/booleanuk/api/cinema/models/Customer.java +++ b/src/main/java/com/booleanuk/api/cinema/models/Customer.java @@ -1,5 +1,6 @@ package com.booleanuk.api.cinema.models; +import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.persistence.*; import java.time.LocalDateTime; @@ -22,10 +23,12 @@ public class Customer { private String phone; @Column(name = "created_at") - private LocalDateTime createdAt = LocalDateTime.now(); + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createdAt; @Column(name = "updated_at") - private LocalDateTime updatedAt = LocalDateTime.now(); + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updatedAt; public Customer(){ } diff --git a/src/main/java/com/booleanuk/api/cinema/models/Movie.java b/src/main/java/com/booleanuk/api/cinema/models/Movie.java index 95ae9d44..037b7140 100644 --- a/src/main/java/com/booleanuk/api/cinema/models/Movie.java +++ b/src/main/java/com/booleanuk/api/cinema/models/Movie.java @@ -1,4 +1,5 @@ package com.booleanuk.api.cinema.models; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; @@ -28,10 +29,12 @@ public class Movie { private int runtimeMins; @Column(name = "created_at") - private LocalDateTime createdTime = LocalDateTime.now(); + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createdTime; @Column(name = "updated_at") - private LocalDateTime updatedTime = LocalDateTime.now(); + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updatedTime; @OneToMany(mappedBy = "movie") @JsonIgnoreProperties("movie") @@ -118,4 +121,8 @@ public List getScreenings() { public void setScreenings(List screenings) { this.screenings = screenings; } + + public void addScreening(Screening screening){ + this.screenings.add(screening); + } } diff --git a/src/main/java/com/booleanuk/api/cinema/models/Screening.java b/src/main/java/com/booleanuk/api/cinema/models/Screening.java index 71fb546b..4ea3d5ce 100644 --- a/src/main/java/com/booleanuk/api/cinema/models/Screening.java +++ b/src/main/java/com/booleanuk/api/cinema/models/Screening.java @@ -5,6 +5,7 @@ import jakarta.persistence.*; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; @Entity @Table(name = "screenings") @@ -23,18 +24,19 @@ public class Screening { private int screenNumber; @Column(name = "starts_at") - private LocalDateTime startsAt = LocalDateTime.now(); + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startsAt; @Column(name = "capacity") private int capacity; @Column(name = "created_at") - @JsonFormat(pattern = "yyyy-MM-ddTHH:mm:ss") - private LocalDateTime createdAt = LocalDateTime.now(); + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createdAt; @Column(name = "updated_at") - @JsonFormat(pattern = "yyyy-MM-ddTHH:mm:ss") - private LocalDateTime updatedAt = LocalDateTime.now(); + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updatedAt; public Screening() { } From 935eb2c00f090cb791002dd7f565d95d6046c776 Mon Sep 17 00:00:00 2001 From: Ludwig J Lundborg Date: Thu, 12 Sep 2024 14:02:24 +0200 Subject: [PATCH 03/11] Added Ticket --- .../controllers/CustomerController.java | 7 -- .../cinema/controllers/MovieController.java | 7 ++ .../controllers/ScreeningController.java | 7 ++ .../cinema/controllers/TicketController.java | 44 ++++++++ .../booleanuk/api/cinema/models/Customer.java | 6 + .../booleanuk/api/cinema/models/Movie.java | 9 +- .../api/cinema/models/Screening.java | 15 ++- .../booleanuk/api/cinema/models/Ticket.java | 105 ++++++++++++++++++ .../cinema/repository/TicketRepository.java | 8 ++ 9 files changed, 195 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java create mode 100644 src/main/java/com/booleanuk/api/cinema/repository/TicketRepository.java diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java index 323ef1ff..13afd524 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java @@ -23,13 +23,6 @@ public List getAllCustomers () { return this.customerRepository.findAll(); } - @GetMapping("{id}") - public ResponseEntity getCustomer (@PathVariable int id) { - Customer customer = this.customerRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found..")); - - return ResponseEntity.ok(customer); - } - @PostMapping public ResponseEntity createCustomer(@RequestBody Customer customer){ customer.setCreatedAt(LocalDateTime.now()); diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java index 2c7f87e2..31629cbb 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java @@ -2,7 +2,9 @@ import com.booleanuk.api.cinema.models.Customer; import com.booleanuk.api.cinema.models.Movie; +import com.booleanuk.api.cinema.models.Screening; import com.booleanuk.api.cinema.repository.MovieRepository; +import com.booleanuk.api.cinema.repository.ScreeningRepository; import com.fasterxml.jackson.annotation.JsonIgnore; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -20,6 +22,9 @@ public class MovieController { @Autowired private MovieRepository movieRepository; + @Autowired + private ScreeningRepository screeningRepository; + @GetMapping public List getAllMovies(){ return this.movieRepository.findAll(); @@ -27,6 +32,8 @@ public List getAllMovies(){ @PostMapping public ResponseEntity createMovie(@RequestBody Movie movie){ + List screenings = movie.getScreenings(); + movie.setCreatedTime(LocalDateTime.now()); movie.setUpdatedTime(LocalDateTime.now()); diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java index e7a6ea57..8959ef90 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java @@ -2,8 +2,10 @@ import com.booleanuk.api.cinema.models.Movie; import com.booleanuk.api.cinema.models.Screening; +import com.booleanuk.api.cinema.models.Ticket; import com.booleanuk.api.cinema.repository.MovieRepository; import com.booleanuk.api.cinema.repository.ScreeningRepository; +import com.booleanuk.api.cinema.repository.TicketRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -23,6 +25,11 @@ public class ScreeningController { @Autowired private MovieRepository movieRepository; + @Autowired + private TicketRepository ticketRepository; + + + //Need to fix to specific id @GetMapping public List getAllCustomers (@PathVariable int id) { return this.screeningRepository.findAll(); diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java new file mode 100644 index 00000000..c1955389 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java @@ -0,0 +1,44 @@ +package com.booleanuk.api.cinema.controllers; + +import com.booleanuk.api.cinema.models.Customer; +import com.booleanuk.api.cinema.models.Screening; +import com.booleanuk.api.cinema.models.Ticket; +import com.booleanuk.api.cinema.repository.CustomerRepository; +import com.booleanuk.api.cinema.repository.ScreeningRepository; +import com.booleanuk.api.cinema.repository.TicketRepository; +import org.springframework.beans.factory.annotation.Autowired; +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; + +@RestController +@RequestMapping(name = "customers/{customerId}/screenings/{screeningId}") +public class TicketController { + + @Autowired + private TicketRepository ticketRepository; + + @Autowired + private ScreeningRepository screeningRepository; + + @Autowired + private CustomerRepository customerRepository; + + @PostMapping + public ResponseEntity createTicket(@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId, @RequestBody Ticket ticket){ + + + Customer customer = this.customerRepository.findById(customerId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found 1..")); + Screening screening = this.screeningRepository.findById(screeningId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found. 2.")); + + ticket.setCustomer(customer); + ticket.setScreening(screening); + ticket.setCreatedAt(LocalDateTime.now()); + ticket.setUpdatedAt(LocalDateTime.now()); + + return new ResponseEntity(this.ticketRepository.save(ticket), HttpStatus.CREATED); + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/models/Customer.java b/src/main/java/com/booleanuk/api/cinema/models/Customer.java index 6a56ac67..74d9761a 100644 --- a/src/main/java/com/booleanuk/api/cinema/models/Customer.java +++ b/src/main/java/com/booleanuk/api/cinema/models/Customer.java @@ -1,9 +1,11 @@ package com.booleanuk.api.cinema.models; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; import java.time.LocalDateTime; +import java.util.List; @Entity @Table(name = "customers") @@ -13,6 +15,10 @@ public class Customer { @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; + @OneToMany(mappedBy = "customer") + @JsonIgnoreProperties("customer") + private List tickets; + @Column(name = "name") private String name; diff --git a/src/main/java/com/booleanuk/api/cinema/models/Movie.java b/src/main/java/com/booleanuk/api/cinema/models/Movie.java index 037b7140..bafe3305 100644 --- a/src/main/java/com/booleanuk/api/cinema/models/Movie.java +++ b/src/main/java/com/booleanuk/api/cinema/models/Movie.java @@ -1,10 +1,8 @@ package com.booleanuk.api.cinema.models; import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -36,7 +34,7 @@ public class Movie { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updatedTime; - @OneToMany(mappedBy = "movie") + @OneToMany(mappedBy = "movie", fetch = FetchType.EAGER) @JsonIgnoreProperties("movie") private List screenings; @@ -49,15 +47,16 @@ public Movie(int id){ this.id = id; } - public Movie(int id, String title, String rating, String description, int runtimeMins, LocalDateTime createdTime, LocalDateTime updatedTime){ - this.id = id; + public Movie(String title, String rating, String description, int runtimeMins, LocalDateTime createdTime, LocalDateTime updatedTime){ this.title = title; this.rating = rating; this.description = description; + this.runtimeMins = runtimeMins; this.createdTime = createdTime; this.updatedTime = updatedTime; } + public int getId() { return id; } diff --git a/src/main/java/com/booleanuk/api/cinema/models/Screening.java b/src/main/java/com/booleanuk/api/cinema/models/Screening.java index 4ea3d5ce..bedc182c 100644 --- a/src/main/java/com/booleanuk/api/cinema/models/Screening.java +++ b/src/main/java/com/booleanuk/api/cinema/models/Screening.java @@ -1,11 +1,12 @@ package com.booleanuk.api.cinema.models; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIncludeProperties; import jakarta.persistence.*; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; +import java.util.List; @Entity @Table(name = "screenings") @@ -20,6 +21,10 @@ public class Screening { @JsonIncludeProperties(value = {"title", "rating", "description", "run_time_mins", "created_at", "updated_at"}) private Movie movie; + @OneToMany(mappedBy = "screening") + @JsonIgnoreProperties("screening") + private List tickets; + @Column(name = "screen_number") private int screenNumber; @@ -115,4 +120,12 @@ public int getScreenNumber() { public void setScreenNumber(int screenNumber) { this.screenNumber = screenNumber; } + + public List getTickets() { + return tickets; + } + + public void setTickets(List tickets) { + this.tickets = tickets; + } } diff --git a/src/main/java/com/booleanuk/api/cinema/models/Ticket.java b/src/main/java/com/booleanuk/api/cinema/models/Ticket.java index c8def85a..30332766 100644 --- a/src/main/java/com/booleanuk/api/cinema/models/Ticket.java +++ b/src/main/java/com/booleanuk/api/cinema/models/Ticket.java @@ -1,4 +1,109 @@ package com.booleanuk.api.cinema.models; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIncludeProperties; +import jakarta.persistence.*; +import java.time.LocalDateTime; + +@Entity +@Table(name = "tickets") public class Ticket { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @ManyToOne + @JoinColumn(name = "customer_id") + @JsonIncludeProperties(value = {"name", "email", "phone", "created_at", "updated_at"}) + private Customer customer; + + //Done one to many + @ManyToOne + @JoinColumn(name = "screening_id") + @JsonIncludeProperties(value = {"movie_id", "screen_number", "starts_at", "capacity", "created_at", "updated_at"}) + private Screening screening; + + @Column(name = "num_seats") + private int numSeats; + + @Column(name = "created_at") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createdAt; + + @Column(name = "updated_at") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updatedAt; + + public Ticket() { + } + + public Ticket(int id) { + this.id = id; + } + + 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 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 int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Customer getCustomer() { + return customer; + } + + public void setCustomer(Customer customer) { + this.customer = customer; + } + + 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; + } } 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..558a48a7 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/repository/TicketRepository.java @@ -0,0 +1,8 @@ +package com.booleanuk.api.cinema.repository; + +import com.booleanuk.api.cinema.models.Ticket; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TicketRepository extends JpaRepository { + +} From 9b4b5f8d77d9da11819b324b98cbf8757feb139f Mon Sep 17 00:00:00 2001 From: Ludwig J Lundborg Date: Thu, 12 Sep 2024 14:48:44 +0200 Subject: [PATCH 04/11] git push --- .../controllers/ScreeningController.java | 1 + .../cinema/controllers/TicketController.java | 6 +++--- .../booleanuk/api/cinema/models/Screening.java | 2 +- .../booleanuk/api/cinema/models/Ticket.java | 18 ++++-------------- 4 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java index 8959ef90..bb0d8679 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java @@ -32,6 +32,7 @@ public class ScreeningController { //Need to fix to specific id @GetMapping public List getAllCustomers (@PathVariable int id) { + return this.screeningRepository.findAll(); } diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java index c1955389..93aa6941 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java @@ -15,7 +15,7 @@ import java.time.LocalDateTime; @RestController -@RequestMapping(name = "customers/{customerId}/screenings/{screeningId}") +@RequestMapping(name = "customers/") public class TicketController { @Autowired @@ -27,10 +27,9 @@ public class TicketController { @Autowired private CustomerRepository customerRepository; - @PostMapping + @PostMapping("{customerId}/screenings/{screeningId}") public ResponseEntity createTicket(@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId, @RequestBody Ticket ticket){ - Customer customer = this.customerRepository.findById(customerId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found 1..")); Screening screening = this.screeningRepository.findById(screeningId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found. 2.")); @@ -41,4 +40,5 @@ public ResponseEntity createTicket(@PathVariable(name = "customerId") in return new ResponseEntity(this.ticketRepository.save(ticket), HttpStatus.CREATED); } + } diff --git a/src/main/java/com/booleanuk/api/cinema/models/Screening.java b/src/main/java/com/booleanuk/api/cinema/models/Screening.java index bedc182c..146030b6 100644 --- a/src/main/java/com/booleanuk/api/cinema/models/Screening.java +++ b/src/main/java/com/booleanuk/api/cinema/models/Screening.java @@ -17,7 +17,7 @@ public class Screening { private int id; @ManyToOne - @JoinColumn(name = "movie_id") + @JoinColumn(name = "movie_id", nullable = false) @JsonIncludeProperties(value = {"title", "rating", "description", "run_time_mins", "created_at", "updated_at"}) private Movie movie; diff --git a/src/main/java/com/booleanuk/api/cinema/models/Ticket.java b/src/main/java/com/booleanuk/api/cinema/models/Ticket.java index 30332766..a061e43b 100644 --- a/src/main/java/com/booleanuk/api/cinema/models/Ticket.java +++ b/src/main/java/com/booleanuk/api/cinema/models/Ticket.java @@ -14,13 +14,12 @@ public class Ticket { private int id; @ManyToOne - @JoinColumn(name = "customer_id") + @JoinColumn(name = "customer_id", nullable = false) @JsonIncludeProperties(value = {"name", "email", "phone", "created_at", "updated_at"}) private Customer customer; - //Done one to many @ManyToOne - @JoinColumn(name = "screening_id") + @JoinColumn(name = "screening_id", nullable = false) @JsonIncludeProperties(value = {"movie_id", "screen_number", "starts_at", "capacity", "created_at", "updated_at"}) private Screening screening; @@ -38,20 +37,11 @@ public class Ticket { public Ticket() { } - public Ticket(int id) { - this.id = id; - } - - public Ticket(Customer customer, Screening screening, int numSeats, LocalDateTime createdAt, LocalDateTime updatedAt) { - this.customer = customer; - this.screening = screening; + public Ticket(int numSeats){ this.numSeats = numSeats; - this.createdAt = createdAt; - this.updatedAt = updatedAt; } - public Ticket(int id, Customer customer, Screening screening, int numSeats, LocalDateTime createdAt, LocalDateTime updatedAt) { - this.id = id; + public Ticket(Customer customer, Screening screening, int numSeats, LocalDateTime createdAt, LocalDateTime updatedAt) { this.customer = customer; this.screening = screening; this.numSeats = numSeats; From 59e4f7912a7e4d95e630308812786c2cdf1ea88b Mon Sep 17 00:00:00 2001 From: Ludwig J Lundborg Date: Thu, 12 Sep 2024 16:38:59 +0200 Subject: [PATCH 05/11] Fixed findById for ScreeningController and functional Post Request for TicketController --- .../controllers/ScreeningController.java | 8 +++--- .../cinema/controllers/TicketController.java | 25 ++++++++++++------- .../booleanuk/api/cinema/models/Movie.java | 4 +-- .../api/cinema/models/Screening.java | 4 +-- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java index bb0d8679..72c02ca5 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java @@ -28,12 +28,11 @@ public class ScreeningController { @Autowired private TicketRepository ticketRepository; - - //Need to fix to specific id @GetMapping - public List getAllCustomers (@PathVariable int id) { + public ResponseEntity getAllCustomers (@PathVariable int id) { + Movie movie = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); - return this.screeningRepository.findAll(); + return ResponseEntity.ok(movie); } @PostMapping @@ -45,7 +44,6 @@ public ResponseEntity createScreening(@PathVariable int id, @RequestB screening.setUpdatedAt(LocalDateTime.now()); movie.addScreening(screening); - return new ResponseEntity(this.screeningRepository.save(screening), HttpStatus.CREATED); } diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java index 93aa6941..c66bd98c 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java @@ -7,15 +7,17 @@ import com.booleanuk.api.cinema.repository.ScreeningRepository; import com.booleanuk.api.cinema.repository.TicketRepository; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; 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(name = "customers/") +@RequestMapping("customers") public class TicketController { @Autowired @@ -28,17 +30,22 @@ public class TicketController { private CustomerRepository customerRepository; @PostMapping("{customerId}/screenings/{screeningId}") - public ResponseEntity createTicket(@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId, @RequestBody Ticket ticket){ + public ResponseEntity createTicket(@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId, @RequestBody Ticket ticket){ - Customer customer = this.customerRepository.findById(customerId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found 1..")); - Screening screening = this.screeningRepository.findById(screeningId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found. 2.")); + Customer customer = this.customerRepository.findById(customerId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found 1..")); + Screening screening = this.screeningRepository.findById(screeningId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found. 2.")); - ticket.setCustomer(customer); - ticket.setScreening(screening); - ticket.setCreatedAt(LocalDateTime.now()); - ticket.setUpdatedAt(LocalDateTime.now()); + ticket.setCustomer(customer); + ticket.setScreening(screening); + ticket.setCreatedAt(LocalDateTime.now()); + ticket.setUpdatedAt(LocalDateTime.now()); - return new ResponseEntity(this.ticketRepository.save(ticket), HttpStatus.CREATED); + return new ResponseEntity(this.ticketRepository.save(ticket), HttpStatus.CREATED); + } + + @GetMapping("{customerId}/screenings/{screeningId}") + public ResponseEntity> getAllTickets (@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId){ + return null; } } diff --git a/src/main/java/com/booleanuk/api/cinema/models/Movie.java b/src/main/java/com/booleanuk/api/cinema/models/Movie.java index bafe3305..3e05da4c 100644 --- a/src/main/java/com/booleanuk/api/cinema/models/Movie.java +++ b/src/main/java/com/booleanuk/api/cinema/models/Movie.java @@ -47,13 +47,11 @@ public Movie(int id){ this.id = id; } - public Movie(String title, String rating, String description, int runtimeMins, LocalDateTime createdTime, LocalDateTime updatedTime){ + public Movie(String title, String rating, String description, int runtimeMins){ this.title = title; this.rating = rating; this.description = description; this.runtimeMins = runtimeMins; - this.createdTime = createdTime; - this.updatedTime = updatedTime; } diff --git a/src/main/java/com/booleanuk/api/cinema/models/Screening.java b/src/main/java/com/booleanuk/api/cinema/models/Screening.java index 146030b6..1c49db39 100644 --- a/src/main/java/com/booleanuk/api/cinema/models/Screening.java +++ b/src/main/java/com/booleanuk/api/cinema/models/Screening.java @@ -56,13 +56,11 @@ public Screening(int screenNumber, LocalDateTime startsAt, int capacity) { this.startsAt = startsAt; } - public Screening(int id, int screenNumber, LocalDateTime startsAt, int capacity, LocalDateTime createdAt, LocalDateTime updatedAt) { + public Screening(int id, int screenNumber, LocalDateTime startsAt, int capacity) { this.id = id; this.screenNumber = screenNumber; this.startsAt = startsAt; this.capacity = capacity; - this.createdAt = createdAt; - this.updatedAt = updatedAt; } public int getId() { From 9ddefab032377419af7c156a09fc44cbd7ca1459 Mon Sep 17 00:00:00 2001 From: Ludwig J Lundborg Date: Fri, 13 Sep 2024 09:31:38 +0200 Subject: [PATCH 06/11] Correct data for the movie and ticket controllers --- .../booleanuk/api/cinema/controllers/MovieController.java | 2 -- .../api/cinema/controllers/TicketController.java | 8 +++++++- .../booleanuk/api/cinema/repository/TicketRepository.java | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java index 31629cbb..dfeb79f1 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java @@ -32,8 +32,6 @@ public List getAllMovies(){ @PostMapping public ResponseEntity createMovie(@RequestBody Movie movie){ - List screenings = movie.getScreenings(); - movie.setCreatedTime(LocalDateTime.now()); movie.setUpdatedTime(LocalDateTime.now()); diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java index c66bd98c..2b5fb7b5 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java @@ -45,7 +45,13 @@ public ResponseEntity createTicket(@PathVariable(name = "customerId") in @GetMapping("{customerId}/screenings/{screeningId}") public ResponseEntity> getAllTickets (@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId){ - return null; + + Customer customer = this.customerRepository.findById(customerId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found ..1")); + Screening screening = this.screeningRepository.findById(screeningId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found ..2")); + + List ticketList = this.ticketRepository.findAllByCustomerIdAndScreeningId(customer.getId(), screening.getId()); + + return ResponseEntity.ok(ticketList); } } diff --git a/src/main/java/com/booleanuk/api/cinema/repository/TicketRepository.java b/src/main/java/com/booleanuk/api/cinema/repository/TicketRepository.java index 558a48a7..6e737499 100644 --- a/src/main/java/com/booleanuk/api/cinema/repository/TicketRepository.java +++ b/src/main/java/com/booleanuk/api/cinema/repository/TicketRepository.java @@ -3,6 +3,9 @@ import com.booleanuk.api.cinema.models.Ticket; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface TicketRepository extends JpaRepository { + public List findAllByCustomerIdAndScreeningId(int customerId, int screeningId); } From f379af183541ee9a5a528e034cbb64bb866c74ac Mon Sep 17 00:00:00 2001 From: Ludwig J Lundborg Date: Fri, 13 Sep 2024 10:08:58 +0200 Subject: [PATCH 07/11] fixed mistake in getAllScreening --- .../api/cinema/controllers/ScreeningController.java | 7 +++++-- .../api/cinema/repository/ScreeningRepository.java | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java index 72c02ca5..3c43beee 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java @@ -6,6 +6,7 @@ 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.ScreeningResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -29,10 +30,12 @@ public class ScreeningController { private TicketRepository ticketRepository; @GetMapping - public ResponseEntity getAllCustomers (@PathVariable int id) { + public ResponseEntity> getAllScreening(@PathVariable int id) { Movie movie = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); - return ResponseEntity.ok(movie); + List screeningsList = this.screeningRepository.findByMovie(movie); + + return ResponseEntity.ok(screeningsList); } @PostMapping diff --git a/src/main/java/com/booleanuk/api/cinema/repository/ScreeningRepository.java b/src/main/java/com/booleanuk/api/cinema/repository/ScreeningRepository.java index dea5ac67..3c4d5bee 100644 --- a/src/main/java/com/booleanuk/api/cinema/repository/ScreeningRepository.java +++ b/src/main/java/com/booleanuk/api/cinema/repository/ScreeningRepository.java @@ -1,7 +1,11 @@ package com.booleanuk.api.cinema.repository; +import com.booleanuk.api.cinema.models.Movie; import com.booleanuk.api.cinema.models.Screening; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface ScreeningRepository extends JpaRepository { + List findByMovie(Movie movie); } From 72e9882b2e02ca79db125481549cca22b7933a91 Mon Sep 17 00:00:00 2001 From: Ludwig J Lundborg Date: Fri, 13 Sep 2024 11:59:28 +0200 Subject: [PATCH 08/11] Added correct Responses for all controllers --- .../controllers/CustomerController.java | 34 +++++++++++++------ .../cinema/controllers/MovieController.java | 33 +++++++++++++----- .../controllers/ScreeningController.java | 19 +++++++---- .../cinema/controllers/TicketController.java | 18 +++++++--- .../responses/CustomerListResponse.java | 8 +++++ .../cinema/responses/CustomerResponse.java | 7 ++++ .../cinema/responses/MovieListResponse.java | 7 ++++ .../api/cinema/responses/MovieResponse.java | 6 ++++ .../api/cinema/responses/Response.java | 20 +++++++++++ .../responses/ScreeningListResponse.java | 7 ++++ .../cinema/responses/ScreeningResponse.java | 6 ++++ .../cinema/responses/TicketListResponse.java | 7 ++++ .../api/cinema/responses/TicketResponse.java | 6 ++++ 13 files changed, 149 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/booleanuk/api/cinema/responses/CustomerListResponse.java create mode 100644 src/main/java/com/booleanuk/api/cinema/responses/CustomerResponse.java create mode 100644 src/main/java/com/booleanuk/api/cinema/responses/MovieListResponse.java create mode 100644 src/main/java/com/booleanuk/api/cinema/responses/MovieResponse.java create mode 100644 src/main/java/com/booleanuk/api/cinema/responses/Response.java create mode 100644 src/main/java/com/booleanuk/api/cinema/responses/ScreeningListResponse.java create mode 100644 src/main/java/com/booleanuk/api/cinema/responses/ScreeningResponse.java create mode 100644 src/main/java/com/booleanuk/api/cinema/responses/TicketListResponse.java create mode 100644 src/main/java/com/booleanuk/api/cinema/responses/TicketResponse.java diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java index 13afd524..89acfd77 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java @@ -2,6 +2,9 @@ import com.booleanuk.api.cinema.models.Customer; import com.booleanuk.api.cinema.repository.CustomerRepository; +import com.booleanuk.api.cinema.responses.CustomerListResponse; +import com.booleanuk.api.cinema.responses.CustomerResponse; +import com.booleanuk.api.cinema.responses.Response; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -15,41 +18,50 @@ @RequestMapping("customers") public class CustomerController { + private CustomerListResponse customerListResponse = new CustomerListResponse(); + private CustomerResponse customerResponse = new CustomerResponse(); + @Autowired private CustomerRepository customerRepository; @GetMapping - public List getAllCustomers () { - return this.customerRepository.findAll(); + public ResponseEntity> getAllCustomers () { + List customers = customerRepository.findAll(); + this.customerListResponse.set(customers); + + return ResponseEntity.ok(customerListResponse); } @PostMapping - public ResponseEntity createCustomer(@RequestBody Customer customer){ + public ResponseEntity> createCustomer(@RequestBody Customer customer){ customer.setCreatedAt(LocalDateTime.now()); customer.setUpdatedAt(LocalDateTime.now()); + this.customerResponse.set(customer); + this.customerRepository.save(customer); - return new ResponseEntity(this.customerRepository.save(customer), HttpStatus.CREATED); + return new ResponseEntity<>(customerResponse, HttpStatus.CREATED); } @PutMapping("{id}") - public ResponseEntity updateCustomer(@PathVariable int id, @RequestBody Customer customer){ + public ResponseEntity> updateCustomer(@PathVariable int id, @RequestBody Customer customer){ Customer customerToUpdate = this.customerRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found..")); customerToUpdate.setName(customer.getName()); customerToUpdate.setEmail(customer.getEmail()); customerToUpdate.setPhone(customer.getPhone()); - customerToUpdate.setUpdatedAt(LocalDateTime.now()); + this.customerResponse.set(customerToUpdate); + this.customerRepository.save(customerToUpdate); - return new ResponseEntity(this.customerRepository.save(customerToUpdate), HttpStatus.CREATED); + return new ResponseEntity<>(customerResponse, HttpStatus.CREATED); } @DeleteMapping("{id}") - public ResponseEntity deleteCustomer(@PathVariable int id){ + public ResponseEntity> deleteCustomer(@PathVariable int id){ Customer customerToDelete = this.customerRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); - + this.customerResponse.set(customerToDelete); this.customerRepository.delete(customerToDelete); - return ResponseEntity.ok(customerToDelete); - } + return ResponseEntity.ok(customerResponse); + } } diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java index dfeb79f1..f7aadf6e 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java @@ -5,6 +5,9 @@ import com.booleanuk.api.cinema.models.Screening; import com.booleanuk.api.cinema.repository.MovieRepository; import com.booleanuk.api.cinema.repository.ScreeningRepository; +import com.booleanuk.api.cinema.responses.MovieListResponse; +import com.booleanuk.api.cinema.responses.MovieResponse; +import com.booleanuk.api.cinema.responses.Response; import com.fasterxml.jackson.annotation.JsonIgnore; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -25,21 +28,30 @@ public class MovieController { @Autowired private ScreeningRepository screeningRepository; + private MovieResponse movieResponse = new MovieResponse(); + private MovieListResponse movieListResponse = new MovieListResponse(); + @GetMapping - public List getAllMovies(){ - return this.movieRepository.findAll(); + public ResponseEntity> getAllMovies(){ + List movies = this.movieRepository.findAll(); + this.movieListResponse.set(movies); + + return ResponseEntity.ok(movieListResponse); } @PostMapping - public ResponseEntity createMovie(@RequestBody Movie movie){ + public ResponseEntity> createMovie(@RequestBody Movie movie){ movie.setCreatedTime(LocalDateTime.now()); movie.setUpdatedTime(LocalDateTime.now()); - return new ResponseEntity(this.movieRepository.save(movie), HttpStatus.CREATED); + this.movieRepository.save(movie); + this.movieResponse.set(movie); + + return new ResponseEntity<>(movieResponse, HttpStatus.CREATED); } @PutMapping("{id}") - public ResponseEntity updateMovie(@PathVariable int id, @RequestBody Movie movie){ + public ResponseEntity> updateMovie(@PathVariable int id, @RequestBody Movie movie){ Movie movieToUpdate = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); movieToUpdate.setTitle(movie.getTitle()); @@ -47,14 +59,19 @@ public ResponseEntity updateMovie(@PathVariable int id, @RequestBody Movi movieToUpdate.setDescription(movie.getDescription()); movieToUpdate.setRuntimeMins(movie.getRuntimeMins()); - return new ResponseEntity(this.movieRepository.save(movieToUpdate), HttpStatus.CREATED); + this.movieRepository.save(movieToUpdate); + this.movieResponse.set(movieToUpdate); + + return new ResponseEntity<>(movieResponse, HttpStatus.CREATED); } @DeleteMapping("{id}") - public ResponseEntity deleteMovie(@PathVariable int id){ + public ResponseEntity> deleteMovie(@PathVariable int id){ Movie movieToDelete = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); this.movieRepository.delete(movieToDelete); - return ResponseEntity.ok(movieToDelete); + this.movieResponse.set(movieToDelete); + + return ResponseEntity.ok(movieResponse); } } diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java index 3c43beee..6925e5c3 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java @@ -6,6 +6,8 @@ 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 com.booleanuk.api.cinema.responses.ScreeningListResponse; import com.booleanuk.api.cinema.responses.ScreeningResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -29,17 +31,20 @@ public class ScreeningController { @Autowired private TicketRepository ticketRepository; + private ScreeningResponse screeningResponse = new ScreeningResponse(); + private ScreeningListResponse screeningListResponse = new ScreeningListResponse(); + @GetMapping - public ResponseEntity> getAllScreening(@PathVariable int id) { + public ResponseEntity> getAllScreening(@PathVariable int id) { Movie movie = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); - List screeningsList = this.screeningRepository.findByMovie(movie); + this.screeningListResponse.set(screeningsList); - return ResponseEntity.ok(screeningsList); + return ResponseEntity.ok(screeningListResponse); } @PostMapping - public ResponseEntity createScreening(@PathVariable int id, @RequestBody Screening screening){ + public ResponseEntity> createScreening(@PathVariable int id, @RequestBody Screening screening){ Movie movie = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found..")); screening.setMovie(movie); @@ -47,9 +52,11 @@ public ResponseEntity createScreening(@PathVariable int id, @RequestB screening.setUpdatedAt(LocalDateTime.now()); movie.addScreening(screening); - return new ResponseEntity(this.screeningRepository.save(screening), HttpStatus.CREATED); - } + this.screeningRepository.save(screening); + this.screeningResponse.set(screening); + return new ResponseEntity<>(screeningResponse, HttpStatus.CREATED); + } } diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java index 2b5fb7b5..bf207392 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java @@ -6,6 +6,9 @@ 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.Response; +import com.booleanuk.api.cinema.responses.TicketListResponse; +import com.booleanuk.api.cinema.responses.TicketResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; import org.springframework.http.HttpStatus; @@ -29,8 +32,11 @@ public class TicketController { @Autowired private CustomerRepository customerRepository; + private TicketResponse ticketResponse = new TicketResponse(); + private TicketListResponse ticketListResponse = new TicketListResponse(); + @PostMapping("{customerId}/screenings/{screeningId}") - public ResponseEntity createTicket(@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId, @RequestBody Ticket ticket){ + public ResponseEntity> createTicket(@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId, @RequestBody Ticket ticket){ Customer customer = this.customerRepository.findById(customerId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found 1..")); Screening screening = this.screeningRepository.findById(screeningId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found. 2.")); @@ -40,18 +46,22 @@ public ResponseEntity createTicket(@PathVariable(name = "customerId") in ticket.setCreatedAt(LocalDateTime.now()); ticket.setUpdatedAt(LocalDateTime.now()); - return new ResponseEntity(this.ticketRepository.save(ticket), HttpStatus.CREATED); + this.ticketRepository.save(ticket); + this.ticketResponse.set(ticket); + + return new ResponseEntity<>(ticketResponse, HttpStatus.CREATED); } @GetMapping("{customerId}/screenings/{screeningId}") - public ResponseEntity> getAllTickets (@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId){ + public ResponseEntity> getAllTickets (@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId){ Customer customer = this.customerRepository.findById(customerId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found ..1")); Screening screening = this.screeningRepository.findById(screeningId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found ..2")); List ticketList = this.ticketRepository.findAllByCustomerIdAndScreeningId(customer.getId(), screening.getId()); + this.ticketListResponse.set(ticketList); - return ResponseEntity.ok(ticketList); + return ResponseEntity.ok(ticketListResponse); } } diff --git a/src/main/java/com/booleanuk/api/cinema/responses/CustomerListResponse.java b/src/main/java/com/booleanuk/api/cinema/responses/CustomerListResponse.java new file mode 100644 index 00000000..922e02f0 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/CustomerListResponse.java @@ -0,0 +1,8 @@ +package com.booleanuk.api.cinema.responses; + +import com.booleanuk.api.cinema.models.Customer; + +import java.util.List; + +public class CustomerListResponse extends Response>{ +} diff --git a/src/main/java/com/booleanuk/api/cinema/responses/CustomerResponse.java b/src/main/java/com/booleanuk/api/cinema/responses/CustomerResponse.java new file mode 100644 index 00000000..c8575ada --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/CustomerResponse.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.responses; + +import com.booleanuk.api.cinema.models.Customer; + +public class CustomerResponse extends Response{ + +} diff --git a/src/main/java/com/booleanuk/api/cinema/responses/MovieListResponse.java b/src/main/java/com/booleanuk/api/cinema/responses/MovieListResponse.java new file mode 100644 index 00000000..412a0c84 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/MovieListResponse.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.responses; + +import com.booleanuk.api.cinema.models.Movie; +import java.util.List; + +public class MovieListResponse extends Response>{ +} diff --git a/src/main/java/com/booleanuk/api/cinema/responses/MovieResponse.java b/src/main/java/com/booleanuk/api/cinema/responses/MovieResponse.java new file mode 100644 index 00000000..322c9748 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/MovieResponse.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.cinema.responses; + +import com.booleanuk.api.cinema.models.Movie; + +public class MovieResponse extends Response{ +} 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..eb84f66c --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/Response.java @@ -0,0 +1,20 @@ +package com.booleanuk.api.cinema.responses; + +public class Response { + protected String status; + protected T data; + + public void set(T data){ + this.status = "success"; + this.data = data; + + } + + public String getStatus() { + return status; + } + + public T getData() { + return data; + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/responses/ScreeningListResponse.java b/src/main/java/com/booleanuk/api/cinema/responses/ScreeningListResponse.java new file mode 100644 index 00000000..e96aa6cd --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/ScreeningListResponse.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.responses; + +import com.booleanuk.api.cinema.models.Screening; +import java.util.List; + +public class ScreeningListResponse extends Response>{ +} diff --git a/src/main/java/com/booleanuk/api/cinema/responses/ScreeningResponse.java b/src/main/java/com/booleanuk/api/cinema/responses/ScreeningResponse.java new file mode 100644 index 00000000..9d817467 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/ScreeningResponse.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.cinema.responses; + +import com.booleanuk.api.cinema.models.Screening; + +public class ScreeningResponse extends Response{ +} diff --git a/src/main/java/com/booleanuk/api/cinema/responses/TicketListResponse.java b/src/main/java/com/booleanuk/api/cinema/responses/TicketListResponse.java new file mode 100644 index 00000000..60a2dcea --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/TicketListResponse.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.responses; + +import com.booleanuk.api.cinema.models.Ticket; +import java.util.List; + +public class TicketListResponse extends Response>{ +} diff --git a/src/main/java/com/booleanuk/api/cinema/responses/TicketResponse.java b/src/main/java/com/booleanuk/api/cinema/responses/TicketResponse.java new file mode 100644 index 00000000..f3bd55c9 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/TicketResponse.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.cinema.responses; + +import com.booleanuk.api.cinema.models.Ticket; + +public class TicketResponse extends Response{ +} From a25693fde8b529cbc4d16659a2d1469ec461db4d Mon Sep 17 00:00:00 2001 From: Ludwig J Lundborg Date: Fri, 13 Sep 2024 15:04:10 +0200 Subject: [PATCH 09/11] Added Error Responses for all controllers --- .../controllers/CustomerController.java | 33 +++++++++++++++++-- .../cinema/controllers/MovieController.java | 28 ++++++++++++++-- .../controllers/ScreeningController.java | 26 +++++++++++++-- .../cinema/controllers/TicketController.java | 32 ++++++++++++++---- .../api/cinema/responses/ErrorResponse.java | 16 +++++++++ 5 files changed, 120 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/booleanuk/api/cinema/responses/ErrorResponse.java diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java index 89acfd77..eeceda77 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java @@ -4,12 +4,12 @@ import com.booleanuk.api.cinema.repository.CustomerRepository; import com.booleanuk.api.cinema.responses.CustomerListResponse; import com.booleanuk.api.cinema.responses.CustomerResponse; +import com.booleanuk.api.cinema.responses.ErrorResponse; import com.booleanuk.api.cinema.responses.Response; import org.springframework.beans.factory.annotation.Autowired; 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; @@ -34,6 +34,14 @@ public ResponseEntity> getAllCustomers () { @PostMapping public ResponseEntity> createCustomer(@RequestBody Customer customer){ + + if (customer.getName() == null || customer.getEmail() == null || customer.getPhone() == null){ + ErrorResponse error = new ErrorResponse(); + error.set("Could not create a new customer, please check all fields are correct"); + + return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST); + } + customer.setCreatedAt(LocalDateTime.now()); customer.setUpdatedAt(LocalDateTime.now()); this.customerResponse.set(customer); @@ -44,7 +52,19 @@ public ResponseEntity> createCustomer(@RequestBody Customer customer @PutMapping("{id}") public ResponseEntity> updateCustomer(@PathVariable int id, @RequestBody Customer customer){ - Customer customerToUpdate = this.customerRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found..")); + + if (customer.getName() == null || customer.getEmail() == null || customer.getPhone() == null){ + ErrorResponse error = new ErrorResponse(); + error.set("Could not create a new customer, please check all fields are correct"); + return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST); + } + + Customer customerToUpdate = customerRepository.findById(id).orElse(null); + if(customerToUpdate == null){ + ErrorResponse error = new ErrorResponse(); + error.set("No customer with that ID found"); + return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); + } customerToUpdate.setName(customer.getName()); customerToUpdate.setEmail(customer.getEmail()); @@ -58,7 +78,14 @@ public ResponseEntity> updateCustomer(@PathVariable int id, @Request @DeleteMapping("{id}") public ResponseEntity> deleteCustomer(@PathVariable int id){ - Customer customerToDelete = this.customerRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); + + Customer customerToDelete = this.customerRepository.findById(id).orElse(null); + if (customerToDelete == null){ + ErrorResponse error = new ErrorResponse(); + error.set("No customer with that ID found"); + return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); + } + this.customerResponse.set(customerToDelete); this.customerRepository.delete(customerToDelete); diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java index f7aadf6e..1e2f8f79 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java @@ -5,6 +5,7 @@ import com.booleanuk.api.cinema.models.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.MovieListResponse; import com.booleanuk.api.cinema.responses.MovieResponse; import com.booleanuk.api.cinema.responses.Response; @@ -41,6 +42,12 @@ public ResponseEntity> getAllMovies(){ @PostMapping public ResponseEntity> createMovie(@RequestBody Movie movie){ + if (movie.getTitle() == null || movie.getRating() == null || movie.getDescription() == null || movie.getRuntimeMins() <= 0){ + ErrorResponse error = new ErrorResponse(); + error.set("Could not create a new movie, please check all fields are correct"); + return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST); + } + movie.setCreatedTime(LocalDateTime.now()); movie.setUpdatedTime(LocalDateTime.now()); @@ -52,7 +59,18 @@ public ResponseEntity> createMovie(@RequestBody Movie movie){ @PutMapping("{id}") public ResponseEntity> updateMovie(@PathVariable int id, @RequestBody Movie movie){ - Movie movieToUpdate = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); + if (movie.getTitle() == null || movie.getRating() == null || movie.getDescription() == null || movie.getRuntimeMins() <= 0){ + ErrorResponse error = new ErrorResponse(); + error.set("Could not create a new movie, please check all fields are correct"); + return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST); + } + + Movie movieToUpdate = this.movieRepository.findById(id).orElse(null); + if (movieToUpdate == null){ + ErrorResponse error = new ErrorResponse(); + error.set("No movie with that id found"); + return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); + } movieToUpdate.setTitle(movie.getTitle()); movieToUpdate.setRating(movie.getRating()); @@ -67,7 +85,13 @@ public ResponseEntity> updateMovie(@PathVariable int id, @RequestBod @DeleteMapping("{id}") public ResponseEntity> deleteMovie(@PathVariable int id){ - Movie movieToDelete = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); + Movie movieToDelete = this.movieRepository.findById(id).orElse(null); + if (movieToDelete == null){ + ErrorResponse error = new ErrorResponse(); + error.set("No movie with that id found"); + + return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); + } this.movieRepository.delete(movieToDelete); this.movieResponse.set(movieToDelete); diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java index 6925e5c3..49e318ea 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java @@ -6,6 +6,7 @@ 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.ErrorResponse; import com.booleanuk.api.cinema.responses.Response; import com.booleanuk.api.cinema.responses.ScreeningListResponse; import com.booleanuk.api.cinema.responses.ScreeningResponse; @@ -36,7 +37,14 @@ public class ScreeningController { @GetMapping public ResponseEntity> getAllScreening(@PathVariable int id) { - Movie movie = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found")); + Movie movie = this.movieRepository.findById(id).orElse(null); + if (movie == null){ + ErrorResponse error = new ErrorResponse(); + error.set("No movie with that id found"); + + return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); + } + List screeningsList = this.screeningRepository.findByMovie(movie); this.screeningListResponse.set(screeningsList); @@ -45,7 +53,20 @@ public ResponseEntity> getAllScreening(@PathVariable int id) { @PostMapping public ResponseEntity> createScreening(@PathVariable int id, @RequestBody Screening screening){ - Movie movie = this.movieRepository.findById(id).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found..")); + if (screening.getScreenNumber() <= 0 || screening.getCapacity() <= 0 || screening.getStartsAt() == null){ + ErrorResponse error = new ErrorResponse(); + error.set("Could not create a screening for the specified movie, please check all fields are correct"); + + return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST); + } + + Movie movie = this.movieRepository.findById(id).orElse(null); + if (movie == null){ + ErrorResponse error = new ErrorResponse(); + error.set("No movie with that id found"); + + return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); + } screening.setMovie(movie); screening.setCreatedAt(LocalDateTime.now()); @@ -55,7 +76,6 @@ public ResponseEntity> createScreening(@PathVariable int id, @Reques this.screeningRepository.save(screening); this.screeningResponse.set(screening); - return new ResponseEntity<>(screeningResponse, HttpStatus.CREATED); } diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java index bf207392..b06faf1b 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java @@ -6,15 +6,14 @@ 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 com.booleanuk.api.cinema.responses.TicketListResponse; import com.booleanuk.api.cinema.responses.TicketResponse; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; 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; @@ -38,8 +37,15 @@ public class TicketController { @PostMapping("{customerId}/screenings/{screeningId}") public ResponseEntity> createTicket(@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId, @RequestBody Ticket ticket){ - Customer customer = this.customerRepository.findById(customerId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found 1..")); - Screening screening = this.screeningRepository.findById(screeningId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found. 2.")); + Customer customer = this.customerRepository.findById(customerId).orElse(null); + Screening screening = this.screeningRepository.findById(screeningId).orElse(null); + + if (customer == null || screening == null){ + ErrorResponse error = new ErrorResponse(); + error.set("No customer or screening with those ids found"); + + new ResponseEntity<>(error, HttpStatus.NOT_FOUND); + } ticket.setCustomer(customer); ticket.setScreening(screening); @@ -55,12 +61,24 @@ public ResponseEntity> createTicket(@PathVariable(name = "customerId @GetMapping("{customerId}/screenings/{screeningId}") public ResponseEntity> getAllTickets (@PathVariable(name = "customerId") int customerId, @PathVariable(name = "screeningId") int screeningId){ - Customer customer = this.customerRepository.findById(customerId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found ..1")); - Screening screening = this.screeningRepository.findById(screeningId).orElseThrow(()-> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not Found ..2")); + Customer customer = this.customerRepository.findById(customerId).orElse(null); + Screening screening = this.screeningRepository.findById(screeningId).orElse(null); + if (customer == null || screening == null){ + ErrorResponse error = new ErrorResponse(); + error.set("No customer or screening with those ids found"); + + return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); + } List ticketList = this.ticketRepository.findAllByCustomerIdAndScreeningId(customer.getId(), screening.getId()); - this.ticketListResponse.set(ticketList); + if (ticketList.isEmpty()){ + ErrorResponse error = new ErrorResponse(); + error.set("No ticket found for the customer and screening with those ids found"); + + return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); + } + this.ticketListResponse.set(ticketList); return ResponseEntity.ok(ticketListResponse); } 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..97570caa --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/responses/ErrorResponse.java @@ -0,0 +1,16 @@ +package com.booleanuk.api.cinema.responses; + +import java.util.HashMap; +import java.util.Map; + +public class ErrorResponse extends Response>{ + + public void set(String message){ + this.status = "error"; + Map reply = new HashMap<>(); + reply.put("message", message); + this.data = reply; + } + + +} From f9a83754ef793cd2a4be7d7809d4e9e91a6a4b10 Mon Sep 17 00:00:00 2001 From: Ludwig J Lundborg Date: Fri, 13 Sep 2024 15:20:41 +0200 Subject: [PATCH 10/11] Extension finished --- .../api/cinema/controllers/CustomerController.java | 8 ++++---- .../api/cinema/controllers/MovieController.java | 12 ++++-------- .../api/cinema/controllers/ScreeningController.java | 10 ++++------ .../api/cinema/controllers/TicketController.java | 8 ++++---- .../CustomerListResponse.java | 2 +- .../{responses => response}/CustomerResponse.java | 2 +- .../{responses => response}/ErrorResponse.java | 2 +- .../{responses => response}/MovieListResponse.java | 2 +- .../{responses => response}/MovieResponse.java | 2 +- .../api/cinema/{responses => response}/Response.java | 2 +- .../ScreeningListResponse.java | 2 +- .../{responses => response}/ScreeningResponse.java | 2 +- .../{responses => response}/TicketListResponse.java | 2 +- .../{responses => response}/TicketResponse.java | 2 +- 14 files changed, 26 insertions(+), 32 deletions(-) rename src/main/java/com/booleanuk/api/cinema/{responses => response}/CustomerListResponse.java (76%) rename src/main/java/com/booleanuk/api/cinema/{responses => response}/CustomerResponse.java (71%) rename src/main/java/com/booleanuk/api/cinema/{responses => response}/ErrorResponse.java (87%) rename src/main/java/com/booleanuk/api/cinema/{responses => response}/MovieListResponse.java (75%) rename src/main/java/com/booleanuk/api/cinema/{responses => response}/MovieResponse.java (69%) rename src/main/java/com/booleanuk/api/cinema/{responses => response}/Response.java (87%) rename src/main/java/com/booleanuk/api/cinema/{responses => response}/ScreeningListResponse.java (76%) rename src/main/java/com/booleanuk/api/cinema/{responses => response}/ScreeningResponse.java (72%) rename src/main/java/com/booleanuk/api/cinema/{responses => response}/TicketListResponse.java (75%) rename src/main/java/com/booleanuk/api/cinema/{responses => response}/TicketResponse.java (70%) diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java index eeceda77..0e52624c 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/CustomerController.java @@ -2,10 +2,10 @@ import com.booleanuk.api.cinema.models.Customer; import com.booleanuk.api.cinema.repository.CustomerRepository; -import com.booleanuk.api.cinema.responses.CustomerListResponse; -import com.booleanuk.api.cinema.responses.CustomerResponse; -import com.booleanuk.api.cinema.responses.ErrorResponse; -import com.booleanuk.api.cinema.responses.Response; +import com.booleanuk.api.cinema.response.CustomerListResponse; +import com.booleanuk.api.cinema.response.CustomerResponse; +import com.booleanuk.api.cinema.response.ErrorResponse; +import com.booleanuk.api.cinema.response.Response; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java index 1e2f8f79..bf94fcfb 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/MovieController.java @@ -1,20 +1,16 @@ package com.booleanuk.api.cinema.controllers; -import com.booleanuk.api.cinema.models.Customer; import com.booleanuk.api.cinema.models.Movie; -import com.booleanuk.api.cinema.models.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.MovieListResponse; -import com.booleanuk.api.cinema.responses.MovieResponse; -import com.booleanuk.api.cinema.responses.Response; -import com.fasterxml.jackson.annotation.JsonIgnore; +import com.booleanuk.api.cinema.response.ErrorResponse; +import com.booleanuk.api.cinema.response.MovieListResponse; +import com.booleanuk.api.cinema.response.MovieResponse; +import com.booleanuk.api.cinema.response.Response; import org.springframework.beans.factory.annotation.Autowired; 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; diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java index 49e318ea..b9b8569a 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/ScreeningController.java @@ -2,19 +2,17 @@ import com.booleanuk.api.cinema.models.Movie; import com.booleanuk.api.cinema.models.Screening; -import com.booleanuk.api.cinema.models.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.ErrorResponse; -import com.booleanuk.api.cinema.responses.Response; -import com.booleanuk.api.cinema.responses.ScreeningListResponse; -import com.booleanuk.api.cinema.responses.ScreeningResponse; +import com.booleanuk.api.cinema.response.ErrorResponse; +import com.booleanuk.api.cinema.response.Response; +import com.booleanuk.api.cinema.response.ScreeningListResponse; +import com.booleanuk.api.cinema.response.ScreeningResponse; import org.springframework.beans.factory.annotation.Autowired; 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; diff --git a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java index b06faf1b..34e863c9 100644 --- a/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java +++ b/src/main/java/com/booleanuk/api/cinema/controllers/TicketController.java @@ -6,10 +6,10 @@ 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 com.booleanuk.api.cinema.responses.TicketListResponse; -import com.booleanuk.api.cinema.responses.TicketResponse; +import com.booleanuk.api.cinema.response.ErrorResponse; +import com.booleanuk.api.cinema.response.Response; +import com.booleanuk.api.cinema.response.TicketListResponse; +import com.booleanuk.api.cinema.response.TicketResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/com/booleanuk/api/cinema/responses/CustomerListResponse.java b/src/main/java/com/booleanuk/api/cinema/response/CustomerListResponse.java similarity index 76% rename from src/main/java/com/booleanuk/api/cinema/responses/CustomerListResponse.java rename to src/main/java/com/booleanuk/api/cinema/response/CustomerListResponse.java index 922e02f0..d4771cd8 100644 --- a/src/main/java/com/booleanuk/api/cinema/responses/CustomerListResponse.java +++ b/src/main/java/com/booleanuk/api/cinema/response/CustomerListResponse.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.cinema.responses; +package com.booleanuk.api.cinema.response; import com.booleanuk.api.cinema.models.Customer; diff --git a/src/main/java/com/booleanuk/api/cinema/responses/CustomerResponse.java b/src/main/java/com/booleanuk/api/cinema/response/CustomerResponse.java similarity index 71% rename from src/main/java/com/booleanuk/api/cinema/responses/CustomerResponse.java rename to src/main/java/com/booleanuk/api/cinema/response/CustomerResponse.java index c8575ada..ccf0c689 100644 --- a/src/main/java/com/booleanuk/api/cinema/responses/CustomerResponse.java +++ b/src/main/java/com/booleanuk/api/cinema/response/CustomerResponse.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.cinema.responses; +package com.booleanuk.api.cinema.response; import com.booleanuk.api.cinema.models.Customer; diff --git a/src/main/java/com/booleanuk/api/cinema/responses/ErrorResponse.java b/src/main/java/com/booleanuk/api/cinema/response/ErrorResponse.java similarity index 87% rename from src/main/java/com/booleanuk/api/cinema/responses/ErrorResponse.java rename to src/main/java/com/booleanuk/api/cinema/response/ErrorResponse.java index 97570caa..ea9855c3 100644 --- a/src/main/java/com/booleanuk/api/cinema/responses/ErrorResponse.java +++ b/src/main/java/com/booleanuk/api/cinema/response/ErrorResponse.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.cinema.responses; +package com.booleanuk.api.cinema.response; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/booleanuk/api/cinema/responses/MovieListResponse.java b/src/main/java/com/booleanuk/api/cinema/response/MovieListResponse.java similarity index 75% rename from src/main/java/com/booleanuk/api/cinema/responses/MovieListResponse.java rename to src/main/java/com/booleanuk/api/cinema/response/MovieListResponse.java index 412a0c84..7b8c888e 100644 --- a/src/main/java/com/booleanuk/api/cinema/responses/MovieListResponse.java +++ b/src/main/java/com/booleanuk/api/cinema/response/MovieListResponse.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.cinema.responses; +package com.booleanuk.api.cinema.response; import com.booleanuk.api.cinema.models.Movie; import java.util.List; diff --git a/src/main/java/com/booleanuk/api/cinema/responses/MovieResponse.java b/src/main/java/com/booleanuk/api/cinema/response/MovieResponse.java similarity index 69% rename from src/main/java/com/booleanuk/api/cinema/responses/MovieResponse.java rename to src/main/java/com/booleanuk/api/cinema/response/MovieResponse.java index 322c9748..699dfeed 100644 --- a/src/main/java/com/booleanuk/api/cinema/responses/MovieResponse.java +++ b/src/main/java/com/booleanuk/api/cinema/response/MovieResponse.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.cinema.responses; +package com.booleanuk.api.cinema.response; import com.booleanuk.api.cinema.models.Movie; diff --git a/src/main/java/com/booleanuk/api/cinema/responses/Response.java b/src/main/java/com/booleanuk/api/cinema/response/Response.java similarity index 87% rename from src/main/java/com/booleanuk/api/cinema/responses/Response.java rename to src/main/java/com/booleanuk/api/cinema/response/Response.java index eb84f66c..f90636c3 100644 --- a/src/main/java/com/booleanuk/api/cinema/responses/Response.java +++ b/src/main/java/com/booleanuk/api/cinema/response/Response.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.cinema.responses; +package com.booleanuk.api.cinema.response; public class Response { protected String status; diff --git a/src/main/java/com/booleanuk/api/cinema/responses/ScreeningListResponse.java b/src/main/java/com/booleanuk/api/cinema/response/ScreeningListResponse.java similarity index 76% rename from src/main/java/com/booleanuk/api/cinema/responses/ScreeningListResponse.java rename to src/main/java/com/booleanuk/api/cinema/response/ScreeningListResponse.java index e96aa6cd..3df04396 100644 --- a/src/main/java/com/booleanuk/api/cinema/responses/ScreeningListResponse.java +++ b/src/main/java/com/booleanuk/api/cinema/response/ScreeningListResponse.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.cinema.responses; +package com.booleanuk.api.cinema.response; import com.booleanuk.api.cinema.models.Screening; import java.util.List; diff --git a/src/main/java/com/booleanuk/api/cinema/responses/ScreeningResponse.java b/src/main/java/com/booleanuk/api/cinema/response/ScreeningResponse.java similarity index 72% rename from src/main/java/com/booleanuk/api/cinema/responses/ScreeningResponse.java rename to src/main/java/com/booleanuk/api/cinema/response/ScreeningResponse.java index 9d817467..d40fbafa 100644 --- a/src/main/java/com/booleanuk/api/cinema/responses/ScreeningResponse.java +++ b/src/main/java/com/booleanuk/api/cinema/response/ScreeningResponse.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.cinema.responses; +package com.booleanuk.api.cinema.response; import com.booleanuk.api.cinema.models.Screening; diff --git a/src/main/java/com/booleanuk/api/cinema/responses/TicketListResponse.java b/src/main/java/com/booleanuk/api/cinema/response/TicketListResponse.java similarity index 75% rename from src/main/java/com/booleanuk/api/cinema/responses/TicketListResponse.java rename to src/main/java/com/booleanuk/api/cinema/response/TicketListResponse.java index 60a2dcea..7f8b58c4 100644 --- a/src/main/java/com/booleanuk/api/cinema/responses/TicketListResponse.java +++ b/src/main/java/com/booleanuk/api/cinema/response/TicketListResponse.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.cinema.responses; +package com.booleanuk.api.cinema.response; import com.booleanuk.api.cinema.models.Ticket; import java.util.List; diff --git a/src/main/java/com/booleanuk/api/cinema/responses/TicketResponse.java b/src/main/java/com/booleanuk/api/cinema/response/TicketResponse.java similarity index 70% rename from src/main/java/com/booleanuk/api/cinema/responses/TicketResponse.java rename to src/main/java/com/booleanuk/api/cinema/response/TicketResponse.java index f3bd55c9..a2ff7831 100644 --- a/src/main/java/com/booleanuk/api/cinema/responses/TicketResponse.java +++ b/src/main/java/com/booleanuk/api/cinema/response/TicketResponse.java @@ -1,4 +1,4 @@ -package com.booleanuk.api.cinema.responses; +package com.booleanuk.api.cinema.response; import com.booleanuk.api.cinema.models.Ticket; From 210b4cf08c644d6c121370053ee931fe689fb0a1 Mon Sep 17 00:00:00 2001 From: Ludwig J Lundborg Date: Fri, 13 Sep 2024 16:06:41 +0200 Subject: [PATCH 11/11] Added DTOs for filtering --- .../booleanuk/api/cinema/dto/MovieDto.java | 81 +++++++++++++++++++ .../api/cinema/dto/ScreeningDto.java | 41 ++++++++++ .../booleanuk/api/cinema/dto/TicketDto.java | 59 ++++++++++++++ .../api/cinema/response/MovieDtoResponse.java | 7 ++ .../api/cinema/response/MovieResponse.java | 1 + .../cinema/response/ScreeningDtoResponse.java | 6 ++ .../cinema/response/TicketDtoResponse.java | 6 ++ .../api/cinema/response/TicketResponse.java | 1 + 8 files changed, 202 insertions(+) create mode 100644 src/main/java/com/booleanuk/api/cinema/dto/MovieDto.java create mode 100644 src/main/java/com/booleanuk/api/cinema/dto/ScreeningDto.java create mode 100644 src/main/java/com/booleanuk/api/cinema/dto/TicketDto.java create mode 100644 src/main/java/com/booleanuk/api/cinema/response/MovieDtoResponse.java create mode 100644 src/main/java/com/booleanuk/api/cinema/response/ScreeningDtoResponse.java create mode 100644 src/main/java/com/booleanuk/api/cinema/response/TicketDtoResponse.java diff --git a/src/main/java/com/booleanuk/api/cinema/dto/MovieDto.java b/src/main/java/com/booleanuk/api/cinema/dto/MovieDto.java new file mode 100644 index 00000000..8f0b6498 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/dto/MovieDto.java @@ -0,0 +1,81 @@ +package com.booleanuk.api.cinema.dto; + +import com.booleanuk.api.cinema.models.Movie; + +import java.time.LocalDateTime; + +public class MovieDto { + private int id; + private String title; + private String rating; + private String description; + private int runtimeMins; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + + public MovieDto(Movie movie) { + this.id = movie.getId(); + this.title = movie.getTitle(); + this.rating = movie.getRating(); + this.description = movie.getDescription(); + this.runtimeMins = movie.getRuntimeMins(); + this.createdAt = movie.getCreatedTime(); + this.updatedAt = movie.getUpdatedTime(); + } + + 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/dto/ScreeningDto.java b/src/main/java/com/booleanuk/api/cinema/dto/ScreeningDto.java new file mode 100644 index 00000000..25b9301b --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/dto/ScreeningDto.java @@ -0,0 +1,41 @@ +package com.booleanuk.api.cinema.dto; + +import com.booleanuk.api.cinema.models.Screening; + +import java.time.LocalDateTime; + +public class ScreeningDto { + private int screenNumber; + private int capacity; + private LocalDateTime statsAt; + + public ScreeningDto(Screening screening) { + this.screenNumber = screening.getScreenNumber(); + this.capacity = screening.getCapacity(); + this.statsAt = screening.getStartsAt(); + } + + 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 getStatsAt() { + return statsAt; + } + + public void setStatsAt(LocalDateTime statsAt) { + this.statsAt = statsAt; + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/dto/TicketDto.java b/src/main/java/com/booleanuk/api/cinema/dto/TicketDto.java new file mode 100644 index 00000000..b5a5048e --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/dto/TicketDto.java @@ -0,0 +1,59 @@ +package com.booleanuk.api.cinema.dto; + +import com.booleanuk.api.cinema.models.Ticket; + +public class TicketDto { + private int customerId; + private String name; + private int screeningId; + private String title; + private int numSeats; + + public TicketDto(Ticket ticket) { + this.customerId = ticket.getCustomer().getId(); + this.name = ticket.getCustomer().getName(); + this.screeningId = ticket.getScreening().getId(); + this.title = ticket.getScreening().getMovie().getTitle(); + this.numSeats = ticket.getNumSeats(); + } + + public int getCustomerId() { + return customerId; + } + + public void setCustomerId(int customerId) { + this.customerId = customerId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getScreeningId() { + return screeningId; + } + + public void setScreeningId(int screeningId) { + this.screeningId = screeningId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getNumSeats() { + return numSeats; + } + + public void setNumSeats(int numSeats) { + this.numSeats = numSeats; + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/response/MovieDtoResponse.java b/src/main/java/com/booleanuk/api/cinema/response/MovieDtoResponse.java new file mode 100644 index 00000000..50db8118 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/response/MovieDtoResponse.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.response; + +import com.booleanuk.api.cinema.dto.MovieDto; + +public class MovieDtoResponse extends Response{ + +} diff --git a/src/main/java/com/booleanuk/api/cinema/response/MovieResponse.java b/src/main/java/com/booleanuk/api/cinema/response/MovieResponse.java index 699dfeed..ff87bc5e 100644 --- a/src/main/java/com/booleanuk/api/cinema/response/MovieResponse.java +++ b/src/main/java/com/booleanuk/api/cinema/response/MovieResponse.java @@ -1,5 +1,6 @@ package com.booleanuk.api.cinema.response; +import com.booleanuk.api.cinema.dto.MovieDto; import com.booleanuk.api.cinema.models.Movie; public class MovieResponse extends Response{ diff --git a/src/main/java/com/booleanuk/api/cinema/response/ScreeningDtoResponse.java b/src/main/java/com/booleanuk/api/cinema/response/ScreeningDtoResponse.java new file mode 100644 index 00000000..2112186e --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/response/ScreeningDtoResponse.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.cinema.response; + +import com.booleanuk.api.cinema.dto.ScreeningDto; + +public class ScreeningDtoResponse extends Response{ +} diff --git a/src/main/java/com/booleanuk/api/cinema/response/TicketDtoResponse.java b/src/main/java/com/booleanuk/api/cinema/response/TicketDtoResponse.java new file mode 100644 index 00000000..5307a7c0 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/response/TicketDtoResponse.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.cinema.response; + +import com.booleanuk.api.cinema.dto.TicketDto; + +public class TicketDtoResponse extends Response{ +} diff --git a/src/main/java/com/booleanuk/api/cinema/response/TicketResponse.java b/src/main/java/com/booleanuk/api/cinema/response/TicketResponse.java index a2ff7831..9c222ac3 100644 --- a/src/main/java/com/booleanuk/api/cinema/response/TicketResponse.java +++ b/src/main/java/com/booleanuk/api/cinema/response/TicketResponse.java @@ -1,5 +1,6 @@ package com.booleanuk.api.cinema.response; +import com.booleanuk.api.cinema.dto.TicketDto; import com.booleanuk.api.cinema.models.Ticket; public class TicketResponse extends Response{