Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public interface StudyTimeApi {
- sort는 월간(MONTHLY) 또는 일간(DAILY) 기준으로 정렬됩니다.
- 시간이 같은 경우 다른 기간의 시간을 기준으로 추가 정렬됩니다.
- 그 마저 같다면 id를 기준으로 정렬됩니다.
- name은 type에 따라 동아리명/학번(앞 네 자리 숫자)/개인 이름으로 반환됩니다.
- name은 type에 따라 동아리명/학번(입학연도 뒤 두 자리)/개인 이름으로 반환됩니다.
- 개인 이름의 경우 개인 정보 보호를 위해 첫번째와 마지막 글자만 표시됩니다.
- 랭킹은 로그인한 사용자의 대학교 기준으로 조회됩니다.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ public record StudyTimeRankingResponse(
@Schema(description = "순위", example = "1", requiredMode = REQUIRED)
Integer rank,

@Schema(description = "이름(동아리 / 학번 앞 네 자리 / 개인)", example = "BCSD", requiredMode = REQUIRED)
@Schema(description = "이름(동아리 / 학번(입학연도 뒤 두 자리) / 개인)", example = "BCSD", requiredMode = REQUIRED)
String name,

@Schema(description = "이번 달 공부 시간(누적 초)", example = "120000", requiredMode = REQUIRED)
Expand All @@ -18,6 +18,8 @@ public record StudyTimeRankingResponse(
@Schema(description = "오늘 공부 시간(누적 초)", example = "5400", requiredMode = REQUIRED)
Long dailyStudyTime
) {
private static final int STUDENT_NUMBER_DISPLAY_LENGTH = 2;

public static StudyTimeRankingResponse from(StudyTimeRanking ranking, Integer rank) {
return new StudyTimeRankingResponse(
rank,
Expand All @@ -26,4 +28,49 @@ public static StudyTimeRankingResponse from(StudyTimeRanking ranking, Integer ra
ranking.getDailySeconds()
);
}

public static StudyTimeRankingResponse from(StudyTimeRanking ranking, Integer rank, String type) {
return new StudyTimeRankingResponse(
rank,
resolveNameByType(ranking.getTargetName(), type),
ranking.getMonthlySeconds(),
ranking.getDailySeconds()
);
}

private static String resolveNameByType(String name, String type) {
if ("PERSONAL".equalsIgnoreCase(type)) {
return maskPersonalName(name);
}

if ("STUDENT_NUMBER".equalsIgnoreCase(type)) {
return resolveStudentNumberDisplay(name);
}

return name;
}

private static String resolveStudentNumberDisplay(String studentNumberYear) {
if (studentNumberYear.length() <= STUDENT_NUMBER_DISPLAY_LENGTH) {
return studentNumberYear;
}

return studentNumberYear.substring(
studentNumberYear.length() - STUDENT_NUMBER_DISPLAY_LENGTH
);
}

private static String maskPersonalName(String name) {
if (name.length() == 1) {
return name;
}

if (name.length() == 2) {
return name.charAt(0) + "*";
}

return name.charAt(0)
+ "*".repeat(name.length() - 2)
+ name.substring(name.length() - 1);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,38 +58,8 @@ public static List<StudyTimeRankingResponse> toRankings(
return IntStream.range(0, rankings.size())
.mapToObj(index -> {
StudyTimeRanking ranking = rankings.get(index);
return new StudyTimeRankingResponse(
baseRank + index,
resolveName(ranking, type),
ranking.getMonthlySeconds(),
ranking.getDailySeconds()
);
return StudyTimeRankingResponse.from(ranking, baseRank + index, type);
})
.toList();
}

private static String resolveName(StudyTimeRanking ranking, String type) {
String name = ranking.getTargetName();

if ("PERSONAL".equalsIgnoreCase(type)) {
return maskPersonalName(name);
}

return name;
}

private static String maskPersonalName(String name) {
if (name.length() == 1) {
return name;
}

if (name.length() == 2) {
return name.charAt(0) + "*";
}

return name.charAt(0)
+ "*".repeat(name.length() - 2)
+ name.substring(name.length() - 1);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ public class StudyTimeRankingService {
private static final String RANKING_TYPE_CLUB = "CLUB";
private static final String RANKING_TYPE_STUDENT_NUMBER = "STUDENT_NUMBER";
private static final String RANKING_TYPE_PERSONAL = "PERSONAL";
private static final int MAX_RANKING_DISPLAY = 4;

private final StudyTimeRankingRepository studyTimeRankingRepository;
private final RankingTypeRepository rankingTypeRepository;
Expand Down Expand Up @@ -84,7 +83,7 @@ public StudyTimeMyRankingsResponse getMyRankings(StudyTimeMyRankingCondition con
studentRankingTypeId,
universityId,
sort,
user.getStudentNumber()
user.getStudentNumberYear()
);

StudyTimeRankingResponse personalRanking = resolveRanking(
Expand Down Expand Up @@ -140,11 +139,19 @@ private StudyTimeRankingResponse resolveStudentNumberRanking(
Integer rankingTypeId,
Integer universityId,
StudyTimeRankingSort sort,
String studentNumber
String studentNumberYear
) {
String targetName = resolveStudentNumber(studentNumber);

return resolveRankingByName(rankingTypeId, universityId, sort, targetName);
return studyTimeRankingRepository.findRankingByName(
rankingTypeId,
universityId,
studentNumberYear
)
.map(ranking -> StudyTimeRankingResponse.from(
ranking,
calculateRank(ranking, sort),
RANKING_TYPE_STUDENT_NUMBER
))
.orElse(null);
}

private StudyTimeRankingResponse resolveRanking(
Expand Down Expand Up @@ -193,8 +200,4 @@ private int calculateRank(StudyTimeRanking ranking, StudyTimeRankingSort sort) {

return (int)higherCount + 1;
}

private String resolveStudentNumber(String studentNumber) {
return String.valueOf(Integer.parseInt(studentNumber.substring(2, MAX_RANKING_DISPLAY)));
}
}
2 changes: 1 addition & 1 deletion src/main/resources/config