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
7 changes: 5 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 @@ -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') {
Expand Down
12 changes: 12 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,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);

}
}
42 changes: 42 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,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;
}

}
Original file line number Diff line number Diff line change
@@ -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<Customer> getAllCustomers() {
return this.customerRepository.findAll();
}

// @GetMapping("/{id}")
// public ResponseEntity<Customer> getOneCustomer(@PathVariable int id) {
// return this.customerRepository.findById(id)
// .map(ResponseEntity::ok)
// .orElse(ResponseEntity.notFound().build());
// }

@PostMapping
public ResponseEntity<Customer> create(@RequestBody Customer customer) {
customer.setCreated_at(String.valueOf(LocalDateTime.now()));
return new ResponseEntity<Customer>(this.customerRepository.save(customer), HttpStatus.CREATED);
}

@PutMapping("/{id}")
public ResponseEntity<Customer> 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<Customer>(this.customerRepository.save(customerToUpdate), HttpStatus.CREATED);
}

@DeleteMapping("/{id}")
public ResponseEntity<Customer> 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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.booleanuk.api.cinema.customer;

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

public interface CustomerRepository extends JpaRepository<Customer, Integer> {

}
60 changes: 60 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,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<Screening> 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;
}

}
61 changes: 61 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,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<Movie> getAllMovies() {
return this.movieRepository.findAll();
}

// @GetMapping("/{id}")
// public ResponseEntity<Movie> getOneMovie(@PathVariable int id) {
// return this.movieRepository.findById(id)
// .map(ResponseEntity::ok)
// .orElse(ResponseEntity.notFound().build());
// }

@PostMapping
public ResponseEntity<Movie> create(@RequestBody Movie movie) {
movie.setCreated_at(String.valueOf(LocalDateTime.now()));
return new ResponseEntity<Movie>(this.movieRepository.save(movie), HttpStatus.CREATED);
}

@PutMapping("/{id}")
public ResponseEntity<Movie> 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<Movie>(this.movieRepository.save(movieToUpdate), HttpStatus.CREATED);
}

@DeleteMapping("/{id}")
public ResponseEntity<Movie> 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);
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.booleanuk.api.cinema.movie;

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

public interface MovieRepository extends JpaRepository<Movie, Integer> {

}
48 changes: 48 additions & 0 deletions src/main/java/com/booleanuk/api/cinema/screening/Screening.java
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -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<Screening> getAllScreenings(@PathVariable int id) {
Movie movie = this.movieRepository.findById(id).orElseThrow(
() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found")
);

return movie.getScreenings();
}

@PostMapping
public ResponseEntity<Screening> 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<Screening>(this.screeningRepository.save(screening), HttpStatus.CREATED);
}

}
Original file line number Diff line number Diff line change
@@ -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<Screening, Integer> {
}
Loading