diff --git a/src/main/java/se/kth/sda6/skeleton/comments/Comment.java b/src/main/java/se/kth/sda6/skeleton/comments/Comment.java index 0da1bbb..b1ab7db 100644 --- a/src/main/java/se/kth/sda6/skeleton/comments/Comment.java +++ b/src/main/java/se/kth/sda6/skeleton/comments/Comment.java @@ -1,45 +1,58 @@ -//package se.kth.sda6.skeleton.comments; -// -// -//import se.kth.sda6.skeleton.posts.Post; -// -//import javax.persistence.*; -// -///** -// * Represents a comment made by a user on a post. -// */ -//@Entity -//public class Comment { -// @Id -// @GeneratedValue(strategy = GenerationType.AUTO) -// private Long id; -// -// private String body; -// -// @ManyToOne -// private Post post; -// -// public Comment() { -// } -// -// public Comment(String body, Post post) { -// this.body = body; -// this.post = post; -// } -// -// public String getBody() { -// return body; -// } -// -// public void setBody(String body) { -// this.body = body; -// } -// -// public Post getPost() { -// return post; -// } -// -// public void setPost(Post post) { -// this.post = post; -// } -//} +package se.kth.sda6.skeleton.comments; + + +import se.kth.sda6.skeleton.posts.Post; + +import javax.persistence.*; + +/** + * Represents a comment made by a user on a post. + */ +@Entity +@Table(name = "comment") +public class Comment { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + @Column(name = "body") + private String body; + + @ManyToOne() + private Post post; + + public Comment() { + + } + + public Comment(Long id, String body, Post post) { + this.id = id; + this.body = body; + this.post = post; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public Post getPost() { + return post; + } + + public void setPost(Post post) { + this.post = post; + } +} diff --git a/src/main/java/se/kth/sda6/skeleton/comments/CommentController.java b/src/main/java/se/kth/sda6/skeleton/comments/CommentController.java index c39a885..a2df82a 100644 --- a/src/main/java/se/kth/sda6/skeleton/comments/CommentController.java +++ b/src/main/java/se/kth/sda6/skeleton/comments/CommentController.java @@ -1,45 +1,62 @@ -//package se.kth.sda6.skeleton.comments; -// -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.web.bind.annotation.*; -//import org.springframework.web.server.ResponseStatusException; -//import se.kth.sda6.skeleton.posts.Post; -//import se.kth.sda6.skeleton.posts.PostService; -// -//import javax.persistence.EntityNotFoundException; -//import java.util.List; -// -//@RestController -//public class CommentController { -// -// private CommentService commentService; -// private PostService postService; -// -// public CommentController(CommentService commentService, PostService postService) { -// this.commentService = commentService; -// this.postService = postService; -// } -// -// @GetMapping("/comments") -// public ResponseEntity getAllCommentsOnPost(@RequestParam Long postId) { -// Post post = postService.getByID(postId) -// .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Could not find post with id " + postId.toString())); -// List comments = commentService.getAllByPost(post); -// return new ResponseEntity<>(comments, HttpStatus.OK); -// } -// -// @DeleteMapping("/comments/{id}") -// public ResponseEntity deleteComment(@PathVariable("id") Long id) { -// commentService.deleteById(id); -// return new ResponseEntity<>(HttpStatus.NO_CONTENT); -// } -// -// @PostMapping("posts/{id}/comments") -// public ResponseEntity postComment(@RequestBody Comment comment, @PathVariable("id") Long postId) { -// Post post = postService.getByID(postId) -// .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Could not find post with id " + postId.toString())); -// Comment savedComment = commentService.save(comment, post); -// return new ResponseEntity(savedComment, HttpStatus.CREATED); -// } -//} +package se.kth.sda6.skeleton.comments; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; +import se.kth.sda6.skeleton.posts.Post; +import se.kth.sda6.skeleton.posts.PostService; + +import java.util.List; + +@RestController +public class CommentController { + + private CommentService commentService; + private PostService postService; + + public CommentController(CommentService commentService, PostService postService) { + this.commentService = commentService; + this.postService = postService; + } + + @GetMapping("/comments") + public ResponseEntity getAll() { + List comments = commentService.getAll(); + return new ResponseEntity<>(comments, HttpStatus.OK); + } + + @GetMapping(value = "/comments", params = "postId") + public ResponseEntity getAllOnPost(@RequestParam Long postId) { + Post post = postService.getByID(postId) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); + List comments = commentService.getAllByPost(post); + return new ResponseEntity<>(comments, HttpStatus.OK); + } + + @GetMapping("/comments/{id}") + public ResponseEntity getById(@PathVariable Long id) { + Comment comment = commentService.getByID(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); + return new ResponseEntity<>(comment, HttpStatus.OK); + } + + @PostMapping("comments") + public ResponseEntity create(@RequestBody Comment comment) { + Comment newComment = commentService.create(comment); + return new ResponseEntity(newComment, HttpStatus.CREATED); + } + + @PutMapping("comments") + public ResponseEntity update(@RequestBody Comment comment) { + commentService.update(comment); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @DeleteMapping("/comments/{id}") + public ResponseEntity delete(@PathVariable("id") Long id) { + commentService.delete(id); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + +} diff --git a/src/main/java/se/kth/sda6/skeleton/comments/CommentRepository.java b/src/main/java/se/kth/sda6/skeleton/comments/CommentRepository.java index 47d4ce5..973f56d 100644 --- a/src/main/java/se/kth/sda6/skeleton/comments/CommentRepository.java +++ b/src/main/java/se/kth/sda6/skeleton/comments/CommentRepository.java @@ -1,12 +1,12 @@ -//package se.kth.sda6.skeleton.comments; -// -//import org.springframework.data.repository.CrudRepository; -//import se.kth.sda6.skeleton.posts.Post; -// -//import java.util.List; -// -// -//public interface CommentRepository extends CrudRepository { -// -// List findAllByPost(Post post); -//} +package se.kth.sda6.skeleton.comments; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.CrudRepository; +import se.kth.sda6.skeleton.posts.Post; + +import java.util.List; + + +public interface CommentRepository extends JpaRepository { + List findAllByPost(Post post); +} diff --git a/src/main/java/se/kth/sda6/skeleton/comments/CommentService.java b/src/main/java/se/kth/sda6/skeleton/comments/CommentService.java index 6060f4f..0b97841 100644 --- a/src/main/java/se/kth/sda6/skeleton/comments/CommentService.java +++ b/src/main/java/se/kth/sda6/skeleton/comments/CommentService.java @@ -1,38 +1,45 @@ -//package se.kth.sda6.skeleton.comments; -// -//import org.springframework.stereotype.Service; -//import se.kth.sda6.skeleton.posts.Post; -// -//import java.util.ArrayList; -//import java.util.List; -//import java.util.Optional; -// -//@Service -//public class CommentService { -// -// private CommentRepository commentRepository; -// -// // Implicitly autowired -// public CommentService(CommentRepository commentRepository) { -// this.commentRepository = commentRepository; -// } -// -// public List getAllByPost(Post post) { -// List list = new ArrayList<>(); -// commentRepository.findAllByPost(post).forEach(list::add); -// return list; -// } -// -// public Optional getByID(Long id) { -// return commentRepository.findById(id); -// } -// -// public Comment save(Comment comment, Post post) { -// post.addComment(comment); -// return commentRepository.save(comment); -// } -// -// public void deleteById(Long id) { -// commentRepository.deleteById(id); -// } -//} +package se.kth.sda6.skeleton.comments; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import se.kth.sda6.skeleton.posts.Post; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +public class CommentService { + + private CommentRepository commentRepository; + + @Autowired + public CommentService(CommentRepository commentRepository) { + this.commentRepository = commentRepository; + } + + public List getAll() { + return commentRepository.findAll(); + } + + public List getAllByPost(Post post) { + return commentRepository.findAllByPost(post); + } + + public Optional getByID(Long id) { + return commentRepository.findById(id); + } + + public Comment create(Comment comment) { + return commentRepository.save(comment); + } + + public void delete(Long id) { + commentRepository.deleteById(id); + } + + public void update(Comment comment) { + commentRepository.save(comment); + } +} diff --git a/src/main/java/se/kth/sda6/skeleton/posts/Post.java b/src/main/java/se/kth/sda6/skeleton/posts/Post.java index a95fabe..f28245c 100644 --- a/src/main/java/se/kth/sda6/skeleton/posts/Post.java +++ b/src/main/java/se/kth/sda6/skeleton/posts/Post.java @@ -1,19 +1,40 @@ package se.kth.sda6.skeleton.posts; +import se.kth.sda6.skeleton.comments.Comment; +import javax.persistence.*; +import javax.validation.constraints.NotEmpty; +import java.util.ArrayList; +import java.util.List; + // @TODO add Hibernate annotations to define which table and columns should be used to save the Post Object. +@Entity +@Table(name = "post") public class Post { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) // The DB will handle the process of generating the id. private Long id; + @NotEmpty + @Column(name = "body") private String body; -// @OneToMany(mappedBy = "post", cascade = CascadeType.ALL) -// private List comments = new ArrayList<>(); + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } public Post() { } - public Post(String body) { + public Post(Long id, String body + ) { + this.id = id; this.body = body; + } public Long getId() { @@ -24,21 +45,4 @@ public void setId(Long id) { this.id = id; } - public String getBody() { - return body; - } - - public void setBody(String body) { - this.body = body; - } - -// public void addComment(Comment comment) { -// comments.add( comment ); -// comment.setPost( this ); -// } -// -// public void removeComment(Comment comment) { -// comments.remove( comment ); -// comment.setPost( null ); -// } } diff --git a/src/main/java/se/kth/sda6/skeleton/posts/PostController.java b/src/main/java/se/kth/sda6/skeleton/posts/PostController.java index 1affd13..9f9aac8 100644 --- a/src/main/java/se/kth/sda6/skeleton/posts/PostController.java +++ b/src/main/java/se/kth/sda6/skeleton/posts/PostController.java @@ -1,10 +1,59 @@ package se.kth.sda6.skeleton.posts; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; /* @TODO AutoWire PostService and create the methods needed to implement the API. Don't forget to add necessary annotations. */ +@RestController +@RequestMapping("/posts") public class PostController { + + @Autowired + private PostService postService; + + @GetMapping("") + // Get a list of all posts + public List getAll () + { + return postService.getAll(); + } + + // Get a specific post by it's id + @GetMapping("/{id}") + public Post getById(@PathVariable Long id) { + return postService.getByID(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); + } + + // Create a new post + @PostMapping("") + public Post create(@RequestBody Post newPost) + { + return postService.create(newPost); + + } + + // Update post + @PutMapping("") + public Post update(@RequestBody Post updatedPost) + { + return postService.update(updatedPost); + } + + // Delete a specific post + @DeleteMapping("/{id}") + public void delete(@PathVariable Long id) + { + postService.deleteById(id); + } } + + + diff --git a/src/main/java/se/kth/sda6/skeleton/posts/PostRepository.java b/src/main/java/se/kth/sda6/skeleton/posts/PostRepository.java index 13b8bca..40bc551 100644 --- a/src/main/java/se/kth/sda6/skeleton/posts/PostRepository.java +++ b/src/main/java/se/kth/sda6/skeleton/posts/PostRepository.java @@ -1,8 +1,14 @@ package se.kth.sda6.skeleton.posts; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + /* @TODO extend the appropriate JpaRepository to get common database operations for Post Add also the correct annotation to describe the Repository. */ -public interface PostRepository { +@Repository +public interface PostRepository extends JpaRepository { } diff --git a/src/main/java/se/kth/sda6/skeleton/posts/PostService.java b/src/main/java/se/kth/sda6/skeleton/posts/PostService.java index 6035b91..3187e57 100644 --- a/src/main/java/se/kth/sda6/skeleton/posts/PostService.java +++ b/src/main/java/se/kth/sda6/skeleton/posts/PostService.java @@ -1,34 +1,52 @@ package se.kth.sda6.skeleton.posts; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Comparator; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; /* @TODO Autowire the PostRepository and use it to implement all the service methods. */ +@Service public class PostService { + @Autowired + private PostRepository repository; + + //get all posts and return them as List public List getAll() { - // @TODO get all posts and return them as List - return null; + return repository.findAll().stream() + .collect(Collectors.toList()); } + // get a post by ID if it exists public Optional getByID(Long id) { - // @TODO get a post by ID if it exists - return null; + return repository.findById(id); + } - public Post save(Post post) { - // @TODO save the post to DB and return the saved post - return null; + public Post create(Post newPost) { + return repository.save(newPost); } - public Optional update(Post post) { - // @TODO update the post if it exists in DB and return the updated post. - return null; + // update the post if it exists in DB and return the updated post. + public Post update(Post updatedPost) { + return repository.save(updatedPost); } + // delete the post by id public void deleteById(Long id) { - // @TODO delete the post by id - return; + repository.deleteById(id); } + + // public List getAllByConcertID(Long commentId) { + // return repository.findAllByCommentId(commentId); + + // } } + + +