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

### VS Code ###
.vscode/

15 changes: 13 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.2'
id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.booleanuk'
Expand All @@ -13,17 +13,28 @@ 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);
}
}
51 changes: 51 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,51 @@
package com.booleanuk.api.cinema.customers;


import com.booleanuk.api.cinema.screens.Screen;
import com.booleanuk.api.cinema.tickets.Ticket;
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.util.List;


@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@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 = "date_created")
private String date_created;

@Column(name = "date_updated")
private String date_updated;

@OneToMany(mappedBy = "customer")
@JsonIgnoreProperties({"id", "customer"})
private List<Ticket> tickets;

public Customer(int id) {
this.id = id;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.booleanuk.api.cinema.customers;


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 org.springframework.web.server.ResponseStatusException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

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

@Autowired
CustomerRepository customerRepository;

@GetMapping
public ResponseEntity<Response<?>> getAllCustomers() {
return new ResponseEntity<>(new Response<>(customerRepository.findAll()), HttpStatus.OK);
}

@PostMapping
public ResponseEntity<Response<?>> createCustomer(@RequestBody Customer customer) {
if (customer == null) {
ErrorResponse errorResponse = new ErrorResponse(Map.of("message","Failed to create customer"));
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_GATEWAY);
}
customer.setDate_created(String.valueOf(LocalDateTime.now()));
return new ResponseEntity<>(new Response<>(this.customerRepository.save(customer)), HttpStatus.CREATED);
}

@PutMapping("/{id}")
public ResponseEntity<Customer> updateCustomer(@PathVariable(name = "id") int id, @RequestBody Customer customer) {
Customer customerToUpdate = this.customerRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No such customer."));
customerToUpdate.setName(customer.getName());
customerToUpdate.setEmail(customer.getEmail());
customerToUpdate.setPhone(customer.getPhone());
customerToUpdate.setDate_updated(String.valueOf(LocalDateTime.now()));
return new ResponseEntity<>(this.customerRepository.save(customerToUpdate), HttpStatus.OK);
}

@DeleteMapping("/{id}")
public ResponseEntity<Customer> deleteCustomer(@PathVariable(name = "id") int id) {
Customer toDelete = this.customerRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No such customer found"));
this.customerRepository.delete(toDelete);
return ResponseEntity.ok(toDelete);

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.booleanuk.api.cinema.customers;

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/movies/Movie.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.booleanuk.api.cinema.movies;

import com.booleanuk.api.cinema.screens.Screen;
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(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({"id", "movie"})
private List<Screen> screens;

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

}
59 changes: 59 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,59 @@
package com.booleanuk.api.cinema.movies;


import com.booleanuk.api.cinema.screens.Screen;
import com.booleanuk.api.cinema.screens.ScreenRepository;
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.ArrayList;
import java.util.List;

@RestController
@RequestMapping("movies")
public class MovieController {

@Autowired
MovieRepository movieRepository;

@Autowired
ScreenRepository screenRepository;

@GetMapping
public ResponseEntity<List<Movie>> getAllMovies() {
return ResponseEntity.ok(movieRepository.findAll());
}

@PostMapping
public ResponseEntity<Movie> createMovie(@RequestBody Movie movie) {
List<Screen> screenList = new ArrayList<>();
movie.setScreens(screenList);
movie.setCreated_at(String.valueOf(LocalDateTime.now()));
return new ResponseEntity<>(this.movieRepository.save(movie), HttpStatus.CREATED);
}

@PutMapping("/{id}")
public ResponseEntity<Movie> updateMovie(@PathVariable(name = "id") int id, @RequestBody Movie movie) {
Movie movieToUpdate = this.movieRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No such movie."));
movieToUpdate.setTitle(movie.getTitle());
movieToUpdate.setDescription(movie.getDescription());
movieToUpdate.setRating(movie.getRating());
movieToUpdate.setRuntime_mins(movie.getRuntime_mins());
movieToUpdate.setUpdated_at(String.valueOf(LocalDateTime.now()));
return new ResponseEntity<>(this.movieRepository.save(movieToUpdate), HttpStatus.OK);
}

@DeleteMapping("/{id}")
public ResponseEntity<Movie> deleteMovie(@PathVariable(name = "id") int id) {
Movie toDelete = this.movieRepository.findById(id)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No such movie found"));
this.screenRepository.deleteAll(toDelete.getScreens());
this.movieRepository.delete(toDelete);
return ResponseEntity.ok(toDelete);

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.booleanuk.api.cinema.movies;

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,18 @@
package com.booleanuk.api.cinema.responses;

import lombok.Getter;
import lombok.NoArgsConstructor;

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

@Getter

public class ErrorResponse extends Response<Map<String, String>>{

public ErrorResponse(Map<String, String> data) {
super(data);
this.status = "Error";

}
}
15 changes: 15 additions & 0 deletions src/main/java/com/booleanuk/api/cinema/responses/Response.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.booleanuk.api.cinema.responses;

import lombok.Getter;

@Getter
public class Response<T> {
protected String status;
protected T data;

public Response(T data) {
this.status = "Success";
this.data = data;
}

}
56 changes: 56 additions & 0 deletions src/main/java/com/booleanuk/api/cinema/screens/Screen.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.booleanuk.api.cinema.screens;

import com.booleanuk.api.cinema.movies.Movie;
import com.booleanuk.api.cinema.tickets.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.time.LocalDateTime;
import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "screens")
public class Screen {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(name = "screen_number")
private int screen_number;

@Column(name = "starts_at")
private String starts_at;

@Column(name = "capacity")
private int capacity;

@Column(name = "created_at")
private String created_at;

@Column(name = "updated_at")
private String updated_at;

@ManyToOne
@JoinColumn(name = "movie_id")
@JsonIgnore
private Movie movie;

@OneToMany(mappedBy = "screen")
@JsonIgnoreProperties({"id", "screen"})
private List<Ticket> tickets;

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

}
Loading