Skip to content

Commit 235ab2a

Browse files
committed
[feat/#92] 통계 도메인 작성
1 parent 5cd613d commit 235ab2a

13 files changed

+161
-8
lines changed

src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java

+5
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@ public enum ErrorCode {
7676
ALREADY_PUBLISHED_ERROR(HttpStatus.BAD_REQUEST, "이미 발행된 문항세트는 컨펌해제할 수 없습니다."),
7777
PROBLEM_SET_DELETED(HttpStatus.BAD_REQUEST, "삭제된 문항세트는 발행할 수 없습니다"),
7878
PROBLEM_SET_NOT_CONFIRMED(HttpStatus.BAD_REQUEST, "컨펌되지 않은 문항세트는 발행할 수 없습니다"),
79+
80+
// 통계
81+
PROBLEM_STATISTIC_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 문항의 통계 정보를 찾을 수 없습니다"),
82+
PROBLEM_SET_STATISTIC_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 문항세트의 통계 정보를 찾을 수 없습니다"),
83+
CHILD_PROBLEM_STATISTIC_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 새끼 문항의 통계 정보를 찾을 수 없습니다"),
7984
;
8085

8186

src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
@Getter
1414
@Entity
1515
@NoArgsConstructor(access = AccessLevel.PROTECTED)
16-
public class ChildProblemStatistic {
16+
public class ChildProblemStatistic implements StatisticCounter {
1717

1818
@Id
1919
@GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -29,4 +29,14 @@ public ChildProblemStatistic(Long childProblemId) {
2929
this.childProblemId = childProblemId;
3030
this.countStatistic = new CountStatistic();
3131
}
32+
33+
@Override
34+
public void addViewCount() {
35+
this.countStatistic.addViewCount();
36+
}
37+
38+
@Override
39+
public void addSubmitCount() {
40+
this.countStatistic.addSubmitCount();
41+
}
3242
}

src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,22 @@
33
import jakarta.persistence.Embeddable;
44

55
@Embeddable
6-
public class CountStatistic {
6+
public class CountStatistic implements StatisticCounter {
77
private Long viewCount;
88
private Long submitCount;
99

1010
public CountStatistic() {
1111
this.viewCount = 0L;
1212
this.submitCount = 0L;
1313
}
14+
15+
@Override
16+
public void addViewCount() {
17+
this.viewCount++;
18+
}
19+
20+
@Override
21+
public void addSubmitCount() {
22+
this.submitCount++;
23+
}
1424
}

src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountUpper.java

-4
This file was deleted.

src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.moplus.moplus_server.statistic.Problem.domain;
22

33
import jakarta.persistence.Column;
4+
import jakarta.persistence.Embedded;
45
import jakarta.persistence.Entity;
56
import jakarta.persistence.GeneratedValue;
67
import jakarta.persistence.GenerationType;
@@ -12,7 +13,7 @@
1213
@Getter
1314
@Entity
1415
@NoArgsConstructor(access = AccessLevel.PROTECTED)
15-
public class ProblemSetStatistic {
16+
public class ProblemSetStatistic implements StatisticCounter {
1617

1718
@Id
1819
@GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -23,9 +24,22 @@ public class ProblemSetStatistic {
2324
private Long viewCount;
2425
private Long submitCount;
2526

27+
@Embedded
28+
private CountStatistic countStatistic;
29+
2630
public ProblemSetStatistic(Long problemSetId, Long viewCount, Long submitCount) {
2731
this.problemSetId = problemSetId;
2832
this.viewCount = viewCount;
2933
this.submitCount = submitCount;
3034
}
35+
36+
@Override
37+
public void addViewCount() {
38+
this.countStatistic.addViewCount();
39+
}
40+
41+
@Override
42+
public void addSubmitCount() {
43+
this.countStatistic.addSubmitCount();
44+
}
3145
}

src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.moplus.moplus_server.statistic.Problem.domain;
22

33
import jakarta.persistence.Column;
4+
import jakarta.persistence.Embedded;
45
import jakarta.persistence.Entity;
56
import jakarta.persistence.GeneratedValue;
67
import jakarta.persistence.GenerationType;
@@ -13,7 +14,7 @@
1314
@Getter
1415
@Entity
1516
@NoArgsConstructor(access = AccessLevel.PROTECTED)
16-
public class ProblemStatistic {
17+
public class ProblemStatistic implements StatisticCounter {
1718

1819
@Id
1920
@GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -24,10 +25,23 @@ public class ProblemStatistic {
2425
private Long viewCount;
2526
private Long submitCount;
2627

28+
@Embedded
29+
private CountStatistic countStatistic;
30+
2731
@Builder
2832
public ProblemStatistic(Long problemId, Long viewCount, Long submitCount) {
2933
this.problemId = problemId;
3034
this.viewCount = viewCount;
3135
this.submitCount = submitCount;
3236
}
37+
38+
@Override
39+
public void addViewCount() {
40+
this.countStatistic.addViewCount();
41+
}
42+
43+
@Override
44+
public void addSubmitCount() {
45+
this.countStatistic.addSubmitCount();
46+
}
3347
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.moplus.moplus_server.statistic.Problem.domain;
2+
3+
public interface StatisticCounter {
4+
void addSubmitCount();
5+
6+
void addViewCount();
7+
8+
default void updateCount(StatisticFieldType type) {
9+
type.updateCount(this);
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.moplus.moplus_server.statistic.Problem.domain;
2+
3+
public enum StatisticEntityTarget {
4+
PROBLEM, PROBLEM_SET, CHILD_PROBLEM
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.moplus.moplus_server.statistic.Problem.domain;
2+
3+
import java.util.function.Consumer;
4+
import lombok.RequiredArgsConstructor;
5+
6+
@RequiredArgsConstructor
7+
public enum StatisticFieldType {
8+
VIEW(StatisticCounter::addViewCount),
9+
SUBMIT(StatisticCounter::addSubmitCount);
10+
11+
private final Consumer<StatisticCounter> countUpdater;
12+
13+
public void updateCount(StatisticCounter counter) {
14+
countUpdater.accept(counter);
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.moplus.moplus_server.statistic.Problem.repository;
2+
3+
import com.moplus.moplus_server.global.error.exception.ErrorCode;
4+
import com.moplus.moplus_server.global.error.exception.NotFoundException;
5+
import com.moplus.moplus_server.statistic.Problem.domain.ChildProblemStatistic;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
8+
public interface ChildProblemStatisticRepository extends JpaRepository<ChildProblemStatistic, Long> {
9+
default ChildProblemStatistic findByIdElseThrow(Long id) {
10+
return findById(id)
11+
.orElseThrow(() -> new NotFoundException(ErrorCode.CHILD_PROBLEM_STATISTIC_NOT_FOUND));
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.moplus.moplus_server.statistic.Problem.repository;
2+
3+
import com.moplus.moplus_server.global.error.exception.ErrorCode;
4+
import com.moplus.moplus_server.global.error.exception.NotFoundException;
5+
import com.moplus.moplus_server.statistic.Problem.domain.ProblemSetStatistic;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
8+
public interface ProblemSetStatisticRepository extends JpaRepository<ProblemSetStatistic, Long> {
9+
default ProblemSetStatistic findByIdElseThrow(Long id) {
10+
return findById(id)
11+
.orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_SET_STATISTIC_NOT_FOUND));
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.moplus.moplus_server.statistic.Problem.repository;
2+
3+
import com.moplus.moplus_server.global.error.exception.ErrorCode;
4+
import com.moplus.moplus_server.global.error.exception.NotFoundException;
5+
import com.moplus.moplus_server.statistic.Problem.domain.ProblemStatistic;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
8+
public interface ProblemStatisticRepository extends JpaRepository<ProblemStatistic, Long> {
9+
default ProblemStatistic findByIdElseThrow(Long id) {
10+
return findById(id)
11+
.orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_STATISTIC_NOT_FOUND));
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.moplus.moplus_server.statistic.Problem.service;
2+
3+
import com.moplus.moplus_server.statistic.Problem.domain.StatisticCounter;
4+
import com.moplus.moplus_server.statistic.Problem.domain.StatisticEntityTarget;
5+
import com.moplus.moplus_server.statistic.Problem.domain.StatisticFieldType;
6+
import com.moplus.moplus_server.statistic.Problem.repository.ChildProblemStatisticRepository;
7+
import com.moplus.moplus_server.statistic.Problem.repository.ProblemSetStatisticRepository;
8+
import com.moplus.moplus_server.statistic.Problem.repository.ProblemStatisticRepository;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.stereotype.Service;
11+
import org.springframework.transaction.annotation.Transactional;
12+
13+
@Service
14+
@RequiredArgsConstructor
15+
public class CountStatisticsUpdateService {
16+
private final ProblemStatisticRepository problemStatisticRepository;
17+
private final ProblemSetStatisticRepository problemSetStatisticRepository;
18+
private final ChildProblemStatisticRepository childProblemStatisticRepository;
19+
20+
@Transactional
21+
public void updateStatistics(Long id, StatisticFieldType type, StatisticEntityTarget target) {
22+
StatisticCounter statistic = findStatistic(id, target);
23+
statistic.updateCount(type);
24+
}
25+
26+
private StatisticCounter findStatistic(Long id, StatisticEntityTarget target) {
27+
return switch (target) {
28+
case PROBLEM -> problemStatisticRepository.findByIdElseThrow(id);
29+
case PROBLEM_SET -> problemSetStatisticRepository.findByIdElseThrow(id);
30+
case CHILD_PROBLEM -> childProblemStatisticRepository.findByIdElseThrow(id);
31+
};
32+
}
33+
}

0 commit comments

Comments
 (0)