From d3f7c896c2588513701f9366f380d92e8d1e5921 Mon Sep 17 00:00:00 2001 From: Jonas Finborud Nyman Date: Tue, 4 Feb 2025 15:51:48 +0100 Subject: [PATCH] Core completed --- build.gradle | 15 +++- .../java/com/booleanuk/api/cinema/Main.java | 11 +++ .../api/cinema/customers/Customer.java | 45 ++++++++++++ .../cinema/customers/CustomerController.java | 58 +++++++++++++++ .../cinema/customers/CustomerRepository.java | 6 ++ .../booleanuk/api/cinema/movies/Movie.java | 51 +++++++++++++ .../api/cinema/movies/MovieController.java | 59 +++++++++++++++ .../api/cinema/movies/MovieRepository.java | 6 ++ .../api/cinema/screenings/Screening.java | 52 ++++++++++++++ .../screenings/ScreeningController.java | 71 +++++++++++++++++++ .../screenings/ScreeningRepository.java | 6 ++ src/main/resources/application.yml.example | 23 ------ 12 files changed, 378 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/booleanuk/api/cinema/Main.java create mode 100644 src/main/java/com/booleanuk/api/cinema/customers/Customer.java create mode 100644 src/main/java/com/booleanuk/api/cinema/customers/CustomerController.java create mode 100644 src/main/java/com/booleanuk/api/cinema/customers/CustomerRepository.java create mode 100644 src/main/java/com/booleanuk/api/cinema/movies/Movie.java create mode 100644 src/main/java/com/booleanuk/api/cinema/movies/MovieController.java create mode 100644 src/main/java/com/booleanuk/api/cinema/movies/MovieRepository.java create mode 100644 src/main/java/com/booleanuk/api/cinema/screenings/Screening.java create mode 100644 src/main/java/com/booleanuk/api/cinema/screenings/ScreeningController.java create mode 100644 src/main/java/com/booleanuk/api/cinema/screenings/ScreeningRepository.java delete mode 100644 src/main/resources/application.yml.example diff --git a/build.gradle b/build.gradle index 3d7f7607..ae1807dc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.3.1' - id 'io.spring.dependency-management' version '1.1.5' + id 'org.springframework.boot' version '3.4.2' + id 'io.spring.dependency-management' version '1.1.7' } group = 'com.booleanuk' @@ -13,6 +13,12 @@ java { } } +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + repositories { mavenCentral() } @@ -20,10 +26,15 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'org.postgresql:postgresql' + annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + + // https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.3' } tasks.named('test') { 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/customers/Customer.java b/src/main/java/com/booleanuk/api/cinema/customers/Customer.java new file mode 100644 index 00000000..4cd772b2 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/customers/Customer.java @@ -0,0 +1,45 @@ +package com.booleanuk.api.cinema.customers; + +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 = "customers") +public class Customer { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String name; + + @Column + private String email; + + @Column + private String phone; + + @Column + private LocalDateTime createdAt; + + @Column + private LocalDateTime updatedAt; + + public Customer(String name, String email, String phone) { + this.name = name; + this.email = email; + this.phone = phone; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/customers/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/customers/CustomerController.java new file mode 100644 index 00000000..66c7e60b --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/customers/CustomerController.java @@ -0,0 +1,58 @@ +package com.booleanuk.api.cinema.customers; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; + +@RestController +@RequestMapping("customers") +public class CustomerController { + @Autowired + private CustomerRepository customerRepository; + + @ResponseStatus(HttpStatus.OK) + @GetMapping("{id}") + public Customer getOneCustomer(@PathVariable int id) { + return this.customerRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Customer not found.") + ); + } + + @ResponseStatus(HttpStatus.OK) + @GetMapping + public List getAllCustomers() { + return this.customerRepository.findAll(); + } + + @ResponseStatus(HttpStatus.CREATED) + @PostMapping + public Customer createCustomer(@RequestBody Customer customer) { + Customer newCustomer = new Customer(customer.getName(), customer.getEmail(), customer.getPhone()); + return this.customerRepository.save(newCustomer); + } + + @ResponseStatus(HttpStatus.CREATED) + @PutMapping("{id}") + public Customer updateCustomer(@RequestBody Customer customer, @PathVariable int id) { + Customer customerToUpdate = this.customerRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Customer not found.") + ); + customerToUpdate.setName(customer.getName()); + customerToUpdate.setEmail(customer.getEmail()); + customerToUpdate.setPhone(customer.getPhone()); + return this.customerRepository.save(customerToUpdate); + } + + @ResponseStatus(HttpStatus.OK) + @DeleteMapping("{id}") + public Customer deleteCustomer(@PathVariable int id) { + Customer customerToDelete = this.customerRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Customer not found.") + ); + this.customerRepository.delete(customerToDelete); + return customerToDelete; + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/customers/CustomerRepository.java b/src/main/java/com/booleanuk/api/cinema/customers/CustomerRepository.java new file mode 100644 index 00000000..30cd28db --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/customers/CustomerRepository.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.cinema.customers; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CustomerRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/cinema/movies/Movie.java b/src/main/java/com/booleanuk/api/cinema/movies/Movie.java new file mode 100644 index 00000000..01de245e --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/movies/Movie.java @@ -0,0 +1,51 @@ +package com.booleanuk.api.cinema.movies; + +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 = "movies") +public class Movie { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String title; + + @Column + private String rating; + + @Column + private String description; + + @Column + private int runtimeMins; + + @Column(nullable = false) + private LocalDateTime createdAt; + + @Column(nullable = false) + private LocalDateTime updatedAt; + + public Movie(String title, String rating, String description, int runtimeMins) { + this.title = title; + this.rating = rating; + this.description = description; + this.runtimeMins = runtimeMins; + } + + public Movie(int id) { + this.id = id; + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/movies/MovieController.java b/src/main/java/com/booleanuk/api/cinema/movies/MovieController.java new file mode 100644 index 00000000..751b3aea --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/movies/MovieController.java @@ -0,0 +1,59 @@ +package com.booleanuk.api.cinema.movies; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; + +@RestController +@RequestMapping("movies") +public class MovieController { + @Autowired + private MovieRepository movieRepository; + + @ResponseStatus(HttpStatus.OK) + @GetMapping("{id}") + public Movie getOneMovie(@PathVariable int id) { + return this.movieRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Movie not found.") + ); + } + + @ResponseStatus(HttpStatus.OK) + @GetMapping + public List getAllMovies() { + return this.movieRepository.findAll(); + } + + @ResponseStatus(HttpStatus.CREATED) + @PostMapping + public Movie createMovie(@RequestBody Movie movie) { + Movie newMovie = new Movie(movie.getTitle(), movie.getRating(), movie.getDescription(), movie.getRuntimeMins()); + return this.movieRepository.save(newMovie); + } + + @ResponseStatus(HttpStatus.CREATED) + @PutMapping("{id}") + public Movie updateMovie(@RequestBody Movie movie, @PathVariable int id) { + Movie movieToUpdate = this.movieRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Movie not found.") + ); + movieToUpdate.setTitle(movie.getTitle()); + movieToUpdate.setRating(movie.getRating()); + movieToUpdate.setDescription(movie.getDescription()); + movieToUpdate.setRuntimeMins(movie.getRuntimeMins()); + return this.movieRepository.save(movieToUpdate); + } + + @ResponseStatus(HttpStatus.OK) + @DeleteMapping("{id}") + public Movie deleteMovie(@PathVariable int id) { + Movie movieToDelete = this.movieRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Movie not found.") + ); + this.movieRepository.delete(movieToDelete); + return movieToDelete; + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/movies/MovieRepository.java b/src/main/java/com/booleanuk/api/cinema/movies/MovieRepository.java new file mode 100644 index 00000000..d7d111cf --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/movies/MovieRepository.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.cinema.movies; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MovieRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/cinema/screenings/Screening.java b/src/main/java/com/booleanuk/api/cinema/screenings/Screening.java new file mode 100644 index 00000000..0c7599db --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/screenings/Screening.java @@ -0,0 +1,52 @@ +package com.booleanuk.api.cinema.screenings; + +import com.booleanuk.api.cinema.movies.Movie; +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 = "screenings") +public class Screening { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private int screenNumber; + + @Column + private LocalDateTime startsAt; + + @Column + private int capacity; + + @Column + private LocalDateTime createdAt; + + @Column + private LocalDateTime updatedAt; + + @ManyToOne + @JoinColumn(name = "movie_id") + @JsonIgnoreProperties("screenings") + private Movie movie; + + public Screening(int screenNumber, LocalDateTime startsAt, int capacity) { + this.screenNumber = screenNumber; + this.startsAt = startsAt; + this.capacity = capacity; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } +} diff --git a/src/main/java/com/booleanuk/api/cinema/screenings/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/screenings/ScreeningController.java new file mode 100644 index 00000000..abafe6c5 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/screenings/ScreeningController.java @@ -0,0 +1,71 @@ +package com.booleanuk.api.cinema.screenings; + +import com.booleanuk.api.cinema.movies.Movie; +import com.booleanuk.api.cinema.movies.MovieRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; + +@RestController +@RequestMapping("screenings") +public class ScreeningController { + @Autowired + private ScreeningRepository screeningRepository; + + @Autowired + private MovieRepository movieRepository; + + @ResponseStatus(HttpStatus.OK) + @GetMapping("{id}") + public Screening getOneScreening(@PathVariable int id) { + return this.screeningRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Screening not found.") + ); + } + + @ResponseStatus(HttpStatus.OK) + @GetMapping + public List getAllScreenings() { + return this.screeningRepository.findAll(); + } + + @ResponseStatus(HttpStatus.CREATED) + @PostMapping + public Screening createScreening(@RequestBody Screening screening) { + Screening newScreening = new Screening(screening.getScreenNumber(), screening.getStartsAt(), screening.getCapacity()); + Movie movieRef = this.movieRepository.findById(screening.getMovie().getId()).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Movie not found.") + ); + newScreening.setMovie(movieRef); + return this.screeningRepository.save(newScreening); + } + + @ResponseStatus(HttpStatus.CREATED) + @PutMapping("{id}") + public Screening updateScreening(@RequestBody Screening screening, @PathVariable int id) { + Screening screeningToUpdate = this.screeningRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Screening not found.") + ); + Movie movieRef = this.movieRepository.findById(screening.getMovie().getId()).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Movie not found.") + ); + screeningToUpdate.setMovie(movieRef); + screeningToUpdate.setScreenNumber(screening.getScreenNumber()); + screeningToUpdate.setStartsAt(screening.getStartsAt()); + screeningToUpdate.setCapacity(screening.getCapacity()); + return this.screeningRepository.save(screeningToUpdate); + } + + @ResponseStatus(HttpStatus.OK) + @DeleteMapping("{id}") + public Screening deleteScreening(@PathVariable int id) { + Screening screeningToDelete = this.screeningRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Screening not found.") + ); + this.screeningRepository.delete(screeningToDelete); + return screeningToDelete; + } +} \ No newline at end of file diff --git a/src/main/java/com/booleanuk/api/cinema/screenings/ScreeningRepository.java b/src/main/java/com/booleanuk/api/cinema/screenings/ScreeningRepository.java new file mode 100644 index 00000000..98fc8114 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/screenings/ScreeningRepository.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.cinema.screenings; + +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