From 02615e4507808170c9b583262dbad74dbc6eb3e5 Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 04:32:50 +0300 Subject: [PATCH 01/16] Remove everything related to the previous logic --- .../Tradeverse/config/DataInitializer.java | 102 --- .../controller/FollowSubforumController.java | 51 -- .../Tradeverse/controller/PostController.java | 458 ------------ .../dto/asset/YahooFinanceChartResponse.java | 1 - .../GeneralFollowSubforumRequest.java | 22 - .../GeneralFollowSubforumResponse.java | 27 - .../followSubforum/GetFollowingsRequest.java | 21 - .../followSubforum/GetFollowingsResponse.java | 42 -- .../dto/post/CreatePostRequest.java | 5 + .../dto/post/CreatePostResponse.java | 5 + .../Tradeverse/dto/post/FeedRequest.java | 13 - .../Tradeverse/dto/post/FeedResponse.java | 62 -- .../dto/post/create/CreateCommentRequest.java | 35 - .../post/create/CreateCommentResponse.java | 28 - .../dto/post/create/CreatePostRequest.java | 45 -- .../dto/post/create/CreatePostResponse.java | 28 - .../post/create/CreateSubforumRequest.java | 23 - .../post/create/CreateSubforumResponse.java | 28 - .../dto/post/delete/GeneralDeleteRequest.java | 24 - .../post/delete/GeneralDeleteResponse.java | 28 - .../dto/post/edit/EditCommentRequest.java | 41 - .../dto/post/edit/EditCommentResponse.java | 28 - .../dto/post/edit/EditForumRequest.java | 33 - .../dto/post/edit/EditForumResponse.java | 28 - .../dto/post/edit/EditPostRequest.java | 45 -- .../dto/post/edit/EditPostResponse.java | 28 - .../explore/ExploreNonRecursiveResponse.java | 52 -- .../dto/post/explore/ExploreRequest.java | 18 - .../dto/post/explore/ExploreResponse.java | 52 -- .../ExploreSearchNonRecursiveResponse.java | 93 --- .../post/explore/ExploreSearchRequest.java | 28 - .../post/explore/ExploreSearchResponse.java | 93 --- .../post/explore/GeneralSearchRequest.java | 50 -- .../post/feed/FeedNonRecursiveResponse.java | 63 -- .../Tradeverse/dto/post/feed/FeedRequest.java | 14 - .../dto/post/feed/FeedResponse.java | 63 -- .../dto/post/other/GeneralGetRequest.java | 23 - .../dto/post/other/GeneralGetResponse.java | 42 -- .../other/GeneralRecursiveGetResponse.java | 42 -- .../dto/post/other/GetPostRequest.java | 24 - .../dto/post/other/GetPostResponse.java | 40 - .../dto/post/other/GetSubforumsResponse.java | 42 -- .../dto/post/other/GetSuperPostResponse.java | 40 - .../post/other/GetSuperSubforumResponse.java | 42 -- .../dto/post/other/PostSummaryDTO.java | 98 --- .../dto/post/other/SubforumDetailsDTO.java | 59 -- .../dto/post/other/SubforumSummaryDTO.java | 26 - .../extra/ListHashMapConverter.java | 41 - .../Tradeverse/extra/PostType.java | 8 - .../Tradeverse/extra/PostWSpecs.java | 201 ----- .../Tradeverse/extra/SubforumWSpecs.java | 70 -- .../Tradeverse/extra/SuperPost.java | 201 ----- .../Tradeverse/extra/SuperSubforum.java | 70 -- .../Tradeverse/model/Comment.java | 122 +++ .../Tradeverse/model/Content.java | 38 + .../Tradeverse/model/FollowSubforum.java | 53 -- .../Tradeverse/model/Portfolio.java | 2 +- .../Tradeverse/model/Post.java | 93 +-- .../Tradeverse/model/Subforum.java | 67 ++ .../repository/FollowSubforumRepository.java | 16 - .../Tradeverse/repository/PostRepository.java | 43 +- .../Tradeverse/service/AssetService.java | 2 - .../Tradeverse/service/DislikeService.java | 5 - .../service/FollowSubforumService.java | 135 ---- .../Tradeverse/service/LikeService.java | 8 - .../Tradeverse/service/PostService.java | 699 +----------------- 66 files changed, 266 insertions(+), 3863 deletions(-) delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/config/DataInitializer.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/FollowSubforumController.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GeneralFollowSubforumRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GeneralFollowSubforumResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GetFollowingsRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GetFollowingsResponse.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/FeedRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/FeedResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateCommentRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateCommentResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreatePostRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreatePostResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateSubforumRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateSubforumResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/delete/GeneralDeleteRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/delete/GeneralDeleteResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditCommentRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditCommentResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditForumRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditForumResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditPostRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditPostResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreNonRecursiveResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchNonRecursiveResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/GeneralSearchRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedNonRecursiveResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralGetRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralGetResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralRecursiveGetResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetPostRequest.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetPostResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSubforumsResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSuperPostResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSuperSubforumResponse.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/PostSummaryDTO.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/SubforumDetailsDTO.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/SubforumSummaryDTO.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/ListHashMapConverter.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/PostType.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/PostWSpecs.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SubforumWSpecs.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SuperPost.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SuperSubforum.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Content.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/model/FollowSubforum.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Subforum.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowSubforumRepository.java delete mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowSubforumService.java diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/config/DataInitializer.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/config/DataInitializer.java deleted file mode 100644 index dd67ac71..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/config/DataInitializer.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.bounswe2024group10.Tradeverse.config; - -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.bounswe2024group10.Tradeverse.extra.PostType; -import com.bounswe2024group10.Tradeverse.model.Post; -import com.bounswe2024group10.Tradeverse.model.User; -import com.bounswe2024group10.Tradeverse.repository.PostRepository; -import com.bounswe2024group10.Tradeverse.repository.UserRepository; - -@Configuration -public class DataInitializer { - - private static final Logger logger = LoggerFactory.getLogger(DataInitializer.class); - private static final PostType FORUM = PostType.FORUM; - private static final PostType SUBFORUM = PostType.SUBFORUM; - private static final PostType POST = PostType.POST; - private static final PostType COMMENT = PostType.COMMENT; - - @Autowired - private PostRepository postRepository; - - @Autowired - private UserRepository userRepository; - - @Bean - public CommandLineRunner initData() { - return args -> { - User user = new User(); - user.setUsername("admin"); - Post subforum1; - Post subforum2; - Post post1; - Post post2; - Post comment1; - Post comment2; - Post comment3; - if (userRepository.findByUsername(user.getUsername()) == null) { - userRepository.save(user); - user = new User(); - user.setUsername("mannacharitable"); - userRepository.save(user); - user = new User(); - user.setUsername("chaosInsurgency"); - userRepository.save(user); - user = new User(); - user.setUsername("scpFoundation"); - userRepository.save(user); - user = new User(); - user.setUsername("globalOccultCoalition"); - userRepository.save(user); - user = new User(); - user.setUsername("serpentHand"); - userRepository.save(user); - user = new User(); - user.setUsername("marshallCarterDark"); - userRepository.save(user); - subforum1 = new Post("admin", "Subforum 1", null, List.of(new HashMap<>()), LocalDateTime.now(), SUBFORUM); - subforum2 = new Post("admin", "Subforum 2", null, List.of(new HashMap<>()), LocalDateTime.now(), SUBFORUM); - postRepository.save(subforum1); - postRepository.save(subforum2); - - post1 = new Post("admin", "Post 1", subforum1.getId(), List.of(new HashMap<>()), LocalDateTime.now(), POST); - post2 = new Post("admin", "Post 2", subforum1.getId(), List.of(new HashMap<>()), LocalDateTime.now(), POST); - postRepository.save(post1); - postRepository.save(post2); - comment1 = new Post("admin", "Comment 1", post1.getId(), List.of(new HashMap<>()), LocalDateTime.now(), COMMENT); - comment2 = new Post("admin", "Comment 2", post1.getId(), List.of(new HashMap<>()), LocalDateTime.now(), COMMENT); - postRepository.save(comment1); - postRepository.save(comment2); - comment3 = new Post("admin", "Comment 3", comment1.getId(), List.of(new HashMap<>()), LocalDateTime.now(), COMMENT); - postRepository.save(comment3); - - } else { - subforum1 = postRepository.findByTitle("Subforum 1").get(0); - subforum2 = postRepository.findByTitle("Subforum 2").get(0); - post1 = postRepository.findByTitle("Post 1").get(0); - post2 = postRepository.findByTitle("Post 2").get(0); - comment1 = postRepository.findByTitle("Comment 1").get(0); - comment2 = postRepository.findByTitle("Comment 2").get(0); - comment3 = postRepository.findByTitle("Comment 3").get(0); - } - - logger.info("Subforum 1 ID: {}", subforum1.getId()); - logger.info("Subforum 2 ID: {}", subforum2.getId()); - logger.info("Post 1 ID: {}", post1.getId()); - logger.info("Post 2 ID: {}", post2.getId()); - logger.info("Comment 1 ID: {}", comment1.getId()); - logger.info("Comment 2 ID: {}", comment2.getId()); - logger.info("Comment 3 ID: {}", comment3.getId()); - }; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/FollowSubforumController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/FollowSubforumController.java deleted file mode 100644 index f4977ec1..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/FollowSubforumController.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.bounswe2024group10.Tradeverse.controller; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.bounswe2024group10.Tradeverse.dto.followSubforum.GeneralFollowSubforumRequest; -import com.bounswe2024group10.Tradeverse.dto.followSubforum.GeneralFollowSubforumResponse; -import com.bounswe2024group10.Tradeverse.dto.followSubforum.GetFollowingsRequest; -import com.bounswe2024group10.Tradeverse.dto.followSubforum.GetFollowingsResponse; -import com.bounswe2024group10.Tradeverse.service.FollowSubforumService; - -@RestController -@RequestMapping("/api/follow-subforum") -public class FollowSubforumController { - @Autowired - private FollowSubforumService followSubforumService; - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/follow-subforum") - public ResponseEntity followUser(@RequestParam Long followedSubforumID, @RequestParam String followerUsername) { - GeneralFollowSubforumRequest request = new GeneralFollowSubforumRequest(); - request.setFollowedSubforumID(followedSubforumID); - request.setFollowerUsername(followerUsername); - GeneralFollowSubforumResponse response = followSubforumService.followSubforum(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/unfollow-subforum") - public ResponseEntity unfollowUser(@RequestParam Long followedSubforumID, @RequestParam String followerUsername) { - GeneralFollowSubforumRequest request = new GeneralFollowSubforumRequest(); - request.setFollowedSubforumID(followedSubforumID); - request.setFollowerUsername(followerUsername); - GeneralFollowSubforumResponse response = followSubforumService.unfollowSubforum(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/get-followings") - public ResponseEntity getFollowings(@RequestParam String username) { - GetFollowingsRequest request = new GetFollowingsRequest(); - request.setUsername(username); - GetFollowingsResponse response = followSubforumService.getFollowings(request); - return ResponseEntity.ok(response); - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java index 51557ca9..fb3a8764 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java @@ -1,468 +1,10 @@ package com.bounswe2024group10.Tradeverse.controller; -import com.bounswe2024group10.Tradeverse.dto.post.other.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreateCommentRequest; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreateCommentResponse; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreatePostRequest; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreatePostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreateSubforumRequest; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreateSubforumResponse; -import com.bounswe2024group10.Tradeverse.dto.post.delete.GeneralDeleteRequest; -import com.bounswe2024group10.Tradeverse.dto.post.delete.GeneralDeleteResponse; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditCommentRequest; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditCommentResponse; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditForumRequest; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditForumResponse; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditPostRequest; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditPostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreNonRecursiveResponse; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreRequest; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreResponse; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreSearchNonRecursiveResponse; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreSearchRequest; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreSearchResponse; -import com.bounswe2024group10.Tradeverse.dto.post.feed.FeedNonRecursiveResponse; -import com.bounswe2024group10.Tradeverse.dto.post.feed.FeedRequest; -import com.bounswe2024group10.Tradeverse.dto.post.feed.FeedResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GeneralGetRequest; -import com.bounswe2024group10.Tradeverse.dto.post.other.GeneralGetResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GeneralRecursiveGetResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GetPostRequest; -import com.bounswe2024group10.Tradeverse.dto.post.other.GetPostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GetSubforumsResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GetSuperPostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GetSuperSubforumResponse; -import com.bounswe2024group10.Tradeverse.service.PostService; -import java.util.List; - -/** - * PostController handles all HTTP requests related to posts, forums, subforums, - * and comments. It provides endpoints for creating, editing, deleting, and - * retrieving posts, forums, subforums, and comments. It also includes endpoints - * for searching and exploring posts. - * - * Endpoints: - * - * - GET /api/post/get-subforums: Retrieves subforums for a given username. - - * GET /api/post/get-posts-of-subforum: Retrieves posts of a specific subforum. - * - GET /api/post/get-comments-of-post-or-comment: Retrieves comments of a - * specific post or comment. - GET /api/post/get-post: Retrieves a specific - * post. It can be a post or a comment or a subforum. - GET - * /api/post/search-posts: Searches for posts based on query type, keyword, - * offset, and limit. - POST /api/post/create-post: Creates a new post. - POST - * /api/post/create-forum: Creates a new forum. - POST - * /api/post/create-subforum: Creates a new subforum. - POST - * /api/post/create-comment: Creates a new comment. - POST - * /api/post/edit-comment: Edits an existing comment. - POST - * /api/post/edit-post: Edits an existing post. - POST /api/post/edit-subforum: - * Edits an existing subforum. - POST /api/post/edit-forum: Edits an existing - * forum. - POST /api/post/delete-post: Deletes a specific post. - POST - * /api/post/delete-subforum: Deletes a specific subforum. - POST - * /api/post/delete-forum: Deletes a specific forum. - POST - * /api/post/delete-comment: Deletes a specific comment. - GET - * /api/post/general-get-post: Retrieves a post with optional username. - GET - * /api/post/general-get-childeren: Retrieves children of a specific parent post - * or comment. - POST /api/post/general-search: Performs a general search. - GET - * /api/post/explore: Explores posts for a given username. - GET /api/post/feed: - * Retrieves the feed for a given username. - * - * All endpoints support Cross-Origin Resource Sharing (CORS) with any origin - * and allowed headers. - */ @RestController @RequestMapping(value = "/api/post") public class PostController { - @Autowired - private PostService postService; - - // @CrossOrigin(origins = "*", allowedHeaders = "*") - // @GetMapping("/get-forums") - // public ResponseEntity getForums() { - // GetForumsResponse response = postService.getForums(); - // return ResponseEntity.ok(response); - // } - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/get-subforums") - public ResponseEntity getSubForums(@RequestParam(required = false) String username) { - GeneralGetRequest request = new GeneralGetRequest(); - if (username == null) { - username = "reserved"; - } - request.setUsername(username); - GetSubforumsResponse response = postService.getSubForums(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/get-subforums/non-recursive") - public ResponseEntity getSubForumsNonRecursive(@RequestParam(required = false) String username) { - GeneralGetRequest request = new GeneralGetRequest(); - if (username == null) { - username = "reserved"; - } - request.setUsername(username); - GetSuperSubforumResponse response = postService.getSubForumsNonRecursive(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/get-posts-of-subforum") - public ResponseEntity getPosts(@RequestParam Long postId, @RequestParam(required = false) String username) { - GeneralGetRequest request = new GeneralGetRequest(); - if (username == null) { - username = "reserved"; - } - request.setParentId(postId); - request.setUsername(username); - GeneralRecursiveGetResponse response = postService.getPosts(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/get-posts-of-subforum/non-recursive") - public ResponseEntity getPosts2(@RequestParam Long postId, @RequestParam(required = false) String username) { - GeneralGetRequest request = new GeneralGetRequest(); - if (username == null) { - username = "reserved"; - } - request.setParentId(postId); - request.setUsername(username); - GeneralGetResponse response = postService.getPostsNonRecursive(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/get-comments-of-post-or-comment") - public ResponseEntity getComments(@RequestParam Long postId, @RequestParam(required = false) String username) { - GeneralGetRequest request = new GeneralGetRequest(); - request.setParentId(postId); - if (username == null) { - username = "reserved"; - } - request.setUsername(username); - GeneralRecursiveGetResponse response = postService.getComments(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/get-comments-of-post-or-comment/non-recursive") - public ResponseEntity getCommentsNonRecursive(@RequestParam Long postId, @RequestParam(required = false) String username) { - GeneralGetRequest request = new GeneralGetRequest(); - request.setParentId(postId); - if (username == null) { - username = "reserved"; - } - request.setUsername(username); - GeneralGetResponse response = postService.getCommentsNonRecursive(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/get-post") - public ResponseEntity getPost(@RequestParam Long postId, @RequestParam(required = false) String username) { - GetPostRequest request = new GetPostRequest(); - request.setPostId(postId); - if (username == null) { - username = "reserved"; - } - request.setUsername(username); - GetPostResponse response = postService.getPost(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/get-post/non-recursive") - public ResponseEntity getPostNonRecursive(@RequestParam Long postId, @RequestParam(required = false) String username) { - GetPostRequest request = new GetPostRequest(); - request.setPostId(postId); - if (username == null) { - username = "reserved"; - } - request.setUsername(username); - GetSuperPostResponse response = postService.getPostNonRecursive(request); - return ResponseEntity.ok(response); - } - - // @CrossOrigin(origins = "*", allowedHeaders = "*") - // @GetMapping("/get-comment") - // public ResponseEntity getComment(@RequestParam Long postId) { - // GetPostRequest request = new GetPostRequest(); - // request.setPostId(postId); - // GetPostResponse response = postService.getComment(request); - // return ResponseEntity.ok(response); - // } - // @CrossOrigin(origins = "*", allowedHeaders = "*") - // @GetMapping("/search-posts") - // public ResponseEntity searchPosts( - // @RequestParam(required = false) String queryType, - // @RequestParam(required = false) String keyword, - // @RequestParam(required = false) Integer offset, - // @RequestParam(required = false) Integer limit) { - // SearchAndListPostsRequest request = new SearchAndListPostsRequest(); - // if (queryType == null) { - // queryType = "date"; - // } - // if (keyword == null) { - // keyword = ""; - // } - // if (offset == null) { - // offset = 0; - // } - // if (limit == null) { - // limit = 10; - // } - // request.setQueryType(queryType); - // request.setKeyword(keyword); - // request.setOffset(offset); - // request.setLimit(limit); - // SearchAndListPostsResponse response = postService.searchAndListPosts(request); - // return ResponseEntity.ok(response); - // } - @CrossOrigin(origins = "*", allowedHeaders = "*") - @PostMapping("/create-post") - public ResponseEntity createPost(@RequestBody CreatePostRequest request) { - CreatePostResponse response = postService.createPost(request); - return ResponseEntity.ok(response); - } - - // @CrossOrigin(origins = "*", allowedHeaders = "*") - // @PostMapping("/create-forum") - // public ResponseEntity createForum(@RequestBody CreateForumRequest request) { - // CreateForumResponse response = postService.createForum(request); - // return ResponseEntity.ok(response); - // } - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/create-subforum") - public ResponseEntity createSubforum(@RequestParam String username, @RequestParam String title) { - CreateSubforumRequest request = new CreateSubforumRequest(); - request.setUsername(username); - request.setTitle(title); - CreateSubforumResponse response = postService.createSubforum(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @PostMapping("/create-comment") - public ResponseEntity createComment(@RequestBody CreateCommentRequest request) { - CreateCommentResponse response = postService.createComment(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @PostMapping("/edit-comment") - public ResponseEntity editComment(@RequestBody EditCommentRequest request) { - EditCommentResponse response = postService.editComment(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @PostMapping("/edit-post") - public ResponseEntity editPost(@RequestBody EditPostRequest request) { - EditPostResponse response = postService.editPost(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/edit-subforum") - public ResponseEntity editSubforum(@RequestParam String username, @RequestParam Long postID, @RequestParam String title) { - EditForumRequest request = new EditForumRequest(); - request.setUsername(username); - request.setPostID(postID); - request.setTitle(title); - EditForumResponse response = postService.editSubforum(request); - return ResponseEntity.ok(response); - } - - // @CrossOrigin(origins = "*", allowedHeaders = "*") - // @PostMapping("/edit-forum") - // public ResponseEntity editForum(@RequestBody EditForumRequest request) { - // EditForumResponse response = postService.editForum(request); - // return ResponseEntity.ok(response); - // } - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/delete-post") - public ResponseEntity deletePost(@RequestParam Long postId, @RequestParam String username) { - GeneralDeleteRequest request = new GeneralDeleteRequest(); - request.setPostId(postId); - request.setUsername(username); - GeneralDeleteResponse response = postService.deletePost(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/delete-subforum") - public ResponseEntity deleteSubforum(@RequestParam Long postId, @RequestParam String username) { - GeneralDeleteRequest request = new GeneralDeleteRequest(); - request.setPostId(postId); - request.setUsername(username); - GeneralDeleteResponse response = postService.deleteSubforum(request); - return ResponseEntity.ok(response); - } - - // @CrossOrigin(origins = "*", allowedHeaders = "*") - // @PostMapping("/delete-forum") - // public ResponseEntity deleteForum(@RequestBody GeneralDeleteRequest request) { - // GeneralDeleteResponse response = postService.deleteForum(request); - // return ResponseEntity.ok(response); - // } - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/delete-comment") - public ResponseEntity deleteComment(@RequestParam Long postId, @RequestParam String username) { - GeneralDeleteRequest request = new GeneralDeleteRequest(); - request.setPostId(postId); - request.setUsername(username); - GeneralDeleteResponse response = postService.deleteComment(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/general-get-post") - public ResponseEntity generalGetPost(@RequestParam Long postId, @RequestBody(required = false) String username) { - GetPostRequest request = new GetPostRequest(); - if (username == null) { - username = "reserved"; - } - request.setPostId(postId); - request.setUsername(username); - GetPostResponse response = postService.generalGetPost(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/general-get-post/non-recursive") - public ResponseEntity generalGetPostNonRecursive(@RequestParam Long postId, @RequestBody(required = false) String username) { - GetPostRequest request = new GetPostRequest(); - if (username == null) { - username = "reserved"; - } - request.setPostId(postId); - request.setUsername(username); - GetSuperPostResponse response = postService.generalGetPostNonRecursive(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/general-get-childeren") - public ResponseEntity generalGetChilderen(@RequestParam Long parentId, @RequestBody(required = false) String username) { - GeneralGetRequest request = new GeneralGetRequest(); - request.setParentId(parentId); - request.setUsername(username); - GeneralRecursiveGetResponse response = postService.generalGetChilderen(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/general-delete") - public ResponseEntity generalDelete(@RequestParam Long postId, @RequestParam String username) { - GeneralDeleteRequest request = new GeneralDeleteRequest(); - request.setPostId(postId); - request.setUsername(username); - GeneralDeleteResponse response = postService.generalDelete(request); - return ResponseEntity.ok(response); - } - - // @CrossOrigin(origins = "*", allowedHeaders = "*") - // @PostMapping("/general-search") - // public String generalSearch(@RequestBody GeneralSearchRequest request) { - // String response = postService.generalSearch(request); - // return response; - // } - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/explore") - public ResponseEntity explore(@RequestParam(required = false) String username) { - if (username == null) { - username = "reserved"; - } - ExploreRequest request = new ExploreRequest(username); - ExploreResponse response = postService.explore(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/explore/non-recursive") - public ResponseEntity exploreNonRecursive(@RequestParam(required = false) String username) { - if (username == null) { - username = "reserved"; - } - ExploreRequest request = new ExploreRequest(username); - ExploreNonRecursiveResponse response = postService.exploreNonRecursive(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/feed") - public ResponseEntity feed(@RequestParam String username) { - if (username == null) { - username = "reserved"; - } - FeedRequest request = new FeedRequest(); - request.setUsername(username); - FeedResponse response = postService.feed(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/feed/non-recursive") - public ResponseEntity feedNonRecursive(@RequestParam String username) { - if (username == null) { - username = "reserved"; - } - FeedRequest request = new FeedRequest(); - request.setUsername(username); - FeedNonRecursiveResponse response = postService.feedNonRecursive(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/explore/search") - public ResponseEntity exploreSearch(@RequestParam(required = false) String username, @RequestParam String keyword) { - if (username == null) { - username = "reserved"; - } - ExploreSearchRequest request = new ExploreSearchRequest(username, keyword); - ExploreSearchResponse response = postService.exploreSearch(request); - return ResponseEntity.ok(response); - } - - @CrossOrigin(origins = "*", allowedHeaders = "*") - @GetMapping("/explore/search/non-recursive") - public ResponseEntity exploreSearchNonRecursive(@RequestParam(required = false) String username, @RequestParam String keyword) { - if (username == null) { - username = "reserved"; - } - ExploreSearchRequest request = new ExploreSearchRequest(username, keyword); - ExploreSearchNonRecursiveResponse response = postService.exploreSearchNonRecursive(request); - return ResponseEntity.ok(response); - } - - // @CrossOrigin(origins = "*", allowedHeaders = "*") - // @GetMapping("/explore/search") - // public ResponseEntity exploreSearch(@RequestParam String username, @RequestParam String keyword) { - // SearchAndListPostsRequest request = new SearchAndListPostsRequest(); - // request.setKeyword(keyword); - // SearchAndListPostsResponse response = postService.exploreSearch(request); - // return ResponseEntity.ok(response); - // } - @GetMapping("/subforum/searchKeyword") - public List searchSubforumsByKeyword(@RequestParam("keyword") String keyword) { - return postService.getSubforumsByKeyword(keyword); - } - @GetMapping("/subforum/{id}") - public SubforumDetailsDTO getSubforumById( - @PathVariable Long id, - @RequestParam String username) { - return postService.getSubforumDetails(id, username); - } } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/asset/YahooFinanceChartResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/asset/YahooFinanceChartResponse.java index 33566a52..e4640e26 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/asset/YahooFinanceChartResponse.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/asset/YahooFinanceChartResponse.java @@ -7,7 +7,6 @@ public class YahooFinanceChartResponse { public static class Chart { private Result[] result; - private String error; public Result[] getResult() { return result; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GeneralFollowSubforumRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GeneralFollowSubforumRequest.java deleted file mode 100644 index d3649325..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GeneralFollowSubforumRequest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.followSubforum; - -public class GeneralFollowSubforumRequest { - private String followerUsername; - private Long followedSubforumID; - - public String getFollowerUsername() { - return followerUsername; - } - - public void setFollowerUsername(String followerUsername) { - this.followerUsername = followerUsername; - } - - public Long getFollowedSubforumID() { - return followedSubforumID; - } - - public void setFollowedSubforumID(Long followedUsername) { - this.followedSubforumID = followedUsername; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GeneralFollowSubforumResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GeneralFollowSubforumResponse.java deleted file mode 100644 index d5b4114c..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GeneralFollowSubforumResponse.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.followSubforum; - -public class GeneralFollowSubforumResponse { - private boolean isSuccessful; - private String message; - - public GeneralFollowSubforumResponse(boolean isSuccessful, String message) { - this.isSuccessful = isSuccessful; - this.message = message; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GetFollowingsRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GetFollowingsRequest.java deleted file mode 100644 index 364c6a96..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GetFollowingsRequest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.followSubforum; - -public class GetFollowingsRequest { - private String username; - - public GetFollowingsRequest() { - } - - public GetFollowingsRequest(String username) { - this.username = username; - } - - public String getUsername() { - return this.username; - } - - public void setUsername(String username) { - this.username = username; - } - -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GetFollowingsResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GetFollowingsResponse.java deleted file mode 100644 index 6d8c6645..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/followSubforum/GetFollowingsResponse.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.followSubforum; - -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.SubforumWSpecs; - -public class GetFollowingsResponse { - - private boolean isSuccessful; - private String message; - private List followings; - - public GetFollowingsResponse(boolean isSuccessful, String message, List followings) { - this.isSuccessful = isSuccessful; - this.message = message; - this.followings = followings; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public List getFollowings() { - return followings; - } - - public void setFollowings(List followings) { - this.followings = followings; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java new file mode 100644 index 00000000..03c9e7df --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java @@ -0,0 +1,5 @@ +package com.bounswe2024group10.Tradeverse.dto.post; + +public class CreatePostRequest { + +} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostResponse.java new file mode 100644 index 00000000..37efbf23 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostResponse.java @@ -0,0 +1,5 @@ +package com.bounswe2024group10.Tradeverse.dto.post; + +public class CreatePostResponse { + +} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/FeedRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/FeedRequest.java deleted file mode 100644 index 260bb81f..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/FeedRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post; - -public class FeedRequest { - private String username; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/FeedResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/FeedResponse.java deleted file mode 100644 index d9b0ea79..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/FeedResponse.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post; - -import java.util.HashMap; -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.PostWSpecs; - -public class FeedResponse { - private List forYou; - private HashMap> followedSubforumPosts; - private HashMap> followedUserPosts; - private boolean isSuccessful; - private String message; - - public FeedResponse(List forYou, HashMap> followedSubforumPosts, HashMap> followedUserPosts, boolean isSuccessful, String message) { - this.forYou = forYou; - this.followedSubforumPosts = followedSubforumPosts; - this.followedUserPosts = followedUserPosts; - this.isSuccessful = isSuccessful; - this.message = message; - } - - public List getForYou() { - return forYou; - } - - public void setForYou(List forYou) { - this.forYou = forYou; - } - - public HashMap> getFollowedSubforumPosts() { - return followedSubforumPosts; - } - - public void setFollowedSubforumPosts(HashMap> followedSubforumPosts) { - this.followedSubforumPosts = followedSubforumPosts; - } - - public HashMap> getFollowedUserPosts() { - return followedUserPosts; - } - - public void setFollowedUserPosts(HashMap> followedUserPosts) { - this.followedUserPosts = followedUserPosts; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateCommentRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateCommentRequest.java deleted file mode 100644 index af1d5974..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateCommentRequest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.create; - -import java.util.HashMap; -import java.util.List; - -public class CreateCommentRequest { - - private String username; - private Long parentID; - private List> content; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public Long getParentID() { - return parentID; - } - - public void setParentID(Long parentID) { - this.parentID = parentID; - } - - public List> getContent() { - return content; - } - - public void setContent(List> content) { - this.content = content; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateCommentResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateCommentResponse.java deleted file mode 100644 index 9b8a1255..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateCommentResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.create; - -public class CreateCommentResponse { - - private boolean isSuccessful; - private String message; - - public CreateCommentResponse(boolean isSuccessful, String message) { - this.isSuccessful = isSuccessful; - this.message = message; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreatePostRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreatePostRequest.java deleted file mode 100644 index 43e01257..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreatePostRequest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.create; - -import java.util.HashMap; -import java.util.List; - -public class CreatePostRequest { - - private String username; - private String title; - private Long parentID; - private List> content; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public Long getParentID() { - return parentID; - } - - public void setParentID(Long parentID) { - this.parentID = parentID; - } - - public List> getContent() { - return content; - } - - public void setContent(List> content) { - this.content = content; - } - -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreatePostResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreatePostResponse.java deleted file mode 100644 index 581cf66c..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreatePostResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.create; - -public class CreatePostResponse { - - private boolean isSuccessful; - private String message; - - public CreatePostResponse(boolean isSuccessful, String message) { - this.isSuccessful = isSuccessful; - this.message = message; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateSubforumRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateSubforumRequest.java deleted file mode 100644 index 7fbae45e..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateSubforumRequest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.create; - -public class CreateSubforumRequest { - - private String username; - private String title; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateSubforumResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateSubforumResponse.java deleted file mode 100644 index 729c86c9..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/create/CreateSubforumResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.create; - -public class CreateSubforumResponse { - - private boolean isSuccessful; - private String message; - - public CreateSubforumResponse(boolean isSuccessful, String message) { - this.isSuccessful = isSuccessful; - this.message = message; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/delete/GeneralDeleteRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/delete/GeneralDeleteRequest.java deleted file mode 100644 index 931d6739..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/delete/GeneralDeleteRequest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.delete; - -public class GeneralDeleteRequest { - - private String username; - private Long postId; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public Long getPostId() { - return postId; - } - - public void setPostId(Long postId) { - this.postId = postId; - } - -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/delete/GeneralDeleteResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/delete/GeneralDeleteResponse.java deleted file mode 100644 index cd8c7e3a..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/delete/GeneralDeleteResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.delete; - -public class GeneralDeleteResponse { - - private boolean isSuccessful; - private String message; - - public GeneralDeleteResponse(boolean isSuccessful, String message) { - this.isSuccessful = isSuccessful; - this.message = message; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditCommentRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditCommentRequest.java deleted file mode 100644 index 547369e0..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditCommentRequest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.edit; - -import java.util.HashMap; -import java.util.List; - -public class EditCommentRequest { - - private String username; - private Long postID; - private List> content; - - public EditCommentRequest(String username, List> content, Long postID) { - this.username = username; - this.content = content; - this.postID = postID; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public Long getPostID() { - return postID; - } - - public void setPostID(Long postID) { - this.postID = postID; - } - - public List> getContent() { - return content; - } - - public void setContent(List> content) { - this.content = content; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditCommentResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditCommentResponse.java deleted file mode 100644 index 4fdb49fe..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditCommentResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.edit; - -public class EditCommentResponse { - - private boolean isSuccessful; - private String message; - - public EditCommentResponse(boolean isSuccessful, String message) { - this.isSuccessful = isSuccessful; - this.message = message; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditForumRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditForumRequest.java deleted file mode 100644 index 633f84cc..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditForumRequest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.edit; - -public class EditForumRequest { - - private String username; - private Long postID; - private String title; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public Long getPostID() { - return postID; - } - - public void setPostID(Long postID) { - this.postID = postID; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditForumResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditForumResponse.java deleted file mode 100644 index 8cec5e78..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditForumResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.edit; - -public class EditForumResponse { - - private boolean isSuccessful; - private String message; - - public EditForumResponse(boolean isSuccessful, String message) { - this.isSuccessful = isSuccessful; - this.message = message; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditPostRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditPostRequest.java deleted file mode 100644 index b1c69cab..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditPostRequest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.edit; - -import java.util.HashMap; -import java.util.List; - -public class EditPostRequest { - - private String username; - private Long postID; - private String title; - private List> content; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public Long getPostID() { - return postID; - } - - public void setPostID(Long postID) { - this.postID = postID; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public List> getContent() { - return content; - } - - public void setContent(List> content) { - this.content = content; - } - -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditPostResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditPostResponse.java deleted file mode 100644 index af990fd8..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/edit/EditPostResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.edit; - -public class EditPostResponse { - - private boolean isSuccessful; - private String message; - - public EditPostResponse(boolean isSuccessful, String message) { - this.isSuccessful = isSuccessful; - this.message = message; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreNonRecursiveResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreNonRecursiveResponse.java deleted file mode 100644 index 4b09a7ad..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreNonRecursiveResponse.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.explore; - -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.SuperPost; - -public class ExploreNonRecursiveResponse { - - private boolean isSuccessful; - private String message; - private List recentPosts; - private List popularPosts; - - public ExploreNonRecursiveResponse(boolean isSuccessful, String message, List recentPosts, List popularPosts) { - this.isSuccessful = isSuccessful; - this.message = message; - this.recentPosts = recentPosts; - this.popularPosts = popularPosts; - } - - public boolean getIsSuccessful() { - return isSuccessful; - } - - public void setIsSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public List getRecentPosts() { - return recentPosts; - } - - public void setRecentPosts(List recentPosts) { - this.recentPosts = recentPosts; - } - - public List getPopularPosts() { - return popularPosts; - } - - public void setPopularPosts(List popularPosts) { - this.popularPosts = popularPosts; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreRequest.java deleted file mode 100644 index c0b6788d..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.explore; - -public class ExploreRequest { - - private String username; - - public ExploreRequest(String username) { - this.username = username; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreResponse.java deleted file mode 100644 index bd634e95..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreResponse.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.explore; - -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.PostWSpecs; - -public class ExploreResponse { - - private boolean isSuccessful; - private String message; - private List recentPosts; - private List popularPosts; - - public ExploreResponse(boolean isSuccessful, String message, List recentPosts, List popularPosts) { - this.isSuccessful = isSuccessful; - this.message = message; - this.recentPosts = recentPosts; - this.popularPosts = popularPosts; - } - - public boolean getIsSuccessful() { - return isSuccessful; - } - - public void setIsSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public List getRecentPosts() { - return recentPosts; - } - - public void setRecentPosts(List recentPosts) { - this.recentPosts = recentPosts; - } - - public List getPopularPosts() { - return popularPosts; - } - - public void setPopularPosts(List popularPosts) { - this.popularPosts = popularPosts; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchNonRecursiveResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchNonRecursiveResponse.java deleted file mode 100644 index 6030f499..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchNonRecursiveResponse.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.explore; - -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.SuperPost; -import com.bounswe2024group10.Tradeverse.extra.SuperSubforum; - -public class ExploreSearchNonRecursiveResponse { - - private List popular; - private List posts; - private List assets; - private List tags; - private List subforums; - private List people; - private boolean isSuccessful; - private String message; - - public ExploreSearchNonRecursiveResponse(List popular, List posts, List assets, List tags, List subforums, List people, boolean isSuccessful, String message) { - this.popular = popular; - this.posts = posts; - this.assets = assets; - this.tags = tags; - this.subforums = subforums; - this.people = people; - this.isSuccessful = isSuccessful; - this.message = message; - } - - public List getPopular() { - return popular; - } - - public void setPopular(List popular) { - this.popular = popular; - } - - public List getPosts() { - return posts; - } - - public void setPosts(List posts) { - this.posts = posts; - } - - public List getAssets() { - return assets; - } - - public void setAssets(List assets) { - this.assets = assets; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - public List getSubforums() { - return subforums; - } - - public void setSubforums(List subforums) { - this.subforums = subforums; - } - - public List getPeople() { - return people; - } - - public void setPeople(List people) { - this.people = people; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean isSuccessful) { - this.isSuccessful = isSuccessful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchRequest.java deleted file mode 100644 index ab37f70f..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchRequest.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.explore; - -public class ExploreSearchRequest { - - private String username; - private String keyword; - - public ExploreSearchRequest(String username, String keyword) { - this.username = username; - this.keyword = keyword; - } - - public String getUsername() { - return username; - } - - public String getKeyword() { - return keyword; - } - - public void setUsername(String username) { - this.username = username; - } - - public void setKeyword(String keyword) { - this.keyword = keyword; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchResponse.java deleted file mode 100644 index 090f5d91..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/ExploreSearchResponse.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.explore; - -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.PostWSpecs; -import com.bounswe2024group10.Tradeverse.extra.SubforumWSpecs; - -public class ExploreSearchResponse { - - private List popular; - private List posts; - private List assets; - private List tags; - private List subforums; - private List people; - private boolean isSuccessful; - private String message; - - public ExploreSearchResponse(List popular, List posts, List assets, List tags, List subforums, List people, boolean isSuccessful, String message) { - this.popular = popular; - this.posts = posts; - this.assets = assets; - this.tags = tags; - this.subforums = subforums; - this.people = people; - this.isSuccessful = isSuccessful; - this.message = message; - } - - public List getPopular() { - return popular; - } - - public void setPopular(List popular) { - this.popular = popular; - } - - public List getPosts() { - return posts; - } - - public void setPosts(List posts) { - this.posts = posts; - } - - public List getAssets() { - return assets; - } - - public void setAssets(List assets) { - this.assets = assets; - } - - public List getTags() { - return tags; - } - - public void setTags(List tags) { - this.tags = tags; - } - - public List getSubforums() { - return subforums; - } - - public void setSubforums(List subforums) { - this.subforums = subforums; - } - - public List getPeople() { - return people; - } - - public void setPeople(List people) { - this.people = people; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean isSuccessful) { - this.isSuccessful = isSuccessful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/GeneralSearchRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/GeneralSearchRequest.java deleted file mode 100644 index 740e6695..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/explore/GeneralSearchRequest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.explore; - -import java.util.HashSet; - -public class GeneralSearchRequest { - - private String username; - private String keyword; - private String order; - private HashSet wantedItems; - - public GeneralSearchRequest(String username, String keyword, String order, HashSet wantedItems) { - this.username = username; - this.keyword = keyword; - this.order = order; - this.wantedItems = wantedItems; - } - - public String getUsername() { - return username; - } - - public String getKeyword() { - return keyword; - } - - public String getOrder() { - return order; - } - - public HashSet getWantedItems() { - return wantedItems; - } - - public void setUsername(String username) { - this.username = username; - } - - public void setKeyword(String keyword) { - this.keyword = keyword; - } - - public void setOrder(String order) { - this.order = order; - } - - public void setWantedItems(HashSet wantedItems) { - this.wantedItems = wantedItems; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedNonRecursiveResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedNonRecursiveResponse.java deleted file mode 100644 index f8818f76..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedNonRecursiveResponse.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.feed; - -import java.util.HashMap; -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.SuperPost; - -public class FeedNonRecursiveResponse { - - private List forYou; - private HashMap> followedSubforumPosts; - private HashMap> followedUserPosts; - private boolean isSuccessful; - private String message; - - public FeedNonRecursiveResponse(List forYou, HashMap> followedSubforumPosts, HashMap> followedUserPosts, boolean isSuccessful, String message) { - this.forYou = forYou; - this.followedSubforumPosts = followedSubforumPosts; - this.followedUserPosts = followedUserPosts; - this.isSuccessful = isSuccessful; - this.message = message; - } - - public List getForYou() { - return forYou; - } - - public void setForYou(List forYou) { - this.forYou = forYou; - } - - public HashMap> getFollowedSubforumPosts() { - return followedSubforumPosts; - } - - public void setFollowedSubforumPosts(HashMap> followedSubforumPosts) { - this.followedSubforumPosts = followedSubforumPosts; - } - - public HashMap> getFollowedUserPosts() { - return followedUserPosts; - } - - public void setFollowedUserPosts(HashMap> followedUserPosts) { - this.followedUserPosts = followedUserPosts; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedRequest.java deleted file mode 100644 index f1b75eac..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.feed; - -public class FeedRequest { - - private String username; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedResponse.java deleted file mode 100644 index d6251ffd..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/feed/FeedResponse.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.feed; - -import java.util.HashMap; -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.PostWSpecs; - -public class FeedResponse { - - private List forYou; - private HashMap> followedSubforumPosts; - private HashMap> followedUserPosts; - private boolean isSuccessful; - private String message; - - public FeedResponse(List forYou, HashMap> followedSubforumPosts, HashMap> followedUserPosts, boolean isSuccessful, String message) { - this.forYou = forYou; - this.followedSubforumPosts = followedSubforumPosts; - this.followedUserPosts = followedUserPosts; - this.isSuccessful = isSuccessful; - this.message = message; - } - - public List getForYou() { - return forYou; - } - - public void setForYou(List forYou) { - this.forYou = forYou; - } - - public HashMap> getFollowedSubforumPosts() { - return followedSubforumPosts; - } - - public void setFollowedSubforumPosts(HashMap> followedSubforumPosts) { - this.followedSubforumPosts = followedSubforumPosts; - } - - public HashMap> getFollowedUserPosts() { - return followedUserPosts; - } - - public void setFollowedUserPosts(HashMap> followedUserPosts) { - this.followedUserPosts = followedUserPosts; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralGetRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralGetRequest.java deleted file mode 100644 index 1ebc6619..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralGetRequest.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.other; - -public class GeneralGetRequest { - - private Long parentId; - private String username; - - public Long getParentId() { - return parentId; - } - - public void setParentId(Long postId) { - this.parentId = postId; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralGetResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralGetResponse.java deleted file mode 100644 index 791f1281..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralGetResponse.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.other; - -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.SuperPost; - -public class GeneralGetResponse { - - private boolean isSuccessful; - private String message; - private List comments; - - public GeneralGetResponse(boolean isSuccessful, String message, List comments) { - this.isSuccessful = isSuccessful; - this.message = message; - this.comments = comments; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public List getComments() { - return comments; - } - - public void setComments(List comments) { - this.comments = comments; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralRecursiveGetResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralRecursiveGetResponse.java deleted file mode 100644 index 2d43063e..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GeneralRecursiveGetResponse.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.other; - -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.PostWSpecs; - -public class GeneralRecursiveGetResponse { - - private boolean isSuccessful; - private String message; - private List comments; - - public GeneralRecursiveGetResponse(boolean isSuccessful, String message, List comments) { - this.isSuccessful = isSuccessful; - this.message = message; - this.comments = comments; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public List getComments() { - return comments; - } - - public void setComments(List comments) { - this.comments = comments; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetPostRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetPostRequest.java deleted file mode 100644 index 3bfd2c6c..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetPostRequest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.other; - -public class GetPostRequest { - - private Long postId; - - private String username; - - public Long getPostId() { - return postId; - } - - public void setPostId(Long postId) { - this.postId = postId; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetPostResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetPostResponse.java deleted file mode 100644 index 134a6abc..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetPostResponse.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.other; - -import com.bounswe2024group10.Tradeverse.extra.PostWSpecs; - -public class GetPostResponse { - - private boolean isSuccessful; - private String message; - private PostWSpecs post; - - public GetPostResponse(boolean isSuccessful, String message, PostWSpecs post) { - this.isSuccessful = isSuccessful; - this.message = message; - this.post = post; - } - - public boolean getIsSuccessful() { - return isSuccessful; - } - - public void setIsSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public PostWSpecs getPost() { - return post; - } - - public void setPost(PostWSpecs post) { - this.post = post; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSubforumsResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSubforumsResponse.java deleted file mode 100644 index 28d257c5..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSubforumsResponse.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.other; - -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.SubforumWSpecs; - -public class GetSubforumsResponse { - - private boolean isSuccessful; - private String message; - private List subforums; - - public GetSubforumsResponse(boolean isSuccessful, String message, List subforums) { - this.isSuccessful = isSuccessful; - this.message = message; - this.subforums = subforums; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public List getSubforums() { - return subforums; - } - - public void setSubforums(List subforums) { - this.subforums = subforums; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSuperPostResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSuperPostResponse.java deleted file mode 100644 index 43b7764b..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSuperPostResponse.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.other; - -import com.bounswe2024group10.Tradeverse.extra.SuperPost; - -public class GetSuperPostResponse { - - private boolean isSuccessful; - private String message; - private SuperPost post; - - public GetSuperPostResponse(boolean isSuccessful, String message, SuperPost post) { - this.isSuccessful = isSuccessful; - this.message = message; - this.post = post; - } - - public boolean getIsSuccessful() { - return isSuccessful; - } - - public void setIsSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public SuperPost getPost() { - return post; - } - - public void setPost(SuperPost post) { - this.post = post; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSuperSubforumResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSuperSubforumResponse.java deleted file mode 100644 index f9779020..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/GetSuperSubforumResponse.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.other; - -import java.util.List; - -import com.bounswe2024group10.Tradeverse.extra.SuperSubforum; - -public class GetSuperSubforumResponse { - - private boolean isSuccessful; - private String message; - private List subforums; - - public GetSuperSubforumResponse(boolean isSuccessful, String message, List subforums) { - this.isSuccessful = isSuccessful; - this.message = message; - this.subforums = subforums; - } - - public boolean isSuccessful() { - return isSuccessful; - } - - public void setSuccessful(boolean successful) { - isSuccessful = successful; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public List getSubforums() { - return subforums; - } - - public void setSubforums(List subforums) { - this.subforums = subforums; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/PostSummaryDTO.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/PostSummaryDTO.java deleted file mode 100644 index 3151414d..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/PostSummaryDTO.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.other; -import java.time.LocalDateTime; -public class PostSummaryDTO -{ - private Long postID; - private String title; - private String content; - private String creatorUsername; - private String creatorProfilePhoto; - private Long nofLikes; - private Long nofDislikes; - private LocalDateTime creationDate; - private Long nofComments; - - public PostSummaryDTO(Long postID, String title, String content, String creatorUsername, String creatorProfilePhoto, Long nofLikes,Long nofDislikes, LocalDateTime creationDate, Long nofComments) { - this.postID = postID; - this.title = title; - this.content = content; - this.creatorUsername = creatorUsername; - this.creatorProfilePhoto = creatorProfilePhoto; - this.nofLikes = nofLikes; - this.nofDislikes = nofDislikes; - this.creationDate = creationDate; // Ensure this is LocalDateTime - this.nofComments = nofComments; - } - - // Getters and setters - public Long getPostID() { - return postID; - } - - public void setPostID(Long postID) { - this.postID = postID; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public String getCreatorUsername() { - return creatorUsername; - } - - public void setCreatorUsername(String creatorUsername) { - this.creatorUsername = creatorUsername; - } - - public String getCreatorProfilePhoto() { - return creatorProfilePhoto; - } - - public void setCreatorProfilePhoto(String creatorProfilePhoto) { - this.creatorProfilePhoto = creatorProfilePhoto; - } - - public Long getNofLikes() { - return nofLikes; - } - - public void setNofLikes(Long nofLikes) { - this.nofLikes = nofLikes; - } - - public Long getNofDislikes() { - return nofDislikes; - } - public void setNofDislikes(Long nofDislikes) { - this.nofDislikes = nofDislikes; - } - - public LocalDateTime getCreationDate() { - return creationDate; - } - - public void setCreationDate(LocalDateTime creationDate) { - this.creationDate = creationDate; - } - - public Long getNofComments() { - return nofComments; - } - - public void setNofComments(Long nofComments) { - this.nofComments = nofComments; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/SubforumDetailsDTO.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/SubforumDetailsDTO.java deleted file mode 100644 index 6ab853a9..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/SubforumDetailsDTO.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.other; -import java.util.List; - -public class SubforumDetailsDTO { - private String subforumName; - private Boolean isFollowedByGivenUsername; - private List posts; - private Long numberOfPosts; - private Long numberOfFollowers; - - public SubforumDetailsDTO(String subforumName, Boolean isFollowedByGivenUsername, List posts, Long numberOfPosts, Long numberOfFollowers) { - this.subforumName = subforumName; - this.isFollowedByGivenUsername = isFollowedByGivenUsername; - this.posts = posts; - this.numberOfPosts = numberOfPosts; - this.numberOfFollowers = numberOfFollowers; - } - - // Getters and setters - public String getSubforumName() { - return subforumName; - } - - public void setSubforumName(String subforumName) { - this.subforumName = subforumName; - } - - public Boolean getIsFollowedByGivenUsername() { - return isFollowedByGivenUsername; - } - - public void setIsFollowedByGivenUsername(Boolean followedByGivenUsername) { - isFollowedByGivenUsername = followedByGivenUsername; - } - - public List getPosts() { - return posts; - } - - public void setPosts(List posts) { - this.posts = posts; - } - - public Long getNumberOfPosts() { - return numberOfPosts; - } - - public void setNumberOfPosts(Long numberOfPosts) { - this.numberOfPosts = numberOfPosts; - } - - public Long getNumberOfFollowers() { - return numberOfFollowers; - } - - public void setNumberOfFollowers(Long numberOfFollowers) { - this.numberOfFollowers = numberOfFollowers; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/SubforumSummaryDTO.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/SubforumSummaryDTO.java deleted file mode 100644 index ec46832f..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/other/SubforumSummaryDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.bounswe2024group10.Tradeverse.dto.post.other; - -public class SubforumSummaryDTO { // Correct class name - private Long id; - private String title; - private Long postCount; - - // Constructor with matching name - public SubforumSummaryDTO(Long id, String title, Long postCount) { - this.id = id; - this.title = title; - this.postCount = postCount; - } - - public Long getId() { - return id; - } - - public String getTitle() { - return title; - } - - public Long getPostCount() { - return postCount; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/ListHashMapConverter.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/ListHashMapConverter.java deleted file mode 100644 index e7f56254..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/ListHashMapConverter.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.bounswe2024group10.Tradeverse.extra; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import jakarta.persistence.AttributeConverter; -import jakarta.persistence.Converter; - -@Converter -public class ListHashMapConverter implements AttributeConverter>, String> { - - private final ObjectMapper objectMapper = new ObjectMapper(); - - @Override - public String convertToDatabaseColumn(List> attribute) { - if (attribute == null) { - return null; - } - try { - return objectMapper.writeValueAsString(attribute); - } catch (JsonProcessingException e) { - throw new IllegalArgumentException("Error converting list to JSON", e); - } - } - - @Override - public List> convertToEntityAttribute(String dbData) { - if (dbData == null) { - return null; - } - try { - return objectMapper.readValue(dbData, List.class); - } catch (IOException e) { - throw new IllegalArgumentException("Error converting JSON to list", e); - } - } -} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/PostType.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/PostType.java deleted file mode 100644 index 20badcdd..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/PostType.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.bounswe2024group10.Tradeverse.extra; - -public enum PostType { - FORUM, - SUBFORUM, - POST, - COMMENT -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/PostWSpecs.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/PostWSpecs.java deleted file mode 100644 index 96f18e37..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/PostWSpecs.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.bounswe2024group10.Tradeverse.extra; - -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.List; - -import com.bounswe2024group10.Tradeverse.model.Post; -import com.bounswe2024group10.Tradeverse.model.User; - -public class PostWSpecs { - - private Long id; - private String title; - private Long parentID; - private List> content; - private Long nofLikes; - private Long nofDislikes; - private Boolean likable; - private LocalDateTime creationDate; - private LocalDateTime lastEditDate; - private LocalDateTime lastUpdateDate; - private PostType postType; - private Long nofComments; - - private Boolean isLiked; - private Boolean isDisliked; - - private Post parentSubforum; - - private User author; - List comments; - - // public PostWSpecs(Long postID, String username) { - // Post post = postRepository.findById(postID).get(); - // this.id = post.getId(); - // this.title = post.getTitle(); - // this.parentID = post.getParentID(); - // this.content = post.getContent(); - // this.nofLikes = post.getNofLikes(); - // this.nofDislikes = post.getNofDislikes(); - // this.likable = post.getLikable(); - // this.creationDate = post.getCreationDate(); - // this.lastEditDate = post.getLastEditDate(); - // this.lastUpdateDate = post.getLastUpdateDate(); - // this.postType = post.getPostType(); - // this.nofComments = postRepository.countByParentID(post.getId()); - // this.isLiked = likeRepository.existsByUsernameAndPostID(username, post.getId()); - // this.isDisliked = dislikeRepository.existsByUsernameAndPostID(username, post.getId()); - // switch (postType) { - // case SUBFORUM: - // this.parentSubforum = this; - // break; - // case FORUM: - // this.parentSubforum = null; - // break; - // default: - // Post parent = postRepository.findById(post.getParentID()).get(); - // while (parent.getPostType() != PostType.SUBFORUM) { - // parent = postRepository.findById(parent.getParentID()).get(); - // } - // this.parentSubforum = new PostWSpecs(parent, username); - // } - // this.author = userRepository.findByUsername(post.getUsername()); - // this.comments = postRepository.findByParentID(post.getId()).stream().map(p -> new PostWSpecs(p, username)).toList(); - // } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public Long getParentID() { - return parentID; - } - - public void setParentID(Long parentID) { - this.parentID = parentID; - } - - public List> getContent() { - return content; - } - - public void setContent(List> content) { - this.content = content; - } - - public Long getNofLikes() { - return nofLikes; - } - - public void setNofLikes(Long nofLikes) { - this.nofLikes = nofLikes; - } - - public Long getNofDislikes() { - return nofDislikes; - } - - public void setNofDislikes(Long nofDislikes) { - this.nofDislikes = nofDislikes; - } - - public Boolean getLikable() { - return likable; - } - - public void setLikable(Boolean likable) { - this.likable = likable; - } - - public LocalDateTime getCreationDate() { - return creationDate; - } - - public void setCreationDate(LocalDateTime creationDate) { - this.creationDate = creationDate; - } - - public LocalDateTime getLastEditDate() { - return lastEditDate; - } - - public void setLastEditDate(LocalDateTime lastEditDate) { - this.lastEditDate = lastEditDate; - } - - public LocalDateTime getLastUpdateDate() { - return lastUpdateDate; - } - - public void setLastUpdateDate(LocalDateTime lastUpdateDate) { - this.lastUpdateDate = lastUpdateDate; - } - - public PostType getPostType() { - return postType; - } - - public void setPostType(PostType postType) { - this.postType = postType; - } - - public Long getNofComments() { - return nofComments; - } - - public void setNofComments(Long nofComments) { - this.nofComments = nofComments; - } - - public Boolean getIsLiked() { - return isLiked; - } - - public void setIsLiked(Boolean isLiked) { - this.isLiked = isLiked; - } - - public Boolean getIsDisliked() { - return isDisliked; - } - - public void setIsDisliked(Boolean isDisliked) { - this.isDisliked = isDisliked; - } - - public Post getParentSubforum() { - return parentSubforum; - } - - public void setParentSubforum(Post parentSubforum) { - this.parentSubforum = parentSubforum; - } - - public User getAuthor() { - return author; - } - - public void setAuthor(User author) { - this.author = author; - } - - public List getComments() { - return comments; - } - - public void setComments(List comments) { - this.comments = comments; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SubforumWSpecs.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SubforumWSpecs.java deleted file mode 100644 index 60692fb3..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SubforumWSpecs.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.bounswe2024group10.Tradeverse.extra; - -import java.util.List; - -public class SubforumWSpecs { - - private Long id; - private String title; - private Long num_of_posts; - private Long num_of_followers; - private boolean is_followed; - private List posts; - - // public SubforumWSpecs(Long id, String username) { - // this.id = id; - // Post post = postRepository.findById(id).get(); - // this.title = post.getTitle(); - // this.num_of_posts = postRepository.countByParentID(id); - // this.num_of_followers = followSubforumRepository.countByFollowedSubforumID(id); - // this.is_followed = followSubforumRepository.findByFollowerUsernameAndFollowedSubforumID(username, id) != null; - // this.posts = postRepository.findByParentID(id).stream().map(p -> new PostWSpecs(p, username)).collect(Collectors.toList()); - // } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public Long getNum_of_posts() { - return num_of_posts; - } - - public void setNum_of_posts(Long num_of_posts) { - this.num_of_posts = num_of_posts; - } - - public Long getNum_of_followers() { - return num_of_followers; - } - - public void setNum_of_followers(Long num_of_followers) { - this.num_of_followers = num_of_followers; - } - - public boolean isIs_followed() { - return is_followed; - } - - public void setIs_followed(boolean is_followed) { - this.is_followed = is_followed; - } - - public List getPosts() { - return posts; - } - - public void setPosts(List posts) { - this.posts = posts; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SuperPost.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SuperPost.java deleted file mode 100644 index d1a6c645..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SuperPost.java +++ /dev/null @@ -1,201 +0,0 @@ -package com.bounswe2024group10.Tradeverse.extra; - -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.List; - -import com.bounswe2024group10.Tradeverse.model.Post; -import com.bounswe2024group10.Tradeverse.model.User; - -public class SuperPost { - - private Long id; - private String title; - private Long parentID; - private List> content; - private Long nofLikes; - private Long nofDislikes; - private Boolean likable; - private LocalDateTime creationDate; - private LocalDateTime lastEditDate; - private LocalDateTime lastUpdateDate; - private PostType postType; - private Long nofComments; - - private Boolean isLiked; - private Boolean isDisliked; - - private Post parentSubforum; - - private User author; - List comments; - - // public PostWSpecs(Long postID, String username) { - // Post post = postRepository.findById(postID).get(); - // this.id = post.getId(); - // this.title = post.getTitle(); - // this.parentID = post.getParentID(); - // this.content = post.getContent(); - // this.nofLikes = post.getNofLikes(); - // this.nofDislikes = post.getNofDislikes(); - // this.likable = post.getLikable(); - // this.creationDate = post.getCreationDate(); - // this.lastEditDate = post.getLastEditDate(); - // this.lastUpdateDate = post.getLastUpdateDate(); - // this.postType = post.getPostType(); - // this.nofComments = postRepository.countByParentID(post.getId()); - // this.isLiked = likeRepository.existsByUsernameAndPostID(username, post.getId()); - // this.isDisliked = dislikeRepository.existsByUsernameAndPostID(username, post.getId()); - // switch (postType) { - // case SUBFORUM: - // this.parentSubforum = this; - // break; - // case FORUM: - // this.parentSubforum = null; - // break; - // default: - // Post parent = postRepository.findById(post.getParentID()).get(); - // while (parent.getPostType() != PostType.SUBFORUM) { - // parent = postRepository.findById(parent.getParentID()).get(); - // } - // this.parentSubforum = new PostWSpecs(parent, username); - // } - // this.author = userRepository.findByUsername(post.getUsername()); - // this.comments = postRepository.findByParentID(post.getId()).stream().map(p -> new PostWSpecs(p, username)).toList(); - // } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public Long getParentID() { - return parentID; - } - - public void setParentID(Long parentID) { - this.parentID = parentID; - } - - public List> getContent() { - return content; - } - - public void setContent(List> content) { - this.content = content; - } - - public Long getNofLikes() { - return nofLikes; - } - - public void setNofLikes(Long nofLikes) { - this.nofLikes = nofLikes; - } - - public Long getNofDislikes() { - return nofDislikes; - } - - public void setNofDislikes(Long nofDislikes) { - this.nofDislikes = nofDislikes; - } - - public Boolean getLikable() { - return likable; - } - - public void setLikable(Boolean likable) { - this.likable = likable; - } - - public LocalDateTime getCreationDate() { - return creationDate; - } - - public void setCreationDate(LocalDateTime creationDate) { - this.creationDate = creationDate; - } - - public LocalDateTime getLastEditDate() { - return lastEditDate; - } - - public void setLastEditDate(LocalDateTime lastEditDate) { - this.lastEditDate = lastEditDate; - } - - public LocalDateTime getLastUpdateDate() { - return lastUpdateDate; - } - - public void setLastUpdateDate(LocalDateTime lastUpdateDate) { - this.lastUpdateDate = lastUpdateDate; - } - - public PostType getPostType() { - return postType; - } - - public void setPostType(PostType postType) { - this.postType = postType; - } - - public Long getNofComments() { - return nofComments; - } - - public void setNofComments(Long nofComments) { - this.nofComments = nofComments; - } - - public Boolean getIsLiked() { - return isLiked; - } - - public void setIsLiked(Boolean isLiked) { - this.isLiked = isLiked; - } - - public Boolean getIsDisliked() { - return isDisliked; - } - - public void setIsDisliked(Boolean isDisliked) { - this.isDisliked = isDisliked; - } - - public Post getParentSubforum() { - return parentSubforum; - } - - public void setParentSubforum(Post parentSubforum) { - this.parentSubforum = parentSubforum; - } - - public User getAuthor() { - return author; - } - - public void setAuthor(User author) { - this.author = author; - } - - public List getComments() { - return comments; - } - - public void setComments(List comments) { - this.comments = comments; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SuperSubforum.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SuperSubforum.java deleted file mode 100644 index 23aa088c..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/extra/SuperSubforum.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.bounswe2024group10.Tradeverse.extra; - -import java.util.List; - -public class SuperSubforum { - - private Long id; - private String title; - private Long num_of_posts; - private Long num_of_followers; - private boolean is_followed; - private List posts; - - // public SubforumWSpecs(Long id, String username) { - // this.id = id; - // Post post = postRepository.findById(id).get(); - // this.title = post.getTitle(); - // this.num_of_posts = postRepository.countByParentID(id); - // this.num_of_followers = followSubforumRepository.countByFollowedSubforumID(id); - // this.is_followed = followSubforumRepository.findByFollowerUsernameAndFollowedSubforumID(username, id) != null; - // this.posts = postRepository.findByParentID(id).stream().map(p -> new PostWSpecs(p, username)).collect(Collectors.toList()); - // } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public Long getNum_of_posts() { - return num_of_posts; - } - - public void setNum_of_posts(Long num_of_posts) { - this.num_of_posts = num_of_posts; - } - - public Long getNum_of_followers() { - return num_of_followers; - } - - public void setNum_of_followers(Long num_of_followers) { - this.num_of_followers = num_of_followers; - } - - public boolean isIs_followed() { - return is_followed; - } - - public void setIs_followed(boolean is_followed) { - this.is_followed = is_followed; - } - - public List getPosts() { - return posts; - } - - public void setPosts(List posts) { - this.posts = posts; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java new file mode 100644 index 00000000..bc220eb4 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java @@ -0,0 +1,122 @@ +package com.bounswe2024group10.Tradeverse.model; + +import java.time.LocalDateTime; +import java.util.List; + +import com.bounswe2024group10.Tradeverse.model.Content; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.persistence.ElementCollection; + +@Entity +@Table(name = "comments") +public class Comment { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ElementCollection + @Column(nullable = true) + private List content; + + @Column(nullable = false) + private String createdBy; + + @Column(nullable = false) + private String postID; + + @Column(nullable = true) + private Long commentID; + + @Column(nullable = false) + private LocalDateTime creationDate; + + @Column(nullable = true) + private LocalDateTime lastEditDate; + + @Column(nullable = true) + private LocalDateTime lastUpdateDate; + + public Comment() { + } + + public Comment(String createdBy, String postID, Long commentID, List content, LocalDateTime creationDate, LocalDateTime lastEditDate, LocalDateTime lastUpdateDate) { + this.createdBy = createdBy; + this.postID = postID; + this.commentID = commentID; + this.content = content; + this.creationDate = creationDate; + this.lastEditDate = lastEditDate; + this.lastUpdateDate = lastUpdateDate; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public List getContent() { + return content; + } + + public void setContent(List content) { + this.content = content; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public String getPostID() { + return postID; + } + + public void setPostID(String postID) { + this.postID = postID; + } + + public Long getCommentID() { + return commentID; + } + + public void setCommentID(Long commentID) { + this.commentID = commentID; + } + + public LocalDateTime getCreationDate() { + return creationDate; + } + + public void setCreationDate(LocalDateTime creationDate) { + this.creationDate = creationDate; + } + + public LocalDateTime getLastEditDate() { + return lastEditDate; + } + + public void setLastEditDate(LocalDateTime lastEditDate) { + this.lastEditDate = lastEditDate; + } + + public LocalDateTime getLastUpdateDate() { + return lastUpdateDate; + } + + public void setLastUpdateDate(LocalDateTime lastUpdateDate) { + this.lastUpdateDate = lastUpdateDate; + } +} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Content.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Content.java new file mode 100644 index 00000000..afc07d8a --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Content.java @@ -0,0 +1,38 @@ +package com.bounswe2024group10.Tradeverse.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Embeddable; + +@Embeddable +public class Content { + + @Column(nullable = false) + private String type; + + @Column(nullable = false) + private String value; + + public Content() { + } + + public Content(String type, String value) { + this.type = type; + this.value = value; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/FollowSubforum.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/FollowSubforum.java deleted file mode 100644 index 9ee10520..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/FollowSubforum.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.bounswe2024group10.Tradeverse.model; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; - -@Entity -@Table(name = "follows-subforum") -public class FollowSubforum { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String followerUsername; - - @Column(nullable = false) - private Long followedSubforumID; - - public FollowSubforum() {} - - public FollowSubforum(String followerUsername, Long followedSubforumID) { - this.followerUsername = followerUsername; - this.followedSubforumID = followedSubforumID; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getFollowerUsername() { - return followerUsername; - } - - public void setFollowerUsername(String followerUsername) { - this.followerUsername = followerUsername; - } - - public Long getFollowedSubforumID() { - return followedSubforumID; - } - - public void setFollowedSubforumID(Long followedSubforum) { - this.followedSubforumID = followedSubforum; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Portfolio.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Portfolio.java index e647601e..ea0b4904 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Portfolio.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Portfolio.java @@ -16,7 +16,7 @@ public class Portfolio { private Long assetId; @Column(nullable = false) - private double amount; // + private double amount; public Portfolio() { } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java index c277eca1..d0d16184 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java @@ -1,19 +1,17 @@ package com.bounswe2024group10.Tradeverse.model; import java.time.LocalDateTime; -import java.util.HashMap; import java.util.List; -import com.bounswe2024group10.Tradeverse.extra.ListHashMapConverter; -import com.bounswe2024group10.Tradeverse.extra.PostType; +import com.bounswe2024group10.Tradeverse.model.Content; import jakarta.persistence.Column; -import jakarta.persistence.Convert; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; +import jakarta.persistence.ElementCollection; @Entity @Table(name = "posts") @@ -23,26 +21,18 @@ public class Post { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String username; - - @Column(nullable = true, columnDefinition = "TEXT") + @Column(nullable = false) private String title; + @ElementCollection @Column(nullable = true) - private Long parentID; - - @Convert(converter = ListHashMapConverter.class) - @Column(nullable = true, columnDefinition = "LONGTEXT") - private List> content; + private List content; @Column(nullable = false) - private Long nofLikes; + private String createdBy; @Column(nullable = false) - private Long nofDislikes; - - @Column(nullable = false) - private Boolean likable; + private Long subforumID; @Column(nullable = false) private LocalDateTime creationDate; @@ -53,24 +43,17 @@ public class Post { @Column(nullable = false) private LocalDateTime lastUpdateDate; - @Column(nullable = false) - private PostType postType; - public Post() { } - public Post(String username, String title, Long parentID, List> content, LocalDateTime creationDate, PostType postType) { - this.username = username; + public Post(String createdBy, String title, List content, Long subforumID, LocalDateTime creationDate, LocalDateTime lastEditDate, LocalDateTime lastUpdateDate) { + this.createdBy = createdBy; this.title = title; - this.parentID = parentID; this.content = content; - this.likable = postType == PostType.COMMENT || postType == PostType.POST; + this.subforumID = subforumID; this.creationDate = creationDate; - this.lastEditDate = creationDate; - this.lastUpdateDate = creationDate; - this.postType = postType; - this.nofLikes = 0L; - this.nofDislikes = 0L; + this.lastEditDate = lastEditDate; + this.lastUpdateDate = lastUpdateDate; } public Long getId() { @@ -81,14 +64,6 @@ public void setId(Long id) { this.id = id; } - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - public String getTitle() { return title; } @@ -97,44 +72,28 @@ public void setTitle(String title) { this.title = title; } - public Long getParentID() { - return parentID; - } - - public void setParentID(Long parentID) { - this.parentID = parentID; - } - - public List> getContent() { + public List getContent() { return content; } - public void setContent(List> content) { + public void setContent(List content) { this.content = content; } - public Boolean getLikable() { - return likable; - } - - public void setLikable(Boolean likable) { - this.likable = likable; + public String getCreatedBy() { + return createdBy; } - public Long getNofLikes() { - return nofLikes; + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; } - public void setNofLikes(Long nofLikes) { - this.nofLikes = nofLikes; + public Long getSubforumID() { + return subforumID; } - public Long getNofDislikes() { - return nofDislikes; - } - - public void setNofDislikes(Long nofDislikes) { - this.nofDislikes = nofDislikes; + public void setSubforumID(Long subforumID) { + this.subforumID = subforumID; } public LocalDateTime getCreationDate() { @@ -160,12 +119,4 @@ public LocalDateTime getLastUpdateDate() { public void setLastUpdateDate(LocalDateTime lastUpdateDate) { this.lastUpdateDate = lastUpdateDate; } - - public PostType getPostType() { - return postType; - } - - public void setPostType(PostType postType) { - this.postType = postType; - } } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Subforum.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Subforum.java new file mode 100644 index 00000000..a07349bc --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Subforum.java @@ -0,0 +1,67 @@ +package com.bounswe2024group10.Tradeverse.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; + +@Entity +@Table(name = "subforums") +public class Subforum { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String name; + + @Column(nullable = false) + private String description; + + @Column(nullable = false) + private String tagColor; + + public Subforum() { + } + + public Subforum(String name, String description, String tagColor) { + this.name = name; + this.description = description; + this.tagColor = tagColor; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getTagColor() { + return tagColor; + } + + public void setTagColor(String tagColor) { + this.tagColor = tagColor; + } +} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowSubforumRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowSubforumRepository.java deleted file mode 100644 index 92015ced..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowSubforumRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.bounswe2024group10.Tradeverse.repository; - -import java.util.List; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import com.bounswe2024group10.Tradeverse.model.FollowSubforum; - -@Repository -public interface FollowSubforumRepository extends JpaRepository { - FollowSubforum findByFollowerUsernameAndFollowedSubforumID(String followerUsername, Long followedSubforumID); - List findByFollowerUsername(String followerUsername); - List findByFollowedSubforumID(Long followedSubforumID); - Long countByFollowedSubforumID(Long followedSubforumID); -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java index fd52410e..fcdc1351 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java @@ -1,49 +1,10 @@ package com.bounswe2024group10.Tradeverse.repository; -import java.util.List; -import java.util.Optional; - -import org.springframework.data.domain.Pageable; +import com.bounswe2024group10.Tradeverse.model.Post; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import com.bounswe2024group10.Tradeverse.extra.PostType; -import com.bounswe2024group10.Tradeverse.model.Post; -import com.bounswe2024group10.Tradeverse.dto.post.other.SubforumSummaryDTO; - - @Repository public interface PostRepository extends JpaRepository { - - List findByUsername(String username); - - List findByParentID(Long parentID); - - List findByTitle(String title); - - Long countByParentID(Long parentID); - - List findByPostType(PostType postType); - - @Query("SELECT p FROM Post p WHERE p.title LIKE %:keyword% ORDER BY p.lastEditDate DESC") - List findByTitleContaining(@Param("keyword") String keyword, Pageable pageable); - - @Query("SELECT p FROM Post p WHERE p.id = :id") - Optional findByIdForUpdate(@Param("id") Long id); - - @Query(value = "SELECT * FROM posts p WHERE p.post_type = :postType AND (p.title LIKE %:keyword% OR p.content LIKE %:keyword%) ORDER BY p.last_edit_date DESC", nativeQuery = true) - List findByKeywordAndPostType(@Param("keyword") String keyword, @Param("postType") PostType postType); - - @Query("SELECT p FROM Post p WHERE p.postType = PostType.POST ORDER BY p.creationDate DESC") - List findRecentPosts(); - - @Query("SELECT p FROM Post p WHERE p.postType = PostType.POST ORDER BY p.lastUpdateDate DESC") - List findPopularPosts(); - @Query("SELECT new com.bounswe2024group10.Tradeverse.dto.post.other.SubforumSummaryDTO(p.id, p.title, COUNT(child.id)) " + - "FROM Post p LEFT JOIN Post child ON p.id = child.parentID " + - "WHERE p.postType = :postType AND p.title LIKE %:keyword% " + - "GROUP BY p.id, p.title") - List findSubforumsWithKeywordAndPostCount(@Param("keyword") String keyword, @Param("postType") PostType postType); + Post findBySubforumID(Long subforumID); } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AssetService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AssetService.java index 4aa071d7..cc85d894 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AssetService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AssetService.java @@ -3,8 +3,6 @@ import com.bounswe2024group10.Tradeverse.dto.asset.*; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpEntity; import org.springframework.http.ResponseEntity; import java.util.ArrayList; import java.util.List; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/DislikeService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/DislikeService.java index 966b15b2..be2a545c 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/DislikeService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/DislikeService.java @@ -42,19 +42,14 @@ public DislikePostResponse dislikePost(DislikePostRequest request) { if (post == null) { return new DislikePostResponse(false, "Post does not exist"); } - if (!post.getLikable()) { - return new DislikePostResponse(false, "Post is not likable"); - } if (dislikeRepository.findByUsernameAndPostID(user.getUsername(), request.getPostId()) != null) { return new DislikePostResponse(false, "You have already disliked this post"); } Dislike dislike = new Dislike(request.getUsername(), request.getPostId()); dislikeRepository.save(dislike); - post.setNofDislikes(post.getNofDislikes() + 1); Like like = likeRepository.findByUsernameAndPostID(user.getUsername(), request.getPostId()); if (like != null) { likeRepository.delete(like); - post.setNofLikes(post.getNofLikes() - 1); } postRepository.save(post); return new DislikePostResponse(true, "Post liked successfully"); diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowSubforumService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowSubforumService.java deleted file mode 100644 index 55002589..00000000 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowSubforumService.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.bounswe2024group10.Tradeverse.service; - -import java.util.List; -import java.util.stream.Collectors; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import com.bounswe2024group10.Tradeverse.dto.followSubforum.GeneralFollowSubforumRequest; -import com.bounswe2024group10.Tradeverse.dto.followSubforum.GeneralFollowSubforumResponse; -import com.bounswe2024group10.Tradeverse.dto.followSubforum.GetFollowingsRequest; -import com.bounswe2024group10.Tradeverse.dto.followSubforum.GetFollowingsResponse; -import com.bounswe2024group10.Tradeverse.extra.PostType; -import com.bounswe2024group10.Tradeverse.extra.PostWSpecs; -import com.bounswe2024group10.Tradeverse.extra.SubforumWSpecs; -import com.bounswe2024group10.Tradeverse.model.FollowSubforum; -import com.bounswe2024group10.Tradeverse.model.Post; -import com.bounswe2024group10.Tradeverse.model.User; -import com.bounswe2024group10.Tradeverse.repository.DislikeRepository; -import com.bounswe2024group10.Tradeverse.repository.FollowSubforumRepository; -import com.bounswe2024group10.Tradeverse.repository.LikeRepository; -import com.bounswe2024group10.Tradeverse.repository.PostRepository; -import com.bounswe2024group10.Tradeverse.repository.UserRepository; - -@Service -public class FollowSubforumService { - - @Autowired - private FollowSubforumRepository followSubforumRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private PostRepository postRepository; - - @Autowired - private LikeRepository likeRepository; - - @Autowired - private DislikeRepository dislikeRepository; - - public GeneralFollowSubforumResponse followSubforum(GeneralFollowSubforumRequest request) { - User follower = userRepository.findByUsername(request.getFollowerUsername()); - Post followedSubforum = postRepository.findById(request.getFollowedSubforumID()).orElse(null); - - if (follower == null) { - return new GeneralFollowSubforumResponse(false, "User does not exist"); - } - if (followedSubforum == null) { - return new GeneralFollowSubforumResponse(false, "Subforum does not exist"); - } - - FollowSubforum follow = new FollowSubforum(request.getFollowerUsername(), request.getFollowedSubforumID()); - followSubforumRepository.save(follow); - return new GeneralFollowSubforumResponse(true, "Followed successfully"); - } - - public GeneralFollowSubforumResponse unfollowSubforum(GeneralFollowSubforumRequest request) { - User follower = userRepository.findByUsername(request.getFollowerUsername()); - Post followedSubforum = postRepository.findById(request.getFollowedSubforumID()).orElse(null); - - if (follower == null) { - return new GeneralFollowSubforumResponse(false, "User does not exist"); - } - if (followedSubforum == null) { - return new GeneralFollowSubforumResponse(false, "Subforum does not exist"); - } - FollowSubforum follow = followSubforumRepository.findByFollowerUsernameAndFollowedSubforumID(request.getFollowerUsername(), request.getFollowedSubforumID()); - if (follow == null) { - return new GeneralFollowSubforumResponse(false, "User does not follow the subforum"); - } - followSubforumRepository.delete(follow); - return new GeneralFollowSubforumResponse(true, "Unfollowed successfully"); - } - - public GetFollowingsResponse getFollowings(GetFollowingsRequest request) { - User user = userRepository.findByUsername(request.getUsername()); - if (user == null) { - return new GetFollowingsResponse(false, "User does not exist", null); - } - List followings = followSubforumRepository.findByFollowerUsername(user.getUsername()); - List followedSubforums = followings.stream() - .map(follow -> subforum2SubforumWSpecs( - follow.getFollowedSubforumID(), request.getUsername())).collect(Collectors.toList()); - - return new GetFollowingsResponse(true, "Followings retrieved successfully", followedSubforums); - } - - public PostWSpecs post2PostWSpecs(Post post, String username) { - PostWSpecs postWSpecs = new PostWSpecs(); - postWSpecs.setId(post.getId()); - postWSpecs.setTitle(post.getTitle()); - postWSpecs.setParentID(post.getParentID()); - postWSpecs.setContent(post.getContent()); - postWSpecs.setNofLikes(post.getNofLikes()); - postWSpecs.setNofDislikes(post.getNofDislikes()); - postWSpecs.setLikable(post.getLikable()); - postWSpecs.setCreationDate(post.getCreationDate()); - postWSpecs.setLastEditDate(post.getLastEditDate()); - postWSpecs.setLastUpdateDate(post.getLastUpdateDate()); - postWSpecs.setPostType(post.getPostType()); - postWSpecs.setNofComments(postRepository.countByParentID(post.getId())); - postWSpecs.setIsLiked(likeRepository.existsByUsernameAndPostID(username, post.getId())); - postWSpecs.setIsDisliked(dislikeRepository.existsByUsernameAndPostID(username, post.getId())); - switch (post.getPostType()) { - case SUBFORUM -> - postWSpecs.setParentSubforum(post); - case FORUM -> - postWSpecs.setParentSubforum(null); - default -> { - Post parent = postRepository.findById(post.getParentID()).get(); - while (parent.getPostType() != PostType.SUBFORUM) { - parent = postRepository.findById(parent.getParentID()).get(); - } - postWSpecs.setParentSubforum(parent); - } - } - postWSpecs.setAuthor(userRepository.findByUsername(post.getUsername())); - postWSpecs.setComments(postRepository.findByParentID(post.getId()).stream().map(p -> post2PostWSpecs(p, username)).toList()); - return postWSpecs; - } - - public SubforumWSpecs subforum2SubforumWSpecs(Long subforumID, String username) { - Post subforum = postRepository.findById(subforumID).get(); - SubforumWSpecs subforumWSpecs = new SubforumWSpecs(); - subforumWSpecs.setId(subforumID); - subforumWSpecs.setTitle(subforum.getTitle()); - subforumWSpecs.setNum_of_posts(postRepository.countByParentID(subforumID)); - subforumWSpecs.setNum_of_followers(followSubforumRepository.countByFollowedSubforumID(subforumID)); - subforumWSpecs.setIs_followed(followSubforumRepository.findByFollowerUsernameAndFollowedSubforumID(username, subforumID) != null); - subforumWSpecs.setPosts(postRepository.findByParentID(subforumID).stream().map(p -> post2PostWSpecs(p, username)).collect(Collectors.toList())); - return subforumWSpecs; - } -} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/LikeService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/LikeService.java index c1a4ccc3..546571c5 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/LikeService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/LikeService.java @@ -49,16 +49,11 @@ public LikePostResponse likePost(LikePostRequest request) { if (post == null) { return new LikePostResponse(false, "Post does not exist"); } - if (!post.getLikable()) { - return new LikePostResponse(false, "Post is not likable"); - } Like like = new Like(request.getUsername(), request.getPostId()); likeRepository.save(like); - post.setNofLikes(post.getNofLikes() + 1); Dislike dislike = dislikeRepository.findByUsernameAndPostID(user.getUsername(), request.getPostId()); if (dislike != null) { dislikeRepository.delete(dislike); - post.setNofDislikes(post.getNofDislikes() - 1); } postRepository.save(post); return new LikePostResponse(true, "Post liked successfully"); @@ -66,7 +61,6 @@ public LikePostResponse likePost(LikePostRequest request) { public UnlikePostResponse unlikePost(UnlikePostRequest request) { User user = userRepository.findByUsername(request.getUsername()); - if (user == null) { return new UnlikePostResponse(false, "User does not exist"); } @@ -77,8 +71,6 @@ public UnlikePostResponse unlikePost(UnlikePostRequest request) { Like like = likeRepository.findByUsernameAndPostID(user.getUsername(), request.getPostId()); if (like != null) { likeRepository.delete(like); - post.setNofLikes(post.getNofLikes() - 1); - postRepository.save(post); return new UnlikePostResponse(true, "Post unliked successfully"); } else { return new UnlikePostResponse(false, "You have not liked this post"); diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java index 81fe91e9..96b908dd 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java @@ -1,704 +1,13 @@ package com.bounswe2024group10.Tradeverse.service; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.time.LocalDateTime; -import java.util.Base64; -import java.util.HashMap; -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; +import com.bounswe2024group10.Tradeverse.dto.post.CreatePostRequest; +import com.bounswe2024group10.Tradeverse.dto.post.CreatePostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.*; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreateCommentRequest; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreateCommentResponse; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreatePostRequest; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreatePostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreateSubforumRequest; -import com.bounswe2024group10.Tradeverse.dto.post.create.CreateSubforumResponse; -import com.bounswe2024group10.Tradeverse.dto.post.delete.GeneralDeleteRequest; -import com.bounswe2024group10.Tradeverse.dto.post.delete.GeneralDeleteResponse; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditCommentRequest; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditCommentResponse; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditForumRequest; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditForumResponse; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditPostRequest; -import com.bounswe2024group10.Tradeverse.dto.post.edit.EditPostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreNonRecursiveResponse; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreRequest; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreResponse; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreSearchNonRecursiveResponse; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreSearchRequest; -import com.bounswe2024group10.Tradeverse.dto.post.explore.ExploreSearchResponse; -import com.bounswe2024group10.Tradeverse.dto.post.explore.GeneralSearchRequest; -import com.bounswe2024group10.Tradeverse.dto.post.feed.FeedNonRecursiveResponse; -import com.bounswe2024group10.Tradeverse.dto.post.feed.FeedRequest; -import com.bounswe2024group10.Tradeverse.dto.post.feed.FeedResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GeneralGetRequest; -import com.bounswe2024group10.Tradeverse.dto.post.other.GeneralGetResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GeneralRecursiveGetResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GetPostRequest; -import com.bounswe2024group10.Tradeverse.dto.post.other.GetPostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GetSubforumsResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GetSuperPostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.other.GetSuperSubforumResponse; -import com.bounswe2024group10.Tradeverse.extra.PostType; -import com.bounswe2024group10.Tradeverse.extra.PostWSpecs; -import com.bounswe2024group10.Tradeverse.extra.SubforumWSpecs; -import com.bounswe2024group10.Tradeverse.extra.SuperPost; -import com.bounswe2024group10.Tradeverse.extra.SuperSubforum; -import com.bounswe2024group10.Tradeverse.model.Post; -import com.bounswe2024group10.Tradeverse.model.User; -import com.bounswe2024group10.Tradeverse.repository.DislikeRepository; -import com.bounswe2024group10.Tradeverse.repository.FollowRepository; -import com.bounswe2024group10.Tradeverse.repository.FollowSubforumRepository; -import com.bounswe2024group10.Tradeverse.repository.LikeRepository; -import com.bounswe2024group10.Tradeverse.repository.PostRepository; -import com.bounswe2024group10.Tradeverse.repository.UserRepository; - @Service public class PostService { - - private static final PostType SUBFORUM = PostType.SUBFORUM; - private static final PostType POST = PostType.POST; - private static final PostType COMMENT = PostType.COMMENT; - - @Autowired - private LikeRepository likeRepository; - - @Autowired - private DislikeRepository dislikeRepository; - - @Autowired - private PostRepository postRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private FollowSubforumRepository followSubforumRepository; - - @Autowired - private FollowRepository followUserRepository; - - public GeneralRecursiveGetResponse getChilderen(GeneralGetRequest request) { - List childeren = postRepository.findByParentID(request.getParentId()).stream() - .map(post -> post2PostWSpecs(post, request.getUsername())).collect(Collectors.toList()); - return new GeneralRecursiveGetResponse(true, "Comments fetched successfully", childeren); - } - public SubforumDetailsDTO getSubforumDetails(Long subforumId, String username) { - Post subforum = postRepository.findById(subforumId).orElse(null); - - if (subforum == null || subforum.getPostType() != PostType.SUBFORUM) { - throw new IllegalArgumentException("Subforum not found or invalid type"); - } - - Boolean isFollowedByUser = followSubforumRepository.findByFollowerUsernameAndFollowedSubforumID(username, subforumId) != null; - Long numberOfPosts = postRepository.countByParentID(subforumId); - Long numberOfFollowers = followSubforumRepository.countByFollowedSubforumID(subforumId); - - List posts = postRepository.findByParentID(subforumId).stream() - .map(post -> { - User creator = userRepository.findByUsername(post.getUsername()); - return new PostSummaryDTO( - post.getId(), - post.getTitle(), - post.getContent() != null ? post.getContent().toString() : null, - post.getUsername(), - creator != null ? creator.getProfilePhoto() : null, // Fetch profile photo - post.getNofLikes(), - post.getNofDislikes(), - post.getCreationDate(), - postRepository.countByParentID(post.getId()) // Count comments - ); - }) - .collect(Collectors.toList()); - - return new SubforumDetailsDTO( - subforum.getTitle(), - isFollowedByUser, - posts, - numberOfPosts, - numberOfFollowers - ); - } - - // public GetForumsResponse getForums() { - // List forums = postRepository.findByPostType(FORUM); - // return new GetForumsResponse(true, "Forums fetched successfully", forums); - // } - public GetSubforumsResponse getSubForums(GeneralGetRequest request) { - List subForums = postRepository.findByPostType(SUBFORUM).stream() - .map(subforum -> subforum2SubforumWSpecs(subforum.getId(), request.getUsername())).collect(Collectors.toList()); - return new GetSubforumsResponse(true, "Subforums fetched successfully", subForums); - } - - public GetSuperSubforumResponse getSubForumsNonRecursive(GeneralGetRequest request) { - List subForums = postRepository.findByPostType(SUBFORUM).stream() - .map(subforum -> subforum2SuperSubforum(subforum.getId(), request.getUsername())).collect(Collectors.toList()); - return new GetSuperSubforumResponse(true, "Subforums fetched successfully", subForums); - } - - public GeneralRecursiveGetResponse getPosts(GeneralGetRequest request) { - Post subforum = postRepository.findById(request.getParentId()).orElse(null); - if (subforum == null) { - return new GeneralRecursiveGetResponse(false, "Subforum does not exist", null); - } - if (subforum.getPostType() != SUBFORUM) { - return new GeneralRecursiveGetResponse(false, "Given post is not a subforum", null); - } - List posts = postRepository.findByParentID(request.getParentId()).stream() - .map(post -> post2PostWSpecs(post, request.getUsername())).collect(Collectors.toList()); - return new GeneralRecursiveGetResponse(true, "Subforum posts fetched successfully", posts); - } - - public GeneralGetResponse getPostsNonRecursive(GeneralGetRequest request) { - Post subforum = postRepository.findById(request.getParentId()).orElse(null); - if (subforum == null) { - return new GeneralGetResponse(false, "Subforum does not exist", null); - } - if (subforum.getPostType() != SUBFORUM) { - return new GeneralGetResponse(false, "Given post is not a subforum", null); - } - List posts = postRepository.findByParentID(request.getParentId()).stream() - .map(post -> post2SuperPost(post, request.getUsername())).collect(Collectors.toList()); - return new GeneralGetResponse(true, "Subforum posts fetched successfully", posts); - } - - public GeneralRecursiveGetResponse getComments(GeneralGetRequest request) { - Post post = postRepository.findById(request.getParentId()).orElse(null); - if (post == null) { - return new GeneralRecursiveGetResponse(false, "Post does not exist", null); - } - if (post.getPostType() != POST && post.getPostType() != COMMENT) { - return new GeneralRecursiveGetResponse(false, "Post is not a post or comment", null); - } - // List commentIds = postRepository.findByParentID(request.getParentId()); - // ArrayList comments = new ArrayList<>(); - // for (Post comment : commentIds) { - // comments.add(post2PostWSpecs(comment, request.getUsername())); - // } - List comments = postRepository.findByParentID(request.getParentId()).stream() - .map(comment -> post2PostWSpecs(comment, request.getUsername())).collect(Collectors.toList()); - return new GeneralRecursiveGetResponse(true, "Comments fetched successfully", comments); - } - - public GeneralGetResponse getCommentsNonRecursive(GeneralGetRequest request) { - Post post = postRepository.findById(request.getParentId()).orElse(null); - if (post == null) { - return new GeneralGetResponse(false, "Post does not exist", null); - } - if (post.getPostType() != POST && post.getPostType() != COMMENT) { - return new GeneralGetResponse(false, "Post is not a post or comment", null); - } - // List commentIds = postRepository.findByParentID(request.getParentId()); - // ArrayList comments = new ArrayList<>(); - // for (Post comment : commentIds) { - // comments.add(post2PostWSpecs(comment, request.getUsername())); - // } - List comments = postRepository.findByParentID(request.getParentId()).stream() - .map(comment -> post2SuperPost(comment, request.getUsername())).collect(Collectors.toList()); - return new GeneralGetResponse(true, "Comments fetched successfully", comments); - } - - // public GetPostResponse getComment(GetPostRequest request) { - // Post comment = postRepository.findById(request.getPostId()).orElse(null); - // if (comment == null) { - // return new GetPostResponse(false, "Comment does not exist", null); - // } - // if (comment.getPostType() != COMMENT) { - // return new GetPostResponse(false, "Post is not a comment", null); - // } - // return new GetPostResponse(true, "Comment fetched successfully", comment); - // } - public GetPostResponse getPost(GetPostRequest request) { - Post post = postRepository.findById(request.getPostId()).orElse(null); - if (post == null) { - return new GetPostResponse(false, "Post does not exist", null); - } - if (post.getPostType() != POST) { - return new GetPostResponse(false, "Post is not a post", null); - } - PostWSpecs postWSpecs = post2PostWSpecs(post, request.getUsername()); - return new GetPostResponse(true, "Post fetched successfully", postWSpecs); - } - - public GetSuperPostResponse getPostNonRecursive(GetPostRequest request) { - Post post = postRepository.findById(request.getPostId()).orElse(null); - if (post == null) { - return new GetSuperPostResponse(false, "Post does not exist", null); - } - if (post.getPostType() != POST) { - return new GetSuperPostResponse(false, "Post is not a post", null); - } - SuperPost superPost = post2SuperPost(post, request.getUsername()); - return new GetSuperPostResponse(true, "Post fetched successfully", superPost); - } - public CreatePostResponse createPost(CreatePostRequest request) { - Post parentSubforum = postRepository.findById(request.getParentID()).orElse(null); - User user = userRepository.findByUsername(request.getUsername()); - if (user == null) { - return new CreatePostResponse(false, "User does not exist"); - } - if (parentSubforum == null) { - return new CreatePostResponse(false, "Parent post does not exist"); - } - if (parentSubforum.getPostType() != SUBFORUM) { - return new CreatePostResponse(false, "Parent post is not a subforum"); - } - for (HashMap content : request.getContent()) { - if (content.get("type").equals("image")) { - String image = content.get("value"); - byte[] imageBytes = Base64.getDecoder().decode(image); - try { - File file = new File("images/" + UUID.randomUUID() + ".jpg"); - file.createNewFile(); - FileOutputStream fos = new FileOutputStream(file); - fos.write(imageBytes); - fos.close(); - content.put("value", file.getAbsolutePath()); - } catch (IOException e) { - e.printStackTrace(); - return new CreatePostResponse(false, "Error while saving image"); - } - } - } - Post post = new Post(request.getUsername(), request.getTitle(), request.getParentID(), request.getContent(), LocalDateTime.now(), POST); - postRepository.save(post); - parentSubforum.setLastUpdateDate(LocalDateTime.now()); - postRepository.save(parentSubforum); - - return new CreatePostResponse(true, "Post created successfully"); - } - - // public CreateForumResponse createForum(CreateForumRequest request) { - // // TO DO: Check if the user is admin - // Post post = new Post(request.getUsername(), request.getTitle(), null, null, LocalDateTime.now(), FORUM); - // postRepository.save(post); - // return new CreateForumResponse(true, "Forum created successfully"); - // } - // TO DO: Check if the user is admin if necessary? and if admin delete username check - public CreateSubforumResponse createSubforum(CreateSubforumRequest request) { - Post post = new Post(request.getUsername(), request.getTitle(), null, null, LocalDateTime.now(), SUBFORUM); - postRepository.save(post); - return new CreateSubforumResponse(true, "Subforum created successfully"); - } - - public CreateCommentResponse createComment(CreateCommentRequest request) { - Post parentPost = postRepository.findById(request.getParentID()).orElse(null); - User user = userRepository.findByUsername(request.getUsername()); - if (user == null) { - return new CreateCommentResponse(false, "User does not exist"); - } - if (parentPost == null) { - return new CreateCommentResponse(false, "Parent post does not exist"); - } - if (parentPost.getPostType() != POST && parentPost.getPostType() != COMMENT) { - return new CreateCommentResponse(false, "Parent post is not a post"); - } - Post comment = new Post(request.getUsername(), null, request.getParentID(), request.getContent(), LocalDateTime.now(), COMMENT); - postRepository.save(comment); - while (true) { - parentPost.setLastUpdateDate(LocalDateTime.now()); - postRepository.save(parentPost); - if (parentPost.getPostType() == SUBFORUM || parentPost.getParentID() == null) { - break; - } - parentPost = postRepository.findById(parentPost.getParentID()).orElse(null); - } - return new CreateCommentResponse(true, "Comment created successfully"); - } - - public EditCommentResponse editComment(EditCommentRequest request) { - Post comment = postRepository.findById(request.getPostID()).orElse(null); - - if (comment == null) { - return new EditCommentResponse(false, "Comment does not exist"); - } - if (!comment.getUsername().equals(request.getUsername())) { - return new EditCommentResponse(false, "You are not authorized to edit this comment"); - } - if (comment.getPostType() != COMMENT) { - return new EditCommentResponse(false, "Post is not a comment"); - } - comment.setContent(request.getContent()); - comment.setLastEditDate(LocalDateTime.now()); - postRepository.save(comment); - Post parentPost = postRepository.findById(comment.getParentID()).orElse(null); - while (parentPost != null) { - parentPost.setLastUpdateDate(LocalDateTime.now()); - postRepository.save(parentPost); - parentPost = postRepository.findById(parentPost.getParentID()).orElse(null); - } - return new EditCommentResponse(true, "Comment edited successfully"); - } - - public EditPostResponse editPost(EditPostRequest request) { - Post post = postRepository.findById(request.getPostID()).orElse(null); - if (post == null) { - return new EditPostResponse(false, "Post does not exist"); - } - if (!post.getUsername().equals(request.getUsername())) { - return new EditPostResponse(false, "You are not authorized to edit this post"); - } - if (post.getPostType() != POST) { - return new EditPostResponse(false, "Post is not a post"); - } - post.setTitle(request.getTitle()); - post.setContent(request.getContent()); - post.setLastEditDate(LocalDateTime.now()); - post.setLastUpdateDate(LocalDateTime.now()); - postRepository.save(post); - Post parentSubforum = postRepository.findById(post.getParentID()).orElse(null); - parentSubforum.setLastUpdateDate(LocalDateTime.now()); - postRepository.save(parentSubforum); - Post parentForum = postRepository.findById(parentSubforum.getParentID()).orElse(null); - parentForum.setLastUpdateDate(LocalDateTime.now()); - postRepository.save(parentForum); - return new EditPostResponse(true, "Post edited successfully"); + return new CreatePostResponse(); } - public List getSubforumsByKeyword(String keyword) { - return postRepository.findSubforumsWithKeywordAndPostCount(keyword, PostType.SUBFORUM); - } - - // TO DO: Check if the user is admin if necessary? and if admin delete username check - public EditForumResponse editSubforum(EditForumRequest request) { - Post post = postRepository.findById(request.getPostID()).orElse(null); - if (post == null) { - return new EditForumResponse(false, "Subforum does not exist"); - } - if (!post.getUsername().equals(request.getUsername())) { - return new EditForumResponse(false, "You are not authorized to edit this subforum"); - } - if (post.getPostType() != SUBFORUM) { - return new EditForumResponse(false, "Post is not a subforum"); - } - post.setTitle(request.getTitle()); - post.setLastEditDate(LocalDateTime.now()); - post.setLastUpdateDate(LocalDateTime.now()); - postRepository.save(post); - Post parentForum = postRepository.findById(post.getParentID()).orElse(null); - parentForum.setLastUpdateDate(LocalDateTime.now()); - postRepository.save(parentForum); - return new EditForumResponse(true, "Subforum edited successfully"); - } - - // TO DO: Check if the user is admin - // public EditForumResponse editForum(EditForumRequest request) { - // Post post = postRepository.findById(request.getPostID()).orElse(null); - // if (post == null) { - // return new EditForumResponse(false, "Forum does not exist"); - // } - // if (!post.getUsername().equals(request.getUsername())) { - // return new EditForumResponse(false, "You are not authorized to edit this forum"); - // } - // if(post.getPostType() != FORUM) { - // return new EditForumResponse(false, "Post is not a forum"); - // } - // post.setTitle(request.getTitle()); - // post.setLastEditDate(LocalDateTime.now()); - // post.setLastUpdateDate(LocalDateTime.now()); - // postRepository.save(post); - // return new EditForumResponse(true, "Forum edited successfully"); - // } - public GeneralDeleteResponse deletePost(GeneralDeleteRequest request) { - Post post = postRepository.findById(request.getPostId()).orElse(null); - if (post == null) { - return new GeneralDeleteResponse(false, "Post does not exist"); - } - if (!post.getUsername().equals(request.getUsername())) { - return new GeneralDeleteResponse(false, "You are not authorized to delete this post"); - } - if (post.getPostType() != POST) { - return new GeneralDeleteResponse(false, "Post is not a post"); - } - postRepository.delete(post); - return new GeneralDeleteResponse(true, "Post deleted successfully"); - } - - // // TO DO: Check if the user is admin - // public GeneralDeleteResponse deleteForum(GeneralDeleteRequest request) { - // Post post = postRepository.findById(request.getPostId()).orElse(null); - // if (post == null) { - // return new GeneralDeleteResponse(false, "Forum does not exist"); - // } - // if (!post.getUsername().equals(request.getUsername())) { - // return new GeneralDeleteResponse(false, "You are not authorized to delete this forum"); - // } - // if(post.getPostType() != FORUM) { - // return new GeneralDeleteResponse(false, "Post is not a forum"); - // } - // postRepository.delete(post); - // return new GeneralDeleteResponse(true, "Forum deleted successfully"); - // } - // TO DO: Check if the user is admin if necessary? and if admin delete username check - public GeneralDeleteResponse deleteSubforum(GeneralDeleteRequest request) { - Post post = postRepository.findById(request.getPostId()).orElse(null); - if (post == null) { - return new GeneralDeleteResponse(false, "Subforum does not exist"); - } - if (post.getPostType() != SUBFORUM) { - return new GeneralDeleteResponse(false, "Post is not a subforum"); - } - postRepository.delete(post); - return new GeneralDeleteResponse(true, "Subforum deleted successfully"); - } - - public GeneralDeleteResponse deleteComment(GeneralDeleteRequest request) { - Post post = postRepository.findById(request.getPostId()).orElse(null); - if (post == null) { - return new GeneralDeleteResponse(false, "Comment does not exist"); - } - if (!post.getUsername().equals(request.getUsername())) { - return new GeneralDeleteResponse(false, "You are not authorized to delete this comment"); - } - if (post.getPostType() != COMMENT) { - return new GeneralDeleteResponse(false, "Post is not a comment"); - } - postRepository.delete(post); - return new GeneralDeleteResponse(true, "Comment deleted successfully"); - } - - // public SearchAndListPostsResponse searchAndListPosts(SearchAndListPostsRequest request) { - // Pageable pageable = PageRequest.of(request.getOffset(), request.getLimit()); - // if (request.getQueryType().equals("date")) { - // List posts = postRepository.findByTitleContaining(request.getKeyword(), pageable); - // return new SearchAndListPostsResponse(true, "Posts fetched successfully", posts); - // } - // return new SearchAndListPostsResponse(false, "Invalid query type", null); - // } - public GetPostResponse generalGetPost(GetPostRequest request) { - Post post = postRepository.findById(request.getPostId()).orElse(null); - if (post == null) { - return new GetPostResponse(false, "Post does not exist", null); - } - PostWSpecs postWSpecs = post2PostWSpecs(post, request.getUsername()); - return new GetPostResponse(true, "Post fetched successfully", postWSpecs); - } - - public GetSuperPostResponse generalGetPostNonRecursive(GetPostRequest request) { - Post post = postRepository.findById(request.getPostId()).orElse(null); - if (post == null) { - return new GetSuperPostResponse(false, "Post does not exist", null); - } - SuperPost superPost = post2SuperPost(post, request.getUsername()); - return new GetSuperPostResponse(true, "Post fetched successfully", superPost); - } - - public GeneralRecursiveGetResponse generalGetChilderen(GeneralGetRequest request) { - Post post = postRepository.findById(request.getParentId()).orElse(null); - if (post == null) { - return new GeneralRecursiveGetResponse(false, "Post does not exist", null); - } - List childeren = postRepository.findByParentID(request.getParentId()).stream() - .map(p -> post2PostWSpecs(p, request.getUsername())).collect(Collectors.toList()); - return new GeneralRecursiveGetResponse(true, "Comments fetched successfully", childeren); - } - - public GeneralDeleteResponse generalDelete(GeneralDeleteRequest request) { - Post post = postRepository.findById(request.getPostId()).orElse(null); - if (post == null) { - return new GeneralDeleteResponse(false, "Post does not exist"); - } - if (!post.getUsername().equals(request.getUsername())) { - return new GeneralDeleteResponse(false, "You are not authorized to delete this comment"); - } - postRepository.delete(post); - return new GeneralDeleteResponse(true, "Post deleted successfully"); - } - - public String generalSearch(GeneralSearchRequest request) { - return "Not implemented yet"; - } - - public ExploreResponse explore(ExploreRequest request) { - String username = request.getUsername(); - List recentPosts = postRepository.findRecentPosts().stream().map(post -> post2PostWSpecs(post, username)).collect(Collectors.toList()); - List popularPosts = postRepository.findPopularPosts().stream().map(post -> post2PostWSpecs(post, username)).collect(Collectors.toList()); - return new ExploreResponse(true, "Posts fetched successfully", recentPosts, popularPosts); - } - - public ExploreNonRecursiveResponse exploreNonRecursive(ExploreRequest request) { - String username = request.getUsername(); - List recentPosts = postRepository.findRecentPosts().stream().map(post -> post2SuperPost(post, username)).collect(Collectors.toList()); - List popularPosts = postRepository.findPopularPosts().stream().map(post -> post2SuperPost(post, username)).collect(Collectors.toList()); - return new ExploreNonRecursiveResponse(true, "Posts fetched successfully", recentPosts, popularPosts); - } - - public ExploreSearchResponse exploreSearch(ExploreSearchRequest request) { - String username = request.getUsername(); - List posts = postRepository.findByKeywordAndPostType(request.getKeyword(), POST).stream() - .map(post -> post2PostWSpecs(post, username)).collect(Collectors.toList()); - List subforums = postRepository.findByKeywordAndPostType(request.getKeyword(), SUBFORUM).stream() - .map(subforum -> subforum2SubforumWSpecs(subforum.getId(), username)).collect(Collectors.toList()); - return new ExploreSearchResponse(null, posts, null, null, subforums, null, true, "Search results fetched successfully"); - } - - public ExploreSearchNonRecursiveResponse exploreSearchNonRecursive(ExploreSearchRequest request) { - String username = request.getUsername(); - List posts = postRepository.findByKeywordAndPostType(request.getKeyword(), POST).stream() - .map(post -> post2SuperPost(post, username)).collect(Collectors.toList()); - List subforums = postRepository.findByKeywordAndPostType(request.getKeyword(), SUBFORUM).stream() - .map(subforum -> subforum2SuperSubforum(subforum.getId(), username)).collect(Collectors.toList()); - return new ExploreSearchNonRecursiveResponse(null, posts, null, null, subforums, null, true, "Search results fetched successfully"); - } - - public FeedResponse feed(FeedRequest request) { - User user = userRepository.findByUsername(request.getUsername()); - if (user == null) { - return new FeedResponse(null, null, null, false, "User does not exist"); - } - List followedSubforums = followSubforumRepository.findByFollowerUsername(user.getUsername()).stream() - .map(follow -> postRepository.findById(follow.getFollowedSubforumID()).orElse(null)) - .collect(Collectors.toList()); - HashMap> followedSubforumPosts = new HashMap<>(); - for (Post subforum : followedSubforums) { - List posts = postRepository.findByParentID(subforum.getId()).stream() - .map(post -> post2PostWSpecs(post, user.getUsername())).collect(Collectors.toList()); - followedSubforumPosts.put(subforum.getTitle(), posts); - } - List followedUsernames = followUserRepository.findByFollowerUsername(user.getUsername()).stream() - .map(follow -> follow.getFollowedUsername()).collect(Collectors.toList()); - - HashMap> followedUserPosts = new HashMap<>(); - for (String username : followedUsernames) { - List posts = postRepository.findByUsername(username).stream() - .map(post -> post2PostWSpecs(post, user.getUsername())).collect(Collectors.toList()); - followedUserPosts.put(username, posts); - } - // TO DO: Implement forYou - return new FeedResponse(null, followedSubforumPosts, followedUserPosts, true, "Feed fetched successfully"); - } - - public FeedNonRecursiveResponse feedNonRecursive(FeedRequest request) { - User user = userRepository.findByUsername(request.getUsername()); - if (user == null) { - return new FeedNonRecursiveResponse(null, null, null, false, "User does not exist"); - } - List followedSubforums = followSubforumRepository.findByFollowerUsername(user.getUsername()).stream() - .map(follow -> postRepository.findById(follow.getFollowedSubforumID()).orElse(null)) - .collect(Collectors.toList()); - HashMap> followedSubforumPosts = new HashMap<>(); - for (Post subforum : followedSubforums) { - List posts = postRepository.findByParentID(subforum.getId()).stream() - .map(post -> post2SuperPost(post, user.getUsername())).collect(Collectors.toList()); - followedSubforumPosts.put(subforum.getTitle(), posts); - } - List followedUsernames = followUserRepository.findByFollowerUsername(user.getUsername()).stream() - .map(follow -> follow.getFollowedUsername()).collect(Collectors.toList()); - - HashMap> followedUserPosts = new HashMap<>(); - for (String username : followedUsernames) { - List posts = postRepository.findByUsername(username).stream() - .map(post -> post2SuperPost(post, user.getUsername())).collect(Collectors.toList()); - followedUserPosts.put(username, posts); - } - // TO DO: Implement forYou - return new FeedNonRecursiveResponse(null, followedSubforumPosts, followedUserPosts, true, "Feed fetched successfully"); - } - - public PostWSpecs post2PostWSpecs(Post post, String username) { - PostWSpecs postWSpecs = new PostWSpecs(); - postWSpecs.setId(post.getId()); - postWSpecs.setTitle(post.getTitle()); - postWSpecs.setParentID(post.getParentID()); - postWSpecs.setContent(post.getContent()); - postWSpecs.setNofLikes(post.getNofLikes()); - postWSpecs.setNofDislikes(post.getNofDislikes()); - postWSpecs.setLikable(post.getLikable()); - postWSpecs.setCreationDate(post.getCreationDate()); - postWSpecs.setLastEditDate(post.getLastEditDate()); - postWSpecs.setLastUpdateDate(post.getLastUpdateDate()); - postWSpecs.setPostType(post.getPostType()); - postWSpecs.setNofComments(postRepository.countByParentID(post.getId())); - postWSpecs.setIsLiked(likeRepository.existsByUsernameAndPostID(username, post.getId())); - postWSpecs.setIsDisliked(dislikeRepository.existsByUsernameAndPostID(username, post.getId())); - switch (post.getPostType()) { - case SUBFORUM -> - postWSpecs.setParentSubforum(post); - case FORUM -> - postWSpecs.setParentSubforum(null); - default -> { - Post parent = postRepository.findById(post.getParentID()).get(); - while (parent.getPostType() != PostType.SUBFORUM) { - parent = postRepository.findById(parent.getParentID()).get(); - } - postWSpecs.setParentSubforum(parent); - } - } - postWSpecs.setAuthor(userRepository.findByUsername(post.getUsername())); - postWSpecs.setComments(postRepository.findByParentID(post.getId()).stream().map(p -> post2PostWSpecs(p, username)).toList()); - return postWSpecs; - } - - public SuperPost post2SuperPost(Post post, String username) { - SuperPost superPost = new SuperPost(); - superPost.setId(post.getId()); - superPost.setTitle(post.getTitle()); - superPost.setParentID(post.getParentID()); - superPost.setContent(post.getContent()); - superPost.setNofLikes(post.getNofLikes()); - superPost.setNofDislikes(post.getNofDislikes()); - superPost.setLikable(post.getLikable()); - superPost.setCreationDate(post.getCreationDate()); - superPost.setLastEditDate(post.getLastEditDate()); - superPost.setLastUpdateDate(post.getLastUpdateDate()); - superPost.setPostType(post.getPostType()); - superPost.setNofComments(postRepository.countByParentID(post.getId())); - superPost.setIsLiked(likeRepository.existsByUsernameAndPostID(username, post.getId())); - superPost.setIsDisliked(dislikeRepository.existsByUsernameAndPostID(username, post.getId())); - switch (post.getPostType()) { - case SUBFORUM -> - superPost.setParentSubforum(post); - case FORUM -> - superPost.setParentSubforum(null); - default -> { - Post parent = postRepository.findById(post.getParentID()).get(); - while (parent.getPostType() != PostType.SUBFORUM) { - parent = postRepository.findById(parent.getParentID()).get(); - } - superPost.setParentSubforum(parent); - } - } - superPost.setAuthor(userRepository.findByUsername(post.getUsername())); - superPost.setComments(postRepository.findByParentID(post.getId()).stream().map(p -> p.getId()).toList()); - return superPost; - } - - public SubforumWSpecs subforum2SubforumWSpecs(Long subforumID, String username) { - Post subforum = postRepository.findById(subforumID).get(); - if (subforum == null) { - return null; - } - SubforumWSpecs subforumWSpecs = new SubforumWSpecs(); - subforumWSpecs.setId(subforumID); - subforumWSpecs.setTitle(subforum.getTitle()); - subforumWSpecs.setNum_of_posts(postRepository.countByParentID(subforumID)); - subforumWSpecs.setNum_of_followers(followSubforumRepository.countByFollowedSubforumID(subforumID)); - subforumWSpecs.setIs_followed(followSubforumRepository.findByFollowerUsernameAndFollowedSubforumID(username, subforumID) != null); - subforumWSpecs.setPosts(postRepository.findByParentID(subforumID).stream().map(p -> post2PostWSpecs(p, username)).collect(Collectors.toList())); - return subforumWSpecs; - } - - public SuperSubforum subforum2SuperSubforum(Long subforumID, String username) { - Post subforum = postRepository.findById(subforumID).get(); - if (subforum == null) { - return null; - } - SuperSubforum subforumWSpecs = new SuperSubforum(); - subforumWSpecs.setId(subforumID); - subforumWSpecs.setTitle(subforum.getTitle()); - subforumWSpecs.setNum_of_posts(postRepository.countByParentID(subforumID)); - subforumWSpecs.setNum_of_followers(followSubforumRepository.countByFollowedSubforumID(subforumID)); - subforumWSpecs.setIs_followed(followSubforumRepository.findByFollowerUsernameAndFollowedSubforumID(username, subforumID) != null); - subforumWSpecs.setPosts(postRepository.findByParentID(subforumID).stream().map(p -> p.getId()).collect(Collectors.toList())); - return subforumWSpecs; - } - -} +} \ No newline at end of file From 1cd9afc2beba16644007ffe6dbaec1a7cd6ce199 Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 04:49:20 +0300 Subject: [PATCH 02/16] Remove unnecessary imports --- .../java/com/bounswe2024group10/Tradeverse/model/Comment.java | 2 -- .../main/java/com/bounswe2024group10/Tradeverse/model/Post.java | 2 -- 2 files changed, 4 deletions(-) diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java index bc220eb4..e10670bf 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java @@ -3,8 +3,6 @@ import java.time.LocalDateTime; import java.util.List; -import com.bounswe2024group10.Tradeverse.model.Content; - import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java index d0d16184..e519bf29 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java @@ -3,8 +3,6 @@ import java.time.LocalDateTime; import java.util.List; -import com.bounswe2024group10.Tradeverse.model.Content; - import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; From 2a9c0f0d757f0ca97033d2cbc88a0e724e75e8ce Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 04:56:50 +0300 Subject: [PATCH 03/16] Rename commentID to parentCommentID --- .../bounswe2024group10/Tradeverse/model/Comment.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java index e10670bf..80f215b4 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java @@ -30,7 +30,7 @@ public class Comment { private String postID; @Column(nullable = true) - private Long commentID; + private Long parentCommentID; @Column(nullable = false) private LocalDateTime creationDate; @@ -44,10 +44,10 @@ public class Comment { public Comment() { } - public Comment(String createdBy, String postID, Long commentID, List content, LocalDateTime creationDate, LocalDateTime lastEditDate, LocalDateTime lastUpdateDate) { + public Comment(String createdBy, String postID, Long parentCommentID, List content, LocalDateTime creationDate, LocalDateTime lastEditDate, LocalDateTime lastUpdateDate) { this.createdBy = createdBy; this.postID = postID; - this.commentID = commentID; + this.parentCommentID = parentCommentID; this.content = content; this.creationDate = creationDate; this.lastEditDate = lastEditDate; @@ -87,11 +87,11 @@ public void setPostID(String postID) { } public Long getCommentID() { - return commentID; + return parentCommentID; } - public void setCommentID(Long commentID) { - this.commentID = commentID; + public void setCommentID(Long parentCommentID) { + this.parentCommentID = parentCommentID; } public LocalDateTime getCreationDate() { From da6ee4b6173746292d7dbe74a87bb7528f2b7343 Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 04:57:38 +0300 Subject: [PATCH 04/16] Implement repositories for posts, comments, and subforums --- .../Tradeverse/repository/CommentRepository.java | 13 +++++++++++++ .../Tradeverse/repository/PostRepository.java | 2 ++ .../Tradeverse/repository/SubforumRepository.java | 9 +++++++++ 3 files changed, 24 insertions(+) create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/CommentRepository.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/SubforumRepository.java diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/CommentRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/CommentRepository.java new file mode 100644 index 00000000..d4b19e71 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/CommentRepository.java @@ -0,0 +1,13 @@ +package com.bounswe2024group10.Tradeverse.repository; + +import com.bounswe2024group10.Tradeverse.model.Comment; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CommentRepository extends JpaRepository { + List findByParentCommentID(Long parentCommentID); + List findByPostID(String postID); + List findByCreatedBy(String createdBy); +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java index fcdc1351..8122958a 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java @@ -1,10 +1,12 @@ package com.bounswe2024group10.Tradeverse.repository; import com.bounswe2024group10.Tradeverse.model.Post; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface PostRepository extends JpaRepository { Post findBySubforumID(Long subforumID); + List findByCreatedBy(String createdBy); } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/SubforumRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/SubforumRepository.java new file mode 100644 index 00000000..aefac4c2 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/SubforumRepository.java @@ -0,0 +1,9 @@ +package com.bounswe2024group10.Tradeverse.repository; + +import com.bounswe2024group10.Tradeverse.model.Subforum; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface SubforumRepository extends JpaRepository { +} From 7e3807ed6c96d35c76abba623f8042aaf3746bd9 Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 05:04:55 +0300 Subject: [PATCH 05/16] Implement subforum endpoints --- .../controller/SubforumController.java | 34 ++++++++++++++ .../dto/subforum/CreateSubforumRequest.java | 31 ++++++++++++ .../dto/subforum/CreateSubforumResponse.java | 47 +++++++++++++++++++ .../Tradeverse/service/SubforumService.java | 40 ++++++++++++++++ 4 files changed, 152 insertions(+) create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumRequest.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumResponse.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java new file mode 100644 index 00000000..968a492f --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java @@ -0,0 +1,34 @@ +package com.bounswe2024group10.Tradeverse.controller; + +import com.bounswe2024group10.Tradeverse.dto.subforum.CreateSubforumRequest; +import com.bounswe2024group10.Tradeverse.dto.subforum.CreateSubforumResponse; +import com.bounswe2024group10.Tradeverse.model.Subforum; +import com.bounswe2024group10.Tradeverse.service.SubforumService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/subforum") +public class SubforumController { + @Autowired + private SubforumService subforumService; + + @GetMapping("/all") + public ResponseEntity> getAllSubforums() { + return ResponseEntity.ok(subforumService.getAllSubforums()); + } + + @PostMapping("/create") + public ResponseEntity createSubforum(@RequestBody CreateSubforumRequest request) { + return ResponseEntity.ok(subforumService.createSubforum(request)); + } + + @PostMapping("/delete/{id}") + public ResponseEntity deleteSubforum(@PathVariable Long id) { + subforumService.deleteSubforum(id); + return ResponseEntity.ok().build(); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumRequest.java new file mode 100644 index 00000000..ac86e462 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumRequest.java @@ -0,0 +1,31 @@ +package com.bounswe2024group10.Tradeverse.dto.subforum; + +public class CreateSubforumRequest { + private String name; + private String description; + private String tagColor; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getTagColor() { + return tagColor; + } + + public void setTagColor(String tagColor) { + this.tagColor = tagColor; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumResponse.java new file mode 100644 index 00000000..2dd1ac07 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumResponse.java @@ -0,0 +1,47 @@ +package com.bounswe2024group10.Tradeverse.dto.subforum; + +public class CreateSubforumResponse { + private Long id; + private String name; + private String description; + private String tagColor; + + public CreateSubforumResponse(Long id, String name, String description, String tagColor) { + this.id = id; + this.name = name; + this.description = description; + this.tagColor = tagColor; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getTagColor() { + return tagColor; + } + + public void setTagColor(String tagColor) { + this.tagColor = tagColor; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java new file mode 100644 index 00000000..39fb763f --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java @@ -0,0 +1,40 @@ +package com.bounswe2024group10.Tradeverse.service; + +import com.bounswe2024group10.Tradeverse.dto.subforum.CreateSubforumRequest; +import com.bounswe2024group10.Tradeverse.dto.subforum.CreateSubforumResponse; +import com.bounswe2024group10.Tradeverse.model.Subforum; +import com.bounswe2024group10.Tradeverse.repository.SubforumRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class SubforumService { + @Autowired + private SubforumRepository subforumRepository; + + public List getAllSubforums() { + return subforumRepository.findAll(); + } + + public CreateSubforumResponse createSubforum(CreateSubforumRequest request) { + Subforum subforum = new Subforum( + request.getName(), + request.getDescription(), + request.getTagColor() + ); + + Subforum savedSubforum = subforumRepository.save(subforum); + return new CreateSubforumResponse( + savedSubforum.getId(), + savedSubforum.getName(), + savedSubforum.getDescription(), + savedSubforum.getTagColor() + ); + } + + public void deleteSubforum(Long id) { + subforumRepository.deleteById(id); + } +} \ No newline at end of file From c4846689e89dd75d9d2e4262e36740567334b0a2 Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 05:42:19 +0300 Subject: [PATCH 06/16] Implement create and delete post endpoints --- .../Tradeverse/controller/PostController.java | 30 ++++++ .../dto/post/CreatePostRequest.java | 40 ++++++- .../dto/post/CreatePostResponse.java | 36 ++++++- .../dto/post/DeletePostRequest.java | 13 +++ .../dto/post/DeletePostResponse.java | 27 +++++ .../Tradeverse/model/Post.java | 8 +- .../Tradeverse/service/PostService.java | 100 +++++++++++++++++- 7 files changed, 244 insertions(+), 10 deletions(-) create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/DeletePostRequest.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/DeletePostResponse.java diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java index fb3a8764..2c5cd32a 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java @@ -1,10 +1,40 @@ package com.bounswe2024group10.Tradeverse.controller; +import com.bounswe2024group10.Tradeverse.dto.post.CreatePostRequest; +import com.bounswe2024group10.Tradeverse.dto.post.CreatePostResponse; +import com.bounswe2024group10.Tradeverse.dto.post.DeletePostRequest; +import com.bounswe2024group10.Tradeverse.dto.post.DeletePostResponse; +import com.bounswe2024group10.Tradeverse.service.PostService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(value = "/api/post") public class PostController { + + @Autowired + private PostService postService; + @PostMapping + public ResponseEntity createPost(@RequestBody CreatePostRequest request) { + CreatePostResponse response = postService.createPost(request); + if (response == null) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + return ResponseEntity.ok(response); + } + + @PostMapping("/delete") + public ResponseEntity deletePost(@RequestBody DeletePostRequest request) { + DeletePostResponse response = postService.deletePost(request); + if (response.getMessage().equals("Post not found")) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response); + } + return ResponseEntity.ok(response); + } } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java index 03c9e7df..42cf4b72 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java @@ -1,5 +1,43 @@ package com.bounswe2024group10.Tradeverse.dto.post; +import com.bounswe2024group10.Tradeverse.model.Content; +import java.util.List; + public class CreatePostRequest { - + private String username; + private String title; + private List content; + private Long subforumID; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List getContent() { + return content; + } + + public void setContent(List content) { + this.content = content; + } + + public Long getSubforumID() { + return subforumID; + } + + public void setSubforumID(Long subforumID) { + this.subforumID = subforumID; + } } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostResponse.java index 37efbf23..4f06642d 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostResponse.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostResponse.java @@ -1,5 +1,37 @@ package com.bounswe2024group10.Tradeverse.dto.post; public class CreatePostResponse { - -} + private boolean isSuccessful; + private String message; + private Long id; + + public CreatePostResponse(boolean isSuccessful, String message, Long id) { + this.isSuccessful = isSuccessful; + this.message = message; + this.id = id; + } + + public boolean getIsSuccessful() { + return isSuccessful; + } + + public void setIsSuccessful(boolean isSuccessful) { + this.isSuccessful = isSuccessful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/DeletePostRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/DeletePostRequest.java new file mode 100644 index 00000000..30afd71d --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/DeletePostRequest.java @@ -0,0 +1,13 @@ +package com.bounswe2024group10.Tradeverse.dto.post; + +public class DeletePostRequest { + private Long postId; + + public Long getPostId() { + return postId; + } + + public void setPostId(Long postId) { + this.postId = postId; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/DeletePostResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/DeletePostResponse.java new file mode 100644 index 00000000..58d9c87e --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/DeletePostResponse.java @@ -0,0 +1,27 @@ +package com.bounswe2024group10.Tradeverse.dto.post; + +public class DeletePostResponse { + private boolean isSuccessful; + private String message; + + public DeletePostResponse(boolean isSuccessful, String message) { + this.isSuccessful = isSuccessful; + this.message = message; + } + + public boolean getIsSuccessful() { + return isSuccessful; + } + + public void setIsSuccessful(boolean isSuccessful) { + this.isSuccessful = isSuccessful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java index e519bf29..143f2f93 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java @@ -35,19 +35,19 @@ public class Post { @Column(nullable = false) private LocalDateTime creationDate; - @Column(nullable = false) + @Column(nullable = true) private LocalDateTime lastEditDate; - @Column(nullable = false) + @Column(nullable = true) private LocalDateTime lastUpdateDate; public Post() { } - public Post(String createdBy, String title, List content, Long subforumID, LocalDateTime creationDate, LocalDateTime lastEditDate, LocalDateTime lastUpdateDate) { - this.createdBy = createdBy; + public Post(String title, List content, String createdBy, Long subforumID, LocalDateTime creationDate, LocalDateTime lastEditDate, LocalDateTime lastUpdateDate) { this.title = title; this.content = content; + this.createdBy = createdBy; this.subforumID = subforumID; this.creationDate = creationDate; this.lastEditDate = lastEditDate; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java index 96b908dd..faff2979 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java @@ -2,12 +2,106 @@ import com.bounswe2024group10.Tradeverse.dto.post.CreatePostRequest; import com.bounswe2024group10.Tradeverse.dto.post.CreatePostResponse; - +import com.bounswe2024group10.Tradeverse.dto.post.DeletePostRequest; +import com.bounswe2024group10.Tradeverse.dto.post.DeletePostResponse; +import com.bounswe2024group10.Tradeverse.model.Content; +import com.bounswe2024group10.Tradeverse.model.Post; +import com.bounswe2024group10.Tradeverse.model.Subforum; +import com.bounswe2024group10.Tradeverse.model.User; +import com.bounswe2024group10.Tradeverse.repository.PostRepository; +import com.bounswe2024group10.Tradeverse.repository.SubforumRepository; +import com.bounswe2024group10.Tradeverse.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Base64; +import java.util.UUID; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Optional; + @Service public class PostService { + @Autowired + private UserRepository userRepository; + + @Autowired + private SubforumRepository subforumRepository; + + @Autowired + private PostRepository postRepository; + public CreatePostResponse createPost(CreatePostRequest request) { - return new CreatePostResponse(); + if (request.getUsername() == null || request.getTitle() == null || request.getContent() == null || request.getSubforumID() == null) { + return new CreatePostResponse(false, "Invalid request", null); + } + + User user = userRepository.findByUsername(request.getUsername()); + if (user == null) { + return new CreatePostResponse(false, "User not found", null); + } + + Optional subforum = subforumRepository.findById(request.getSubforumID()); + if (subforum.isEmpty()) { + return new CreatePostResponse(false, "Subforum not found", null); + } + + List content = new ArrayList<>(); + for (Content contentItem : request.getContent()) { + if (contentItem.getType().equals("image")) { + try { + String imageEncoded = contentItem.getValue(); + byte[] imageDecoded = Base64.getDecoder().decode(imageEncoded); + String imageFileName = UUID.randomUUID().toString() + ".jpg"; + String imageFilePath = "images/" + imageFileName; + File imageFile = new File(imageFilePath); + FileOutputStream imageFileOutputStream = new FileOutputStream(imageFile); + imageFileOutputStream.write(imageDecoded); + imageFileOutputStream.close(); + contentItem.setValue(imageFileName); + content.add(contentItem); + } catch (IOException e) { + e.printStackTrace(); + return new CreatePostResponse(false, "Failed to save image", null); + } + } else { + content.add(contentItem); + } + } + + Post post = new Post( + request.getTitle(), + content, + request.getUsername(), + request.getSubforumID(), + LocalDateTime.now(), + null, + null + ); + postRepository.save(post); + return new CreatePostResponse(true, "Post created successfully", post.getId()); + } + + public DeletePostResponse deletePost(DeletePostRequest request) { + Optional post = postRepository.findById(request.getPostId()); + if (post.isEmpty()) { + return new DeletePostResponse(false, "Post not found"); + } + + for (Content contentItem : post.get().getContent()) { + if (contentItem.getType().equals("image")) { + File imageFile = new File("images/" + contentItem.getValue()); + if (imageFile.exists()) { + imageFile.delete(); + } + } + } + + postRepository.deleteById(request.getPostId()); + return new DeletePostResponse(true, "Post deleted successfully"); } -} \ No newline at end of file +} From c2266c01c8c5a9b234de41ba2d99742e9a0ecafd Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 06:34:57 +0300 Subject: [PATCH 07/16] Implement post retrieving endpoints --- .../Tradeverse/controller/PostController.java | 69 +++++++- .../dto/post/CreatePostRequest.java | 9 - .../Tradeverse/dto/post/GetPostResponse.java | 113 ++++++++++++ .../Tradeverse/model/Comment.java | 8 +- .../repository/CommentRepository.java | 3 +- .../repository/DislikeRepository.java | 2 +- .../Tradeverse/repository/LikeRepository.java | 2 +- .../Tradeverse/repository/PostRepository.java | 2 + .../Tradeverse/service/PostService.java | 161 +++++++++++++++++- 9 files changed, 342 insertions(+), 27 deletions(-) create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/GetPostResponse.java diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java index 2c5cd32a..292f2408 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java @@ -4,25 +4,41 @@ import com.bounswe2024group10.Tradeverse.dto.post.CreatePostResponse; import com.bounswe2024group10.Tradeverse.dto.post.DeletePostRequest; import com.bounswe2024group10.Tradeverse.dto.post.DeletePostResponse; +import com.bounswe2024group10.Tradeverse.dto.post.GetPostResponse; import com.bounswe2024group10.Tradeverse.service.PostService; +import com.bounswe2024group10.Tradeverse.util.JwtUtil; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping(value = "/api/post") public class PostController { - + + @Autowired + private JwtUtil jwtUtil; + @Autowired private PostService postService; - @PostMapping - public ResponseEntity createPost(@RequestBody CreatePostRequest request) { - CreatePostResponse response = postService.createPost(request); + @PostMapping("/create") + public ResponseEntity createPost(@RequestBody CreatePostRequest request, @RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + CreatePostResponse response = postService.createPost(request, username); if (response == null) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } @@ -30,11 +46,52 @@ public ResponseEntity createPost(@RequestBody CreatePostRequ } @PostMapping("/delete") - public ResponseEntity deletePost(@RequestBody DeletePostRequest request) { - DeletePostResponse response = postService.deletePost(request); + public ResponseEntity deletePost(@RequestBody DeletePostRequest request, @RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + DeletePostResponse response = postService.deletePost(request, username); if (response.getMessage().equals("Post not found")) { return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response); } return ResponseEntity.ok(response); } + + @GetMapping("/get-posts-by-subforum") + public ResponseEntity> getPostsBySubforum( + @RequestParam Long subforumId, + @RequestHeader("Authorization") String token + ) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + List posts = postService.getPostsBySubforum(subforumId, username); + return ResponseEntity.ok(posts); + } + + @GetMapping("/for-you") + public ResponseEntity> getForYouPosts(@RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + List posts = postService.getForYouPosts(username); + return ResponseEntity.ok(posts); + } + + @GetMapping("/recent") + public ResponseEntity> getRecentPosts(@RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + List posts = postService.getRecentPosts(username); + return ResponseEntity.ok(posts); + } } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java index 42cf4b72..e2c730ee 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/CreatePostRequest.java @@ -4,19 +4,10 @@ import java.util.List; public class CreatePostRequest { - private String username; private String title; private List content; private Long subforumID; - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - public String getTitle() { return title; } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/GetPostResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/GetPostResponse.java new file mode 100644 index 00000000..dfb521b8 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/post/GetPostResponse.java @@ -0,0 +1,113 @@ +package com.bounswe2024group10.Tradeverse.dto.post; + +import com.bounswe2024group10.Tradeverse.model.Content; +import java.time.LocalDateTime; +import java.util.List; + +public class GetPostResponse { + private Long id; + private String title; + private List content; + private String createdBy; + private LocalDateTime creationDate; + private int likeCount; + private int dislikeCount; + private int commentCount; + private boolean isLikedByUser; + private boolean isDislikedByUser; + + public GetPostResponse(Long id, String title, List content, String createdBy, + LocalDateTime creationDate, int likeCount, int dislikeCount, + int commentCount, boolean isLikedByUser, boolean isDislikedByUser) { + this.id = id; + this.title = title; + this.content = content; + this.createdBy = createdBy; + this.creationDate = creationDate; + this.likeCount = likeCount; + this.dislikeCount = dislikeCount; + this.commentCount = commentCount; + this.isLikedByUser = isLikedByUser; + this.isDislikedByUser = isDislikedByUser; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List getContent() { + return content; + } + + public void setContent(List content) { + this.content = content; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public LocalDateTime getCreationDate() { + return creationDate; + } + + public void setCreationDate(LocalDateTime creationDate) { + this.creationDate = creationDate; + } + + public int getLikeCount() { + return likeCount; + } + + public void setLikeCount(int likeCount) { + this.likeCount = likeCount; + } + + public int getDislikeCount() { + return dislikeCount; + } + + public void setDislikeCount(int dislikeCount) { + this.dislikeCount = dislikeCount; + } + + public int getCommentCount() { + return commentCount; + } + + public void setCommentCount(int commentCount) { + this.commentCount = commentCount; + } + + public boolean getIsLikedByUser() { + return isLikedByUser; + } + + public void setIsLikedByUser(boolean isLikedByUser) { + this.isLikedByUser = isLikedByUser; + } + + public boolean getIsDislikedByUser() { + return isDislikedByUser; + } + + public void setIsDislikedByUser(boolean isDislikedByUser) { + this.isDislikedByUser = isDislikedByUser; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java index 80f215b4..f54cc8f3 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java @@ -27,7 +27,7 @@ public class Comment { private String createdBy; @Column(nullable = false) - private String postID; + private Long postID; @Column(nullable = true) private Long parentCommentID; @@ -44,7 +44,7 @@ public class Comment { public Comment() { } - public Comment(String createdBy, String postID, Long parentCommentID, List content, LocalDateTime creationDate, LocalDateTime lastEditDate, LocalDateTime lastUpdateDate) { + public Comment(String createdBy, Long postID, Long parentCommentID, List content, LocalDateTime creationDate, LocalDateTime lastEditDate, LocalDateTime lastUpdateDate) { this.createdBy = createdBy; this.postID = postID; this.parentCommentID = parentCommentID; @@ -78,11 +78,11 @@ public void setCreatedBy(String createdBy) { this.createdBy = createdBy; } - public String getPostID() { + public Long getPostID() { return postID; } - public void setPostID(String postID) { + public void setPostID(Long postID) { this.postID = postID; } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/CommentRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/CommentRepository.java index d4b19e71..b0467bba 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/CommentRepository.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/CommentRepository.java @@ -8,6 +8,7 @@ @Repository public interface CommentRepository extends JpaRepository { List findByParentCommentID(Long parentCommentID); - List findByPostID(String postID); + List findByPostID(Long postID); List findByCreatedBy(String createdBy); + int countByPostID(Long postID); } \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/DislikeRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/DislikeRepository.java index addcd0e2..bc54dd75 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/DislikeRepository.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/DislikeRepository.java @@ -14,5 +14,5 @@ public interface DislikeRepository extends JpaRepository { Boolean existsByUsernameAndPostID(String username, Long postID); List findByUsername(String username); List findByPostID(Long postID); - Long countByPostID(Long postID); + int countByPostID(Long postID); } \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/LikeRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/LikeRepository.java index 5e513f4d..b66c3aae 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/LikeRepository.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/LikeRepository.java @@ -14,6 +14,6 @@ public interface LikeRepository extends JpaRepository { Boolean existsByUsernameAndPostID(String username, Long postID); List findByUsername(String username); List findByPostID(Long postID); - Long countByPostID(Long postID); + int countByPostID(Long postID); } \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java index 8122958a..76a2644f 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java @@ -9,4 +9,6 @@ public interface PostRepository extends JpaRepository { Post findBySubforumID(Long subforumID); List findByCreatedBy(String createdBy); + List findAllBySubforumIDOrderByCreationDateDesc(Long subforumID); + List findTop100ByOrderByCreationDateDesc(); } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java index faff2979..d45f1eff 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java @@ -4,10 +4,15 @@ import com.bounswe2024group10.Tradeverse.dto.post.CreatePostResponse; import com.bounswe2024group10.Tradeverse.dto.post.DeletePostRequest; import com.bounswe2024group10.Tradeverse.dto.post.DeletePostResponse; +import com.bounswe2024group10.Tradeverse.dto.post.GetPostResponse; +import com.bounswe2024group10.Tradeverse.model.Comment; import com.bounswe2024group10.Tradeverse.model.Content; import com.bounswe2024group10.Tradeverse.model.Post; import com.bounswe2024group10.Tradeverse.model.Subforum; import com.bounswe2024group10.Tradeverse.model.User; +import com.bounswe2024group10.Tradeverse.repository.LikeRepository; +import com.bounswe2024group10.Tradeverse.repository.CommentRepository; +import com.bounswe2024group10.Tradeverse.repository.DislikeRepository; import com.bounswe2024group10.Tradeverse.repository.PostRepository; import com.bounswe2024group10.Tradeverse.repository.SubforumRepository; import com.bounswe2024group10.Tradeverse.repository.UserRepository; @@ -17,8 +22,11 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Base64; +import java.util.HashMap; import java.util.UUID; +import java.util.stream.Collectors; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -35,12 +43,25 @@ public class PostService { @Autowired private PostRepository postRepository; - public CreatePostResponse createPost(CreatePostRequest request) { - if (request.getUsername() == null || request.getTitle() == null || request.getContent() == null || request.getSubforumID() == null) { + @Autowired + private CommentRepository commentRepository; + + @Autowired + private LikeRepository likeRepository; + + @Autowired + private DislikeRepository dislikeRepository; + + public CreatePostResponse createPost(CreatePostRequest request, String username) { + if (username == null) { + return new CreatePostResponse(false, "User not authenticated", null); + } + + if (request.getTitle() == null || request.getContent() == null || request.getSubforumID() == null) { return new CreatePostResponse(false, "Invalid request", null); } - User user = userRepository.findByUsername(request.getUsername()); + User user = userRepository.findByUsername(username); if (user == null) { return new CreatePostResponse(false, "User not found", null); } @@ -76,7 +97,7 @@ public CreatePostResponse createPost(CreatePostRequest request) { Post post = new Post( request.getTitle(), content, - request.getUsername(), + username, request.getSubforumID(), LocalDateTime.now(), null, @@ -86,12 +107,16 @@ public CreatePostResponse createPost(CreatePostRequest request) { return new CreatePostResponse(true, "Post created successfully", post.getId()); } - public DeletePostResponse deletePost(DeletePostRequest request) { + public DeletePostResponse deletePost(DeletePostRequest request, String username) { Optional post = postRepository.findById(request.getPostId()); if (post.isEmpty()) { return new DeletePostResponse(false, "Post not found"); } + if (!post.get().getCreatedBy().equals(username)) { + return new DeletePostResponse(false, "User does not have permission to delete this post"); + } + for (Content contentItem : post.get().getContent()) { if (contentItem.getType().equals("image")) { File imageFile = new File("images/" + contentItem.getValue()); @@ -104,4 +129,130 @@ public DeletePostResponse deletePost(DeletePostRequest request) { postRepository.deleteById(request.getPostId()); return new DeletePostResponse(true, "Post deleted successfully"); } + + public List getPostsBySubforum(Long subforumID, String username) { + List posts = postRepository.findAllBySubforumIDOrderByCreationDateDesc(subforumID); + List response = new ArrayList<>(); + + for (Post post : posts) { + int commentCount = commentRepository.countByPostID(post.getId()); + int likeCount = likeRepository.countByPostID(post.getId()); + int dislikeCount = dislikeRepository.countByPostID(post.getId()); + boolean isLikedByUser = username != null && likeRepository.existsByUsernameAndPostID(username, post.getId()); + boolean isDislikedByUser = username != null && dislikeRepository.existsByUsernameAndPostID(username, post.getId()); + + response.add(new GetPostResponse( + post.getId(), + post.getTitle(), + post.getContent(), + post.getCreatedBy(), + post.getCreationDate(), + likeCount, + dislikeCount, + commentCount, + isLikedByUser, + isDislikedByUser + )); + } + + return response; + } + + public List getForYouPosts(String username) { + List posts = postRepository.findTop100ByOrderByCreationDateDesc(); + List response = new ArrayList<>(); + + User user = userRepository.findByUsername(username); + if (user == null) { + return new ArrayList<>(); + } + int userTag = user.getTag(); + + Map postScoreMap = new HashMap<>(); + + for (Post post : posts) { + int score = 0; + User creator = userRepository.findByUsername(post.getCreatedBy()); + int creatorTag = creator.getTag(); + if (creatorTag == userTag) { + score += 3; + } + List comments = commentRepository.findByPostID(post.getId()); + for (Comment comment : comments) { + User commentCreator = userRepository.findByUsername(comment.getCreatedBy()); + int commentCreatorTag = commentCreator.getTag(); + if (commentCreatorTag == userTag) { + score += 2; + } else { + score += 1; + } + } + score += likeRepository.countByPostID(post.getId()); + score -= dislikeRepository.countByPostID(post.getId()); + postScoreMap.put(post.getId(), score); + } + + List sortedPosts = posts.stream() + .sorted((p1, p2) -> postScoreMap.get(p2.getId()) - postScoreMap.get(p1.getId())) + .collect(Collectors.toList()); + + for (Post post : sortedPosts) { + int commentCount = commentRepository.countByPostID(post.getId()); + int likeCount = likeRepository.countByPostID(post.getId()); + int dislikeCount = dislikeRepository.countByPostID(post.getId()); + boolean isLikedByUser = username != null && likeRepository.existsByUsernameAndPostID(username, post.getId()); + boolean isDislikedByUser = username != null && dislikeRepository.existsByUsernameAndPostID(username, post.getId()); + + response.add(new GetPostResponse( + post.getId(), + post.getTitle(), + post.getContent(), + post.getCreatedBy(), + post.getCreationDate(), + likeCount, + dislikeCount, + commentCount, + isLikedByUser, + isDislikedByUser + )); + } + return response; + } + + public List getRecentPosts(String username) { + List posts = postRepository.findTop100ByOrderByCreationDateDesc(); + List response = new ArrayList<>(); + + for (Post post : posts) { + int commentCount = commentRepository.countByPostID(post.getId()); + int likeCount = likeRepository.countByPostID(post.getId()); + int dislikeCount = dislikeRepository.countByPostID(post.getId()); + boolean isLikedByUser = username != null && likeRepository.existsByUsernameAndPostID(username, post.getId()); + boolean isDislikedByUser = username != null && dislikeRepository.existsByUsernameAndPostID(username, post.getId()); + response.add(new GetPostResponse( + post.getId(), + post.getTitle(), + post.getContent(), + post.getCreatedBy(), + post.getCreationDate(), + likeCount, + dislikeCount, + commentCount, + isLikedByUser, + isDislikedByUser + )); + } + + return response; + } + + public List getFollowedTopicsPosts(String username) { + List response = new ArrayList<>(); + return response; + } + + public List getFollowedPeoplePosts(String username) { + List response = new ArrayList<>(); + return response; + } } From aab4790df4e3af45caf3d106b6a87eecb8a32ad6 Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 06:43:36 +0300 Subject: [PATCH 08/16] Implement get-followed-topics --- .../Tradeverse/controller/PostController.java | 22 ++++ .../Tradeverse/service/FollowService.java | 1 + .../Tradeverse/service/PostService.java | 110 ++++++------------ 3 files changed, 59 insertions(+), 74 deletions(-) diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java index 292f2408..040a048d 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java @@ -94,4 +94,26 @@ public ResponseEntity> getRecentPosts(@RequestHeader("Auth List posts = postService.getRecentPosts(username); return ResponseEntity.ok(posts); } + + @GetMapping("/followed-topics") + public ResponseEntity> getFollowedTopicsPosts(@RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + List posts = postService.getFollowedTopicsPosts(username); + return ResponseEntity.ok(posts); + } + + @GetMapping("/followed-people") + public ResponseEntity> getFollowedPeoplePosts(@RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + List posts = postService.getFollowedPeoplePosts(username); + return ResponseEntity.ok(posts); + } } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowService.java index 6b2f6e21..0e4e2d30 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowService.java @@ -4,6 +4,7 @@ import com.bounswe2024group10.Tradeverse.model.Follow; import com.bounswe2024group10.Tradeverse.model.User; import com.bounswe2024group10.Tradeverse.repository.FollowRepository; +import com.bounswe2024group10.Tradeverse.repository.PostRepository; import com.bounswe2024group10.Tradeverse.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java index d45f1eff..b41d2f36 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java @@ -1,21 +1,8 @@ package com.bounswe2024group10.Tradeverse.service; -import com.bounswe2024group10.Tradeverse.dto.post.CreatePostRequest; -import com.bounswe2024group10.Tradeverse.dto.post.CreatePostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.DeletePostRequest; -import com.bounswe2024group10.Tradeverse.dto.post.DeletePostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.GetPostResponse; -import com.bounswe2024group10.Tradeverse.model.Comment; -import com.bounswe2024group10.Tradeverse.model.Content; -import com.bounswe2024group10.Tradeverse.model.Post; -import com.bounswe2024group10.Tradeverse.model.Subforum; -import com.bounswe2024group10.Tradeverse.model.User; -import com.bounswe2024group10.Tradeverse.repository.LikeRepository; -import com.bounswe2024group10.Tradeverse.repository.CommentRepository; -import com.bounswe2024group10.Tradeverse.repository.DislikeRepository; -import com.bounswe2024group10.Tradeverse.repository.PostRepository; -import com.bounswe2024group10.Tradeverse.repository.SubforumRepository; -import com.bounswe2024group10.Tradeverse.repository.UserRepository; +import com.bounswe2024group10.Tradeverse.dto.post.*; +import com.bounswe2024group10.Tradeverse.model.*; +import com.bounswe2024group10.Tradeverse.repository.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -52,6 +39,9 @@ public class PostService { @Autowired private DislikeRepository dislikeRepository; + @Autowired + private FollowRepository followRepository; + public CreatePostResponse createPost(CreatePostRequest request, String username) { if (username == null) { return new CreatePostResponse(false, "User not authenticated", null); @@ -130,31 +120,32 @@ public DeletePostResponse deletePost(DeletePostRequest request, String username) return new DeletePostResponse(true, "Post deleted successfully"); } + private GetPostResponse convertToGetPostResponse(Post post, String username) { + int likeCount = likeRepository.countByPostID(post.getId()); + int dislikeCount = dislikeRepository.countByPostID(post.getId()); + int commentCount = commentRepository.countByPostID(post.getId()); + boolean isLikedByUser = username != null && likeRepository.existsByUsernameAndPostID(username, post.getId()); + boolean isDislikedByUser = username != null && dislikeRepository.existsByUsernameAndPostID(username, post.getId()); + return new GetPostResponse( + post.getId(), + post.getTitle(), + post.getContent(), + post.getCreatedBy(), + post.getCreationDate(), + likeCount, + dislikeCount, + commentCount, + isLikedByUser, + isDislikedByUser + ); + } + public List getPostsBySubforum(Long subforumID, String username) { List posts = postRepository.findAllBySubforumIDOrderByCreationDateDesc(subforumID); List response = new ArrayList<>(); - for (Post post : posts) { - int commentCount = commentRepository.countByPostID(post.getId()); - int likeCount = likeRepository.countByPostID(post.getId()); - int dislikeCount = dislikeRepository.countByPostID(post.getId()); - boolean isLikedByUser = username != null && likeRepository.existsByUsernameAndPostID(username, post.getId()); - boolean isDislikedByUser = username != null && dislikeRepository.existsByUsernameAndPostID(username, post.getId()); - - response.add(new GetPostResponse( - post.getId(), - post.getTitle(), - post.getContent(), - post.getCreatedBy(), - post.getCreationDate(), - likeCount, - dislikeCount, - commentCount, - isLikedByUser, - isDislikedByUser - )); + response.add(convertToGetPostResponse(post, username)); } - return response; } @@ -169,7 +160,6 @@ public List getForYouPosts(String username) { int userTag = user.getTag(); Map postScoreMap = new HashMap<>(); - for (Post post : posts) { int score = 0; User creator = userRepository.findByUsername(post.getCreatedBy()); @@ -197,24 +187,7 @@ public List getForYouPosts(String username) { .collect(Collectors.toList()); for (Post post : sortedPosts) { - int commentCount = commentRepository.countByPostID(post.getId()); - int likeCount = likeRepository.countByPostID(post.getId()); - int dislikeCount = dislikeRepository.countByPostID(post.getId()); - boolean isLikedByUser = username != null && likeRepository.existsByUsernameAndPostID(username, post.getId()); - boolean isDislikedByUser = username != null && dislikeRepository.existsByUsernameAndPostID(username, post.getId()); - - response.add(new GetPostResponse( - post.getId(), - post.getTitle(), - post.getContent(), - post.getCreatedBy(), - post.getCreationDate(), - likeCount, - dislikeCount, - commentCount, - isLikedByUser, - isDislikedByUser - )); + response.add(convertToGetPostResponse(post, username)); } return response; } @@ -222,27 +195,9 @@ public List getForYouPosts(String username) { public List getRecentPosts(String username) { List posts = postRepository.findTop100ByOrderByCreationDateDesc(); List response = new ArrayList<>(); - for (Post post : posts) { - int commentCount = commentRepository.countByPostID(post.getId()); - int likeCount = likeRepository.countByPostID(post.getId()); - int dislikeCount = dislikeRepository.countByPostID(post.getId()); - boolean isLikedByUser = username != null && likeRepository.existsByUsernameAndPostID(username, post.getId()); - boolean isDislikedByUser = username != null && dislikeRepository.existsByUsernameAndPostID(username, post.getId()); - response.add(new GetPostResponse( - post.getId(), - post.getTitle(), - post.getContent(), - post.getCreatedBy(), - post.getCreationDate(), - likeCount, - dislikeCount, - commentCount, - isLikedByUser, - isDislikedByUser - )); + response.add(convertToGetPostResponse(post, username)); } - return response; } @@ -252,7 +207,14 @@ public List getFollowedTopicsPosts(String username) { } public List getFollowedPeoplePosts(String username) { + List follows = followRepository.findByFollowerUsername(username); List response = new ArrayList<>(); + for (Follow follow : follows) { + List posts = postRepository.findByCreatedBy(follow.getFollowedUsername()); + for (Post post : posts) { + response.add(convertToGetPostResponse(post, username)); + } + } return response; } } From 05a69ed8742f7a99f1e9d394719c1870a946747d Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 06:50:20 +0300 Subject: [PATCH 09/16] Implement popular posts --- .../Tradeverse/controller/PostController.java | 11 +++++++++ .../Tradeverse/service/PostService.java | 23 ++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java index 040a048d..318ff355 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java @@ -95,6 +95,17 @@ public ResponseEntity> getRecentPosts(@RequestHeader("Auth return ResponseEntity.ok(posts); } + @GetMapping("/popular") + public ResponseEntity> getPopularPosts(@RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + List posts = postService.getPopularPosts(username); + return ResponseEntity.ok(posts); + } + @GetMapping("/followed-topics") public ResponseEntity> getFollowedTopicsPosts(@RequestHeader("Authorization") String token) { String username = null; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java index b41d2f36..d6ba91fc 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java @@ -152,13 +152,11 @@ public List getPostsBySubforum(Long subforumID, String username public List getForYouPosts(String username) { List posts = postRepository.findTop100ByOrderByCreationDateDesc(); List response = new ArrayList<>(); - User user = userRepository.findByUsername(username); if (user == null) { return new ArrayList<>(); } int userTag = user.getTag(); - Map postScoreMap = new HashMap<>(); for (Post post : posts) { int score = 0; @@ -181,7 +179,6 @@ public List getForYouPosts(String username) { score -= dislikeRepository.countByPostID(post.getId()); postScoreMap.put(post.getId(), score); } - List sortedPosts = posts.stream() .sorted((p1, p2) -> postScoreMap.get(p2.getId()) - postScoreMap.get(p1.getId())) .collect(Collectors.toList()); @@ -193,6 +190,26 @@ public List getForYouPosts(String username) { } public List getRecentPosts(String username) { + List posts = postRepository.findTop100ByOrderByCreationDateDesc(); + List response = new ArrayList<>(); + Map postScoreMap = new HashMap<>(); + for (Post post : posts) { + int score = 0; + score += likeRepository.countByPostID(post.getId()); + score += dislikeRepository.countByPostID(post.getId()); + score += 2 * commentRepository.countByPostID(post.getId()); + postScoreMap.put(post.getId(), score); + } + List sortedPosts = posts.stream() + .sorted((p1, p2) -> postScoreMap.get(p2.getId()) - postScoreMap.get(p1.getId())) + .collect(Collectors.toList()); + for (Post post : sortedPosts) { + response.add(convertToGetPostResponse(post, username)); + } + return response; + } + + public List getPopularPosts(String username) { List posts = postRepository.findTop100ByOrderByCreationDateDesc(); List response = new ArrayList<>(); for (Post post : posts) { From 765f76365b4541ab66049adfa13554cb782f6a12 Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 13:16:24 +0300 Subject: [PATCH 10/16] Implement comment service & improve consistency --- .../controller/CommentController.java | 60 ++++++++++ .../Tradeverse/controller/PostController.java | 9 ++ .../controller/SubforumController.java | 31 +++-- .../dto/comment/CreateCommentRequest.java | 43 +++++++ .../dto/comment/CreateCommentResponse.java | 37 ++++++ .../dto/comment/DeleteCommentRequest.java | 13 +++ .../dto/comment/DeleteCommentResponse.java | 27 +++++ .../dto/comment/GetCommentResponse.java | 83 +++++++++++++ .../dto/subforum/CreateSubforumResponse.java | 46 +++----- .../dto/subforum/DeleteSubforumRequest.java | 13 +++ .../dto/subforum/DeleteSubforumResponse.java | 27 +++++ .../Tradeverse/model/Comment.java | 14 +-- .../Tradeverse/model/Post.java | 14 +-- .../Tradeverse/model/User.java | 39 ++++++- .../service/AuthenticationService.java | 5 +- .../Tradeverse/service/CommentService.java | 109 ++++++++++++++++++ .../Tradeverse/service/FollowService.java | 1 - .../Tradeverse/service/PostService.java | 1 - .../Tradeverse/service/SubforumService.java | 47 +++++--- 19 files changed, 534 insertions(+), 85 deletions(-) create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/CommentController.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/CreateCommentRequest.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/CreateCommentResponse.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/DeleteCommentRequest.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/DeleteCommentResponse.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/GetCommentResponse.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/DeleteSubforumRequest.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/DeleteSubforumResponse.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/CommentController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/CommentController.java new file mode 100644 index 00000000..8aaeb423 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/CommentController.java @@ -0,0 +1,60 @@ +package com.bounswe2024group10.Tradeverse.controller; + +import com.bounswe2024group10.Tradeverse.dto.comment.GetCommentResponse; +import com.bounswe2024group10.Tradeverse.service.CommentService; +import com.bounswe2024group10.Tradeverse.util.JwtUtil; +import com.bounswe2024group10.Tradeverse.dto.comment.CreateCommentRequest; +import com.bounswe2024group10.Tradeverse.dto.comment.CreateCommentResponse; +import com.bounswe2024group10.Tradeverse.dto.comment.DeleteCommentRequest; +import com.bounswe2024group10.Tradeverse.dto.comment.DeleteCommentResponse; +import org.springframework.http.HttpStatus; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/comment") +public class CommentController { + @Autowired + private JwtUtil jwtUtil; + + @Autowired + private CommentService commentService; + + @CrossOrigin(origins = "*", allowedHeaders = "*") + @PostMapping("/create") + public ResponseEntity createComment(@RequestBody CreateCommentRequest request, @RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + CreateCommentResponse response = commentService.createComment(request, username); + return ResponseEntity.ok(response); + } + + @CrossOrigin(origins = "*", allowedHeaders = "*") + @GetMapping("/get-comments") + public ResponseEntity> getComments(@RequestParam Long postId) { + List comments = commentService.getCommentsByPostId(postId); + return ResponseEntity.ok(comments); + } + + @CrossOrigin(origins = "*", allowedHeaders = "*") + @PostMapping("/delete") + public ResponseEntity deleteComment(@RequestBody DeleteCommentRequest request, @RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + DeleteCommentResponse response = commentService.deleteComment(request, username); + if (response.getMessage().equals("Comment not found")) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response); + } + return ResponseEntity.ok(response); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java index 318ff355..69f1caa1 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java @@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -31,6 +32,7 @@ public class PostController { @Autowired private PostService postService; + @CrossOrigin(origins = "*", allowedHeaders = "*") @PostMapping("/create") public ResponseEntity createPost(@RequestBody CreatePostRequest request, @RequestHeader("Authorization") String token) { String username = null; @@ -45,6 +47,7 @@ public ResponseEntity createPost(@RequestBody CreatePostRequ return ResponseEntity.ok(response); } + @CrossOrigin(origins = "*", allowedHeaders = "*") @PostMapping("/delete") public ResponseEntity deletePost(@RequestBody DeletePostRequest request, @RequestHeader("Authorization") String token) { String username = null; @@ -59,6 +62,7 @@ public ResponseEntity deletePost(@RequestBody DeletePostRequ return ResponseEntity.ok(response); } + @CrossOrigin(origins = "*", allowedHeaders = "*") @GetMapping("/get-posts-by-subforum") public ResponseEntity> getPostsBySubforum( @RequestParam Long subforumId, @@ -73,6 +77,7 @@ public ResponseEntity> getPostsBySubforum( return ResponseEntity.ok(posts); } + @CrossOrigin(origins = "*", allowedHeaders = "*") @GetMapping("/for-you") public ResponseEntity> getForYouPosts(@RequestHeader("Authorization") String token) { String username = null; @@ -84,6 +89,7 @@ public ResponseEntity> getForYouPosts(@RequestHeader("Auth return ResponseEntity.ok(posts); } + @CrossOrigin(origins = "*", allowedHeaders = "*") @GetMapping("/recent") public ResponseEntity> getRecentPosts(@RequestHeader("Authorization") String token) { String username = null; @@ -95,6 +101,7 @@ public ResponseEntity> getRecentPosts(@RequestHeader("Auth return ResponseEntity.ok(posts); } + @CrossOrigin(origins = "*", allowedHeaders = "*") @GetMapping("/popular") public ResponseEntity> getPopularPosts(@RequestHeader("Authorization") String token) { String username = null; @@ -106,6 +113,7 @@ public ResponseEntity> getPopularPosts(@RequestHeader("Aut return ResponseEntity.ok(posts); } + @CrossOrigin(origins = "*", allowedHeaders = "*") @GetMapping("/followed-topics") public ResponseEntity> getFollowedTopicsPosts(@RequestHeader("Authorization") String token) { String username = null; @@ -117,6 +125,7 @@ public ResponseEntity> getFollowedTopicsPosts(@RequestHead return ResponseEntity.ok(posts); } + @CrossOrigin(origins = "*", allowedHeaders = "*") @GetMapping("/followed-people") public ResponseEntity> getFollowedPeoplePosts(@RequestHeader("Authorization") String token) { String username = null; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java index 968a492f..a7c16eac 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java @@ -1,9 +1,10 @@ package com.bounswe2024group10.Tradeverse.controller; -import com.bounswe2024group10.Tradeverse.dto.subforum.CreateSubforumRequest; -import com.bounswe2024group10.Tradeverse.dto.subforum.CreateSubforumResponse; +import com.bounswe2024group10.Tradeverse.dto.subforum.*; import com.bounswe2024group10.Tradeverse.model.Subforum; import com.bounswe2024group10.Tradeverse.service.SubforumService; +import com.bounswe2024group10.Tradeverse.util.JwtUtil; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -13,22 +14,36 @@ @RestController @RequestMapping("/api/subforum") public class SubforumController { + @Autowired + private JwtUtil jwtUtil; @Autowired private SubforumService subforumService; + @CrossOrigin(origins = "*", allowedHeaders = "*") @GetMapping("/all") public ResponseEntity> getAllSubforums() { return ResponseEntity.ok(subforumService.getAllSubforums()); } + @CrossOrigin(origins = "*", allowedHeaders = "*") @PostMapping("/create") - public ResponseEntity createSubforum(@RequestBody CreateSubforumRequest request) { - return ResponseEntity.ok(subforumService.createSubforum(request)); + public ResponseEntity createSubforum(@RequestBody CreateSubforumRequest request, @RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + return ResponseEntity.ok(subforumService.createSubforum(request, username)); } - @PostMapping("/delete/{id}") - public ResponseEntity deleteSubforum(@PathVariable Long id) { - subforumService.deleteSubforum(id); - return ResponseEntity.ok().build(); + @CrossOrigin(origins = "*", allowedHeaders = "*") + @PostMapping("/delete") + public ResponseEntity deleteSubforum(@RequestBody DeleteSubforumRequest request, @RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + return ResponseEntity.ok(subforumService.deleteSubforum(request, username)); } } \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/CreateCommentRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/CreateCommentRequest.java new file mode 100644 index 00000000..f006da0b --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/CreateCommentRequest.java @@ -0,0 +1,43 @@ +package com.bounswe2024group10.Tradeverse.dto.comment; + +import com.bounswe2024group10.Tradeverse.model.Content; +import java.util.List; + +public class CreateCommentRequest { + private List content; + private Long postID; + private Long parentCommentID; + + public CreateCommentRequest() { + } + + public CreateCommentRequest(List content, Long postID, Long parentCommentID) { + this.content = content; + this.postID = postID; + this.parentCommentID = parentCommentID; + } + + public List getContent() { + return content; + } + + public void setContent(List content) { + this.content = content; + } + + public Long getPostID() { + return postID; + } + + public void setPostID(Long postID) { + this.postID = postID; + } + + public Long getParentCommentID() { + return parentCommentID; + } + + public void setParentCommentID(Long parentCommentID) { + this.parentCommentID = parentCommentID; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/CreateCommentResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/CreateCommentResponse.java new file mode 100644 index 00000000..dd0f5efc --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/CreateCommentResponse.java @@ -0,0 +1,37 @@ +package com.bounswe2024group10.Tradeverse.dto.comment; + +public class CreateCommentResponse { + private boolean isSuccessful; + private String message; + private Long id; + + public CreateCommentResponse(boolean isSuccessful, String message, Long id) { + this.isSuccessful = isSuccessful; + this.message = message; + this.id = id; + } + + public boolean getIsSuccessful() { + return isSuccessful; + } + + public void setIsSuccessful(boolean isSuccessful) { + this.isSuccessful = isSuccessful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/DeleteCommentRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/DeleteCommentRequest.java new file mode 100644 index 00000000..e636174b --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/DeleteCommentRequest.java @@ -0,0 +1,13 @@ +package com.bounswe2024group10.Tradeverse.dto.comment; + +public class DeleteCommentRequest { + private Long commentId; + + public Long getCommentId() { + return commentId; + } + + public void setCommentId(Long commentId) { + this.commentId = commentId; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/DeleteCommentResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/DeleteCommentResponse.java new file mode 100644 index 00000000..d4ffafc0 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/DeleteCommentResponse.java @@ -0,0 +1,27 @@ +package com.bounswe2024group10.Tradeverse.dto.comment; + +public class DeleteCommentResponse { + private boolean isSuccessful; + private String message; + + public DeleteCommentResponse(boolean isSuccessful, String message) { + this.isSuccessful = isSuccessful; + this.message = message; + } + + public boolean getIsSuccessful() { + return isSuccessful; + } + + public void setIsSuccessful(boolean isSuccessful) { + this.isSuccessful = isSuccessful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/GetCommentResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/GetCommentResponse.java new file mode 100644 index 00000000..3b6b9017 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/comment/GetCommentResponse.java @@ -0,0 +1,83 @@ +package com.bounswe2024group10.Tradeverse.dto.comment; + +import com.bounswe2024group10.Tradeverse.model.Content; +import java.time.LocalDateTime; +import java.util.List; + +public class GetCommentResponse { + private Long id; + private List content; + private String createdBy; + private Long postID; + private Long parentCommentID; + private LocalDateTime creationDate; + private List replies; + + public GetCommentResponse(Long id, List content, String createdBy, + Long postID, Long parentCommentID, LocalDateTime creationDate, + List replies) { + this.id = id; + this.content = content; + this.createdBy = createdBy; + this.postID = postID; + this.parentCommentID = parentCommentID; + this.creationDate = creationDate; + this.replies = replies; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public List getContent() { + return content; + } + + public void setContent(List content) { + this.content = content; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Long getPostID() { + return postID; + } + + public void setPostID(Long postID) { + this.postID = postID; + } + + public Long getParentCommentID() { + return parentCommentID; + } + + public void setParentCommentID(Long parentCommentID) { + this.parentCommentID = parentCommentID; + } + + public LocalDateTime getCreationDate() { + return creationDate; + } + + public void setCreationDate(LocalDateTime creationDate) { + this.creationDate = creationDate; + } + + public List getReplies() { + return replies; + } + + public void setReplies(List replies) { + this.replies = replies; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumResponse.java index 2dd1ac07..6db11272 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumResponse.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/CreateSubforumResponse.java @@ -1,47 +1,37 @@ package com.bounswe2024group10.Tradeverse.dto.subforum; public class CreateSubforumResponse { + private boolean isSuccessful; + private String message; private Long id; - private String name; - private String description; - private String tagColor; - public CreateSubforumResponse(Long id, String name, String description, String tagColor) { + public CreateSubforumResponse(boolean isSuccessful, String message, Long id) { + this.isSuccessful = isSuccessful; + this.message = message; this.id = id; - this.name = name; - this.description = description; - this.tagColor = tagColor; } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; + public boolean getIsSuccessful() { + return isSuccessful; } - public String getName() { - return name; + public void setIsSuccessful(boolean isSuccessful) { + this.isSuccessful = isSuccessful; } - public void setName(String name) { - this.name = name; + public String getMessage() { + return message; } - public String getDescription() { - return description; + public void setMessage(String message) { + this.message = message; } - public void setDescription(String description) { - this.description = description; - } - - public String getTagColor() { - return tagColor; + public Long getId() { + return id; } - public void setTagColor(String tagColor) { - this.tagColor = tagColor; + public void setId(Long id) { + this.id = id; } -} \ No newline at end of file +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/DeleteSubforumRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/DeleteSubforumRequest.java new file mode 100644 index 00000000..72cf39d7 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/DeleteSubforumRequest.java @@ -0,0 +1,13 @@ +package com.bounswe2024group10.Tradeverse.dto.subforum; + +public class DeleteSubforumRequest { + private Long id; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/DeleteSubforumResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/DeleteSubforumResponse.java new file mode 100644 index 00000000..0cb36878 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/DeleteSubforumResponse.java @@ -0,0 +1,27 @@ +package com.bounswe2024group10.Tradeverse.dto.subforum; + +public class DeleteSubforumResponse { + private boolean isSuccessful; + private String message; + + public DeleteSubforumResponse(boolean isSuccessful, String message) { + this.isSuccessful = isSuccessful; + this.message = message; + } + + public boolean getIsSuccessful() { + return isSuccessful; + } + + public void setIsSuccessful(boolean isSuccessful) { + this.isSuccessful = isSuccessful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java index f54cc8f3..768da1b2 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Comment.java @@ -38,20 +38,16 @@ public class Comment { @Column(nullable = true) private LocalDateTime lastEditDate; - @Column(nullable = true) - private LocalDateTime lastUpdateDate; - public Comment() { } - public Comment(String createdBy, Long postID, Long parentCommentID, List content, LocalDateTime creationDate, LocalDateTime lastEditDate, LocalDateTime lastUpdateDate) { + public Comment(String createdBy, Long postID, Long parentCommentID, List content, LocalDateTime creationDate, LocalDateTime lastEditDate) { this.createdBy = createdBy; this.postID = postID; this.parentCommentID = parentCommentID; this.content = content; this.creationDate = creationDate; this.lastEditDate = lastEditDate; - this.lastUpdateDate = lastUpdateDate; } public Long getId() { @@ -109,12 +105,4 @@ public LocalDateTime getLastEditDate() { public void setLastEditDate(LocalDateTime lastEditDate) { this.lastEditDate = lastEditDate; } - - public LocalDateTime getLastUpdateDate() { - return lastUpdateDate; - } - - public void setLastUpdateDate(LocalDateTime lastUpdateDate) { - this.lastUpdateDate = lastUpdateDate; - } } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java index 143f2f93..54ee9db0 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java @@ -38,20 +38,16 @@ public class Post { @Column(nullable = true) private LocalDateTime lastEditDate; - @Column(nullable = true) - private LocalDateTime lastUpdateDate; - public Post() { } - public Post(String title, List content, String createdBy, Long subforumID, LocalDateTime creationDate, LocalDateTime lastEditDate, LocalDateTime lastUpdateDate) { + public Post(String title, List content, String createdBy, Long subforumID, LocalDateTime creationDate, LocalDateTime lastEditDate) { this.title = title; this.content = content; this.createdBy = createdBy; this.subforumID = subforumID; this.creationDate = creationDate; this.lastEditDate = lastEditDate; - this.lastUpdateDate = lastUpdateDate; } public Long getId() { @@ -109,12 +105,4 @@ public LocalDateTime getLastEditDate() { public void setLastEditDate(LocalDateTime lastEditDate) { this.lastEditDate = lastEditDate; } - - public LocalDateTime getLastUpdateDate() { - return lastUpdateDate; - } - - public void setLastUpdateDate(LocalDateTime lastUpdateDate) { - this.lastUpdateDate = lastUpdateDate; - } } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/User.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/User.java index e7881dba..fad091ae 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/User.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/User.java @@ -11,20 +11,51 @@ @Table(name = "users") public class User implements UserDetails { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) // Use auto-generated ID + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(nullable = false, unique = true) private String email; + + @Column(nullable = false, unique = true) private String username; + + @Column(nullable = false) private String password; + + @Column(nullable = false) private String name; + @Column(nullable = true, columnDefinition = "LONGTEXT") private String profilePhoto; - private int portfolioPrivacyLevel = 0; // Default value + + @Column(nullable = false) + private int portfolioPrivacyLevel = 0; + + @Column(nullable = false) private int tag; - private String bio; // New field for user bio - // Getters and setters + @Column(nullable = true, columnDefinition = "LONGTEXT") + private String bio; + + @Column(nullable = false) + private boolean isAdmin = false; + + public User() { + } + + public User(String email, String username, String password, String name, String profilePhoto, int portfolioPrivacyLevel, int tag, String bio, boolean isAdmin) { + this.email = email; + this.username = username; + this.password = password; + this.name = name; + this.profilePhoto = profilePhoto; + this.portfolioPrivacyLevel = portfolioPrivacyLevel; + this.tag = tag; + this.bio = bio; + this.isAdmin = isAdmin; + } + public Long getId() { return id; } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AuthenticationService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AuthenticationService.java index 4e2c729e..e5772caa 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AuthenticationService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AuthenticationService.java @@ -30,7 +30,7 @@ public class AuthenticationService { @Autowired private JwtUtil jwtUtil; - private static final String EMAIL_REGEX = "^[A-Za-z0-9+_.-]+@(.+)$"; // Simple email regex + private static final String EMAIL_REGEX = "^[A-Za-z0-9+_.-]+@(.+)$"; private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX); public RegisterResponse register(RegisterRequest registerRequest) { @@ -56,7 +56,7 @@ public RegisterResponse register(RegisterRequest registerRequest) { return new RegisterResponse(false, "Error while saving profile photo", null, null); } } - User user = new User(); + User user = new User(); user.setEmail(registerRequest.getEmail()); user.setUsername(registerRequest.getUsername()); user.setPassword(passwordEncoder.encode(registerRequest.getPassword())); @@ -64,7 +64,6 @@ public RegisterResponse register(RegisterRequest registerRequest) { user.setProfilePhoto(registerRequest.getProfilePhoto()); user.setTag(registerRequest.getTag()); userRepository.save(user); - String token = jwtUtil.generateToken(user); return new RegisterResponse(true, "User registered successfully", token, user.getUsername()); } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java new file mode 100644 index 00000000..b53eb35a --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java @@ -0,0 +1,109 @@ +package com.bounswe2024group10.Tradeverse.service; + +import com.bounswe2024group10.Tradeverse.dto.comment.GetCommentResponse; +import com.bounswe2024group10.Tradeverse.dto.comment.CreateCommentRequest; +import com.bounswe2024group10.Tradeverse.dto.comment.CreateCommentResponse; +import com.bounswe2024group10.Tradeverse.dto.comment.DeleteCommentRequest; +import com.bounswe2024group10.Tradeverse.dto.comment.DeleteCommentResponse; +import com.bounswe2024group10.Tradeverse.model.Comment; +import com.bounswe2024group10.Tradeverse.model.Post; +import com.bounswe2024group10.Tradeverse.model.User; +import com.bounswe2024group10.Tradeverse.repository.CommentRepository; +import com.bounswe2024group10.Tradeverse.repository.PostRepository; +import com.bounswe2024group10.Tradeverse.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.time.LocalDateTime; +import java.util.Optional; + +@Service +public class CommentService { + @Autowired + private CommentRepository commentRepository; + + @Autowired + private PostRepository postRepository; + + @Autowired + private UserRepository userRepository; + + public List getCommentsByPostId(Long postId) { + List allComments = commentRepository.findByPostID(postId); + + Map> commentsByParent = allComments.stream() + .collect(Collectors.groupingBy( + comment -> comment.getCommentID() != null ? comment.getCommentID() : -1L + )); + + List topLevelComments = commentsByParent.getOrDefault(-1L, new ArrayList<>()); + + return topLevelComments.stream() + .map(comment -> convertToResponseWithReplies(comment, commentsByParent)) + .collect(Collectors.toList()); + } + + private GetCommentResponse convertToResponseWithReplies(Comment comment, Map> commentsByParent) { + List replies = commentsByParent.getOrDefault(comment.getId(), new ArrayList<>()) + .stream() + .map(reply -> convertToResponseWithReplies(reply, commentsByParent)) + .collect(Collectors.toList()); + + return new GetCommentResponse( + comment.getId(), + comment.getContent(), + comment.getCreatedBy(), + comment.getPostID(), + comment.getCommentID(), + comment.getCreationDate(), + replies + ); + } + + public CreateCommentResponse createComment(CreateCommentRequest request, String username) { + if (username == null) { + return new CreateCommentResponse(false, "User not authenticated", null); + } + User user = userRepository.findByUsername(username); + if (user == null) { + return new CreateCommentResponse(false, "User not found", null); + } + Optional post = postRepository.findById(request.getPostID()); + if (post.isEmpty()) { + return new CreateCommentResponse(false, "Post not found", null); + } + Comment comment = new Comment( + username, + request.getPostID(), + request.getParentCommentID(), + request.getContent(), + LocalDateTime.now(), + null + ); + Comment savedComment = commentRepository.save(comment); + return new CreateCommentResponse(true, "Comment created successfully", savedComment.getId()); + } + + public DeleteCommentResponse deleteComment(DeleteCommentRequest request, String username) { + if (username == null) { + return new DeleteCommentResponse(false, "User not authenticated"); + } + Optional comment = commentRepository.findById(request.getCommentId()); + if (comment.isEmpty()) { + return new DeleteCommentResponse(false, "Comment not found"); + } + if (!comment.get().getCreatedBy().equals(username)) { + return new DeleteCommentResponse(false, "User does not have permission to delete this comment"); + } + List replies = commentRepository.findByParentCommentID(request.getCommentId()); + for (Comment reply : replies) { + commentRepository.deleteById(reply.getId()); + } + commentRepository.deleteById(request.getCommentId()); + return new DeleteCommentResponse(true, "Comment deleted successfully"); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowService.java index 0e4e2d30..6b2f6e21 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/FollowService.java @@ -4,7 +4,6 @@ import com.bounswe2024group10.Tradeverse.model.Follow; import com.bounswe2024group10.Tradeverse.model.User; import com.bounswe2024group10.Tradeverse.repository.FollowRepository; -import com.bounswe2024group10.Tradeverse.repository.PostRepository; import com.bounswe2024group10.Tradeverse.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java index d6ba91fc..b7b09b6e 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java @@ -90,7 +90,6 @@ public CreatePostResponse createPost(CreatePostRequest request, String username) username, request.getSubforumID(), LocalDateTime.now(), - null, null ); postRepository.save(post); diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java index 39fb763f..2eb8c625 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java @@ -1,40 +1,59 @@ package com.bounswe2024group10.Tradeverse.service; -import com.bounswe2024group10.Tradeverse.dto.subforum.CreateSubforumRequest; -import com.bounswe2024group10.Tradeverse.dto.subforum.CreateSubforumResponse; +import com.bounswe2024group10.Tradeverse.dto.subforum.*; import com.bounswe2024group10.Tradeverse.model.Subforum; +import com.bounswe2024group10.Tradeverse.model.User; import com.bounswe2024group10.Tradeverse.repository.SubforumRepository; +import com.bounswe2024group10.Tradeverse.repository.UserRepository; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Optional; @Service public class SubforumService { @Autowired private SubforumRepository subforumRepository; + @Autowired + private UserRepository userRepository; + public List getAllSubforums() { return subforumRepository.findAll(); } - public CreateSubforumResponse createSubforum(CreateSubforumRequest request) { + public CreateSubforumResponse createSubforum(CreateSubforumRequest request, String username) { + if (username == null) { + return new CreateSubforumResponse(false, "User not found", null); + } + User user = userRepository.findByUsername(username); + if (user == null) { + return new CreateSubforumResponse(false, "User not found", null); + } Subforum subforum = new Subforum( request.getName(), request.getDescription(), request.getTagColor() ); - - Subforum savedSubforum = subforumRepository.save(subforum); - return new CreateSubforumResponse( - savedSubforum.getId(), - savedSubforum.getName(), - savedSubforum.getDescription(), - savedSubforum.getTagColor() - ); + subforumRepository.save(subforum); + return new CreateSubforumResponse(true, "Subforum created successfully", subforum.getId()); } - public void deleteSubforum(Long id) { - subforumRepository.deleteById(id); + public DeleteSubforumResponse deleteSubforum(DeleteSubforumRequest request, String username) { + if (username == null) { + return new DeleteSubforumResponse(false, "User not found"); + } + User user = userRepository.findByUsername(username); + if (user == null) { + return new DeleteSubforumResponse(false, "User not found"); + } + Optional subforum = subforumRepository.findById(request.getId()); + if (subforum.isEmpty()) { + return new DeleteSubforumResponse(false, "Subforum not found"); + } + subforumRepository.delete(subforum.get()); + return new DeleteSubforumResponse(true, "Subforum deleted successfully"); } -} \ No newline at end of file +} From 1a96f158519922e025ab7684b9b52900c57114e6 Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 13:29:31 +0300 Subject: [PATCH 11/16] Refactor file structure --- .../controller/AuthenticationController.java | 5 +---- .../Tradeverse/controller/CommentController.java | 5 +---- .../Tradeverse/controller/PostController.java | 6 +----- .../Tradeverse/controller/UserController.java | 4 ++-- .../dto/{ => authentication}/LoginRequest.java | 2 +- .../dto/{ => authentication}/LoginResponse.java | 2 +- .../dto/{ => authentication}/RegisterRequest.java | 2 +- .../dto/{ => authentication}/RegisterResponse.java | 2 +- .../dto/{ => user}/GetUserDetailsResponse.java | 10 ++++++++-- .../dto/{ => user}/SetUserDetailsRequest.java | 2 +- .../com/bounswe2024group10/Tradeverse/model/User.java | 8 ++++++++ .../Tradeverse/service/AuthenticationService.java | 5 +---- .../Tradeverse/service/CommentService.java | 6 +----- .../Tradeverse/service/LikeService.java | 9 +-------- .../Tradeverse/service/UserService.java | 10 +++------- 15 files changed, 32 insertions(+), 46 deletions(-) rename backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/{ => authentication}/LoginRequest.java (86%) rename backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/{ => authentication}/LoginResponse.java (95%) rename backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/{ => authentication}/RegisterRequest.java (94%) rename backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/{ => authentication}/RegisterResponse.java (94%) rename backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/{ => user}/GetUserDetailsResponse.java (76%) rename backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/{ => user}/SetUserDetailsRequest.java (94%) diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/AuthenticationController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/AuthenticationController.java index 9f94227f..b3ebeae3 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/AuthenticationController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/AuthenticationController.java @@ -1,9 +1,6 @@ package com.bounswe2024group10.Tradeverse.controller; -import com.bounswe2024group10.Tradeverse.dto.LoginRequest; -import com.bounswe2024group10.Tradeverse.dto.LoginResponse; -import com.bounswe2024group10.Tradeverse.dto.RegisterRequest; -import com.bounswe2024group10.Tradeverse.dto.RegisterResponse; +import com.bounswe2024group10.Tradeverse.dto.authentication.*; import com.bounswe2024group10.Tradeverse.repository.UserRepository; import com.bounswe2024group10.Tradeverse.service.AuthenticationService; import org.springframework.beans.factory.annotation.Autowired; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/CommentController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/CommentController.java index 8aaeb423..d9e1f654 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/CommentController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/CommentController.java @@ -1,12 +1,9 @@ package com.bounswe2024group10.Tradeverse.controller; +import com.bounswe2024group10.Tradeverse.dto.comment.*; import com.bounswe2024group10.Tradeverse.dto.comment.GetCommentResponse; import com.bounswe2024group10.Tradeverse.service.CommentService; import com.bounswe2024group10.Tradeverse.util.JwtUtil; -import com.bounswe2024group10.Tradeverse.dto.comment.CreateCommentRequest; -import com.bounswe2024group10.Tradeverse.dto.comment.CreateCommentResponse; -import com.bounswe2024group10.Tradeverse.dto.comment.DeleteCommentRequest; -import com.bounswe2024group10.Tradeverse.dto.comment.DeleteCommentResponse; import org.springframework.http.HttpStatus; import org.springframework.beans.factory.annotation.Autowired; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java index 69f1caa1..2858c2ca 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/PostController.java @@ -1,10 +1,6 @@ package com.bounswe2024group10.Tradeverse.controller; -import com.bounswe2024group10.Tradeverse.dto.post.CreatePostRequest; -import com.bounswe2024group10.Tradeverse.dto.post.CreatePostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.DeletePostRequest; -import com.bounswe2024group10.Tradeverse.dto.post.DeletePostResponse; -import com.bounswe2024group10.Tradeverse.dto.post.GetPostResponse; +import com.bounswe2024group10.Tradeverse.dto.post.*; import com.bounswe2024group10.Tradeverse.service.PostService; import com.bounswe2024group10.Tradeverse.util.JwtUtil; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java index 6b76f147..83b91f81 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java @@ -1,5 +1,6 @@ package com.bounswe2024group10.Tradeverse.controller; +import com.bounswe2024group10.Tradeverse.dto.user.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.CrossOrigin; @@ -9,8 +10,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.bounswe2024group10.Tradeverse.dto.GetUserDetailsResponse; -import com.bounswe2024group10.Tradeverse.dto.SetUserDetailsRequest; + import com.bounswe2024group10.Tradeverse.service.UserService; @RestController diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/LoginRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/LoginRequest.java similarity index 86% rename from backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/LoginRequest.java rename to backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/LoginRequest.java index 6b9d5430..76257f4a 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/LoginRequest.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/LoginRequest.java @@ -1,4 +1,4 @@ -package com.bounswe2024group10.Tradeverse.dto; +package com.bounswe2024group10.Tradeverse.dto.authentication; public class LoginRequest { private String username; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/LoginResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/LoginResponse.java similarity index 95% rename from backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/LoginResponse.java rename to backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/LoginResponse.java index 1583616e..abc88e65 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/LoginResponse.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/LoginResponse.java @@ -1,4 +1,4 @@ -package com.bounswe2024group10.Tradeverse.dto; +package com.bounswe2024group10.Tradeverse.dto.authentication; public class LoginResponse { private boolean isSuccessful; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/RegisterRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/RegisterRequest.java similarity index 94% rename from backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/RegisterRequest.java rename to backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/RegisterRequest.java index 42972a7c..a8ace39b 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/RegisterRequest.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/RegisterRequest.java @@ -1,4 +1,4 @@ -package com.bounswe2024group10.Tradeverse.dto; +package com.bounswe2024group10.Tradeverse.dto.authentication; public class RegisterRequest { private String email; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/RegisterResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/RegisterResponse.java similarity index 94% rename from backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/RegisterResponse.java rename to backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/RegisterResponse.java index 6ed19da9..ff58fa6f 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/RegisterResponse.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/authentication/RegisterResponse.java @@ -1,4 +1,4 @@ -package com.bounswe2024group10.Tradeverse.dto; +package com.bounswe2024group10.Tradeverse.dto.authentication; public class RegisterResponse { private boolean isSuccessful; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/GetUserDetailsResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/GetUserDetailsResponse.java similarity index 76% rename from backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/GetUserDetailsResponse.java rename to backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/GetUserDetailsResponse.java index 39677b6b..5e586164 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/GetUserDetailsResponse.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/GetUserDetailsResponse.java @@ -1,4 +1,4 @@ -package com.bounswe2024group10.Tradeverse.dto; +package com.bounswe2024group10.Tradeverse.dto.user; public class GetUserDetailsResponse { private String email; @@ -7,14 +7,16 @@ public class GetUserDetailsResponse { private String profilePhoto; private int tag; private String bio; + private boolean isAdmin; - public GetUserDetailsResponse(String email, String username, String name, String profilePhoto, int tag, String bio) { + public GetUserDetailsResponse(String email, String username, String name, String profilePhoto, int tag, String bio, boolean isAdmin) { this.email = email; this.username = username; this.name = name; this.profilePhoto = profilePhoto; this.tag = tag; this.bio = bio; + this.isAdmin = isAdmin; } public String getEmail() { @@ -40,4 +42,8 @@ public int getTag() { public String getBio() { return bio; } + + public boolean isAdmin() { + return isAdmin; + } } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/SetUserDetailsRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/SetUserDetailsRequest.java similarity index 94% rename from backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/SetUserDetailsRequest.java rename to backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/SetUserDetailsRequest.java index 88a3ac48..779d1569 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/SetUserDetailsRequest.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/SetUserDetailsRequest.java @@ -1,4 +1,4 @@ -package com.bounswe2024group10.Tradeverse.dto; +package com.bounswe2024group10.Tradeverse.dto.user; import io.micrometer.common.lang.Nullable; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/User.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/User.java index fad091ae..c72936eb 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/User.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/User.java @@ -128,6 +128,14 @@ public void setBio(String bio) { this.bio = bio; } + public boolean getIsAdmin() { + return isAdmin; + } + + public void setIsAdmin(boolean isAdmin) { + this.isAdmin = isAdmin; + } + // UserDetails interface methods @Override public Collection getAuthorities() { diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AuthenticationService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AuthenticationService.java index e5772caa..66fac892 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AuthenticationService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/AuthenticationService.java @@ -11,10 +11,7 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; -import com.bounswe2024group10.Tradeverse.dto.LoginRequest; -import com.bounswe2024group10.Tradeverse.dto.LoginResponse; -import com.bounswe2024group10.Tradeverse.dto.RegisterRequest; -import com.bounswe2024group10.Tradeverse.dto.RegisterResponse; +import com.bounswe2024group10.Tradeverse.dto.authentication.*; import com.bounswe2024group10.Tradeverse.model.User; import com.bounswe2024group10.Tradeverse.repository.UserRepository; import com.bounswe2024group10.Tradeverse.util.JwtUtil; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java index b53eb35a..39be0112 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java @@ -1,10 +1,6 @@ package com.bounswe2024group10.Tradeverse.service; -import com.bounswe2024group10.Tradeverse.dto.comment.GetCommentResponse; -import com.bounswe2024group10.Tradeverse.dto.comment.CreateCommentRequest; -import com.bounswe2024group10.Tradeverse.dto.comment.CreateCommentResponse; -import com.bounswe2024group10.Tradeverse.dto.comment.DeleteCommentRequest; -import com.bounswe2024group10.Tradeverse.dto.comment.DeleteCommentResponse; +import com.bounswe2024group10.Tradeverse.dto.comment.*; import com.bounswe2024group10.Tradeverse.model.Comment; import com.bounswe2024group10.Tradeverse.model.Post; import com.bounswe2024group10.Tradeverse.model.User; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/LikeService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/LikeService.java index 546571c5..20d3b38e 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/LikeService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/LikeService.java @@ -6,14 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.bounswe2024group10.Tradeverse.dto.like.GetLikedPostsRequest; -import com.bounswe2024group10.Tradeverse.dto.like.GetLikedPostsResponse; -import com.bounswe2024group10.Tradeverse.dto.like.GetLikersRequest; -import com.bounswe2024group10.Tradeverse.dto.like.GetLikersResponse; -import com.bounswe2024group10.Tradeverse.dto.like.LikePostRequest; -import com.bounswe2024group10.Tradeverse.dto.like.LikePostResponse; -import com.bounswe2024group10.Tradeverse.dto.like.UnlikePostRequest; -import com.bounswe2024group10.Tradeverse.dto.like.UnlikePostResponse; +import com.bounswe2024group10.Tradeverse.dto.like.*; import com.bounswe2024group10.Tradeverse.model.Dislike; import com.bounswe2024group10.Tradeverse.model.Like; import com.bounswe2024group10.Tradeverse.model.Post; diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java index a098f2fc..d5cf8824 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java @@ -1,7 +1,6 @@ package com.bounswe2024group10.Tradeverse.service; -import com.bounswe2024group10.Tradeverse.dto.GetUserDetailsResponse; -import com.bounswe2024group10.Tradeverse.dto.SetUserDetailsRequest; +import com.bounswe2024group10.Tradeverse.dto.user.*; import com.bounswe2024group10.Tradeverse.model.User; import com.bounswe2024group10.Tradeverse.repository.UserRepository; @@ -22,7 +21,7 @@ public class UserService { public GetUserDetailsResponse getUserDetails(String username) { User user = userRepository.findByUsername(username); if (user != null) { - return new GetUserDetailsResponse(user.getEmail(), user.getUsername(), user.getName(), user.getProfilePhoto(), user.getTag(), user.getBio()); + return new GetUserDetailsResponse(user.getEmail(), user.getUsername(), user.getName(), user.getProfilePhoto(), user.getTag(), user.getBio(), user.getIsAdmin()); } return null; } @@ -32,7 +31,6 @@ public GetUserDetailsResponse updateUserDetails(String username, SetUserDetailsR if (user == null) { return null; } - if (userDetailsRequest.getEmail() != null) { user.setEmail(userDetailsRequest.getEmail()); } @@ -55,9 +53,7 @@ public GetUserDetailsResponse updateUserDetails(String username, SetUserDetailsR if (userDetailsRequest.getTag() != null) { user.setTag(userDetailsRequest.getTag()); } - userRepository.save(user); - - return new GetUserDetailsResponse(user.getEmail(), user.getUsername(), user.getName(), user.getProfilePhoto(), user.getTag(), user.getBio()); + return new GetUserDetailsResponse(user.getEmail(), user.getUsername(), user.getName(), user.getProfilePhoto(), user.getTag(), user.getBio(), user.getIsAdmin()); } } From 7c5c787c75620f5a61f9b363ccf181187c582ac6 Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 13:31:33 +0300 Subject: [PATCH 12/16] Grant delete content access to admins --- .../Tradeverse/service/CommentService.java | 2 +- .../bounswe2024group10/Tradeverse/service/PostService.java | 2 +- .../Tradeverse/service/SubforumService.java | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java index 39be0112..0c293a6f 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/CommentService.java @@ -92,7 +92,7 @@ public DeleteCommentResponse deleteComment(DeleteCommentRequest request, String if (comment.isEmpty()) { return new DeleteCommentResponse(false, "Comment not found"); } - if (!comment.get().getCreatedBy().equals(username)) { + if (!comment.get().getCreatedBy().equals(username) && !userRepository.findByUsername(username).getIsAdmin()) { return new DeleteCommentResponse(false, "User does not have permission to delete this comment"); } List replies = commentRepository.findByParentCommentID(request.getCommentId()); diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java index b7b09b6e..9dd3a17c 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java @@ -102,7 +102,7 @@ public DeletePostResponse deletePost(DeletePostRequest request, String username) return new DeletePostResponse(false, "Post not found"); } - if (!post.get().getCreatedBy().equals(username)) { + if (!post.get().getCreatedBy().equals(username) && !userRepository.findByUsername(username).getIsAdmin()) { return new DeletePostResponse(false, "User does not have permission to delete this post"); } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java index 2eb8c625..21e85cb7 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java @@ -32,6 +32,9 @@ public CreateSubforumResponse createSubforum(CreateSubforumRequest request, Stri if (user == null) { return new CreateSubforumResponse(false, "User not found", null); } + if (!user.getIsAdmin()) { + return new CreateSubforumResponse(false, "User does not have permission to create a subforum", null); + } Subforum subforum = new Subforum( request.getName(), request.getDescription(), @@ -49,6 +52,9 @@ public DeleteSubforumResponse deleteSubforum(DeleteSubforumRequest request, Stri if (user == null) { return new DeleteSubforumResponse(false, "User not found"); } + if (!user.getIsAdmin()) { + return new DeleteSubforumResponse(false, "User does not have permission to delete a subforum"); + } Optional subforum = subforumRepository.findById(request.getId()); if (subforum.isEmpty()) { return new DeleteSubforumResponse(false, "Subforum not found"); From a841c5dc34463e99186bca68e0ce223986a724bc Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 13:40:58 +0300 Subject: [PATCH 13/16] Fix setUserDetails endpoint --- .../Tradeverse/controller/UserController.java | 19 ++++++++++--- .../dto/user/SetUserDetailsResponse.java | 27 +++++++++++++++++++ .../Tradeverse/service/UserService.java | 8 +++--- 3 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/SetUserDetailsResponse.java diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java index 83b91f81..0338a363 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java @@ -8,17 +8,23 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.bounswe2024group10.Tradeverse.service.UserService; +import com.bounswe2024group10.Tradeverse.util.JwtUtil; @RestController @RequestMapping("/api/user") public class UserController { + @Autowired private UserService userService; + @Autowired + private JwtUtil jwtUtil; + @CrossOrigin(origins = "*", allowedHeaders = "*") @GetMapping("/get-user-details/{username}") public ResponseEntity getUserDetails(@PathVariable String username) { @@ -29,10 +35,15 @@ public ResponseEntity getUserDetails(@PathVariable Strin return ResponseEntity.status(404).build(); } - @PostMapping("/set-user-details/{username}") - public ResponseEntity setUserDetails( - @PathVariable String username, @RequestBody SetUserDetailsRequest userDetailsRequest) { - GetUserDetailsResponse updatedUser = userService.updateUserDetails(username, userDetailsRequest); + @CrossOrigin(origins = "*", allowedHeaders = "*") + @PostMapping("/set-user-details") + public ResponseEntity setUserDetails(@RequestBody SetUserDetailsRequest userDetailsRequest, @RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + SetUserDetailsResponse updatedUser = userService.setUserDetails(userDetailsRequest, username); if (updatedUser != null) { return ResponseEntity.ok(updatedUser); } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/SetUserDetailsResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/SetUserDetailsResponse.java new file mode 100644 index 00000000..8c829a53 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/SetUserDetailsResponse.java @@ -0,0 +1,27 @@ +package com.bounswe2024group10.Tradeverse.dto.user; + +public class SetUserDetailsResponse { + private boolean isSuccessful; + private String message; + + public SetUserDetailsResponse(boolean isSuccessful, String message) { + this.isSuccessful = isSuccessful; + this.message = message; + } + + public boolean getIsSuccessful() { + return isSuccessful; + } + + public void setIsSuccessful(boolean isSuccessful) { + this.isSuccessful = isSuccessful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java index d5cf8824..059a15ab 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java @@ -26,10 +26,10 @@ public GetUserDetailsResponse getUserDetails(String username) { return null; } - public GetUserDetailsResponse updateUserDetails(String username, SetUserDetailsRequest userDetailsRequest) { + public SetUserDetailsResponse setUserDetails(SetUserDetailsRequest userDetailsRequest, String username) { User user = userRepository.findByUsername(username); if (user == null) { - return null; + return new SetUserDetailsResponse(false, "User not found"); } if (userDetailsRequest.getEmail() != null) { user.setEmail(userDetailsRequest.getEmail()); @@ -44,7 +44,7 @@ public GetUserDetailsResponse updateUserDetails(String username, SetUserDetailsR user.setProfilePhoto(file.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); - return null; + return new SetUserDetailsResponse(false, "Error while saving profile photo"); } } if (userDetailsRequest.getBio() != null) { @@ -54,6 +54,6 @@ public GetUserDetailsResponse updateUserDetails(String username, SetUserDetailsR user.setTag(userDetailsRequest.getTag()); } userRepository.save(user); - return new GetUserDetailsResponse(user.getEmail(), user.getUsername(), user.getName(), user.getProfilePhoto(), user.getTag(), user.getBio(), user.getIsAdmin()); + return new SetUserDetailsResponse(true, "User details updated successfully"); } } From b36cf25a739db46fdbd13e7e9de4d429c2c4e77d Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 14:01:05 +0300 Subject: [PATCH 14/16] Implement getProfile endpoint --- .../Tradeverse/controller/UserController.java | 13 +++ .../dto/user/GetProfileResponse.java | 106 ++++++++++++++++++ .../repository/FollowRepository.java | 2 + .../Tradeverse/repository/PostRepository.java | 1 + .../Tradeverse/service/UserService.java | 78 +++++++++++++ 5 files changed, 200 insertions(+) create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/GetProfileResponse.java diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java index 0338a363..6a002a3e 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/UserController.java @@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.bounswe2024group10.Tradeverse.service.UserService; @@ -49,4 +50,16 @@ public ResponseEntity setUserDetails(@RequestBody SetUse } return ResponseEntity.status(404).build(); } + + @CrossOrigin(origins = "*", allowedHeaders = "*") + @GetMapping("/profile") + public ResponseEntity getProfile(@RequestParam String username, @RequestHeader("Authorization") String token) { + String requesterUsername = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + requesterUsername = jwtUtil.extractUsername(token); + } + GetProfileResponse response = userService.getProfile(username, requesterUsername); + return ResponseEntity.ok(response); + } } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/GetProfileResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/GetProfileResponse.java new file mode 100644 index 00000000..b30e829c --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/user/GetProfileResponse.java @@ -0,0 +1,106 @@ +package com.bounswe2024group10.Tradeverse.dto.user; + +import java.util.List; +import com.bounswe2024group10.Tradeverse.dto.post.GetPostResponse; + +public class GetProfileResponse { + private boolean success; + private String message; + private String username; + private String profilePhoto; + private int postCount; + private int followerCount; + private boolean isFollowing; + private List popularPosts; + private List recentPosts; + + public GetProfileResponse(boolean success, String message) { + this.success = success; + this.message = message; + } + + public GetProfileResponse(String username, String profilePhoto, int postCount, + int followerCount, boolean isFollowing, + List popularPosts, List recentPosts) { + this.success = true; + this.username = username; + this.profilePhoto = profilePhoto; + this.postCount = postCount; + this.followerCount = followerCount; + this.isFollowing = isFollowing; + this.popularPosts = popularPosts; + this.recentPosts = recentPosts; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getProfilePhoto() { + return profilePhoto; + } + + public void setProfilePhoto(String profilePhoto) { + this.profilePhoto = profilePhoto; + } + + public int getPostCount() { + return postCount; + } + + public void setPostCount(int postCount) { + this.postCount = postCount; + } + + public int getFollowerCount() { + return followerCount; + } + + public void setFollowerCount(int followerCount) { + this.followerCount = followerCount; + } + + public boolean isFollowing() { + return isFollowing; + } + + public void setFollowing(boolean following) { + isFollowing = following; + } + + public List getPopularPosts() { + return popularPosts; + } + + public void setPopularPosts(List popularPosts) { + this.popularPosts = popularPosts; + } + + public List getRecentPosts() { + return recentPosts; + } + + public void setRecentPosts(List recentPosts) { + this.recentPosts = recentPosts; + } +} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowRepository.java index 02065c2f..8d38e44e 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowRepository.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowRepository.java @@ -11,4 +11,6 @@ public interface FollowRepository extends JpaRepository { Follow findByFollowerUsernameAndFollowedUsername(String followerUsername, String followedUsername); List findByFollowerUsername(String followerUsername); List findByFollowedUsername(String followedUsername); + int countByFollowedUsername(String followedUsername); + int countByFollowerUsername(String followerUsername); } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java index 76a2644f..75da6ef8 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java @@ -11,4 +11,5 @@ public interface PostRepository extends JpaRepository { List findByCreatedBy(String createdBy); List findAllBySubforumIDOrderByCreationDateDesc(Long subforumID); List findTop100ByOrderByCreationDateDesc(); + int countByCreatedBy(String createdBy); } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java index 059a15ab..84320d77 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/UserService.java @@ -1,14 +1,26 @@ package com.bounswe2024group10.Tradeverse.service; +import com.bounswe2024group10.Tradeverse.dto.post.GetPostResponse; import com.bounswe2024group10.Tradeverse.dto.user.*; +import com.bounswe2024group10.Tradeverse.model.Post; import com.bounswe2024group10.Tradeverse.model.User; import com.bounswe2024group10.Tradeverse.repository.UserRepository; +import com.bounswe2024group10.Tradeverse.repository.PostRepository; +import com.bounswe2024group10.Tradeverse.repository.FollowRepository; +import com.bounswe2024group10.Tradeverse.repository.LikeRepository; +import com.bounswe2024group10.Tradeverse.repository.DislikeRepository; +import com.bounswe2024group10.Tradeverse.repository.CommentRepository; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.ArrayList; import java.util.Base64; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.UUID; +import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -18,6 +30,21 @@ public class UserService { @Autowired private UserRepository userRepository; + @Autowired + private PostRepository postRepository; + + @Autowired + private FollowRepository followRepository; + + @Autowired + private LikeRepository likeRepository; + + @Autowired + private DislikeRepository dislikeRepository; + + @Autowired + private CommentRepository commentRepository; + public GetUserDetailsResponse getUserDetails(String username) { User user = userRepository.findByUsername(username); if (user != null) { @@ -56,4 +83,55 @@ public SetUserDetailsResponse setUserDetails(SetUserDetailsRequest userDetailsRe userRepository.save(user); return new SetUserDetailsResponse(true, "User details updated successfully"); } + + private GetPostResponse convertToGetPostResponse(Post post, String username) { + int likeCount = likeRepository.countByPostID(post.getId()); + int dislikeCount = dislikeRepository.countByPostID(post.getId()); + int commentCount = commentRepository.countByPostID(post.getId()); + boolean isLikedByUser = username != null && likeRepository.existsByUsernameAndPostID(username, post.getId()); + boolean isDislikedByUser = username != null && dislikeRepository.existsByUsernameAndPostID(username, post.getId()); + return new GetPostResponse( + post.getId(), + post.getTitle(), + post.getContent(), + post.getCreatedBy(), + post.getCreationDate(), + likeCount, + dislikeCount, + commentCount, + isLikedByUser, + isDislikedByUser + ); + } + + public GetProfileResponse getProfile(String username, String requesterUsername) { + User user = userRepository.findByUsername(username); + if (user == null) { + return new GetProfileResponse(false, "User not found"); + } + int postCount = postRepository.countByCreatedBy(username); + int followerCount = followRepository.countByFollowedUsername(username); + boolean isFollowing = followRepository.findByFollowerUsernameAndFollowedUsername(requesterUsername, username) != null; + List recentPostResponses = new ArrayList<>(); + List recentPosts = postRepository.findTop100ByOrderByCreationDateDesc(); + for (Post post : recentPosts) { + recentPostResponses.add(convertToGetPostResponse(post, requesterUsername)); + } + Map postScoreMap = new HashMap<>(); + for (Post post : recentPosts) { + int score = 0; + score += likeRepository.countByPostID(post.getId()); + score += dislikeRepository.countByPostID(post.getId()); + score += commentRepository.countByPostID(post.getId()); + postScoreMap.put(post.getId(), score); + } + List sortedPosts = recentPosts.stream() + .sorted((p1, p2) -> postScoreMap.get(p2.getId()) - postScoreMap.get(p1.getId())) + .collect(Collectors.toList()); + List popularPostResponses = new ArrayList<>(); + for (Post post : sortedPosts) { + popularPostResponses.add(convertToGetPostResponse(post, requesterUsername)); + } + return new GetProfileResponse(user.getUsername(), user.getProfilePhoto(), postCount, followerCount, isFollowing, popularPostResponses, recentPostResponses); + } } From 05c7d320bed75000242eb07b7d1c38bb604f39fd Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 14:10:06 +0300 Subject: [PATCH 15/16] Implement view count mechanics --- .../bounswe2024group10/Tradeverse/model/Post.java | 14 +++++++++++++- .../Tradeverse/service/PostService.java | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java index 54ee9db0..13585303 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/Post.java @@ -32,6 +32,9 @@ public class Post { @Column(nullable = false) private Long subforumID; + @Column(nullable = false) + private int viewCount; + @Column(nullable = false) private LocalDateTime creationDate; @@ -41,11 +44,12 @@ public class Post { public Post() { } - public Post(String title, List content, String createdBy, Long subforumID, LocalDateTime creationDate, LocalDateTime lastEditDate) { + public Post(String title, List content, String createdBy, Long subforumID, int viewCount, LocalDateTime creationDate, LocalDateTime lastEditDate) { this.title = title; this.content = content; this.createdBy = createdBy; this.subforumID = subforumID; + this.viewCount = viewCount; this.creationDate = creationDate; this.lastEditDate = lastEditDate; } @@ -90,6 +94,14 @@ public void setSubforumID(Long subforumID) { this.subforumID = subforumID; } + public int getViewCount() { + return viewCount; + } + + public void setViewCount(int viewCount) { + this.viewCount = viewCount; + } + public LocalDateTime getCreationDate() { return creationDate; } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java index 9dd3a17c..8810d6b6 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java @@ -89,6 +89,7 @@ public CreatePostResponse createPost(CreatePostRequest request, String username) content, username, request.getSubforumID(), + 0, LocalDateTime.now(), null ); @@ -120,6 +121,7 @@ public DeletePostResponse deletePost(DeletePostRequest request, String username) } private GetPostResponse convertToGetPostResponse(Post post, String username) { + post.setViewCount(post.getViewCount() + 1); int likeCount = likeRepository.countByPostID(post.getId()); int dislikeCount = dislikeRepository.countByPostID(post.getId()); int commentCount = commentRepository.countByPostID(post.getId()); From adee89c46617b056893cdaec6d874e2c47c4b09f Mon Sep 17 00:00:00 2001 From: melihakpinar Date: Mon, 9 Dec 2024 15:10:35 +0300 Subject: [PATCH 16/16] Implement following subforums --- .../controller/SubforumController.java | 35 +++++++++- .../dto/subforum/FollowSubforumRequest.java | 19 ++++++ .../dto/subforum/FollowSubforumResponse.java | 29 ++++++++ .../GetFollowedSubforumsResponse.java | 67 +++++++++++++++++++ .../Tradeverse/model/FollowSubforum.java | 48 +++++++++++++ .../repository/FollowSubforumRepository.java | 18 +++++ .../Tradeverse/repository/PostRepository.java | 4 +- .../Tradeverse/service/PostService.java | 11 +++ .../Tradeverse/service/SubforumService.java | 66 +++++++++++++++++- 9 files changed, 294 insertions(+), 3 deletions(-) create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/FollowSubforumRequest.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/FollowSubforumResponse.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/GetFollowedSubforumsResponse.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/model/FollowSubforum.java create mode 100644 backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowSubforumRepository.java diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java index a7c16eac..8d436de3 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/controller/SubforumController.java @@ -46,4 +46,37 @@ public ResponseEntity deleteSubforum(@RequestBody Delete } return ResponseEntity.ok(subforumService.deleteSubforum(request, username)); } -} \ No newline at end of file + + @CrossOrigin(origins = "*", allowedHeaders = "*") + @PostMapping("/follow") + public ResponseEntity followSubforum(@RequestBody FollowSubforumRequest request, @RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + return ResponseEntity.ok(subforumService.followSubforum(request, username)); + } + + @CrossOrigin(origins = "*", allowedHeaders = "*") + @PostMapping("/unfollow") + public ResponseEntity unfollowSubforum(@RequestBody FollowSubforumRequest request, @RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + return ResponseEntity.ok(subforumService.unfollowSubforum(request, username)); + } + + @CrossOrigin(origins = "*", allowedHeaders = "*") + @GetMapping("/followed") + public ResponseEntity> getFollowedSubforums(@RequestHeader("Authorization") String token) { + String username = null; + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + username = jwtUtil.extractUsername(token); + } + return ResponseEntity.ok(subforumService.getFollowedSubforums(username)); + } +} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/FollowSubforumRequest.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/FollowSubforumRequest.java new file mode 100644 index 00000000..e913142b --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/FollowSubforumRequest.java @@ -0,0 +1,19 @@ +package com.bounswe2024group10.Tradeverse.dto.subforum; + +public class FollowSubforumRequest { + private Long subforumId; + + public FollowSubforumRequest() {} + + public FollowSubforumRequest(Long subforumId) { + this.subforumId = subforumId; + } + + public Long getSubforumId() { + return subforumId; + } + + public void setSubforumId(Long subforumId) { + this.subforumId = subforumId; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/FollowSubforumResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/FollowSubforumResponse.java new file mode 100644 index 00000000..3f4ff901 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/FollowSubforumResponse.java @@ -0,0 +1,29 @@ +package com.bounswe2024group10.Tradeverse.dto.subforum; + +public class FollowSubforumResponse { + private boolean isSuccessful; + private String message; + + public FollowSubforumResponse() {} + + public FollowSubforumResponse(boolean isSuccessful, String message) { + this.isSuccessful = isSuccessful; + this.message = message; + } + + public boolean getIsSuccessful() { + return isSuccessful; + } + + public void setIsSuccessful(boolean isSuccessful) { + this.isSuccessful = isSuccessful; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/GetFollowedSubforumsResponse.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/GetFollowedSubforumsResponse.java new file mode 100644 index 00000000..1cbd8ee7 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/dto/subforum/GetFollowedSubforumsResponse.java @@ -0,0 +1,67 @@ +package com.bounswe2024group10.Tradeverse.dto.subforum; + +public class GetFollowedSubforumsResponse { + private Long id; + private String name; + private String description; + private String tagColor; + private int followerCount; + private int postCount; + + public GetFollowedSubforumsResponse(Long id, String name, String description, String tagColor, int followerCount, int postCount) { + this.id = id; + this.name = name; + this.description = description; + this.tagColor = tagColor; + this.followerCount = followerCount; + this.postCount = postCount; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getTagColor() { + return tagColor; + } + + public void setTagColor(String tagColor) { + this.tagColor = tagColor; + } + + public int getFollowerCount() { + return followerCount; + } + + public void setFollowerCount(int followerCount) { + this.followerCount = followerCount; + } + + public int getPostCount() { + return postCount; + } + + public void setPostCount(int postCount) { + this.postCount = postCount; + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/FollowSubforum.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/FollowSubforum.java new file mode 100644 index 00000000..6460b82b --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/model/FollowSubforum.java @@ -0,0 +1,48 @@ +package com.bounswe2024group10.Tradeverse.model; + +import jakarta.persistence.*; + +@Entity +@Table(name = "follow_subforums") +public class FollowSubforum { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String followerUsername; + + @Column(nullable = false) + private Long subforumID; + + public FollowSubforum() {} + + public FollowSubforum(String followerUsername, Long subforumID) { + this.followerUsername = followerUsername; + this.subforumID = subforumID; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFollowerUsername() { + return followerUsername; + } + + public void setFollowerUsername(String followerUsername) { + this.followerUsername = followerUsername; + } + + public Long getSubforumID() { + return subforumID; + } + + public void setSubforumID(Long subforumID) { + this.subforumID = subforumID; + } +} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowSubforumRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowSubforumRepository.java new file mode 100644 index 00000000..28b4a254 --- /dev/null +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/FollowSubforumRepository.java @@ -0,0 +1,18 @@ +package com.bounswe2024group10.Tradeverse.repository; + +import com.bounswe2024group10.Tradeverse.model.FollowSubforum; +import com.bounswe2024group10.Tradeverse.model.Subforum; +import com.bounswe2024group10.Tradeverse.model.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface FollowSubforumRepository extends JpaRepository { + FollowSubforum findByFollowerUsernameAndSubforumID(String followerUsername, Long subforumID); + List findByFollowerUsername(String followerUsername); + List findBySubforumID(Long subforumID); + int countBySubforumID(Long subforumID); + int countByFollowerUsername(String followerUsername); +} diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java index fff373fe..a239fe1d 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/repository/PostRepository.java @@ -2,13 +2,15 @@ import com.bounswe2024group10.Tradeverse.model.Post; import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface PostRepository extends JpaRepository { - Post findBySubforumID(Long subforumID); List findByCreatedBy(String createdBy); List findAllBySubforumIDOrderByCreationDateDesc(Long subforumID); List findTop100ByOrderByCreationDateDesc(); int countByCreatedBy(String createdBy); + int countBySubforumID(Long subforumID); } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java index 8810d6b6..a91f0edf 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/PostService.java @@ -42,6 +42,9 @@ public class PostService { @Autowired private FollowRepository followRepository; + @Autowired + private FollowSubforumRepository followSubforumRepository; + public CreatePostResponse createPost(CreatePostRequest request, String username) { if (username == null) { return new CreatePostResponse(false, "User not authenticated", null); @@ -221,6 +224,14 @@ public List getPopularPosts(String username) { public List getFollowedTopicsPosts(String username) { List response = new ArrayList<>(); + List followedSubforums = followSubforumRepository.findByFollowerUsername(username); + for (FollowSubforum followedSubforum : followedSubforums) { + List posts = postRepository.findAllBySubforumIDOrderByCreationDateDesc(followedSubforum.getSubforumID()); + for (Post post : posts) { + response.add(convertToGetPostResponse(post, username)); + } + } + response.sort((p1, p2) -> p2.getCreationDate().compareTo(p1.getCreationDate())); return response; } diff --git a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java index 21e85cb7..804f85c3 100644 --- a/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java +++ b/backend/src/main/java/com/bounswe2024group10/Tradeverse/service/SubforumService.java @@ -2,13 +2,17 @@ import com.bounswe2024group10.Tradeverse.dto.subforum.*; import com.bounswe2024group10.Tradeverse.model.Subforum; +import com.bounswe2024group10.Tradeverse.model.FollowSubforum; import com.bounswe2024group10.Tradeverse.model.User; import com.bounswe2024group10.Tradeverse.repository.SubforumRepository; +import com.bounswe2024group10.Tradeverse.repository.FollowSubforumRepository; import com.bounswe2024group10.Tradeverse.repository.UserRepository; +import com.bounswe2024group10.Tradeverse.repository.PostRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -20,6 +24,11 @@ public class SubforumService { @Autowired private UserRepository userRepository; + @Autowired + private PostRepository postRepository; + @Autowired + private FollowSubforumRepository followSubforumRepository; + public List getAllSubforums() { return subforumRepository.findAll(); } @@ -62,4 +71,59 @@ public DeleteSubforumResponse deleteSubforum(DeleteSubforumRequest request, Stri subforumRepository.delete(subforum.get()); return new DeleteSubforumResponse(true, "Subforum deleted successfully"); } -} + + public FollowSubforumResponse followSubforum(FollowSubforumRequest request, String username) { + if (username == null) { + return new FollowSubforumResponse(false, "User not found"); + } + User user = userRepository.findByUsername(username); + if (user == null) { + return new FollowSubforumResponse(false, "User not found"); + } + Optional subforum = subforumRepository.findById(request.getSubforumId()); + if (subforum.isEmpty()) { + return new FollowSubforumResponse(false, "Subforum not found"); + } + if (followSubforumRepository.findByFollowerUsernameAndSubforumID(user.getUsername(), subforum.get().getId()) != null) { + return new FollowSubforumResponse(false, "Already following this subforum"); + } + FollowSubforum followSubforum = new FollowSubforum(user.getUsername(), subforum.get().getId()); + followSubforumRepository.save(followSubforum); + return new FollowSubforumResponse(true, "Successfully followed subforum"); + } + + public FollowSubforumResponse unfollowSubforum(FollowSubforumRequest request, String username) { + if (username == null) { + return new FollowSubforumResponse(false, "User not found"); + } + User user = userRepository.findByUsername(username); + if (user == null) { + return new FollowSubforumResponse(false, "User not found"); + } + Optional subforum = subforumRepository.findById(request.getSubforumId()); + if (subforum.isEmpty()) { + return new FollowSubforumResponse(false, "Subforum not found"); + } + FollowSubforum followSubforum = followSubforumRepository.findByFollowerUsernameAndSubforumID(user.getUsername(), subforum.get().getId()); + if (followSubforum == null) { + return new FollowSubforumResponse(false, "Not following this subforum"); + } + followSubforumRepository.delete(followSubforum); + return new FollowSubforumResponse(true, "Successfully unfollowed subforum"); + } + + public List getFollowedSubforums(String username) { + if (username == null) { + return new ArrayList(); + } + List followedSubforums = followSubforumRepository.findByFollowerUsername(username); + List response = new ArrayList<>(); + for (FollowSubforum followedSubforum : followedSubforums) { + Subforum subforum = subforumRepository.findById(followedSubforum.getSubforumID()).orElse(null); + if (subforum != null) { + response.add(new GetFollowedSubforumsResponse(subforum.getId(), subforum.getName(), subforum.getDescription(), subforum.getTagColor(), followSubforumRepository.countBySubforumID(subforum.getId()), postRepository.countBySubforumID(subforum.getId()))); + } + } + return response; + } +} \ No newline at end of file