diff --git a/.gitignore b/.gitignore index c2065bc..c7257fc 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ out/ ### VS Code ### .vscode/ + +*.jar \ No newline at end of file diff --git a/build.gradle b/build.gradle index fb070c4..e775b43 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.1.4' - id 'io.spring.dependency-management' version '1.1.3' + id 'org.springframework.boot' version '3.5.4' + id 'io.spring.dependency-management' version '1.1.7' } group = 'com.booleanuk' @@ -23,7 +23,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' - implementation 'org.postgresql:postgresql:42.6.0' + implementation 'org.postgresql:postgresql:42.7.7' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } @@ -31,3 +31,14 @@ dependencies { tasks.named('test') { useJUnitPlatform() } + +jar { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + manifest { + attributes 'Main-Class': 'com.booleanuk.api.Main' + } + + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } +} diff --git a/dockers/Dockerfile b/dockers/Dockerfile new file mode 100644 index 0000000..c28337f --- /dev/null +++ b/dockers/Dockerfile @@ -0,0 +1,9 @@ +FROM mcr.microsoft.com/openjdk/jdk:21-ubuntu + +WORKDIR /app + +COPY java.docker.day.2-0.0.1.jar /app/java.docker.day.2-0.0.1.jar + +EXPOSE 4000 + +ENTRYPOINT [ "java", "-jar", "java.docker.day.2-0.0.1.jar" ] \ No newline at end of file diff --git a/dockers/docker-compose.yml b/dockers/docker-compose.yml new file mode 100644 index 0000000..a201f91 --- /dev/null +++ b/dockers/docker-compose.yml @@ -0,0 +1,23 @@ +services: + app: + image: 'hibernate-app:latest' + container_name: app + depends_on: + - db + ports: + - '4000:4000' + environment: + - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mypostgresuser + - SPRING_DATASOURCE_USERNAME=mypostgresuser + - SPRING_DATASOURCE_PASSWORD=mypostgrespassword + - SPRING_JPA_HIBERNATE_DDL_AUTO=update + + db: + image: 'postgres:latest' + container_name: db + ports: + - '5432:5432' + environment: + - POSTGRES_USER=mypostgresuser + - POSTGRES_DATABASE=mypostgresuser + - POSTGRES_PASSWORD=mypostgrespassword \ No newline at end of file diff --git a/src/main/java/com/booleanuk/api/.gitkeep b/src/main/java/com/booleanuk/api/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/booleanuk/api/Main.java b/src/main/java/com/booleanuk/api/Main.java new file mode 100644 index 0000000..8e749e0 --- /dev/null +++ b/src/main/java/com/booleanuk/api/Main.java @@ -0,0 +1,11 @@ +package com.booleanuk.api; + +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); + } +} diff --git a/src/main/java/com/booleanuk/api/controllers/GameController.java b/src/main/java/com/booleanuk/api/controllers/GameController.java new file mode 100644 index 0000000..3bec174 --- /dev/null +++ b/src/main/java/com/booleanuk/api/controllers/GameController.java @@ -0,0 +1,59 @@ +package com.booleanuk.api.controllers; + +import com.booleanuk.api.models.Game; +import com.booleanuk.api.repositories.GameRepository; +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.util.List; + +@RestController +@RequestMapping("games") +public class GameController { + + @Autowired + private GameRepository gameRepository; + + @GetMapping + public ResponseEntity> getAll() { + return ResponseEntity.ok(this.gameRepository.findAll()); + } + + @PostMapping + public ResponseEntity create(@RequestBody Game game) { + return new ResponseEntity(this.gameRepository.save(game), HttpStatus.CREATED); + } + + @GetMapping("/{id}") + public ResponseEntity getOne(@PathVariable int id) { + Game game = null; + game = this.gameRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found")); + return ResponseEntity.ok(game); + } + + @PutMapping("/{id}") + public ResponseEntity update(@PathVariable int id, @RequestBody Game game) { + Game updated = this.gameRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found")); + + updated.setTitle(game.getTitle()); + updated.setGenre(game.getGenre()); + updated.setPublisher(game.getPublisher()); + updated.setDeveloper(game.getDeveloper()); + updated.setReleaseYear(game.getReleaseYear()); + updated.setEarlyAccess(game.isEarlyAccess()); + + return new ResponseEntity(this.gameRepository.save(updated), HttpStatus.CREATED); + } + + @DeleteMapping("/{id}") + public ResponseEntity delete(@PathVariable int id) { + Game delete = this.gameRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found")); + this.gameRepository.delete(delete); + + return ResponseEntity.ok(delete); + } +} diff --git a/src/main/java/com/booleanuk/api/controllers/UserController.java b/src/main/java/com/booleanuk/api/controllers/UserController.java new file mode 100644 index 0000000..063a0c3 --- /dev/null +++ b/src/main/java/com/booleanuk/api/controllers/UserController.java @@ -0,0 +1,59 @@ +package com.booleanuk.api.controllers; + +import com.booleanuk.api.models.User; +import com.booleanuk.api.repositories.UserRepository; +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.util.List; + +@RestController +@RequestMapping("users") +public class UserController { + + @Autowired + private UserRepository userRepository; + + @GetMapping + public ResponseEntity> getAll() { + return ResponseEntity.ok(this.userRepository.findAll()); + } + + @GetMapping("/{id}") + public ResponseEntity getOne(@PathVariable int id) { + User user = null; + user = this.userRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found")); + return ResponseEntity.ok(user); + } + + @PostMapping + public ResponseEntity create(@RequestBody User user) { + return new ResponseEntity(this.userRepository.save(user), HttpStatus.CREATED); + } + + + @PutMapping("/{id}") + public ResponseEntity update(@PathVariable int id, @RequestBody User user) { + User updated = this.userRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found")); + + updated.setEmail(user.getEmail()); + updated.setFirstName(user.getFirstName()); + updated.setLastName(user.getLastName()); + updated.setUsername(user.getUsername()); + updated.setPhone(user.getPhone()); + + return new ResponseEntity(this.userRepository.save(updated), HttpStatus.CREATED); + } + + @DeleteMapping("/{id}") + public ResponseEntity delete(@PathVariable int id) { + User delete = this.userRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found")); + this.userRepository.delete(delete); + + return ResponseEntity.ok(delete); + } +} diff --git a/src/main/java/com/booleanuk/api/models/Game.java b/src/main/java/com/booleanuk/api/models/Game.java new file mode 100644 index 0000000..5b4d3ca --- /dev/null +++ b/src/main/java/com/booleanuk/api/models/Game.java @@ -0,0 +1,53 @@ +package com.booleanuk.api.models; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@Entity +@Table(name = "games") +public class Game { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String title; + + @Column + private String genre; + + @Column + private String publisher; + + @Column + private String developer; + + @Column(name = "release_year") + private int releaseYear; + + @Column(name = "is_early_access") + private boolean isEarlyAccess; + + public Game(int id) { + this.id = id; + } + + @Override + public String toString() { + return "Game{" + + "id=" + id + + ", title='" + title + '\'' + + ", genre='" + genre + '\'' + + ", publisher='" + publisher + '\'' + + ", developer='" + developer + '\'' + + ", releaseYear=" + releaseYear + + ", isEarlyAccess=" + isEarlyAccess + + '}'; + } +} diff --git a/src/main/java/com/booleanuk/api/models/User.java b/src/main/java/com/booleanuk/api/models/User.java new file mode 100644 index 0000000..609c74e --- /dev/null +++ b/src/main/java/com/booleanuk/api/models/User.java @@ -0,0 +1,67 @@ +package com.booleanuk.api.models; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.Objects; + +@Getter +@Setter +@NoArgsConstructor +@Entity +@Table(name = "users") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Column + private String email; + + @Column + private String firstName; + + @Column + private String lastName; + + @Column + private String username; + + @Column + private String phone; + + public User(String email, String firstName, String lastName, String username, String phone) { + this.email = email; + this.firstName = firstName; + this.lastName = lastName; + this.username = username; + this.phone = phone; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return Objects.equals(id, user.id) && Objects.equals(email, user.email) && Objects.equals(firstName, user.firstName) && Objects.equals(lastName, user.lastName) && Objects.equals(username, user.username) && Objects.equals(phone, user.phone); + } + + @Override + public int hashCode() { + return Objects.hash(id, email, firstName, lastName, username, phone); + } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", email='" + email + '\'' + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", username='" + username + '\'' + + ", phone='" + phone + '\'' + + '}'; + } +} diff --git a/src/main/java/com/booleanuk/api/repositories/GameRepository.java b/src/main/java/com/booleanuk/api/repositories/GameRepository.java new file mode 100644 index 0000000..e29e9c6 --- /dev/null +++ b/src/main/java/com/booleanuk/api/repositories/GameRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.repositories; + +import com.booleanuk.api.models.Game; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GameRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/repositories/UserRepository.java b/src/main/java/com/booleanuk/api/repositories/UserRepository.java new file mode 100644 index 0000000..9fb4c54 --- /dev/null +++ b/src/main/java/com/booleanuk/api/repositories/UserRepository.java @@ -0,0 +1,8 @@ +package com.booleanuk.api.repositories; + +import com.booleanuk.api.models.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { + +}