From c8b9817ff901f68020073dc586ad3d5d8d5e4339 Mon Sep 17 00:00:00 2001 From: EnesBaserr Date: Fri, 6 Dec 2024 21:06:56 +0300 Subject: [PATCH] Add followed tags to users' profile responses. --- .../Config/ModelMapperConfig.java | 7 +++++++ .../Controllers/UserController.java | 13 +++++++++---- .../DTOs/Responses/SelfProfileResponseDto.java | 15 +++++++++++++++ .../DTOs/Responses/UserProfileResponseDto.java | 6 ++++++ .../Repositories/TagRepository.java | 4 ++++ .../Services/TagService.java | 10 ++++++++++ 6 files changed, 51 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/com/group1/programminglanguagesforum/Config/ModelMapperConfig.java b/backend/src/main/java/com/group1/programminglanguagesforum/Config/ModelMapperConfig.java index dc617d07..5fe26a6c 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/Config/ModelMapperConfig.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/Config/ModelMapperConfig.java @@ -46,6 +46,13 @@ protected void configure() { } }); + modelMapper.addMappings(new PropertyMap () { + @Override + protected void configure() { + skip(destination.getFollowedTags()); + + } + }); modelMapper.addMappings(new PropertyMap() { @Override protected void configure() { diff --git a/backend/src/main/java/com/group1/programminglanguagesforum/Controllers/UserController.java b/backend/src/main/java/com/group1/programminglanguagesforum/Controllers/UserController.java index d15adf83..8ecfcaa3 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/Controllers/UserController.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/Controllers/UserController.java @@ -6,10 +6,7 @@ import com.group1.programminglanguagesforum.Entities.User; import com.group1.programminglanguagesforum.Exceptions.UnauthorizedAccessException; import com.group1.programminglanguagesforum.Exceptions.UserNotFoundException; -import com.group1.programminglanguagesforum.Services.AnswerService; -import com.group1.programminglanguagesforum.Services.QuestionService; -import com.group1.programminglanguagesforum.Services.UserContextService; -import com.group1.programminglanguagesforum.Services.UserService; +import com.group1.programminglanguagesforum.Services.*; import com.group1.programminglanguagesforum.Util.ApiResponseBuilder; import lombok.RequiredArgsConstructor; import org.modelmapper.ModelMapper; @@ -33,6 +30,7 @@ public class UserController extends BaseController { private final ModelMapper modelMapper; private final QuestionService questionService; private final AnswerService answerService; + private final TagService tagService; @GetMapping(value = EndpointConstants.UserEndpoints.USER_ME) public ResponseEntity> getUser() { @@ -43,6 +41,9 @@ public ResponseEntity> getUser() { SelfProfileResponseDto.class); List questions = questionService.findByAuthorId(user.getId()); List answers = answerService.findByAnsweredBy(user.getId()); + selfProfileResponseDto.setFollowedTags( + tagService.getFollowedTags(user.getId()) + ); selfProfileResponseDto.setQuestionCount((long) questions.size()); selfProfileResponseDto.setQuestions( questions); @@ -81,6 +82,10 @@ public ResponseEntity> getUserById( UserProfileResponseDto userProfileResponseDto = modelMapper.map(user.get(), UserProfileResponseDto.class); userProfileResponseDto.setSelfFollowing(userService.selfFollowing(user.get())); + userProfileResponseDto.setFollowedTags( + tagService.getFollowedTags(user.get().getId()) + ); + GenericApiResponse response = ApiResponseBuilder.buildSuccessResponse( userProfileResponseDto.getClass(), diff --git a/backend/src/main/java/com/group1/programminglanguagesforum/DTOs/Responses/SelfProfileResponseDto.java b/backend/src/main/java/com/group1/programminglanguagesforum/DTOs/Responses/SelfProfileResponseDto.java index 2685cc1f..f243d681 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/DTOs/Responses/SelfProfileResponseDto.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/DTOs/Responses/SelfProfileResponseDto.java @@ -1,5 +1,6 @@ package com.group1.programminglanguagesforum.DTOs.Responses; import com.group1.programminglanguagesforum.Entities.ExperienceLevel; +import com.group1.programminglanguagesforum.Entities.TagType; import lombok.*; import java.util.List; @@ -25,4 +26,18 @@ public class SelfProfileResponseDto { private ExperienceLevel experienceLevel; private List questions; private List answers; + private List followedTags; + @Builder + @NoArgsConstructor + @AllArgsConstructor + @Getter + @Setter + public static class FollowedTags { + + private Long id; + private String name; + private TagType tagType; + private String description; + + } } diff --git a/backend/src/main/java/com/group1/programminglanguagesforum/DTOs/Responses/UserProfileResponseDto.java b/backend/src/main/java/com/group1/programminglanguagesforum/DTOs/Responses/UserProfileResponseDto.java index 3fa6629d..942d33a0 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/DTOs/Responses/UserProfileResponseDto.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/DTOs/Responses/UserProfileResponseDto.java @@ -2,6 +2,9 @@ import com.group1.programminglanguagesforum.Entities.ExperienceLevel; import lombok.*; +import java.util.ArrayList; +import java.util.List; + @Builder @NoArgsConstructor @AllArgsConstructor @@ -20,4 +23,7 @@ public class UserProfileResponseDto { private boolean selfFollowing; private int reputationPoints; private ExperienceLevel experienceLevel; + @Builder.Default + private List followedTags = new ArrayList<>(); + } diff --git a/backend/src/main/java/com/group1/programminglanguagesforum/Repositories/TagRepository.java b/backend/src/main/java/com/group1/programminglanguagesforum/Repositories/TagRepository.java index b62ec825..da282981 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/Repositories/TagRepository.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/Repositories/TagRepository.java @@ -5,6 +5,8 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; 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.util.List; @@ -14,4 +16,6 @@ public interface TagRepository extends JpaRepository { List findAllByIdIn(List ids); Page findTagsByTagNameContainingIgnoreCase(String tagName, Pageable pageable); + @Query("SELECT t FROM Tag t JOIN t.followers u WHERE u.id = :userId") + List findTagByFollowers(@Param("userId") Long userId); } diff --git a/backend/src/main/java/com/group1/programminglanguagesforum/Services/TagService.java b/backend/src/main/java/com/group1/programminglanguagesforum/Services/TagService.java index 2eeeb004..4483efc0 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/Services/TagService.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/Services/TagService.java @@ -101,6 +101,16 @@ public GetTagDetailsResponseDto getTagDetails(Long tagId) { .build(); } + public List getFollowedTags(Long userId) { + return tagRepository.findTagByFollowers(userId).stream() + .map(tag -> SelfProfileResponseDto.FollowedTags.builder() + .id(tag.getId()) + .name(tag.getTagName()) + .tagType(getTagType(tag)) + .description(tag.getTagDescription()) + .build()) + .toList(); + } public Page searchTags(String q, Pageable pageable) { Page tags = tagRepository.findTagsByTagNameContainingIgnoreCase(q, pageable);