From 7b8a145e731dd74bfc8d1a2951c8f75c9a666bf4 Mon Sep 17 00:00:00 2001 From: EnesBaserr Date: Sun, 8 Dec 2024 22:25:52 +0300 Subject: [PATCH 1/2] Implemented reputationPoints flow. --- .../Config/ModelMapperConfig.java | 3 +++ .../Controllers/UserController.java | 2 ++ .../Responses/SelfProfileResponseDto.java | 2 +- .../Responses/UserProfileResponseDto.java | 2 +- .../Repositories/QuestionRepository.java | 7 +++++++ .../Services/UserService.java | 19 +++++++++++++++++++ 6 files changed, 33 insertions(+), 2 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 930c52f1..f762f5b1 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/Config/ModelMapperConfig.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/Config/ModelMapperConfig.java @@ -28,6 +28,7 @@ protected void configure() { skip(destination.getPassword()); skip(destination.getFollowers()); skip(destination.getFollowing()); + } }); modelMapper.addMappings(new PropertyMap() { @@ -35,6 +36,7 @@ protected void configure() { protected void configure() { skip(destination.getQuestions()); skip(destination.getAnswers()); + map(source.getReputationPoints(), destination.getReputationPoints()); } }); modelMapper.addMappings(new PropertyMap () { @@ -50,6 +52,7 @@ protected void configure() { @Override protected void configure() { skip(destination.getFollowedTags()); + map(source.getReputationPoints(), destination.getReputationPoints()); } }); 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 8ecfcaa3..0abad964 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/Controllers/UserController.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/Controllers/UserController.java @@ -44,6 +44,7 @@ public ResponseEntity> getUser() { selfProfileResponseDto.setFollowedTags( tagService.getFollowedTags(user.getId()) ); + selfProfileResponseDto.setReputationPoints(userService.calculateReputation(user)); selfProfileResponseDto.setQuestionCount((long) questions.size()); selfProfileResponseDto.setQuestions( questions); @@ -81,6 +82,7 @@ public ResponseEntity> getUserById( if (user.isPresent()) { UserProfileResponseDto userProfileResponseDto = modelMapper.map(user.get(), UserProfileResponseDto.class); + userProfileResponseDto.setReputationPoints(userService.calculateReputation(user.get())); userProfileResponseDto.setSelfFollowing(userService.selfFollowing(user.get())); userProfileResponseDto.setFollowedTags( tagService.getFollowedTags(user.get().getId()) 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 f243d681..854b4662 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 @@ -21,7 +21,7 @@ public class SelfProfileResponseDto { private Long answerCount; private int followersCount; private int followingCount; - private int reputationPoints; + private Long reputationPoints; private Long questionCount; private ExperienceLevel experienceLevel; private List questions; 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 942d33a0..15d12b1a 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 @@ -21,7 +21,7 @@ public class UserProfileResponseDto { private int followersCount; private int followingCount; private boolean selfFollowing; - private int reputationPoints; + private Long reputationPoints; private ExperienceLevel experienceLevel; @Builder.Default private List followedTags = new ArrayList<>(); diff --git a/backend/src/main/java/com/group1/programminglanguagesforum/Repositories/QuestionRepository.java b/backend/src/main/java/com/group1/programminglanguagesforum/Repositories/QuestionRepository.java index 369c287f..42120529 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/Repositories/QuestionRepository.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/Repositories/QuestionRepository.java @@ -2,6 +2,7 @@ import com.group1.programminglanguagesforum.Entities.DifficultyLevel; import com.group1.programminglanguagesforum.Entities.Question; +import com.group1.programminglanguagesforum.Entities.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -10,6 +11,7 @@ import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface QuestionRepository extends JpaRepository { @@ -28,6 +30,11 @@ Page searchQuestions( @Param("tagIds") List tagIds, @Param("difficulty") DifficultyLevel difficulty, Pageable pageable); + @Query("SELECT q FROM Question q WHERE q.askedBy.id = :author") List findByAuthorId(@Param("author") Long authorId); + + @Query("SELECT q.askedBy FROM Question q WHERE q.id = :id") + Optional findQuestionOwner(@Param("id") Long questionId); } + diff --git a/backend/src/main/java/com/group1/programminglanguagesforum/Services/UserService.java b/backend/src/main/java/com/group1/programminglanguagesforum/Services/UserService.java index 73c00ed4..2ae7cc7d 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/Services/UserService.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/Services/UserService.java @@ -1,9 +1,13 @@ package com.group1.programminglanguagesforum.Services; import com.group1.programminglanguagesforum.DTOs.Requests.UserProfileUpdateRequestDto; +import com.group1.programminglanguagesforum.Entities.Answer; +import com.group1.programminglanguagesforum.Entities.Question; import com.group1.programminglanguagesforum.Entities.User; import com.group1.programminglanguagesforum.Exceptions.UnauthorizedAccessException; import com.group1.programminglanguagesforum.Exceptions.UserNotFoundException; +import com.group1.programminglanguagesforum.Repositories.AnswerRepository; +import com.group1.programminglanguagesforum.Repositories.QuestionRepository; import com.group1.programminglanguagesforum.Repositories.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -20,11 +24,26 @@ public class UserService { private final UserRepository userRepository; private final UserContextService userContextService; + private final AnswerRepository answerRepository; + private final QuestionRepository questionRepository; public Optional getUserById(Long id) { return userRepository.findById(id); } + public Long calculateReputation(User user) { + List questions = questionRepository.findByAuthorId(user.getId()); + long questionCount = questions.size(); + Long questionUpvoteCount = questions.stream().map(Question::getUpvoteCount).reduce(0L, Long::sum); + Long questionDownvoteCount = questions.stream().map(Question::getDownvoteCount).reduce(0L, Long::sum); + List< Answer> answers= answerRepository.findByAnsweredBy(user.getId()); + long answerCount = answers.size(); + Long answerUpvoteCount = answers.stream().map(Answer::getUpvoteCount).reduce(0L, Long::sum); + Long answerDownvoteCount = answers.stream().map(Answer::getDownvoteCount).reduce(0L, Long::sum); + return (questionCount * 10 + answerCount * 15 + questionUpvoteCount * 25 + answerUpvoteCount * 30) - (questionDownvoteCount*10 + answerDownvoteCount*15); + + } + public User updateUser(User user, UserProfileUpdateRequestDto userProfileUpdateRequestDto) throws UserNotFoundException { Optional userOptional = userRepository.findById(user.getId()); From 556fe297c645f3216275bab9f65c10f7a2715403 Mon Sep 17 00:00:00 2001 From: EnesBaserr Date: Sun, 8 Dec 2024 22:45:37 +0300 Subject: [PATCH 2/2] Changed reputation policy --- .../group1/programminglanguagesforum/Entities/Answer.java | 4 ++++ .../programminglanguagesforum/Entities/Question.java | 3 +++ .../programminglanguagesforum/Services/UserService.java | 8 +++----- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/com/group1/programminglanguagesforum/Entities/Answer.java b/backend/src/main/java/com/group1/programminglanguagesforum/Entities/Answer.java index 56cbdf06..fa983df0 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/Entities/Answer.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/Entities/Answer.java @@ -51,6 +51,10 @@ public Long getDownvoteCount() { return votes.stream().filter(vote -> !vote.isUpvote()).count(); } + public Long getVoteDifference() { + return Math.max(this.getUpvoteCount() - this.getDownvoteCount(), 0); + } + public Integer getRating() { return (int)(this.getUpvoteCount() - this.getDownvoteCount()); } diff --git a/backend/src/main/java/com/group1/programminglanguagesforum/Entities/Question.java b/backend/src/main/java/com/group1/programminglanguagesforum/Entities/Question.java index 3439cfec..e89c3648 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/Entities/Question.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/Entities/Question.java @@ -60,5 +60,8 @@ public Long getUpvoteCount() { public Long getDownvoteCount() { return votes.stream().filter(vote -> !vote.isUpvote()).count(); } + public Long getVoteDifference() { + return Math.max(getUpvoteCount() - getDownvoteCount(), 0); + } } diff --git a/backend/src/main/java/com/group1/programminglanguagesforum/Services/UserService.java b/backend/src/main/java/com/group1/programminglanguagesforum/Services/UserService.java index 2ae7cc7d..646ba34e 100644 --- a/backend/src/main/java/com/group1/programminglanguagesforum/Services/UserService.java +++ b/backend/src/main/java/com/group1/programminglanguagesforum/Services/UserService.java @@ -34,13 +34,11 @@ public Optional getUserById(Long id) { public Long calculateReputation(User user) { List questions = questionRepository.findByAuthorId(user.getId()); long questionCount = questions.size(); - Long questionUpvoteCount = questions.stream().map(Question::getUpvoteCount).reduce(0L, Long::sum); - Long questionDownvoteCount = questions.stream().map(Question::getDownvoteCount).reduce(0L, Long::sum); + Long questionVoteDifference = questions.stream().map(Question::getVoteDifference).reduce(0L, Long::sum); List< Answer> answers= answerRepository.findByAnsweredBy(user.getId()); long answerCount = answers.size(); - Long answerUpvoteCount = answers.stream().map(Answer::getUpvoteCount).reduce(0L, Long::sum); - Long answerDownvoteCount = answers.stream().map(Answer::getDownvoteCount).reduce(0L, Long::sum); - return (questionCount * 10 + answerCount * 15 + questionUpvoteCount * 25 + answerUpvoteCount * 30) - (questionDownvoteCount*10 + answerDownvoteCount*15); + Long answerVoteDifference = answers.stream().map(Answer::getVoteDifference).reduce(0L, Long::sum); + return (questionCount * 10 + answerCount * 15 + questionVoteDifference * 25 + answerVoteDifference * 30); }