diff --git a/backend/src/main/java/online/wesal/wesal/controller/PostController.java b/backend/src/main/java/online/wesal/wesal/controller/PostController.java index bed1765..2d34d88 100644 --- a/backend/src/main/java/online/wesal/wesal/controller/PostController.java +++ b/backend/src/main/java/online/wesal/wesal/controller/PostController.java @@ -14,6 +14,9 @@ import org.springframework.security.core.Authentication; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.stream.Collectors; + @RestController @RequestMapping("/posts") @CrossOrigin(origins = "*") @@ -43,8 +46,7 @@ public class PostController { } try { - Post post = postService.createPost(request.getBody()); - PostResponseDTO response = new PostResponseDTO(post); + PostResponseDTO response = postService.createPostWithResponse(request.getBody()); return ResponseEntity.ok(ApiResponse.success(response)); } catch (RuntimeException e) { String message; @@ -58,4 +60,38 @@ public class PostController { return ResponseEntity.status(500).body(ApiResponse.error("Something went wrong.. We're sorry but try again later")); } } + + @GetMapping("/all") + @Operation(summary = "Get all recent posts", description = "Get all posts from the last 7 days, ordered by creation date (latest first)") + public ResponseEntity>> getAllRecentPosts() { + try { + List response = postService.getAllRecentPosts(); + return ResponseEntity.ok(ApiResponse.success(response)); + } catch (Exception e) { + return ResponseEntity.status(500).body(ApiResponse.error("Something went wrong.. We're sorry but try again later")); + } + } + + @GetMapping("/user") + @Operation(summary = "Get user posts", description = "Get all posts by a specific user, ordered by creation date (latest first)") + public ResponseEntity>> getUserPosts(@RequestParam Long id) { + if (id == null || id <= 0) { + return ResponseEntity.badRequest().body(ApiResponse.error("Valid user ID is required")); + } + + try { + List response = postService.getUserPosts(id); + return ResponseEntity.ok(ApiResponse.success(response)); + } catch (RuntimeException e) { + String message; + if (e.getMessage().contains("User not found")) { + message = "User not found"; + } else { + message = "Something went wrong.. We're sorry but try again later"; + } + return ResponseEntity.badRequest().body(ApiResponse.error(message)); + } catch (Exception e) { + return ResponseEntity.status(500).body(ApiResponse.error("Something went wrong.. We're sorry but try again later")); + } + } } \ No newline at end of file diff --git a/backend/src/main/java/online/wesal/wesal/dto/CreatorDTO.java b/backend/src/main/java/online/wesal/wesal/dto/CreatorDTO.java new file mode 100644 index 0000000..7b125d3 --- /dev/null +++ b/backend/src/main/java/online/wesal/wesal/dto/CreatorDTO.java @@ -0,0 +1,32 @@ +package online.wesal.wesal.dto; + +import online.wesal.wesal.entity.User; + +public class CreatorDTO { + + private String id; + private String displayName; + + public CreatorDTO() {} + + public CreatorDTO(User user) { + this.id = String.valueOf(user.getId()); + this.displayName = user.getDisplayName(); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } +} \ No newline at end of file diff --git a/backend/src/main/java/online/wesal/wesal/dto/PostResponseDTO.java b/backend/src/main/java/online/wesal/wesal/dto/PostResponseDTO.java index 0391268..a3a5602 100644 --- a/backend/src/main/java/online/wesal/wesal/dto/PostResponseDTO.java +++ b/backend/src/main/java/online/wesal/wesal/dto/PostResponseDTO.java @@ -1,12 +1,13 @@ package online.wesal.wesal.dto; import online.wesal.wesal.entity.Post; +import online.wesal.wesal.entity.User; import java.time.LocalDateTime; public class PostResponseDTO { private String id; - private String creatorId; + private CreatorDTO creator; private String body; private String likes; private String comments; @@ -14,9 +15,9 @@ public class PostResponseDTO { public PostResponseDTO() {} - public PostResponseDTO(Post post) { + public PostResponseDTO(Post post, User creator) { this.id = String.valueOf(post.getId()); - this.creatorId = String.valueOf(post.getCreatorId()); + this.creator = new CreatorDTO(creator); this.body = post.getBody(); this.likes = String.valueOf(post.getLikes()); this.comments = String.valueOf(post.getComments()); @@ -31,12 +32,12 @@ public class PostResponseDTO { this.id = id; } - public String getCreatorId() { - return creatorId; + public CreatorDTO getCreator() { + return creator; } - public void setCreatorId(String creatorId) { - this.creatorId = creatorId; + public void setCreator(CreatorDTO creator) { + this.creator = creator; } public String getBody() { diff --git a/backend/src/main/java/online/wesal/wesal/repository/PostRepository.java b/backend/src/main/java/online/wesal/wesal/repository/PostRepository.java index 867dc48..c505859 100644 --- a/backend/src/main/java/online/wesal/wesal/repository/PostRepository.java +++ b/backend/src/main/java/online/wesal/wesal/repository/PostRepository.java @@ -2,11 +2,19 @@ package online.wesal.wesal.repository; import online.wesal.wesal.entity.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 java.time.LocalDateTime; import java.util.List; @Repository public interface PostRepository extends JpaRepository { List findByCreatorIdOrderByCreationDateDesc(Long creatorId); + + @Query("SELECT p FROM Post p WHERE p.creationDate >= :sevenDaysAgo ORDER BY p.creationDate DESC") + List findAllPostsWithinLast7Days(@Param("sevenDaysAgo") LocalDateTime sevenDaysAgo); + + List findAllByOrderByCreationDateDesc(); } \ No newline at end of file diff --git a/backend/src/main/java/online/wesal/wesal/service/PostService.java b/backend/src/main/java/online/wesal/wesal/service/PostService.java index 30796cb..e11e2e7 100644 --- a/backend/src/main/java/online/wesal/wesal/service/PostService.java +++ b/backend/src/main/java/online/wesal/wesal/service/PostService.java @@ -1,17 +1,27 @@ package online.wesal.wesal.service; +import online.wesal.wesal.dto.PostResponseDTO; import online.wesal.wesal.entity.Post; import online.wesal.wesal.entity.User; import online.wesal.wesal.repository.PostRepository; +import online.wesal.wesal.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Service public class PostService { @Autowired private PostRepository postRepository; + @Autowired + private UserRepository userRepository; + @Autowired private UserService userService; @@ -20,4 +30,38 @@ public class PostService { Post post = new Post(currentUser.getId(), body); return postRepository.save(post); } + + public List getAllRecentPosts() { + LocalDateTime sevenDaysAgo = LocalDateTime.now().minusDays(7); + List posts = postRepository.findAllPostsWithinLast7Days(sevenDaysAgo); + + List creatorIds = posts.stream() + .map(Post::getCreatorId) + .distinct() + .collect(Collectors.toList()); + + Map creators = userRepository.findAllById(creatorIds).stream() + .collect(Collectors.toMap(User::getId, user -> user)); + + return posts.stream() + .map(post -> new PostResponseDTO(post, creators.get(post.getCreatorId()))) + .collect(Collectors.toList()); + } + + public List getUserPosts(Long userId) { + List posts = postRepository.findByCreatorIdOrderByCreationDateDesc(userId); + User creator = userRepository.findById(userId) + .orElseThrow(() -> new RuntimeException("User not found")); + + return posts.stream() + .map(post -> new PostResponseDTO(post, creator)) + .collect(Collectors.toList()); + } + + public PostResponseDTO createPostWithResponse(String body) { + User currentUser = userService.getCurrentUser(); + Post post = new Post(currentUser.getId(), body); + post = postRepository.save(post); + return new PostResponseDTO(post, currentUser); + } } \ No newline at end of file