From af202ed6e33a8369d8d8808aada05581a2b57d47 Mon Sep 17 00:00:00 2001 From: TMajlu Date: Wed, 11 Sep 2024 15:56:18 +0200 Subject: [PATCH 1/8] Started doing the core exercise. --- build.gradle | 2 + .../cinema/Controller/CustomerController.java | 15 +++++++ .../cinema/Controller/MovieController.java | 13 +++++++ .../Controller/ScreeningController.java | 13 +++++++ .../cinema/Controller/TicketController.java | 13 +++++++ .../booleanuk/api/cinema/Model/Customer.java | 32 +++++++++++++++ .../com/booleanuk/api/cinema/Model/Movie.java | 39 +++++++++++++++++++ .../booleanuk/api/cinema/Model/Screening.java | 36 +++++++++++++++++ .../booleanuk/api/cinema/Model/Ticket.java | 30 ++++++++++++++ .../cinema/Repository/CustomerRepository.java | 7 ++++ .../cinema/Repository/MovieRepository.java | 8 ++++ .../Repository/ScreeningRepository.java | 8 ++++ .../cinema/Repository/TicketRepository.java | 8 ++++ 13 files changed, 224 insertions(+) create mode 100644 src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java create mode 100644 src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java create mode 100644 src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java create mode 100644 src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java create mode 100644 src/main/java/com/booleanuk/api/cinema/Model/Customer.java create mode 100644 src/main/java/com/booleanuk/api/cinema/Model/Movie.java create mode 100644 src/main/java/com/booleanuk/api/cinema/Model/Screening.java create mode 100644 src/main/java/com/booleanuk/api/cinema/Model/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 create mode 100644 src/main/java/com/booleanuk/api/cinema/Repository/TicketRepository.java diff --git a/build.gradle b/build.gradle index 3d7f7607..1a2ea1b3 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'org.postgresql:postgresql' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' 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/Controller/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java new file mode 100644 index 00000000..9a9c3e19 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java @@ -0,0 +1,15 @@ +package com.booleanuk.api.cinema.Controller; + +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.util.List; + +@RestController +@RequestMapping("customers") +public class CustomerController { +} diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java b/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java new file mode 100644 index 00000000..0eeaef88 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java @@ -0,0 +1,13 @@ +package com.booleanuk.api.cinema.Controller; + +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.util.List; +@RestController +@RequestMapping("movies") +public class MovieController { +} diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java new file mode 100644 index 00000000..8690cc48 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java @@ -0,0 +1,13 @@ +package com.booleanuk.api.cinema.Controller; + +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.util.List; +@RestController +@RequestMapping("screenings") +public class ScreeningController { +} diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java b/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java new file mode 100644 index 00000000..cd4392b9 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java @@ -0,0 +1,13 @@ +package com.booleanuk.api.cinema.Controller; + +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.util.List; +@RestController +@RequestMapping("tickets") +public class TicketController { +} diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Customer.java b/src/main/java/com/booleanuk/api/cinema/Model/Customer.java new file mode 100644 index 00000000..3d7c9863 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Model/Customer.java @@ -0,0 +1,32 @@ +package com.booleanuk.api.cinema.Model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "customers") +public class Customer { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String name; + + @Column + private String email; + + @Column + private String phone; + + @OneToMany(mappedBy = "customer") + private List tickets; +} diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Movie.java b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java new file mode 100644 index 00000000..2742e1f9 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java @@ -0,0 +1,39 @@ +package com.booleanuk.api.cinema.Model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "movies") + +public class Movie { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String title; + + @Column + private String rating; + + @Column + private String description; + + @Column + private int runtimeMins; + + @OneToMany(mappedBy = "movie") + private List screenings; + + + +} diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Screening.java b/src/main/java/com/booleanuk/api/cinema/Model/Screening.java new file mode 100644 index 00000000..9f51b12b --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Model/Screening.java @@ -0,0 +1,36 @@ +package com.booleanuk.api.cinema.Model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "screenings") + +public class Screening { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + int screenNumber; + + @Column + int capacity; + + @ManyToOne + @JoinColumn(name="movieid", nullable = false) + private Movie movie; + + @OneToMany(mappedBy = "screening") + private List tickets; + + +} diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java b/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java new file mode 100644 index 00000000..ec450988 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java @@ -0,0 +1,30 @@ +package com.booleanuk.api.cinema.Model; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "tickets") + +public class Ticket { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private int numSeats; + + @ManyToOne + @JoinColumn(name="customerId", nullable = false) + private Customer customer; + + @ManyToOne + @JoinColumn(name="screeningId", nullable = false) + private Screening screening; +} 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..45115586 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Repository/CustomerRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.Repository; + +import com.booleanuk.api.cinema.Model.Customer; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CustomerRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/cinema/Repository/MovieRepository.java b/src/main/java/com/booleanuk/api/cinema/Repository/MovieRepository.java new file mode 100644 index 00000000..6d17a166 --- /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.Model.Customer; +import com.booleanuk.api.cinema.Model.Movie; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MovieRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/cinema/Repository/ScreeningRepository.java b/src/main/java/com/booleanuk/api/cinema/Repository/ScreeningRepository.java new file mode 100644 index 00000000..6d8ffa57 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Repository/ScreeningRepository.java @@ -0,0 +1,8 @@ +package com.booleanuk.api.cinema.Repository; + +import com.booleanuk.api.cinema.Model.Customer; +import com.booleanuk.api.cinema.Model.Screening; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ScreeningRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/cinema/Repository/TicketRepository.java b/src/main/java/com/booleanuk/api/cinema/Repository/TicketRepository.java new file mode 100644 index 00000000..89d3c941 --- /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.Model.Customer; +import com.booleanuk.api.cinema.Model.Ticket; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TicketRepository extends JpaRepository { +} From af364e594b0bf8a84a9e1f5ccd667b2fe34cd085 Mon Sep 17 00:00:00 2001 From: TMajlu Date: Thu, 12 Sep 2024 11:27:55 +0200 Subject: [PATCH 2/8] Continued developing the core exercises and extension. --- .../cinema/Controller/CustomerController.java | 56 ++++++++++++ .../cinema/Controller/MovieController.java | 60 +++++++++++++ .../Controller/ScreeningController.java | 67 +++++++++++++++ .../cinema/Controller/TicketController.java | 86 ++++++++++++++++++- 4 files changed, 268 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java index 9a9c3e19..0a44347c 100644 --- a/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java +++ b/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java @@ -1,5 +1,6 @@ package com.booleanuk.api.cinema.Controller; +import com.booleanuk.api.cinema.Model.Customer; import com.booleanuk.api.cinema.Repository.CustomerRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -12,4 +13,59 @@ @RestController @RequestMapping("customers") public class CustomerController { + + @Autowired + private CustomerRepository repository; + + + @PostMapping + public ResponseEntity createAuthor(@RequestBody Customer customer){ + try { + return new ResponseEntity(this.repository.save(customer), + HttpStatus.CREATED); + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Could not create a new customer, please check all required fields are correct."); + } + + + } + + @GetMapping + public List getAll() { + return this.repository.findAll(); + } + + + @PutMapping("{id}") + public ResponseEntity updateCustomer(@PathVariable int id, + @RequestBody Customer customer){ + Customer customerToUpdate=this.repository.findById(id).orElseThrow( + ()->new ResponseStatusException(HttpStatus.NOT_FOUND, + "No customer with that ID found") + ); + customerToUpdate.setName(customer.getName()); + customerToUpdate.setEmail(customerToUpdate.getEmail()); + customerToUpdate.setPhone(customer.getPhone()); + try{ + return new ResponseEntity(this.repository.save(customerToUpdate + ), HttpStatus.CREATED); + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Could not update customer, please check all required fields are correct."); + } + + + + + } + + @DeleteMapping("{id}") + public ResponseEntity deleteCustomer(@PathVariable int id){ + Customer customerToDelete=this.repository.findById(id).orElseThrow( + ()->new ResponseStatusException(HttpStatus.NOT_FOUND, + "No customer with that ID found") + ); + + this.repository.delete(customerToDelete); + return ResponseEntity.ok(customerToDelete); + } } diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java b/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java index 0eeaef88..cfab2a1d 100644 --- a/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java +++ b/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java @@ -1,5 +1,9 @@ package com.booleanuk.api.cinema.Controller; +import com.booleanuk.api.cinema.Model.Customer; +import com.booleanuk.api.cinema.Model.Movie; +import com.booleanuk.api.cinema.Repository.CustomerRepository; +import com.booleanuk.api.cinema.Repository.MovieRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -10,4 +14,60 @@ @RestController @RequestMapping("movies") public class MovieController { + + @Autowired + private MovieRepository repository; + + + @PostMapping + public ResponseEntity createMovie(@RequestBody Movie movie){ + try { + return new ResponseEntity(this.repository.save(movie), + HttpStatus.CREATED); + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Could not create a new movie, please check all required fields are correct."); + } + + + } + + @GetMapping + public List getAll() { + return this.repository.findAll(); + } + + + @PutMapping("{id}") + public ResponseEntity updateMovie(@PathVariable int id, + @RequestBody Movie movie){ + Movie movieToUpdate=this.repository.findById(id).orElseThrow( + ()->new ResponseStatusException(HttpStatus.NOT_FOUND, + "No movie with that ID found") + ); + movieToUpdate.setTitle(movie.getTitle()); + movieToUpdate.setRating(movie.getRating()); + movieToUpdate.setDescription(movie.getDescription()); + movieToUpdate.setRuntimeMins(movie.getRuntimeMins()); + try{ + return new ResponseEntity(this.repository.save(movieToUpdate + ), HttpStatus.CREATED); + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Could not update movie, please check all required fields are correct."); + } + + + + + } + + @DeleteMapping("{id}") + public ResponseEntity deleteMovie(@PathVariable int id){ + Movie movieToDelete=this.repository.findById(id).orElseThrow( + ()->new ResponseStatusException(HttpStatus.NOT_FOUND, + "No movie with that ID found") + ); + + this.repository.delete(movieToDelete); + return ResponseEntity.ok(movieToDelete); + } } diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java index 8690cc48..7efd82bf 100644 --- a/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java +++ b/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java @@ -1,13 +1,80 @@ package com.booleanuk.api.cinema.Controller; +import com.booleanuk.api.cinema.Model.Movie; +import com.booleanuk.api.cinema.Model.Screening; +import com.booleanuk.api.cinema.Repository.MovieRepository; +import com.booleanuk.api.cinema.Repository.ScreeningRepository; import 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.util.ArrayList; import java.util.List; +import java.util.Optional; + @RestController @RequestMapping("screenings") public class ScreeningController { + + @Autowired + private MovieRepository movieRepository; + + @Autowired + private ScreeningRepository screeningRepository; + + @PostMapping("{id}") + public ResponseEntity createScreening(@RequestBody Screening screening, @PathVariable("id") Integer id){ + + + try { + + + Movie movie = this.movieRepository.findById( + id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No movie with that id exists") + ); + + + + screening.setMovie(movie); + return new ResponseEntity(this.screeningRepository.save(screening), + HttpStatus.CREATED); + + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Could not create screening for the specified " + + "movie, please check all required fields are correct."); + } + + + } + + @GetMapping("{id}") + public ResponseEntity getAll(@PathVariable("id") Integer id) { + List allMovs=new ArrayList<>(); + + + Movie movie = this.movieRepository.findById( + id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No movie with that id exists") + ); + + for (Screening s:this.screeningRepository.findAll()){ + if (s.getMovie().getId()==id){ + allMovs.add(s); + } + } + + if (allMovs.size()==0){ + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No movie with that id exists"); + } + + + return (ResponseEntity) allMovs; + + } + + + } diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java b/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java index cd4392b9..21c0220d 100644 --- a/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java +++ b/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java @@ -1,13 +1,97 @@ package com.booleanuk.api.cinema.Controller; +import com.booleanuk.api.cinema.Model.Customer; +import com.booleanuk.api.cinema.Model.Movie; +import com.booleanuk.api.cinema.Model.Screening; +import com.booleanuk.api.cinema.Model.Ticket; +import com.booleanuk.api.cinema.Repository.CustomerRepository; +import com.booleanuk.api.cinema.Repository.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; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; +import java.util.ArrayList; import java.util.List; @RestController -@RequestMapping("tickets") +@RequestMapping("customers/{customerId}/screenings/{screeningID}") public class TicketController { + + @Autowired + private CustomerRepository customerRepository; + + @Autowired + private ScreeningRepository screeningRepository; + + @Autowired + private TicketRepository ticketRepository; + + @PostMapping() + public ResponseEntity createTicket(@RequestBody Integer numseats, @PathVariable("screeningId") Integer + screeningId, @PathVariable("customerId") Integer customerId){ + + + try { + + + Screening screening = this.screeningRepository.findById( + screeningId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No screening with that id exists") + ); + + Customer customer = this.customerRepository.findById( + screeningId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No customer with that id exists") + ); + + + + Ticket ticket=new Ticket(); + ticket.setNumSeats(numseats); + ticket.setCustomer(customer); + ticket.setScreening(screening); + return new ResponseEntity(this.ticketRepository.save(ticket), + HttpStatus.CREATED); + + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Could not create ticket for the specified " + + "customer/screening, please check all required fields are correct."); + } + + + } + + @GetMapping("{id}") + public ResponseEntity getAll(@PathVariable("screeningId") Integer + screeningId, @PathVariable("customerId") Integer customerId) { + List allTickets=new ArrayList<>(); + + + Customer customer = this.customerRepository.findById( + customerId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No customer with that id exists") + ); + + Screening screening = this.screeningRepository.findById( + screeningId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No customer with that id exists") + ); + + for (Ticket t:this.ticketRepository.findAll()){ + if (t.getCustomer().getId()==customerId && t.getScreening().getId()==screeningId){ + allTickets.add(t); + } + } + + if(allTickets.size()==0){ + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No ticket for that customer and screening exists"); + } + + + return (ResponseEntity) allTickets; + + } } From b8c13c5b086e4b90e89f48de2c7be145f53d5863 Mon Sep 17 00:00:00 2001 From: TMajlu Date: Thu, 12 Sep 2024 11:36:00 +0200 Subject: [PATCH 3/8] Continued developing the core exercises and extension. --- src/main/java/com/booleanuk/api/cinema/Main.java | 11 +++++++++++ .../java/com/booleanuk/api/cinema/Model/Customer.java | 1 + .../java/com/booleanuk/api/cinema/Model/Movie.java | 2 +- .../com/booleanuk/api/cinema/Model/Screening.java | 2 +- .../java/com/booleanuk/api/cinema/Model/Ticket.java | 2 +- 5 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/booleanuk/api/cinema/Main.java 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/Model/Customer.java b/src/main/java/com/booleanuk/api/cinema/Model/Customer.java index 3d7c9863..d5b6a8b0 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Customer.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Customer.java @@ -12,6 +12,7 @@ @Setter @NoArgsConstructor @AllArgsConstructor +@Entity @Table(name = "customers") public class Customer { @Id diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Movie.java b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java index 2742e1f9..6e4bf42a 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Movie.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java @@ -12,8 +12,8 @@ @Setter @NoArgsConstructor @AllArgsConstructor +@Entity @Table(name = "movies") - public class Movie { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Screening.java b/src/main/java/com/booleanuk/api/cinema/Model/Screening.java index 9f51b12b..9e36154d 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Screening.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Screening.java @@ -12,8 +12,8 @@ @Setter @NoArgsConstructor @AllArgsConstructor +@Entity @Table(name = "screenings") - public class Screening { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java b/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java index ec450988..90b8482e 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java @@ -10,8 +10,8 @@ @Setter @NoArgsConstructor @AllArgsConstructor +@Entity @Table(name = "tickets") - public class Ticket { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) From 23b4e1e6d22f8793da7aa69d006ab778c1b975ac Mon Sep 17 00:00:00 2001 From: TMajlu Date: Thu, 12 Sep 2024 14:32:19 +0200 Subject: [PATCH 4/8] Continued developing the core exercises and extension. --- .../api/cinema/Controller/CustomerController.java | 2 +- .../cinema/Controller/ScreeningController.java | 14 +++----------- .../api/cinema/Controller/TicketController.java | 15 ++------------- .../com/booleanuk/api/cinema/Model/Customer.java | 9 +++++++++ .../com/booleanuk/api/cinema/Model/Movie.java | 2 ++ .../com/booleanuk/api/cinema/Model/Screening.java | 2 ++ 6 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java index 0a44347c..1e2cafc6 100644 --- a/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java +++ b/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java @@ -19,7 +19,7 @@ public class CustomerController { @PostMapping - public ResponseEntity createAuthor(@RequestBody Customer customer){ + public ResponseEntity createCustomer(@RequestBody Customer customer){ try { return new ResponseEntity(this.repository.save(customer), HttpStatus.CREATED); diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java index 7efd82bf..6dbae729 100644 --- a/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java +++ b/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java @@ -51,7 +51,7 @@ public ResponseEntity createScreening(@RequestBody Screening screenin } @GetMapping("{id}") - public ResponseEntity getAll(@PathVariable("id") Integer id) { + public ResponseEntity> getAll(@PathVariable("id") Integer id) { List allMovs=new ArrayList<>(); @@ -60,20 +60,12 @@ public ResponseEntity getAll(@PathVariable("id") Integer id) { () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No movie with that id exists") ); - for (Screening s:this.screeningRepository.findAll()){ - if (s.getMovie().getId()==id){ - allMovs.add(s); - } - } - if (allMovs.size()==0){ - throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No movie with that id exists"); - } + return new ResponseEntity>(movie.getScreenings(), HttpStatus.FOUND); + } - return (ResponseEntity) allMovs; - } diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java b/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java index 21c0220d..a298a743 100644 --- a/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java +++ b/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java @@ -65,7 +65,7 @@ public ResponseEntity createTicket(@RequestBody Integer numseats, @PathV } @GetMapping("{id}") - public ResponseEntity getAll(@PathVariable("screeningId") Integer + public ResponseEntity> getAll(@PathVariable("screeningId") Integer screeningId, @PathVariable("customerId") Integer customerId) { List allTickets=new ArrayList<>(); @@ -80,18 +80,7 @@ public ResponseEntity getAll(@PathVariable("screeningId") Integer () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No customer with that id exists") ); - for (Ticket t:this.ticketRepository.findAll()){ - if (t.getCustomer().getId()==customerId && t.getScreening().getId()==screeningId){ - allTickets.add(t); - } - } - - if(allTickets.size()==0){ - throw new ResponseStatusException(HttpStatus.NOT_FOUND, "No ticket for that customer and screening exists"); - } - - - return (ResponseEntity) allTickets; + return new ResponseEntity>(screening.getTickets(), HttpStatus.FOUND); } } diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Customer.java b/src/main/java/com/booleanuk/api/cinema/Model/Customer.java index d5b6a8b0..920910db 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Customer.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Customer.java @@ -1,11 +1,13 @@ package com.booleanuk.api.cinema.Model; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import java.time.LocalDateTime; import java.util.List; @Getter @@ -29,5 +31,12 @@ public class Customer { private String phone; @OneToMany(mappedBy = "customer") + @JsonIgnoreProperties(value ={"customer", "screening"}) private List tickets; + /* + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + + */ + } diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Movie.java b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java index 6e4bf42a..2c39e5f1 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Movie.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java @@ -1,5 +1,6 @@ package com.booleanuk.api.cinema.Model; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Getter; @@ -32,6 +33,7 @@ public class Movie { private int runtimeMins; @OneToMany(mappedBy = "movie") + @JsonIgnoreProperties(value ={"movie", "tickets"}) private List screenings; diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Screening.java b/src/main/java/com/booleanuk/api/cinema/Model/Screening.java index 9e36154d..0f9d023a 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Screening.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Screening.java @@ -1,5 +1,6 @@ package com.booleanuk.api.cinema.Model; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Getter; @@ -30,6 +31,7 @@ public class Screening { private Movie movie; @OneToMany(mappedBy = "screening") + @JsonIgnoreProperties(value ={"screenings", "tickets", "movie","customer","screening"}) private List tickets; From 3dac0705be21a2a93c0e30fe85275fe5a9837466 Mon Sep 17 00:00:00 2001 From: TMajlu Date: Thu, 12 Sep 2024 15:31:52 +0200 Subject: [PATCH 5/8] Continued developing the core exercises and extension. --- .../api/cinema/Controller/CustomerController.java | 2 ++ .../api/cinema/Controller/MovieController.java | 2 ++ .../api/cinema/Controller/TicketController.java | 4 ++-- .../java/com/booleanuk/api/cinema/Model/Customer.java | 11 +++++++---- .../java/com/booleanuk/api/cinema/Model/Movie.java | 7 +++++++ .../com/booleanuk/api/cinema/Model/Screening.java | 7 +++++++ .../java/com/booleanuk/api/cinema/Model/Ticket.java | 8 ++++++++ 7 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java index 1e2cafc6..47c908f9 100644 --- a/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java +++ b/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; +import java.time.LocalDateTime; import java.util.List; @RestController @@ -46,6 +47,7 @@ public ResponseEntity updateCustomer(@PathVariable int id, customerToUpdate.setName(customer.getName()); customerToUpdate.setEmail(customerToUpdate.getEmail()); customerToUpdate.setPhone(customer.getPhone()); + customerToUpdate.setUpdatedAt(LocalDateTime.now()); try{ return new ResponseEntity(this.repository.save(customerToUpdate ), HttpStatus.CREATED); diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java b/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java index cfab2a1d..e6af0ba0 100644 --- a/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java +++ b/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java @@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; +import java.time.LocalDateTime; import java.util.List; @RestController @RequestMapping("movies") @@ -48,6 +49,7 @@ public ResponseEntity updateMovie(@PathVariable int id, movieToUpdate.setRating(movie.getRating()); movieToUpdate.setDescription(movie.getDescription()); movieToUpdate.setRuntimeMins(movie.getRuntimeMins()); + movieToUpdate.setUpdatedAt(LocalDateTime.now()); try{ return new ResponseEntity(this.repository.save(movieToUpdate ), HttpStatus.CREATED); diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java b/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java index a298a743..fe8486e7 100644 --- a/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java +++ b/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java @@ -17,7 +17,7 @@ import java.util.ArrayList; import java.util.List; @RestController -@RequestMapping("customers/{customerId}/screenings/{screeningID}") +@RequestMapping("customers/{customerId}/screenings/{screeningId}") public class TicketController { @Autowired @@ -64,7 +64,7 @@ public ResponseEntity createTicket(@RequestBody Integer numseats, @PathV } - @GetMapping("{id}") + @GetMapping() public ResponseEntity> getAll(@PathVariable("screeningId") Integer screeningId, @PathVariable("customerId") Integer customerId) { List allTickets=new ArrayList<>(); diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Customer.java b/src/main/java/com/booleanuk/api/cinema/Model/Customer.java index 920910db..206b5802 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Customer.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Customer.java @@ -33,10 +33,13 @@ public class Customer { @OneToMany(mappedBy = "customer") @JsonIgnoreProperties(value ={"customer", "screening"}) private List tickets; - /* - private LocalDateTime createdAt; - private LocalDateTime updatedAt; - */ + @Column + private LocalDateTime createdAt=LocalDateTime.now(); + + @Column + private LocalDateTime updatedAt=LocalDateTime.now(); + + } diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Movie.java b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java index 2c39e5f1..87e86a59 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Movie.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; +import java.time.LocalDateTime; import java.util.List; @Getter @@ -32,6 +33,12 @@ public class Movie { @Column private int runtimeMins; + @Column + private LocalDateTime createdAt=LocalDateTime.now(); + + @Column + private LocalDateTime updatedAt=LocalDateTime.now(); + @OneToMany(mappedBy = "movie") @JsonIgnoreProperties(value ={"movie", "tickets"}) private List screenings; diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Screening.java b/src/main/java/com/booleanuk/api/cinema/Model/Screening.java index 0f9d023a..877a4555 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Screening.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Screening.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; +import java.time.LocalDateTime; import java.util.List; @Getter @@ -26,6 +27,12 @@ public class Screening { @Column int capacity; + @Column + private LocalDateTime createdAt=LocalDateTime.now(); + + @Column + private LocalDateTime updatedAt=LocalDateTime.now(); + @ManyToOne @JoinColumn(name="movieid", nullable = false) private Movie movie; diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java b/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java index 90b8482e..0ef71c31 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java @@ -6,6 +6,8 @@ import lombok.NoArgsConstructor; import lombok.Setter; +import java.time.LocalDateTime; + @Getter @Setter @NoArgsConstructor @@ -20,6 +22,12 @@ public class Ticket { @Column private int numSeats; + @Column + private LocalDateTime createdAt=LocalDateTime.now(); + + @Column + private LocalDateTime updatedAt=LocalDateTime.now(); + @ManyToOne @JoinColumn(name="customerId", nullable = false) private Customer customer; From 0481e88c2636f3971deee8db98c1a48d9b7cfa42 Mon Sep 17 00:00:00 2001 From: TMajlu Date: Thu, 12 Sep 2024 15:56:58 +0200 Subject: [PATCH 6/8] Continued developing the core exercises and extension. --- src/main/java/com/booleanuk/api/cinema/Model/Movie.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Movie.java b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java index 87e86a59..b9c436ef 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Movie.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java @@ -33,16 +33,17 @@ public class Movie { @Column private int runtimeMins; - @Column - private LocalDateTime createdAt=LocalDateTime.now(); - @Column - private LocalDateTime updatedAt=LocalDateTime.now(); @OneToMany(mappedBy = "movie") @JsonIgnoreProperties(value ={"movie", "tickets"}) private List screenings; + @Column + private LocalDateTime createdAt=LocalDateTime.now(); + + @Column + private LocalDateTime updatedAt=LocalDateTime.now(); } From 71b8f96198e52938e8d881b978a83c50d8c33852 Mon Sep 17 00:00:00 2001 From: TMajlu Date: Fri, 13 Sep 2024 11:00:46 +0200 Subject: [PATCH 7/8] I believe I have finished the core and extension. --- .../api/cinema/Controller/TicketController.java | 7 +++---- .../java/com/booleanuk/api/cinema/Model/Customer.java | 3 ++- src/main/java/com/booleanuk/api/cinema/Model/Movie.java | 2 +- src/main/java/com/booleanuk/api/cinema/Model/Ticket.java | 9 +++++++++ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java b/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java index fe8486e7..a74d91ac 100644 --- a/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java +++ b/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java @@ -30,7 +30,7 @@ public class TicketController { private TicketRepository ticketRepository; @PostMapping() - public ResponseEntity createTicket(@RequestBody Integer numseats, @PathVariable("screeningId") Integer + public ResponseEntity createTicket(@RequestBody Ticket ticket, @PathVariable("screeningId") Integer screeningId, @PathVariable("customerId") Integer customerId){ @@ -43,14 +43,13 @@ public ResponseEntity createTicket(@RequestBody Integer numseats, @PathV ); Customer customer = this.customerRepository.findById( - screeningId).orElseThrow( + customerId).orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No customer with that id exists") ); - Ticket ticket=new Ticket(); - ticket.setNumSeats(numseats); + ticket.setCustomer(customer); ticket.setScreening(screening); return new ResponseEntity(this.ticketRepository.save(ticket), diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Customer.java b/src/main/java/com/booleanuk/api/cinema/Model/Customer.java index 206b5802..ebc2c3ad 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Customer.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Customer.java @@ -31,7 +31,7 @@ public class Customer { private String phone; @OneToMany(mappedBy = "customer") - @JsonIgnoreProperties(value ={"customer", "screening"}) + @JsonIgnoreProperties(value ={"screenings", "tickets", "movie","customer","screening"}) private List tickets; @Column @@ -42,4 +42,5 @@ public class Customer { + } diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Movie.java b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java index b9c436ef..a14b5475 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Movie.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java @@ -36,7 +36,7 @@ public class Movie { @OneToMany(mappedBy = "movie") - @JsonIgnoreProperties(value ={"movie", "tickets"}) + @JsonIgnoreProperties(value ={"screenings", "tickets", "movie","customer","screening"}) private List screenings; @Column diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java b/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java index 0ef71c31..f2807678 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java @@ -1,5 +1,6 @@ package com.booleanuk.api.cinema.Model; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Getter; @@ -29,10 +30,18 @@ public class Ticket { private LocalDateTime updatedAt=LocalDateTime.now(); @ManyToOne + @JsonIgnoreProperties(value ={"screenings", "tickets", "movie","customer","screening"}) @JoinColumn(name="customerId", nullable = false) private Customer customer; @ManyToOne + @JsonIgnoreProperties(value ={"screenings", "tickets", "movie","customer","screening"}) @JoinColumn(name="screeningId", nullable = false) private Screening screening; + + public Ticket(int numSeats) { + this.numSeats = numSeats; + createdAt=LocalDateTime.now(); + updatedAt=LocalDateTime.now(); + } } From ef9f9cdf8b4937b044289a59ee9ef9235f6e5c79 Mon Sep 17 00:00:00 2001 From: TMajlu Date: Fri, 13 Sep 2024 11:03:24 +0200 Subject: [PATCH 8/8] I believe I have finished the core and extension. --- .../java/com/booleanuk/api/cinema/Model/Screening.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/booleanuk/api/cinema/Model/Screening.java b/src/main/java/com/booleanuk/api/cinema/Model/Screening.java index 877a4555..6675458b 100644 --- a/src/main/java/com/booleanuk/api/cinema/Model/Screening.java +++ b/src/main/java/com/booleanuk/api/cinema/Model/Screening.java @@ -22,10 +22,13 @@ public class Screening { private int id; @Column - int screenNumber; + private int screenNumber; @Column - int capacity; + private int capacity; + + @Column + private String startsAt; @Column private LocalDateTime createdAt=LocalDateTime.now();