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..47c908f9 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Controller/CustomerController.java @@ -0,0 +1,73 @@ +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; +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 repository; + + + @PostMapping + public ResponseEntity createCustomer(@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()); + customerToUpdate.setUpdatedAt(LocalDateTime.now()); + 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 new file mode 100644 index 00000000..e6af0ba0 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Controller/MovieController.java @@ -0,0 +1,75 @@ +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; +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 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()); + movieToUpdate.setUpdatedAt(LocalDateTime.now()); + 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 new file mode 100644 index 00000000..6dbae729 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Controller/ScreeningController.java @@ -0,0 +1,72 @@ +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") + ); + + + return new ResponseEntity>(movie.getScreenings(), HttpStatus.FOUND); + + } + + + + + +} 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..a74d91ac --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Controller/TicketController.java @@ -0,0 +1,85 @@ +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("customers/{customerId}/screenings/{screeningId}") +public class TicketController { + + @Autowired + private CustomerRepository customerRepository; + + @Autowired + private ScreeningRepository screeningRepository; + + @Autowired + private TicketRepository ticketRepository; + + @PostMapping() + public ResponseEntity createTicket(@RequestBody Ticket ticket, @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( + customerId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No customer with that id exists") + ); + + + + + 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() + 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") + ); + + return new ResponseEntity>(screening.getTickets(), HttpStatus.FOUND); + + } +} 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 new file mode 100644 index 00000000..ebc2c3ad --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Model/Customer.java @@ -0,0 +1,46 @@ +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 +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "customers") +public class Customer { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String name; + + @Column + private String email; + + @Column + private String phone; + + @OneToMany(mappedBy = "customer") + @JsonIgnoreProperties(value ={"screenings", "tickets", "movie","customer","screening"}) + private List tickets; + + @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 new file mode 100644 index 00000000..a14b5475 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Model/Movie.java @@ -0,0 +1,49 @@ +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 +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "movies") +public class Movie { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String title; + + @Column + private String rating; + + @Column + private String description; + + @Column + private int runtimeMins; + + + + @OneToMany(mappedBy = "movie") + @JsonIgnoreProperties(value ={"screenings", "tickets", "movie","customer","screening"}) + private List screenings; + + @Column + private LocalDateTime createdAt=LocalDateTime.now(); + + @Column + private LocalDateTime updatedAt=LocalDateTime.now(); + + +} 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..6675458b --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Model/Screening.java @@ -0,0 +1,48 @@ +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 +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "screenings") +public class Screening { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private int screenNumber; + + @Column + private int capacity; + + @Column + private String startsAt; + + @Column + private LocalDateTime createdAt=LocalDateTime.now(); + + @Column + private LocalDateTime updatedAt=LocalDateTime.now(); + + @ManyToOne + @JoinColumn(name="movieid", nullable = false) + private Movie movie; + + @OneToMany(mappedBy = "screening") + @JsonIgnoreProperties(value ={"screenings", "tickets", "movie","customer","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..f2807678 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Model/Ticket.java @@ -0,0 +1,47 @@ +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; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "tickets") +public class Ticket { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private int numSeats; + + @Column + private LocalDateTime createdAt=LocalDateTime.now(); + + @Column + 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(); + } +} 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 { +}