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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,5 @@ out/

### VS Code ###
.vscode/

application.yml
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
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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package com.booleanuk.api.cinema.controller;

import com.booleanuk.api.cinema.model.Customer;
import com.booleanuk.api.cinema.repository.CustomerRepository;
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 CustomerRepository customerRepository;


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



@ResponseStatus(HttpStatus.CREATED)
@PostMapping
public ResponseEntity<Response<?>> create(@RequestBody Customer request) {
CustomerResponse customerResponse = new CustomerResponse();
try{
customerResponse.set(this.customerRepository.save(request));
} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("bad request");
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.customerRepository.findById(id).orElse(null);
if(customerToUpdate == null){
ErrorResponse error = new ErrorResponse();
error.set("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.customerRepository.save(customerToUpdate);

} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("bad request");
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}

CustomerResponse customerResponse = new CustomerResponse();
customerResponse.set(customerToUpdate);

return new ResponseEntity<>(customerResponse, HttpStatus.CREATED);
}



@DeleteMapping("{id}")
public ResponseEntity<Response<?>> deleteCustomer(@PathVariable int id) {
Customer customerToDelete = this.customerRepository.findById(id).orElse(null);

if(customerToDelete == null){
ErrorResponse error = new ErrorResponse();
error.set("not found");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}

this.customerRepository.delete(customerToDelete);
CustomerResponse customerResponse = new CustomerResponse();
customerResponse.set(customerToDelete);

return ResponseEntity.ok(customerResponse);
}
}
107 changes: 107 additions & 0 deletions src/main/java/com/booleanuk/api/cinema/controller/MovieController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
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 com.booleanuk.api.cinema.responses.ErrorResponse;
import com.booleanuk.api.cinema.responses.MovieListResponse;
import com.booleanuk.api.cinema.responses.MovieResponse;
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("movies")
public class MovieController {
@Autowired
private MovieRepository movieRepository;

@Autowired
private ScreeningRepository screeningRepository;


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



@ResponseStatus(HttpStatus.CREATED)
@PostMapping
public ResponseEntity<Response<?>> create(@RequestBody Movie request) {
MovieResponse movieResponse = new MovieResponse();

try{
movieResponse.set(this.movieRepository.save(request));
} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("bad request");
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}

if(request.getScreenings() != null){
for(Screening screening : request.getScreenings()){
Screening newScreening = new Screening(screening.getScreenNumber(), screening.getCapacity(), screening.getStartsAt(), request);
this.screeningRepository.save(newScreening);
}
}

return new ResponseEntity<>(movieResponse, HttpStatus.CREATED);
}



@PutMapping("{id}")
public ResponseEntity<Response<?>> updateMovie(@PathVariable int id, @RequestBody Movie movie) {
Movie movieToUpdate = null;

try {
movieToUpdate = this.movieRepository.findById(id).orElse(null);
if(movieToUpdate == null){
ErrorResponse error = new ErrorResponse();
error.set("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.movieRepository.save(movieToUpdate);

} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("bad request");
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
MovieResponse movieResponse = new MovieResponse();
movieResponse.set(movieToUpdate);

return new ResponseEntity<>(movieResponse, HttpStatus.CREATED);
}


@DeleteMapping("{id}")
public ResponseEntity<Response<?>> deleteMovie(@PathVariable int id) {
Movie movieToDelete = this.movieRepository.findById(id).orElse(null);

if(movieToDelete == null){
ErrorResponse error = new ErrorResponse();
error.set("not found");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
this.movieRepository.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,68 @@
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 com.booleanuk.api.cinema.responses.ErrorResponse;
import com.booleanuk.api.cinema.responses.Response;
import com.booleanuk.api.cinema.responses.ScreeningListResponse;
import com.booleanuk.api.cinema.responses.ScreeningResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("movies/{id}/screenings")
public class ScreeningController {
@Autowired
private ScreeningRepository screeningRepository;

@Autowired
private MovieRepository movieRepository;


@GetMapping
public ResponseEntity<?> getAllScreening(@PathVariable int id){
Movie movie = this.movieRepository.findById(id).orElse(null);
if(movie == null){
ErrorResponse error = new ErrorResponse();
error.set("not found");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}

ScreeningListResponse screeningListResponse = new ScreeningListResponse();
screeningListResponse.set(this.screeningRepository.getScreeningByMovie(movie));

return ResponseEntity.ok(screeningListResponse);
}



@ResponseStatus(HttpStatus.CREATED)
@PostMapping
public ResponseEntity<Response<?>> create(@PathVariable int id, @RequestBody Screening request) {
ScreeningResponse screeningResponse = new ScreeningResponse();

try {
Movie movie = this.movieRepository.findById(id).orElse(null);
if(movie == null){
ErrorResponse error = new ErrorResponse();
error.set("not found");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}

request.setMovie(movie);
screeningResponse.set(this.screeningRepository.save(request));

} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("bad request");
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}

return new ResponseEntity<>(screeningResponse, HttpStatus.CREATED);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.booleanuk.api.cinema.controller;

import com.booleanuk.api.cinema.model.Customer;
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.ScreeningRepository;
import com.booleanuk.api.cinema.repository.TicketRepository;
import com.booleanuk.api.cinema.responses.ErrorResponse;
import com.booleanuk.api.cinema.responses.Response;
import com.booleanuk.api.cinema.responses.TicketListResponse;
import com.booleanuk.api.cinema.responses.TicketResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;


@RestController
@RequestMapping("customers/{cId}/screenings/{sId}")
public class TicketController {
@Autowired
private TicketRepository ticketRepository;

@Autowired
private CustomerRepository customerRepository;

@Autowired
private ScreeningRepository screeningRepository;


@GetMapping
public ResponseEntity<?> getAllTickets(@PathVariable("cId") int cId, @PathVariable("sId") int sId){
Customer customer = this.customerRepository.findById(cId).orElse(null);
Screening screening = this.screeningRepository.findById(sId).orElse(null);

if(customer == null || screening == null){
ErrorResponse error = new ErrorResponse();
error.set("not found");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
TicketListResponse ticketListResponse = new TicketListResponse();
ticketListResponse.set(this.ticketRepository.findAllTicketsByCustomerAndScreening(customer, screening));

return ResponseEntity.ok(ticketListResponse);
}


@ResponseStatus(HttpStatus.CREATED)
@PostMapping
public ResponseEntity<Response<?>> create(@RequestBody Ticket request, @PathVariable("cId") int cId, @PathVariable("sId") int sId) {
TicketResponse ticketResponse = new TicketResponse();

Customer customer = this.customerRepository.findById(cId).orElse(null);
Screening screening = this.screeningRepository.findById(sId).orElse(null);

if(customer == null || screening == null){
ErrorResponse error = new ErrorResponse();
error.set("not found");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
request.setCustomer(customer);
request.setScreening(screening);

ticketResponse.set(this.ticketRepository.save(request));
return new ResponseEntity<>(ticketResponse, HttpStatus.CREATED);
}
}
Loading