Skip to content

Commit

Permalink
[REFACTOR] 솝탬프 리팩토링 (#374)
Browse files Browse the repository at this point in the history
  • Loading branch information
kseysh authored Sep 29, 2024
2 parents 7d6f45c + ab0dac3 commit 2f3387f
Show file tree
Hide file tree
Showing 32 changed files with 401 additions and 1,310 deletions.
Original file line number Diff line number Diff line change
@@ -1,35 +1,60 @@
package org.sopt.app.application.rank;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.sopt.app.application.soptamp.SoptampPointInfo.PartPoint;
import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank;
import org.sopt.app.application.soptamp.SoptampUserInfo;
import org.sopt.app.domain.enums.Part;


@RequiredArgsConstructor
public class SoptampPartRankCalculator {

private final List<PartPoint> partPoints;

public List<PartRank> findAllPartRanks() {

return partPoints.stream().map(this::createPartRank).toList();
private final List<SoptampUserInfo> userInfos;

private final HashMap<String, Long> partScores =
new HashMap<>(Map.of(
Part.SERVER.getPartName(), 0L,
Part.WEB.getPartName(), 0L,
Part.DESIGN.getPartName(), 0L,
Part.ANDROID.getPartName(), 0L,
Part.IOS.getPartName(), 0L,
Part.PLAN.getPartName(), 0L
));

private final List<Part> partReturnOrder = List.of(
Part.PLAN, Part.DESIGN, Part.WEB, Part.IOS, Part.ANDROID, Part.SERVER
);

public List<PartRank> calculatePartRank() {
userInfos.forEach(this::calculatePartScore);
return partReturnOrder.stream().map(part -> PartRank.builder()
.part(part.getPartName())
.rank(getTargetPartRank(partScores.get(part.getPartName())))
.points(partScores.get(part.getPartName()))
.build()).toList();
}

private PartRank createPartRank(PartPoint targetPartPoint) {
private void calculatePartScore(SoptampUserInfo userInfo) {
String nickname = userInfo.getNickname();
partReturnOrder.forEach(part -> {
if(nickname.startsWith(part.getPartName())){
this.putPartScore(part.getPartName(), userInfo.getTotalPoints());
}
});
}

return PartRank.builder()
.part(targetPartPoint.part().getPartName())
.rank(getTargetPartRank(targetPartPoint))
.points(targetPartPoint.points())
.build();
private void putPartScore(String partName, Long point) {
partScores.put(partName, partScores.get(partName) + point);
}

private int getTargetPartRank(PartPoint targetPartPoint) {
private int getTargetPartRank(Long targetPartPoint) {
int rankPoint = 1;

for (PartPoint comparisonPartPoint : partPoints) {
if (targetPartPoint.points() < comparisonPartPoint.points()) {
for (Long partScore : partScores.values()) {
if (targetPartPoint < partScore) {
rankPoint++;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,64 +1,23 @@
package org.sopt.app.application.rank;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.concurrent.atomic.AtomicInteger;
import lombok.RequiredArgsConstructor;
import org.sopt.app.application.slack.SlackService;
import org.sopt.app.application.soptamp.SoptampPointInfo.Main;
import org.sopt.app.application.soptamp.SoptampPointInfo.Point;
import org.sopt.app.application.soptamp.SoptampUserInfo;

@RequiredArgsConstructor
public class SoptampUserRankCalculator {

private final List<SoptampUserInfo> soptampUsers;
private final List<Main> ranking = new ArrayList<>();
private int rankPoint = 1;
private final List<SoptampUserInfo> soptampUserInfos;

public List<Main> calculateRanking(List<Point> soptampPointList) {
soptampPointList.stream()
.sorted(Comparator.comparing(Point::getPoints).reversed())
.forEach(point ->
findSoptampUserInfo(point.getSoptampUserId())
.ifPresentOrElse(
user -> addUserToRanking(user, point.getPoints()),
() -> SlackService.sendSlackMessage(
"Warning",
"soptamp_point에 해당하지 않는 soptamp_user가 확인되었습니다.\n"
+ "soptampPointId: " + point.getId() + "\n"
+ "soptampUserId: " + point.getSoptampUserId()
)
));
return ranking;
}

private void addUserToRanking(SoptampUserInfo user, Long userPoint) {
ranking.add(Main.builder()
.rank(getCurrentRankPointAndIncrement())
.nickname(user.getNickname())
.profileMessage(user.getProfileMessage())
.point(userPoint)
.build());
}

private Optional<SoptampUserInfo> findSoptampUserInfo(Long soptampUserId) {
return soptampUsers.stream()
.filter(user -> user.getId().equals(soptampUserId))
.findAny();
}

private int getCurrentRankPointAndIncrement() {
return rankPoint++;
}

@Deprecated
public List<Main> calculateRank() {
return soptampUsers.stream().sorted(
Comparator.comparing(SoptampUserInfo::getTotalPoints).reversed())
.map(user -> Main.of(getCurrentRankPointAndIncrement(), user))
.collect(Collectors.toList());
AtomicInteger rankPoint = new AtomicInteger(1);

return soptampUserInfos.stream()
.sorted(Comparator.comparing(SoptampUserInfo::getTotalPoints).reversed())
.map(user -> Main.of(rankPoint.getAndIncrement(), user))
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,6 @@
package org.sopt.app.application.soptamp;

import java.util.List;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.sopt.app.domain.entity.soptamp.Mission;
import org.sopt.app.domain.entity.soptamp.SoptampPoint;
import lombok.*;
import org.sopt.app.domain.enums.Part;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
Expand All @@ -33,33 +26,6 @@ public static Main of(Integer rank, SoptampUserInfo soptampUserInfo) {
}
}

@Getter
public static class Detail {

private String nickname;
private String profileMessage;
private List<Mission> userMissions;
}

@Getter
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public static class Point {
private Long id;
private Long generation;
private Long soptampUserId;
private Long points;

public static Point of(SoptampPoint soptampPoint) {
return new Point(
soptampPoint.getId(),
soptampPoint.getGeneration(),
soptampPoint.getSoptampUserId(),
soptampPoint.getPoints()
);
}
}

@Getter
@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package org.sopt.app.application.soptamp;

import java.util.List;
import lombok.RequiredArgsConstructor;
import org.sopt.app.common.exception.BadRequestException;
import org.sopt.app.common.response.ErrorCode;
import org.sopt.app.domain.entity.soptamp.SoptampUser;
import org.sopt.app.domain.enums.Part;
import org.sopt.app.interfaces.postgres.SoptampUserRepository;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class SoptampUserFinder {

private final SoptampUserRepository soptampUserRepository;

@Value("${sopt.current.generation}")
private Long currentGeneration;

public List<SoptampUserInfo> findAllCurrentGenerationSoptampUsers() {
return soptampUserRepository.findAllByGeneration(currentGeneration)
.stream()
.map(SoptampUserInfo::of)
.toList();
}

public List<SoptampUserInfo> findSoptampUserIdByPart(Part part) {
return soptampUserRepository.findAllByNicknameStartingWithAndGeneration(part.getPartName(), currentGeneration)
.stream()
.map(SoptampUserInfo::of)
.toList();
}

public SoptampUserInfo findSoptampUserByNickname(String nickname) {
return SoptampUserInfo.of(
soptampUserRepository.findUserByNickname(nickname)
.orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage()))
);
}

public SoptampUserInfo findByNickname(String nickname) {
SoptampUser soptampUser = soptampUserRepository.findUserByNickname(nickname)
.orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage()));
return SoptampUserInfo.of(soptampUser);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package org.sopt.app.application.soptamp;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.*;
import org.sopt.app.domain.entity.soptamp.SoptampUser;

@Getter
Expand All @@ -26,16 +23,4 @@ public static SoptampUserInfo of(SoptampUser soptampUser) {
.nickname(soptampUser.getNickname())
.build();
}

@Getter
@Builder
public static class SoptampUserPlaygroundInfo {

private Long userId;
private Long playgroundId;
private String name;
private Integer generation;
private String part;
}

}
Loading

0 comments on commit 2f3387f

Please sign in to comment.