diff --git a/.gitignore b/.gitignore index c2065bc..b3db3e2 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ out/ ### VS Code ### .vscode/ + +application.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9a8a6f9 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,9 @@ +FROM mcr.microsoft.com/openjdk/jdk:21-ubuntu + +WORKDIR /app + +COPY build/libs/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/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f865b08 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +services: + app: + image: 'docker-day-2: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 + 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/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/PostController.java b/src/main/java/com/booleanuk/api/controllers/PostController.java new file mode 100644 index 0000000..e60727c --- /dev/null +++ b/src/main/java/com/booleanuk/api/controllers/PostController.java @@ -0,0 +1,58 @@ +package com.booleanuk.api.controllers; + + +import com.booleanuk.api.models.Post; +import com.booleanuk.api.models.User; +import com.booleanuk.api.repositories.PostRepository; +import com.booleanuk.api.repositories.UserRepository; +import org.apache.coyote.Response; +import org.aspectj.apache.bcel.Repository; +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("posts") +public class PostController { + + @Autowired + PostRepository postRepository; + + @Autowired + UserRepository userRepository; + + @GetMapping + public ResponseEntity> getAllPosts() { + return new ResponseEntity<>(this.postRepository.findAll(), HttpStatus.OK); + } + + @PostMapping + public ResponseEntity createPost(@RequestBody Post post) { + User user = this.userRepository.findById(post.getUser().getId()) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No such user")); + post.setUser(user); + return new ResponseEntity<>(this.postRepository.save(post), HttpStatus.CREATED); + } + + @PutMapping("{id}") + public ResponseEntity updatePost(@PathVariable(name = "id") int id, @RequestBody Post post) { + Post postToUpdate = this.postRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No such user")); + postToUpdate.setPostBody(post.getPostBody()); + return new ResponseEntity<>(this.postRepository.save(postToUpdate), HttpStatus.OK); + } + + @DeleteMapping("{id}") + public ResponseEntity deletePost(@PathVariable(name = "id") int id) { + Post toDelete = this.postRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found")); + this.postRepository.delete(toDelete); + return ResponseEntity.ok(toDelete); + } + + +} 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..e35a759 --- /dev/null +++ b/src/main/java/com/booleanuk/api/controllers/UserController.java @@ -0,0 +1,49 @@ +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 + UserRepository userRepository; + + @GetMapping + public ResponseEntity> getAllUsers() { + return new ResponseEntity<>(this.userRepository.findAll(), HttpStatus.OK); + } + + @PostMapping + public ResponseEntity createUser(@RequestBody User user) { + return new ResponseEntity<>(this.userRepository.save(user), HttpStatus.OK); + } + + @PutMapping("/{id}") + public ResponseEntity updateUser(@PathVariable(name = "id") int id, @RequestBody User user) { + User toUpdate = this.userRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "User not found")); + toUpdate.setName(user.getName()); + return new ResponseEntity<>(this.userRepository.save(toUpdate), HttpStatus.CREATED); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteUser(@PathVariable int id) { + User toDelete = this.userRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Not found")); + + this.userRepository.delete(toDelete); + return ResponseEntity.ok(toDelete); + } + + + +} diff --git a/src/main/java/com/booleanuk/api/models/Post.java b/src/main/java/com/booleanuk/api/models/Post.java new file mode 100644 index 0000000..9b0c65b --- /dev/null +++ b/src/main/java/com/booleanuk/api/models/Post.java @@ -0,0 +1,34 @@ +package com.booleanuk.api.models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "posts") +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String postBody; + + @ManyToOne + @JoinColumn(name = "user_id") + @JsonIgnoreProperties("posts") + private User user; + + public Post(int id) { + this.id = id; + } + +} 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..174f9e5 --- /dev/null +++ b/src/main/java/com/booleanuk/api/models/User.java @@ -0,0 +1,35 @@ +package com.booleanuk.api.models; + +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; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "users") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String name; + + @OneToMany(mappedBy = "user") + @JsonIgnoreProperties({"id", "user"}) + private List posts; + + public User(int id) { + this.id = id; + } + + +} diff --git a/src/main/java/com/booleanuk/api/repositories/PostRepository.java b/src/main/java/com/booleanuk/api/repositories/PostRepository.java new file mode 100644 index 0000000..44b816d --- /dev/null +++ b/src/main/java/com/booleanuk/api/repositories/PostRepository.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.repositories; + +import com.booleanuk.api.models.Post; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostRepository 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..5f430b2 --- /dev/null +++ b/src/main/java/com/booleanuk/api/repositories/UserRepository.java @@ -0,0 +1,6 @@ +package com.booleanuk.api.repositories; + +import com.booleanuk.api.models.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository {}