diff --git a/.gitignore b/.gitignore index c2065bc..0bfa5a4 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,7 @@ out/ ### VS Code ### .vscode/ + +application.yml + +docker-compose.yml \ No newline at end of file diff --git a/build.gradle b/build.gradle index fb070c4..60613d7 100644 --- a/build.gradle +++ b/build.gradle @@ -30,4 +30,4 @@ dependencies { tasks.named('test') { useJUnitPlatform() -} +} \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..b52dcda --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,10 @@ +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/docker/java.docker.day.2-0.0.1.jar b/docker/java.docker.day.2-0.0.1.jar new file mode 100644 index 0000000..6dbbff3 Binary files /dev/null and b/docker/java.docker.day.2-0.0.1.jar differ 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..5749fbb --- /dev/null +++ b/src/main/java/com/booleanuk/api/Main.java @@ -0,0 +1,12 @@ +package com.booleanuk.api; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +public class Main { + public static void main(String[] args) { + SpringApplication.run(Main.class, args); + } +} diff --git a/src/main/java/com/booleanuk/api/controller/PostController.java b/src/main/java/com/booleanuk/api/controller/PostController.java new file mode 100644 index 0000000..9ea9940 --- /dev/null +++ b/src/main/java/com/booleanuk/api/controller/PostController.java @@ -0,0 +1,56 @@ +package com.booleanuk.api.controller; + +import com.booleanuk.api.model.Post; +import com.booleanuk.api.repository.PostRepository; +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 + private PostRepository postRepository; + + @PostMapping + public ResponseEntity createPost(@RequestBody Post post) { + if (post == null) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(this.postRepository.save(post), HttpStatus.CREATED); + } + + @GetMapping + public List getAllPosts() { + return this.postRepository.findAll(); + } + + @GetMapping("/{id}") + public ResponseEntity getPost(@PathVariable int id) { + return new ResponseEntity<>(this.postRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND,"No post with that id were found")), HttpStatus.OK); + } + + @PutMapping("/{id}") + public ResponseEntity updatePost(@PathVariable int id, @RequestBody Post post) { + if (post == null) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Could not update the post, please check all required fields are correct"); + } + Post updatePost = this.postRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND,"No post with that id were found ")); + updatePost.setTitle(post.getTitle()); + updatePost.setDescription(post.getDescription()); + + return new ResponseEntity<>(this.postRepository.save(updatePost), HttpStatus.CREATED); + } + + @DeleteMapping("/{id}") + public ResponseEntity deletePost(@PathVariable int id) { + Post deletedPost = this.postRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id were found")); + this.postRepository.delete(deletedPost); + return ResponseEntity.ok(deletedPost); + } +} diff --git a/src/main/java/com/booleanuk/api/controller/UserController.java b/src/main/java/com/booleanuk/api/controller/UserController.java new file mode 100644 index 0000000..e222180 --- /dev/null +++ b/src/main/java/com/booleanuk/api/controller/UserController.java @@ -0,0 +1,56 @@ +package com.booleanuk.api.controller; + +import com.booleanuk.api.model.User; +import com.booleanuk.api.repository.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; + + @PostMapping + public ResponseEntity createUser(@RequestBody User user) { + if (user == null) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST); + } + return new ResponseEntity<>(this.userRepository.save(user), HttpStatus.CREATED); + } + + @GetMapping + public List getAllUsers() { + return this.userRepository.findAll(); + } + + @GetMapping("/{id}") + public ResponseEntity getUser(@PathVariable int id) { + return new ResponseEntity<>(this.userRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND,"No user with that id were found")), HttpStatus.OK); + } + + @PutMapping("/{id}") + public ResponseEntity updateUser(@PathVariable int id, @RequestBody User user) { + if (user == null) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Could not update the user, please check all required fields are correct"); + } + User updateUser = this.userRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND,"No user with that id were found ")); + updateUser.setUsername(user.getUsername()); + updateUser.setEmail(user.getEmail()); + + return new ResponseEntity<>(this.userRepository.save(updateUser), HttpStatus.CREATED); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteUser(@PathVariable int id) { + User deletedUser = this.userRepository.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id were found")); + this.userRepository.delete(deletedUser); + return ResponseEntity.ok(deletedUser); + } +} diff --git a/src/main/java/com/booleanuk/api/model/Post.java b/src/main/java/com/booleanuk/api/model/Post.java new file mode 100644 index 0000000..ae43af3 --- /dev/null +++ b/src/main/java/com/booleanuk/api/model/Post.java @@ -0,0 +1,39 @@ +package com.booleanuk.api.model; + +import com.fasterxml.jackson.annotation.JsonIncludeProperties; +import jakarta.persistence.*; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.lang.NonNull; + +import java.util.List; + +@NoArgsConstructor +@Entity +@Table(name = "posts") +@Getter +@Setter +@Data +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String title; + + @Column + private String description; + + @ManyToOne + @JoinColumn(name = "user_id") + @JsonIncludeProperties({"username"}) + private User user; + + public Post(int id) { + this.id = id; + } +} diff --git a/src/main/java/com/booleanuk/api/model/User.java b/src/main/java/com/booleanuk/api/model/User.java new file mode 100644 index 0000000..9b7ae05 --- /dev/null +++ b/src/main/java/com/booleanuk/api/model/User.java @@ -0,0 +1,38 @@ +package com.booleanuk.api.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import jakarta.persistence.*; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@NoArgsConstructor +@Entity +@Table(name = "users") +@Getter +@Setter +@Data +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String username; + + @Column + private String email; + + @OneToMany(mappedBy = "user") + @JsonIgnoreProperties({"user"}) + private List posts; +cd + public User(int id) { + this.id = id; + } +} diff --git a/src/main/java/com/booleanuk/api/repository/PostRepository.java b/src/main/java/com/booleanuk/api/repository/PostRepository.java new file mode 100644 index 0000000..a80e468 --- /dev/null +++ b/src/main/java/com/booleanuk/api/repository/PostRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.repository; + +import com.booleanuk.api.model.Post; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostRepository extends JpaRepository { +} diff --git a/src/main/java/com/booleanuk/api/repository/UserRepository.java b/src/main/java/com/booleanuk/api/repository/UserRepository.java new file mode 100644 index 0000000..74858a5 --- /dev/null +++ b/src/main/java/com/booleanuk/api/repository/UserRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.repository; + +import com.booleanuk.api.model.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index 02c2591..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,7 +0,0 @@ -server: - port: 4000 - error: - include-message: always - include-binding-errors: always - include-stacktrace: never - include-exception: false