diff --git a/build.gradle b/build.gradle index 3d7f7607..b4b70939 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' @@ -20,10 +20,13 @@ 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' + 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..41b8e60b --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/Main.java @@ -0,0 +1,12 @@ +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/customer/Customer.java b/src/main/java/com/booleanuk/api/cinema/customer/Customer.java new file mode 100644 index 00000000..f53faef5 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/customer/Customer.java @@ -0,0 +1,42 @@ +package com.booleanuk.api.cinema.customer; + + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@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 String created_at; + + @Column(name = "updated_at") + private String updated_at; + + public Customer(String name, String email, String phone) { + this.name = name; + this.email = email; + this.phone = phone; + } + +} diff --git a/src/main/java/com/booleanuk/api/cinema/customer/CustomerController.java b/src/main/java/com/booleanuk/api/cinema/customer/CustomerController.java new file mode 100644 index 00000000..67118e36 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/customer/CustomerController.java @@ -0,0 +1,58 @@ +package com.booleanuk.api.cinema.customer; + +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 getOneCustomer(@PathVariable int id) { +// return this.customerRepository.findById(id) +// .map(ResponseEntity::ok) +// .orElse(ResponseEntity.notFound().build()); +// } + + @PostMapping + public ResponseEntity create(@RequestBody Customer customer) { + customer.setCreated_at(String.valueOf(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.setUpdated_at(String.valueOf(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/customer/CustomerRepository.java b/src/main/java/com/booleanuk/api/cinema/customer/CustomerRepository.java new file mode 100644 index 00000000..33304d27 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/customer/CustomerRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.customer; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CustomerRepository extends JpaRepository { + +} diff --git a/src/main/java/com/booleanuk/api/cinema/movie/Movie.java b/src/main/java/com/booleanuk/api/cinema/movie/Movie.java new file mode 100644 index 00000000..98db2ff4 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/movie/Movie.java @@ -0,0 +1,60 @@ +package com.booleanuk.api.cinema.movie; + + +import com.booleanuk.api.cinema.screening.Screening; +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.time.format.DateTimeFormatter; +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@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 = "runtime_mins") + private int runtime_mins; + + @Column(name = "created_at") + private String created_at; + + @Column(name = "updated_at") + private String updated_at; + + @OneToMany(mappedBy = "movie") + @JsonIgnoreProperties({"movie", "id"}) + private List screenings; + + public Movie(String title, String rating, String description, int runtime_mins){ + this.title = title; + this.rating = rating; + this.description = description; + this.runtime_mins = runtime_mins; + } + + public Movie(int id){ + this.id = id; + } + +} diff --git a/src/main/java/com/booleanuk/api/cinema/movie/MovieController.java b/src/main/java/com/booleanuk/api/cinema/movie/MovieController.java new file mode 100644 index 00000000..99b977b1 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/movie/MovieController.java @@ -0,0 +1,61 @@ +package com.booleanuk.api.cinema.movie; + + +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(); + } + +// @GetMapping("/{id}") +// public ResponseEntity getOneMovie(@PathVariable int id) { +// return this.movieRepository.findById(id) +// .map(ResponseEntity::ok) +// .orElse(ResponseEntity.notFound().build()); +// } + + @PostMapping + public ResponseEntity create(@RequestBody Movie movie) { + movie.setCreated_at(String.valueOf(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.setRuntime_mins(movie.getRuntime_mins()); + movieToUpdate.setUpdated_at(String.valueOf(LocalDateTime.now())); + + 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/movie/MovieRepository.java b/src/main/java/com/booleanuk/api/cinema/movie/MovieRepository.java new file mode 100644 index 00000000..5d7f4f6b --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/movie/MovieRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.cinema.movie; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MovieRepository extends JpaRepository { + +} diff --git a/src/main/java/com/booleanuk/api/cinema/screening/Screening.java b/src/main/java/com/booleanuk/api/cinema/screening/Screening.java new file mode 100644 index 00000000..b2bc5c53 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/screening/Screening.java @@ -0,0 +1,48 @@ +package com.booleanuk.api.cinema.screening; + + +import com.booleanuk.api.cinema.movie.Movie; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@Entity +@Table(name = "screenings") +public class Screening { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column(name = "screen_number") + private int screen_number; + + @Column(name = "capacity") + private int capacity; + + @Column(name = "starts_at") + private String starts_at; + + @Column(name = "created_at") + private String created_at; + + @Column(name = "updated_at") + private String updated_at; + + @ManyToOne + @JoinColumn(name = "movie_id", nullable = false) + @JsonIgnoreProperties({"screenings", "id"}) + private Movie movie; + + public Screening(int screen_number, int capacity){ + this.screen_number = screen_number; + this.capacity = capacity; + } + +} diff --git a/src/main/java/com/booleanuk/api/cinema/screening/ScreeningController.java b/src/main/java/com/booleanuk/api/cinema/screening/ScreeningController.java new file mode 100644 index 00000000..c394ff45 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/screening/ScreeningController.java @@ -0,0 +1,43 @@ +package com.booleanuk.api.cinema.screening; + +import com.booleanuk.api.cinema.movie.Movie; +import com.booleanuk.api.cinema.movie.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/{id}/screenings") +public class ScreeningController { + @Autowired + private ScreeningRepository screeningRepository; + @Autowired + private MovieRepository movieRepository; + + @GetMapping + public List getAllScreenings(@PathVariable int id) { + Movie movie = this.movieRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found") + ); + + return movie.getScreenings(); + } + + @PostMapping + public ResponseEntity create(@PathVariable int id, @RequestBody Screening screening) { + Movie movie = this.movieRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found") + ); + + screening.setMovie(movie); + screening.setCreated_at(String.valueOf(LocalDateTime.now())); + screening.setStarts_at(String.valueOf(LocalDateTime.now())); + return new ResponseEntity(this.screeningRepository.save(screening), HttpStatus.CREATED); + } + +} diff --git a/src/main/java/com/booleanuk/api/cinema/screening/ScreeningRepository.java b/src/main/java/com/booleanuk/api/cinema/screening/ScreeningRepository.java new file mode 100644 index 00000000..50e7c128 --- /dev/null +++ b/src/main/java/com/booleanuk/api/cinema/screening/ScreeningRepository.java @@ -0,0 +1,9 @@ +package com.booleanuk.api.cinema.screening; + +import com.booleanuk.api.cinema.movie.Movie; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +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