Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -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.1'
id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.booleanuk'
Expand All @@ -13,17 +13,27 @@ java {
}
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

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') {
Expand Down
Empty file.
11 changes: 11 additions & 0 deletions src/main/java/com/booleanuk/api/cinema/Main.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
61 changes: 61 additions & 0 deletions src/main/java/com/booleanuk/api/cinema/customers/Customer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.booleanuk.api.cinema.customers;

import com.booleanuk.api.cinema.tickets.Ticket;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;
import java.util.List;

@Getter
@Setter
@AllArgsConstructor
@Entity
@Table(name = "customers")
@JsonIgnoreProperties({"tickets"})
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 LocalDate createdAt;

@Column
private LocalDate updatedAt;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "customer", orphanRemoval = true)
private List<Ticket> tickets;


public Customer(String name, String email, String phone) {
this.name = name;
this.email = email;
this.phone = phone;
createdAt = LocalDate.now();
updatedAt = LocalDate.now();

}

public Customer(int id) {
this.id = id;
}

public Customer() {
createdAt = LocalDate.now();
updatedAt = LocalDate.now();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package com.booleanuk.api.cinema.customers;

import com.booleanuk.api.cinema.responses.CustomerListResponse;
import com.booleanuk.api.cinema.responses.CustomerResponse;
import com.booleanuk.api.cinema.responses.ErrorResponse;
import com.booleanuk.api.cinema.responses.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;

@RestController
@RequestMapping("customers")

public class CustomerController {

@Autowired
private final CustomerRepository repository;

public CustomerController(CustomerRepository repository) {
this.repository = repository;
}

@GetMapping
public ResponseEntity<CustomerListResponse> getAll() {
CustomerListResponse customerListResponse = new CustomerListResponse();
customerListResponse.set(this.repository.findAll());
return ResponseEntity.ok(customerListResponse);
}

@ResponseStatus(HttpStatus.CREATED)
@PostMapping
public ResponseEntity<Response<?>> create(@RequestBody Customer customer) {
CustomerResponse customerResponse = new CustomerResponse();
try {
customerResponse.set(this.repository.save(customer));
} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("Bad request - cannot create customer");
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(customerResponse, HttpStatus.CREATED);
}

@PutMapping("{id}")
public ResponseEntity<Response<?>> updateCustomer(@PathVariable int id, @RequestBody Customer customer) {
Customer customerToUpdate = null;
try {
customerToUpdate = this.repository.findById(id).orElse(null);
} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("Bad request - could not successfully find customer");
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
if (customerToUpdate == null) {
ErrorResponse error = new ErrorResponse();
error.set("Customer not found");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
customerToUpdate.setName(customer.getName());
customerToUpdate.setEmail(customer.getEmail());
customerToUpdate.setPhone(customer.getPhone());
customerToUpdate.setUpdatedAt(LocalDate.now());
customerToUpdate= this.repository.save(customerToUpdate);
CustomerResponse customerResponse = new CustomerResponse();
customerResponse.set(customerToUpdate);
return new ResponseEntity<>(customerResponse, HttpStatus.CREATED);
}

@DeleteMapping("{id}")
public ResponseEntity<Response<?>> deleteACustomer(@PathVariable int id) {
Customer customerToDelete = this.repository.findById(id).orElse(null);
if (customerToDelete == null) {
ErrorResponse error = new ErrorResponse();
error.set("Customer not found");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
this.repository.delete(customerToDelete);
CustomerResponse customerResponse = new CustomerResponse();
customerResponse.set(customerToDelete);
return ResponseEntity.ok(customerResponse);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.booleanuk.api.cinema.customers;

import com.booleanuk.api.cinema.customers.Customer;
import org.springframework.data.jpa.repository.JpaRepository;

public interface CustomerRepository extends JpaRepository<Customer, Integer>{
}
65 changes: 65 additions & 0 deletions src/main/java/com/booleanuk/api/cinema/movies/Movie.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.booleanuk.api.cinema.movies;

import com.booleanuk.api.cinema.screenings.Screening;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;
import java.util.List;

@Getter
@Setter
@AllArgsConstructor
@Entity
@Table(name = "movies")
@JsonIgnoreProperties({"screenings"})
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
private LocalDate createdAt;

@Column
private LocalDate updatedAt;


@OneToMany(cascade = CascadeType.ALL, mappedBy = "movie", orphanRemoval = true)
private List<Screening> screenings;

public Movie(String title, String rating, String description, int runtimeMins) {
this.title = title;
this.rating = rating;
this.description = description;
this.runtimeMins = runtimeMins;
createdAt = LocalDate.now();
updatedAt = LocalDate.now();

}

public Movie(int id) {
this.id = id;
}

public Movie() {
createdAt = LocalDate.now();
updatedAt = LocalDate.now();
}
}
93 changes: 93 additions & 0 deletions src/main/java/com/booleanuk/api/cinema/movies/MovieController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package com.booleanuk.api.cinema.movies;

import com.booleanuk.api.cinema.responses.*;
import com.booleanuk.api.cinema.screenings.Screening;
import com.booleanuk.api.cinema.screenings.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 java.time.LocalDate;

@RestController
@RequestMapping("movies")

public class MovieController {

@Autowired
private final MovieRepository repository;
@Autowired
private final ScreeningRepository screeningRepository;

public MovieController(MovieRepository repository, ScreeningRepository screeningRepository) {
this.repository = repository;
this.screeningRepository = screeningRepository;
}

@GetMapping
public ResponseEntity<MovieListResponse> getAll() {
MovieListResponse movieListResponse = new MovieListResponse();
movieListResponse.set(this.repository.findAll());
return ResponseEntity.ok(movieListResponse);
}

@PostMapping
public ResponseEntity<Response<?>> createAMovie(@RequestBody Movie movie) {
MovieResponse movieResponse = new MovieResponse();
ScreeningResponse screeningResponse = new ScreeningResponse();
try {
movieResponse.set(this.repository.save(movie));
for(Screening screening : movie.getScreenings()){
screening = new Screening(movie, screening.getScreenNumber(), screening.getStartsAt(), screening.getCapacity());
screeningResponse.set(this.screeningRepository.save(screening));
}

} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("Bad request - cannot create movie and/or screening(s)");
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(movieResponse, HttpStatus.CREATED);
}

@PutMapping("{id}")
public ResponseEntity<Response<?>> updateAMovie(@PathVariable int id, @RequestBody Movie movie) {
Movie movieToUpdate = null;
try {
movieToUpdate = this.repository.findById(id).orElse(null);
} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("Bad request - could not successfully find movie");
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
if (movieToUpdate == null) {
ErrorResponse error = new ErrorResponse();
error.set("Artist not found");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
movieToUpdate.setTitle(movie.getTitle());
movieToUpdate.setRating(movie.getRating());
movieToUpdate.setDescription(movie.getDescription());
movieToUpdate.setRuntimeMins(movie.getRuntimeMins());
movieToUpdate.setUpdatedAt(LocalDate.now());
movieToUpdate = this.repository.save(movieToUpdate);
MovieResponse movieResponse = new MovieResponse();
movieResponse.set(movieToUpdate);
return new ResponseEntity<>(movieResponse, HttpStatus.CREATED);
}

@DeleteMapping("{id}")
public ResponseEntity<Response<?>> deleteAMovie(@PathVariable int id) {
Movie movieToDelete = this.repository.findById(id).orElse(null);
if (movieToDelete == null) {
ErrorResponse error = new ErrorResponse();
error.set("Movie not found");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
this.repository.delete(movieToDelete);
MovieResponse movieResponse = new MovieResponse();
movieResponse.set(movieToDelete);
return ResponseEntity.ok(movieResponse);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.booleanuk.api.cinema.movies;

import com.booleanuk.api.cinema.movies.Movie;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MovieRepository extends JpaRepository<Movie, Integer>{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.booleanuk.api.cinema.responses;

import com.booleanuk.api.cinema.customers.Customer;

import java.util.List;

public class CustomerListResponse extends Response<List<Customer>>{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.booleanuk.api.cinema.responses;

import com.booleanuk.api.cinema.customers.Customer;

public class CustomerResponse extends Response<Customer>{
}

Loading