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
12 changes: 10 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,15 +13,23 @@ 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'
}
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);
}
}
44 changes: 44 additions & 0 deletions src/main/java/com/booleanuk/api/cinema/customer/Customer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.booleanuk.api.cinema.customer;

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

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;

@Column
private String created_at;

@Column
private String updated_at;

@OneToMany(mappedBy = "customer", cascade = CascadeType.REMOVE)
@JsonIgnore
private List<Ticket> tickets;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.booleanuk.api.cinema.customer;

import com.booleanuk.api.cinema.response.CustomerResponse;
import com.booleanuk.api.cinema.response.CustomerResponseList;
import com.booleanuk.api.cinema.response.ErrorResponse;
import com.booleanuk.api.cinema.response.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 org.springframework.web.server.ResponseStatusException;

import java.time.LocalDateTime;
import java.util.List;

@RestController
@RequestMapping("customers")
public class CustomerController {

@Autowired
private CustomerRepository customerRepository;

@PostMapping
public ResponseEntity<Response<?>> createCustomer(@RequestBody Customer customer) {
CustomerResponse response = new CustomerResponse();
try {
customer.setCreated_at(String.valueOf(LocalDateTime.now()));
response.set(this.customerRepository.save(customer));
} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("bad request");
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(response, HttpStatus.CREATED);
}

@GetMapping
@ResponseStatus(HttpStatus.OK)
public ResponseEntity<CustomerResponseList> getAllCustomers() {
CustomerResponseList response = new CustomerResponseList();
response.set(this.customerRepository.findAll());
return ResponseEntity.ok(response);
}

@PutMapping("/{id}")
public ResponseEntity<Response<?>> updateCustomer(@PathVariable int id, @RequestBody Customer customer) {
Customer updatedCustomer = null;
CustomerResponse response = new CustomerResponse();

try {
updatedCustomer = this.customerRepository.findById(id).orElse(null);
} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("bad request");
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}

if (updatedCustomer == null) {
ErrorResponse error = new ErrorResponse();
error.set("not found");
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
updatedCustomer.setName(customer.getName());
updatedCustomer.setEmail(customer.getEmail());
updatedCustomer.setPhone(customer.getPhone());
updatedCustomer.setUpdated_at(String.valueOf(LocalDateTime.now()));
response.set(this.customerRepository.save(updatedCustomer));

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

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

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

this.customerRepository.delete(deletedCustomer);
response.set(deletedCustomer);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.booleanuk.api.cinema.customer;

import org.springframework.data.jpa.repository.JpaRepository;

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

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

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;

@Column
private String created_at;

@Column
private String updated_at;

@OneToMany(mappedBy = "movie", cascade = CascadeType.REMOVE)
@JsonIgnore
private List<Screening> screenings;

public Movie(int id) {
this.id = id;
}
}
92 changes: 92 additions & 0 deletions src/main/java/com/booleanuk/api/cinema/movie/MovieController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package com.booleanuk.api.cinema.movie;

import com.booleanuk.api.cinema.response.ErrorResponse;
import com.booleanuk.api.cinema.response.MovieResponse;
import com.booleanuk.api.cinema.response.MovieResponseList;
import com.booleanuk.api.cinema.response.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 org.springframework.web.server.ResponseStatusException;

import java.time.LocalDateTime;
import java.util.List;

@RestController
@RequestMapping("movies")
public class MovieController {
@Autowired
private MovieRepository movieRepository;

@PostMapping
public ResponseEntity<Response<?>> createMovie(@RequestBody Movie movie) {
MovieResponse response = new MovieResponse();
movie.setCreated_at(String.valueOf(LocalDateTime.now()));

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

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

@GetMapping
@ResponseStatus(HttpStatus.OK)
public ResponseEntity<MovieResponseList> getAllMovies() {
MovieResponseList response = new MovieResponseList();
response.set(this.movieRepository.findAll());
return ResponseEntity.ok(response);
}

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


try {
updatedMovie = this.movieRepository.findById(id).orElse(null);
} catch (Exception e) {
ErrorResponse error = new ErrorResponse();
error.set("bad request");
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}

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

updatedMovie.setTitle(movie.getTitle());
updatedMovie.setRating(movie.getRating());
updatedMovie.setDescription(movie.getDescription());
updatedMovie.setRuntimeMins(movie.getRuntimeMins());
updatedMovie.setUpdated_at(String.valueOf(LocalDateTime.now()));

response.set(this.movieRepository.save(updatedMovie));

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

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

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

this.movieRepository.delete(deletedMovie);
response.set(deletedMovie);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.booleanuk.api.cinema.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.response;

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

import java.util.List;

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

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

import java.util.List;

public class CustomerResponseList extends Response<List<Customer>>{
}
19 changes: 19 additions & 0 deletions src/main/java/com/booleanuk/api/cinema/response/ErrorResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.booleanuk.api.cinema.response;

import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.HashMap;
import java.util.Map;

@Getter
@NoArgsConstructor
public class ErrorResponse extends Response<Map<String, String>> {

public void set(String message) {
this.status = "error";
Map<String, String> reply = new HashMap<>();
reply.put("message", message);
this.data = reply;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.booleanuk.api.cinema.response;

import com.booleanuk.api.cinema.movie.Movie;

public class MovieResponse extends Response<Movie> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.booleanuk.api.cinema.response;

import com.booleanuk.api.cinema.movie.Movie;

import java.util.List;

public class MovieResponseList extends Response<List<Movie>> {
}
Loading