From 2afde4efbcb1273f93c71add40b6151c7dd6e5d3 Mon Sep 17 00:00:00 2001 From: Fredrik Haupt Date: Fri, 20 Sep 2024 10:06:46 +0200 Subject: [PATCH 1/2] Core finished --- .gitignore | 4 ++ Dockers/Dockerfile | 9 +++ Dockers/docker-compose.yml | 23 ++++++ build.gradle | 31 ++++++-- src/main/java/com/booleanuk/api/Main.java | 11 +++ .../api/controllers/CommentController.java | 71 +++++++++++++++++++ .../api/controllers/PostController.java | 55 ++++++++++++++ .../com/booleanuk/api/models/Comment.java | 32 +++++++++ .../java/com/booleanuk/api/models/Post.java | 41 +++++++++++ .../api/repositories/CommentRepository.java | 7 ++ .../api/repositories/PostRepository.java | 7 ++ 11 files changed, 286 insertions(+), 5 deletions(-) create mode 100644 Dockers/Dockerfile create mode 100644 Dockers/docker-compose.yml create mode 100644 src/main/java/com/booleanuk/api/Main.java create mode 100644 src/main/java/com/booleanuk/api/controllers/CommentController.java create mode 100644 src/main/java/com/booleanuk/api/controllers/PostController.java create mode 100644 src/main/java/com/booleanuk/api/models/Comment.java create mode 100644 src/main/java/com/booleanuk/api/models/Post.java create mode 100644 src/main/java/com/booleanuk/api/repositories/CommentRepository.java create mode 100644 src/main/java/com/booleanuk/api/repositories/PostRepository.java diff --git a/.gitignore b/.gitignore index c2065bc..aa8e685 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,7 @@ out/ ### VS Code ### .vscode/ + +.application.yml + +.Dockers diff --git a/Dockers/Dockerfile b/Dockers/Dockerfile new file mode 100644 index 0000000..f5bfa27 --- /dev/null +++ b/Dockers/Dockerfile @@ -0,0 +1,9 @@ +FROM eclipse-temurin:21 + +WORKDIR /app + +COPY java.docker.day.2-0.0.1-SNAPSHOT.jar /app/java.docker.day.2-0.0.1-SNAPSHOT.jar + +EXPOSE 4000 + +ENTRYPOINT ["java", "-jar", "java.docker.day.2-0.0.1-SNAPSHOT.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..775256d --- /dev/null +++ b/Dockers/docker-compose.yml @@ -0,0 +1,23 @@ +services: + app: + image: 'my-forum-box:latest' + container_name: app + depends_on: + - db + ports: + - '4000:4000' + environment: + - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/postgres + - SPRING_DATASOURCE_USERNAME=postgres + - SPRING_DATASOURCE_PASSWORD=mypassword + - SPRING_JPA_HIBERNATE_DDL_AUTO=update + + db: + image: 'postgres:latest' + container_name: db + ports: + - '5432:5432' + environment: + - POSTGRES_USER=postgres + - POSTGRES_DATABASE=postgres + - POSTGRES_PASSWORD=mypassword \ No newline at end of file diff --git a/build.gradle b/build.gradle index fb070c4..e44f9ad 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,17 @@ 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.3.3' + id 'io.spring.dependency-management' version '1.1.6' } group = 'com.booleanuk' -version = '0.0.1' -sourceCompatibility = '17' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} configurations { compileOnly { @@ -23,11 +28,27 @@ 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' + runtimeOnly 'org.postgresql:postgresql' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +tasks.named('bootBuildImage') { + builder = 'paketobuildpacks/builder-jammy-base:latest' } 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) } + } +} \ 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/CommentController.java b/src/main/java/com/booleanuk/api/controllers/CommentController.java new file mode 100644 index 0000000..f74de67 --- /dev/null +++ b/src/main/java/com/booleanuk/api/controllers/CommentController.java @@ -0,0 +1,71 @@ +package com.booleanuk.api.controllers; + +import com.booleanuk.api.models.Comment; +import com.booleanuk.api.models.Post; +import com.booleanuk.api.repositories.CommentRepository; +import com.booleanuk.api.repositories.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/{postId}/comments") +public class CommentController { + @Autowired + private CommentRepository commentRepository; + @Autowired + private PostRepository postRepository; + + @PostMapping + public ResponseEntity create(@RequestBody Comment comment, @PathVariable int postId){ + Post post = this.postRepository.findById(postId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") + ); + comment.setPost(post); + return new ResponseEntity<>(this.commentRepository.save(comment), HttpStatus.CREATED); + } + + @GetMapping + public List getAll(@PathVariable int postId){ + this.postRepository.findById(postId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") + ); + return this.commentRepository.findAll(); + } + + @GetMapping("{id}") + public ResponseEntity getOne(@PathVariable int postId, @PathVariable int id){ + this.postRepository.findById(postId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") + ); + Comment comment = this.commentRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No comment with that id") + ); + return ResponseEntity.ok(comment); + } + + @PutMapping("{id}") + public ResponseEntity update(@RequestBody Comment comment, @PathVariable int postId, @PathVariable int id){ + this.postRepository.findById(postId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") + ); + Comment commentToUpdate = this.commentRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No comment with that id") + ); + commentToUpdate.setContent(comment.getContent()); + return new ResponseEntity<>(this.commentRepository.save(commentToUpdate), HttpStatus.CREATED); + } + + @DeleteMapping("{id}") + public ResponseEntity delete(@PathVariable int postId, @PathVariable int id){ + Comment comment = this.commentRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No comment with that id") + ); + this.commentRepository.delete(comment); + return ResponseEntity.ok(comment); + } +} 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..fa51118 --- /dev/null +++ b/src/main/java/com/booleanuk/api/controllers/PostController.java @@ -0,0 +1,55 @@ +package com.booleanuk.api.controllers; + +import com.booleanuk.api.models.Post; +import com.booleanuk.api.repositories.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 create(@RequestBody Post post){ + return new ResponseEntity<>(this.postRepository.save(post), HttpStatus.CREATED); + } + + @GetMapping + public List getAll(){ + return this.postRepository.findAll(); + } + + @GetMapping("{id}") + public ResponseEntity getOne(@PathVariable int id){ + Post post = this.postRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") + ); + return ResponseEntity.ok(post); + } + + @PutMapping("{id}") + public ResponseEntity update(@PathVariable int id, @RequestBody Post post){ + Post postToUpdate = this.postRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") + ); + postToUpdate.setContent(post.getContent()); + postToUpdate.setLikes(post.getLikes()); + return new ResponseEntity<>(this.postRepository.save(postToUpdate), HttpStatus.CREATED); + } + + @DeleteMapping("{id}") + public ResponseEntity delete(@PathVariable int id){ + Post post = this.postRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") + ); + this.postRepository.delete(post); + return ResponseEntity.ok(post); + } +} diff --git a/src/main/java/com/booleanuk/api/models/Comment.java b/src/main/java/com/booleanuk/api/models/Comment.java new file mode 100644 index 0000000..b2a529c --- /dev/null +++ b/src/main/java/com/booleanuk/api/models/Comment.java @@ -0,0 +1,32 @@ +package com.booleanuk.api.models; + +import com.fasterxml.jackson.annotation.JsonIncludeProperties; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "Comments") +public class Comment { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String content; + + @ManyToOne + @JoinColumn(name = "post_id") + @JsonIncludeProperties(value = {"content", "likes"}) + private Post post; + + public Comment(int id){ + this.id = id; + } +} 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..00e6f06 --- /dev/null +++ b/src/main/java/com/booleanuk/api/models/Post.java @@ -0,0 +1,41 @@ +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; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "Posts") +public class Post { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String content; + + @Column + private int likes; + + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) + @JsonIgnoreProperties("post") + private List comments; + + public Post(String content){ + this.content = content; + this.likes = 0; + } + + public Post(int id){ + this.id = id; + } +} diff --git a/src/main/java/com/booleanuk/api/repositories/CommentRepository.java b/src/main/java/com/booleanuk/api/repositories/CommentRepository.java new file mode 100644 index 0000000..356354d --- /dev/null +++ b/src/main/java/com/booleanuk/api/repositories/CommentRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.repositories; + +import com.booleanuk.api.models.Comment; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CommentRepository extends JpaRepository { +} 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..f6a0d31 --- /dev/null +++ b/src/main/java/com/booleanuk/api/repositories/PostRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.repositories; + +import com.booleanuk.api.models.Post; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostRepository extends JpaRepository { +} From 123099916e8a86b1e3848422f8b356018c5852fe Mon Sep 17 00:00:00 2001 From: Fredrik Haupt Date: Mon, 7 Oct 2024 16:26:19 +0200 Subject: [PATCH 2/2] Extension finished --- .../api/controllers/CommentController.java | 35 +++++++-- .../api/controllers/PostController.java | 28 ++++++-- .../api/controllers/UserController.java | 72 +++++++++++++++++++ .../com/booleanuk/api/models/Comment.java | 5 ++ .../java/com/booleanuk/api/models/Post.java | 6 ++ .../java/com/booleanuk/api/models/User.java | 45 ++++++++++++ .../api/repositories/UserRepository.java | 7 ++ src/main/resources/application.yml | 16 +++++ 8 files changed, 203 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/booleanuk/api/controllers/UserController.java create mode 100644 src/main/java/com/booleanuk/api/models/User.java create mode 100644 src/main/java/com/booleanuk/api/repositories/UserRepository.java diff --git a/src/main/java/com/booleanuk/api/controllers/CommentController.java b/src/main/java/com/booleanuk/api/controllers/CommentController.java index f74de67..611040b 100644 --- a/src/main/java/com/booleanuk/api/controllers/CommentController.java +++ b/src/main/java/com/booleanuk/api/controllers/CommentController.java @@ -2,8 +2,10 @@ import com.booleanuk.api.models.Comment; import com.booleanuk.api.models.Post; +import com.booleanuk.api.models.User; import com.booleanuk.api.repositories.CommentRepository; import com.booleanuk.api.repositories.PostRepository; +import com.booleanuk.api.repositories.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -13,24 +15,33 @@ import java.util.List; @RestController -@RequestMapping("posts/{postId}/comments") +@RequestMapping("users/{userId}/posts/{postId}/comments") public class CommentController { @Autowired private CommentRepository commentRepository; @Autowired + private UserRepository userRepository; + @Autowired private PostRepository postRepository; @PostMapping - public ResponseEntity create(@RequestBody Comment comment, @PathVariable int postId){ + public ResponseEntity create(@RequestBody Comment comment, @PathVariable int postId, @PathVariable int userId){ + User user = this.userRepository.findById(userId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); Post post = this.postRepository.findById(postId).orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") ); + comment.setUser(user); comment.setPost(post); return new ResponseEntity<>(this.commentRepository.save(comment), HttpStatus.CREATED); } @GetMapping - public List getAll(@PathVariable int postId){ + public List getAll(@PathVariable int postId, @PathVariable int userId){ + this.userRepository.findById(userId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); this.postRepository.findById(postId).orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") ); @@ -38,7 +49,10 @@ public List getAll(@PathVariable int postId){ } @GetMapping("{id}") - public ResponseEntity getOne(@PathVariable int postId, @PathVariable int id){ + public ResponseEntity getOne(@PathVariable int userId, @PathVariable int postId, @PathVariable int id){ + this.userRepository.findById(userId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); this.postRepository.findById(postId).orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") ); @@ -49,7 +63,10 @@ public ResponseEntity getOne(@PathVariable int postId, @PathVariable in } @PutMapping("{id}") - public ResponseEntity update(@RequestBody Comment comment, @PathVariable int postId, @PathVariable int id){ + public ResponseEntity update(@RequestBody Comment comment, @PathVariable int userId, @PathVariable int postId, @PathVariable int id){ + this.userRepository.findById(userId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); this.postRepository.findById(postId).orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") ); @@ -61,7 +78,13 @@ public ResponseEntity update(@RequestBody Comment comment, @PathVariabl } @DeleteMapping("{id}") - public ResponseEntity delete(@PathVariable int postId, @PathVariable int id){ + public ResponseEntity delete(@PathVariable int userId, @PathVariable int postId, @PathVariable int id){ + this.userRepository.findById(userId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); + this.postRepository.findById(postId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") + ); Comment comment = this.commentRepository.findById(id).orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No comment with that id") ); diff --git a/src/main/java/com/booleanuk/api/controllers/PostController.java b/src/main/java/com/booleanuk/api/controllers/PostController.java index fa51118..f5304ea 100644 --- a/src/main/java/com/booleanuk/api/controllers/PostController.java +++ b/src/main/java/com/booleanuk/api/controllers/PostController.java @@ -1,7 +1,9 @@ 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.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -11,23 +13,36 @@ import java.util.List; @RestController -@RequestMapping("posts") +@RequestMapping("users/{userId}/posts") public class PostController { @Autowired private PostRepository postRepository; + @Autowired + private UserRepository userRepository; @PostMapping - public ResponseEntity create(@RequestBody Post post){ + public ResponseEntity create(@RequestBody Post post, @PathVariable int userId){ + User user = this.userRepository.findById(userId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); + post.setUser(user); + return new ResponseEntity<>(this.postRepository.save(post), HttpStatus.CREATED); } @GetMapping - public List getAll(){ + public List getAll(@PathVariable int userId){ + this.userRepository.findById(userId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); return this.postRepository.findAll(); } @GetMapping("{id}") - public ResponseEntity getOne(@PathVariable int id){ + public ResponseEntity getOne(@PathVariable int id, @PathVariable int userId){ + this.userRepository.findById(userId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); Post post = this.postRepository.findById(id).orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") ); @@ -35,7 +50,10 @@ public ResponseEntity getOne(@PathVariable int id){ } @PutMapping("{id}") - public ResponseEntity update(@PathVariable int id, @RequestBody Post post){ + public ResponseEntity update(@PathVariable int id, @RequestBody Post post, @PathVariable int userId){ + this.userRepository.findById(userId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); Post postToUpdate = this.postRepository.findById(id).orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No post with that id") ); 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..8d5830b --- /dev/null +++ b/src/main/java/com/booleanuk/api/controllers/UserController.java @@ -0,0 +1,72 @@ +package com.booleanuk.api.controllers; + +import com.booleanuk.api.models.User; +import com.booleanuk.api.repositories.PostRepository; +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; + + @PostMapping + public ResponseEntity create(@RequestBody User user){ + return new ResponseEntity<>(this.userRepository.save(user), HttpStatus.CREATED); + } + + @GetMapping + public List getAll(){ + return this.userRepository.findAll(); + } + + @GetMapping("{id}") + public ResponseEntity getOne(@PathVariable int id){ + User user = this.userRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); + return ResponseEntity.ok(user); + } + + @PutMapping("{id}") + public ResponseEntity update(@PathVariable int id, @RequestBody User user) { + User userToUpdate = this.userRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); + userToUpdate.setUserName(user.getUserName()); + return new ResponseEntity<>(this.userRepository.save(userToUpdate), HttpStatus.CREATED); + } + + @PutMapping("{id}/{userId}") + public ResponseEntity addFriend(@PathVariable int id, @PathVariable int userId) { + + User userToUpdate = this.userRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); + User friend = this.userRepository.findById(userId).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); + List friends = userToUpdate.getUsers(); + friends.add(friend); + userToUpdate.setUsers(friends); + return new ResponseEntity<>(this.userRepository.save(userToUpdate), HttpStatus.CREATED); + } + + + @DeleteMapping("{id}") + public ResponseEntity delete(@PathVariable int id){ + User user = this.userRepository.findById(id).orElseThrow( + () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "No user with that id") + ); + this.userRepository.delete(user); + return ResponseEntity.ok(user); + } + +} diff --git a/src/main/java/com/booleanuk/api/models/Comment.java b/src/main/java/com/booleanuk/api/models/Comment.java index b2a529c..9d6586b 100644 --- a/src/main/java/com/booleanuk/api/models/Comment.java +++ b/src/main/java/com/booleanuk/api/models/Comment.java @@ -21,6 +21,11 @@ public class Comment { @Column private String content; + @ManyToOne + @JoinColumn(name = "user_id") + @JsonIncludeProperties(value = {"userName"}) + private User user; + @ManyToOne @JoinColumn(name = "post_id") @JsonIncludeProperties(value = {"content", "likes"}) diff --git a/src/main/java/com/booleanuk/api/models/Post.java b/src/main/java/com/booleanuk/api/models/Post.java index 00e6f06..e843cf8 100644 --- a/src/main/java/com/booleanuk/api/models/Post.java +++ b/src/main/java/com/booleanuk/api/models/Post.java @@ -1,6 +1,7 @@ package com.booleanuk.api.models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonIncludeProperties; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Getter; @@ -26,6 +27,11 @@ public class Post { @Column private int likes; + @ManyToOne + @JoinColumn(name = "user_id") + @JsonIncludeProperties(value = {"userName"}) + private User user; + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true) @JsonIgnoreProperties("post") private List comments; 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..5f695e5 --- /dev/null +++ b/src/main/java/com/booleanuk/api/models/User.java @@ -0,0 +1,45 @@ +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; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "Users") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column + private String userName; + + @OneToMany + @JsonIgnoreProperties("user") + private List users; + + @OneToMany(mappedBy = "user") + @JsonIgnoreProperties("user") + private List posts; + + @OneToMany(mappedBy = "user") + @JsonIgnoreProperties("user") + private List comments; + + public User(String userName){ + this.userName = userName; + } + + public User(int id){ + this.id = id; + } +} 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..26097e0 --- /dev/null +++ b/src/main/java/com/booleanuk/api/repositories/UserRepository.java @@ -0,0 +1,7 @@ +package com.booleanuk.api.repositories; + +import com.booleanuk.api.models.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 index 02c2591..7e7698f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -5,3 +5,19 @@ server: include-binding-errors: always include-stacktrace: never include-exception: false + +spring: + datasource: + url: jdbc:postgresql://ep-nameless-wildflower-a2shgspg.eu-central-1.aws.neon.tech:5432/neondb + username: neondb_owner + password: 0kgcbNIr3PQi + max-active: 5 + max-idle: 5 + jpa: + hibernate: + ddl-auto: update + properties: + hibernate: + dialect: org.hibernate.dialect.PostgreSQLDialect + format_sql: true + show-sql: true \ No newline at end of file