From 5cd613df0fb6119b942b805659e96cb87ad2b605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B8=EC=A4=80?= <74056843+sejoon00@users.noreply.github.com> Date: Fri, 14 Mar 2025 20:19:36 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[feat/#92]=20=EC=9E=84=EC=8B=9C=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Problem/domain/ChildProblemStatistic.java | 32 ++++++++++++++++++ .../Problem/domain/CountStatistic.java | 14 ++++++++ .../statistic/Problem/domain/CountUpper.java | 4 +++ .../Problem/domain/ProblemSetStatistic.java | 31 +++++++++++++++++ .../Problem/domain/ProblemStatistic.java | 33 +++++++++++++++++++ 5 files changed, 114 insertions(+) create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountUpper.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java new file mode 100644 index 00000000..0dfb5561 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java @@ -0,0 +1,32 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ChildProblemStatistic { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "child_problem_statistic_id") + private Long id; + + private Long childProblemId; + + @Embedded + private CountStatistic countStatistic; + + public ChildProblemStatistic(Long childProblemId) { + this.childProblemId = childProblemId; + this.countStatistic = new CountStatistic(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java new file mode 100644 index 00000000..793c0d71 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java @@ -0,0 +1,14 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import jakarta.persistence.Embeddable; + +@Embeddable +public class CountStatistic { + private Long viewCount; + private Long submitCount; + + public CountStatistic() { + this.viewCount = 0L; + this.submitCount = 0L; + } +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountUpper.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountUpper.java new file mode 100644 index 00000000..fca28a41 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountUpper.java @@ -0,0 +1,4 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +public interface CountUpper { +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java new file mode 100644 index 00000000..2a913f21 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java @@ -0,0 +1,31 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ProblemSetStatistic { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "problem_set_statistic_id") + private Long id; + + private Long problemSetId; + private Long viewCount; + private Long submitCount; + + public ProblemSetStatistic(Long problemSetId, Long viewCount, Long submitCount) { + this.problemSetId = problemSetId; + this.viewCount = viewCount; + this.submitCount = submitCount; + } +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java new file mode 100644 index 00000000..e10c4e2d --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java @@ -0,0 +1,33 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ProblemStatistic { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "problem_statistic_id") + private Long id; + + private Long problemId; + private Long viewCount; + private Long submitCount; + + @Builder + public ProblemStatistic(Long problemId, Long viewCount, Long submitCount) { + this.problemId = problemId; + this.viewCount = viewCount; + this.submitCount = submitCount; + } +} From 235ab2ad9947077ab8dc8f6a017da0c94bde9922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B8=EC=A4=80?= <74056843+sejoon00@users.noreply.github.com> Date: Sun, 16 Mar 2025 00:36:10 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[feat/#92]=20=ED=86=B5=EA=B3=84=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/error/exception/ErrorCode.java | 5 +++ .../Problem/domain/ChildProblemStatistic.java | 12 ++++++- .../Problem/domain/CountStatistic.java | 12 ++++++- .../statistic/Problem/domain/CountUpper.java | 4 --- .../Problem/domain/ProblemSetStatistic.java | 16 ++++++++- .../Problem/domain/ProblemStatistic.java | 16 ++++++++- .../Problem/domain/StatisticCounter.java | 11 +++++++ .../Problem/domain/StatisticEntityTarget.java | 5 +++ .../Problem/domain/StatisticFieldType.java | 16 +++++++++ .../ChildProblemStatisticRepository.java | 13 ++++++++ .../ProblemSetStatisticRepository.java | 13 ++++++++ .../ProblemStatisticRepository.java | 13 ++++++++ .../service/CountStatisticsUpdateService.java | 33 +++++++++++++++++++ 13 files changed, 161 insertions(+), 8 deletions(-) delete mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountUpper.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticCounter.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticEntityTarget.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticFieldType.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ChildProblemStatisticRepository.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemSetStatisticRepository.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemStatisticRepository.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateService.java diff --git a/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java b/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java index 52a7fa02..8b43db9d 100644 --- a/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java +++ b/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java @@ -76,6 +76,11 @@ public enum ErrorCode { ALREADY_PUBLISHED_ERROR(HttpStatus.BAD_REQUEST, "이미 발행된 문항세트는 컨펌해제할 수 없습니다."), PROBLEM_SET_DELETED(HttpStatus.BAD_REQUEST, "삭제된 문항세트는 발행할 수 없습니다"), PROBLEM_SET_NOT_CONFIRMED(HttpStatus.BAD_REQUEST, "컨펌되지 않은 문항세트는 발행할 수 없습니다"), + + // 통계 + PROBLEM_STATISTIC_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 문항의 통계 정보를 찾을 수 없습니다"), + PROBLEM_SET_STATISTIC_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 문항세트의 통계 정보를 찾을 수 없습니다"), + CHILD_PROBLEM_STATISTIC_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 새끼 문항의 통계 정보를 찾을 수 없습니다"), ; diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java index 0dfb5561..a69f4f99 100644 --- a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java @@ -13,7 +13,7 @@ @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ChildProblemStatistic { +public class ChildProblemStatistic implements StatisticCounter { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -29,4 +29,14 @@ public ChildProblemStatistic(Long childProblemId) { this.childProblemId = childProblemId; this.countStatistic = new CountStatistic(); } + + @Override + public void addViewCount() { + this.countStatistic.addViewCount(); + } + + @Override + public void addSubmitCount() { + this.countStatistic.addSubmitCount(); + } } diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java index 793c0d71..0e38e52d 100644 --- a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java @@ -3,7 +3,7 @@ import jakarta.persistence.Embeddable; @Embeddable -public class CountStatistic { +public class CountStatistic implements StatisticCounter { private Long viewCount; private Long submitCount; @@ -11,4 +11,14 @@ public CountStatistic() { this.viewCount = 0L; this.submitCount = 0L; } + + @Override + public void addViewCount() { + this.viewCount++; + } + + @Override + public void addSubmitCount() { + this.submitCount++; + } } diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountUpper.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountUpper.java deleted file mode 100644 index fca28a41..00000000 --- a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountUpper.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.moplus.moplus_server.statistic.Problem.domain; - -public interface CountUpper { -} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java index 2a913f21..e7021d80 100644 --- a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java @@ -1,6 +1,7 @@ package com.moplus.moplus_server.statistic.Problem.domain; import jakarta.persistence.Column; +import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -12,7 +13,7 @@ @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ProblemSetStatistic { +public class ProblemSetStatistic implements StatisticCounter { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -23,9 +24,22 @@ public class ProblemSetStatistic { private Long viewCount; private Long submitCount; + @Embedded + private CountStatistic countStatistic; + public ProblemSetStatistic(Long problemSetId, Long viewCount, Long submitCount) { this.problemSetId = problemSetId; this.viewCount = viewCount; this.submitCount = submitCount; } + + @Override + public void addViewCount() { + this.countStatistic.addViewCount(); + } + + @Override + public void addSubmitCount() { + this.countStatistic.addSubmitCount(); + } } diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java index e10c4e2d..ba3be5a0 100644 --- a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java @@ -1,6 +1,7 @@ package com.moplus.moplus_server.statistic.Problem.domain; import jakarta.persistence.Column; +import jakarta.persistence.Embedded; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -13,7 +14,7 @@ @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ProblemStatistic { +public class ProblemStatistic implements StatisticCounter { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -24,10 +25,23 @@ public class ProblemStatistic { private Long viewCount; private Long submitCount; + @Embedded + private CountStatistic countStatistic; + @Builder public ProblemStatistic(Long problemId, Long viewCount, Long submitCount) { this.problemId = problemId; this.viewCount = viewCount; this.submitCount = submitCount; } + + @Override + public void addViewCount() { + this.countStatistic.addViewCount(); + } + + @Override + public void addSubmitCount() { + this.countStatistic.addSubmitCount(); + } } diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticCounter.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticCounter.java new file mode 100644 index 00000000..3c8b309d --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticCounter.java @@ -0,0 +1,11 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +public interface StatisticCounter { + void addSubmitCount(); + + void addViewCount(); + + default void updateCount(StatisticFieldType type) { + type.updateCount(this); + } +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticEntityTarget.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticEntityTarget.java new file mode 100644 index 00000000..d66eba95 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticEntityTarget.java @@ -0,0 +1,5 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +public enum StatisticEntityTarget { + PROBLEM, PROBLEM_SET, CHILD_PROBLEM +} diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticFieldType.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticFieldType.java new file mode 100644 index 00000000..771214d7 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/StatisticFieldType.java @@ -0,0 +1,16 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import java.util.function.Consumer; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum StatisticFieldType { + VIEW(StatisticCounter::addViewCount), + SUBMIT(StatisticCounter::addSubmitCount); + + private final Consumer countUpdater; + + public void updateCount(StatisticCounter counter) { + countUpdater.accept(counter); + } +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ChildProblemStatisticRepository.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ChildProblemStatisticRepository.java new file mode 100644 index 00000000..31f10665 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ChildProblemStatisticRepository.java @@ -0,0 +1,13 @@ +package com.moplus.moplus_server.statistic.Problem.repository; + +import com.moplus.moplus_server.global.error.exception.ErrorCode; +import com.moplus.moplus_server.global.error.exception.NotFoundException; +import com.moplus.moplus_server.statistic.Problem.domain.ChildProblemStatistic; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ChildProblemStatisticRepository extends JpaRepository { + default ChildProblemStatistic findByIdElseThrow(Long id) { + return findById(id) + .orElseThrow(() -> new NotFoundException(ErrorCode.CHILD_PROBLEM_STATISTIC_NOT_FOUND)); + } +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemSetStatisticRepository.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemSetStatisticRepository.java new file mode 100644 index 00000000..349d6d6f --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemSetStatisticRepository.java @@ -0,0 +1,13 @@ +package com.moplus.moplus_server.statistic.Problem.repository; + +import com.moplus.moplus_server.global.error.exception.ErrorCode; +import com.moplus.moplus_server.global.error.exception.NotFoundException; +import com.moplus.moplus_server.statistic.Problem.domain.ProblemSetStatistic; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProblemSetStatisticRepository extends JpaRepository { + default ProblemSetStatistic findByIdElseThrow(Long id) { + return findById(id) + .orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_SET_STATISTIC_NOT_FOUND)); + } +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemStatisticRepository.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemStatisticRepository.java new file mode 100644 index 00000000..59bbfcc5 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemStatisticRepository.java @@ -0,0 +1,13 @@ +package com.moplus.moplus_server.statistic.Problem.repository; + +import com.moplus.moplus_server.global.error.exception.ErrorCode; +import com.moplus.moplus_server.global.error.exception.NotFoundException; +import com.moplus.moplus_server.statistic.Problem.domain.ProblemStatistic; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProblemStatisticRepository extends JpaRepository { + default ProblemStatistic findByIdElseThrow(Long id) { + return findById(id) + .orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_STATISTIC_NOT_FOUND)); + } +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateService.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateService.java new file mode 100644 index 00000000..29801647 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateService.java @@ -0,0 +1,33 @@ +package com.moplus.moplus_server.statistic.Problem.service; + +import com.moplus.moplus_server.statistic.Problem.domain.StatisticCounter; +import com.moplus.moplus_server.statistic.Problem.domain.StatisticEntityTarget; +import com.moplus.moplus_server.statistic.Problem.domain.StatisticFieldType; +import com.moplus.moplus_server.statistic.Problem.repository.ChildProblemStatisticRepository; +import com.moplus.moplus_server.statistic.Problem.repository.ProblemSetStatisticRepository; +import com.moplus.moplus_server.statistic.Problem.repository.ProblemStatisticRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class CountStatisticsUpdateService { + private final ProblemStatisticRepository problemStatisticRepository; + private final ProblemSetStatisticRepository problemSetStatisticRepository; + private final ChildProblemStatisticRepository childProblemStatisticRepository; + + @Transactional + public void updateStatistics(Long id, StatisticFieldType type, StatisticEntityTarget target) { + StatisticCounter statistic = findStatistic(id, target); + statistic.updateCount(type); + } + + private StatisticCounter findStatistic(Long id, StatisticEntityTarget target) { + return switch (target) { + case PROBLEM -> problemStatisticRepository.findByIdElseThrow(id); + case PROBLEM_SET -> problemSetStatisticRepository.findByIdElseThrow(id); + case CHILD_PROBLEM -> childProblemStatisticRepository.findByIdElseThrow(id); + }; + } +} From 91cdcb3c16fb120bd1f4b7dc23a83e07783d6de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B8=EC=A4=80?= <74056843+sejoon00@users.noreply.github.com> Date: Sun, 16 Mar 2025 16:41:46 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[feat/#92]=20=EC=A1=B0=ED=9A=8C=EC=88=98,?= =?UTF-8?q?=20=ED=92=80=EC=9D=B4=EC=88=98=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=ED=86=B5=EA=B3=84=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EA=B3=B5=ED=86=B5=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/QChildProblemStatistic.java | 53 +++++++++++ .../Problem/domain/QCountStatistic.java | 39 +++++++++ .../Problem/domain/QProblemSetStatistic.java | 53 +++++++++++ .../Problem/domain/QProblemStatistic.java | 53 +++++++++++ .../Problem/domain/ChildProblemStatistic.java | 8 ++ .../Problem/domain/CountStatistic.java | 2 + .../Problem/domain/ProblemSetStatistic.java | 15 ++-- .../Problem/domain/ProblemStatistic.java | 15 ++-- .../CountStatisticsUpdateServiceTest.java | 87 +++++++++++++++++++ 9 files changed, 315 insertions(+), 10 deletions(-) create mode 100644 src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QChildProblemStatistic.java create mode 100644 src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QCountStatistic.java create mode 100644 src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemSetStatistic.java create mode 100644 src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemStatistic.java create mode 100644 src/test/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateServiceTest.java diff --git a/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QChildProblemStatistic.java b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QChildProblemStatistic.java new file mode 100644 index 00000000..a77720c4 --- /dev/null +++ b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QChildProblemStatistic.java @@ -0,0 +1,53 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QChildProblemStatistic is a Querydsl query type for ChildProblemStatistic + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QChildProblemStatistic extends EntityPathBase { + + private static final long serialVersionUID = 1136828573L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QChildProblemStatistic childProblemStatistic = new QChildProblemStatistic("childProblemStatistic"); + + public final NumberPath childProblemId = createNumber("childProblemId", Long.class); + + public final QCountStatistic countStatistic; + + public final NumberPath id = createNumber("id", Long.class); + + public QChildProblemStatistic(String variable) { + this(ChildProblemStatistic.class, forVariable(variable), INITS); + } + + public QChildProblemStatistic(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QChildProblemStatistic(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QChildProblemStatistic(PathMetadata metadata, PathInits inits) { + this(ChildProblemStatistic.class, metadata, inits); + } + + public QChildProblemStatistic(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.countStatistic = inits.isInitialized("countStatistic") ? new QCountStatistic(forProperty("countStatistic")) : null; + } + +} + diff --git a/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QCountStatistic.java b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QCountStatistic.java new file mode 100644 index 00000000..5b0ba49d --- /dev/null +++ b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QCountStatistic.java @@ -0,0 +1,39 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QCountStatistic is a Querydsl query type for CountStatistic + */ +@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") +public class QCountStatistic extends BeanPath { + + private static final long serialVersionUID = 1047466257L; + + public static final QCountStatistic countStatistic = new QCountStatistic("countStatistic"); + + public final NumberPath submitCount = createNumber("submitCount", Long.class); + + public final NumberPath viewCount = createNumber("viewCount", Long.class); + + public QCountStatistic(String variable) { + super(CountStatistic.class, forVariable(variable)); + } + + public QCountStatistic(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QCountStatistic(PathMetadata metadata) { + super(CountStatistic.class, metadata); + } + +} + diff --git a/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemSetStatistic.java b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemSetStatistic.java new file mode 100644 index 00000000..6d992ad2 --- /dev/null +++ b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemSetStatistic.java @@ -0,0 +1,53 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QProblemSetStatistic is a Querydsl query type for ProblemSetStatistic + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QProblemSetStatistic extends EntityPathBase { + + private static final long serialVersionUID = -1319940803L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QProblemSetStatistic problemSetStatistic = new QProblemSetStatistic("problemSetStatistic"); + + public final QCountStatistic countStatistic; + + public final NumberPath id = createNumber("id", Long.class); + + public final NumberPath problemSetId = createNumber("problemSetId", Long.class); + + public QProblemSetStatistic(String variable) { + this(ProblemSetStatistic.class, forVariable(variable), INITS); + } + + public QProblemSetStatistic(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QProblemSetStatistic(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QProblemSetStatistic(PathMetadata metadata, PathInits inits) { + this(ProblemSetStatistic.class, metadata, inits); + } + + public QProblemSetStatistic(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.countStatistic = inits.isInitialized("countStatistic") ? new QCountStatistic(forProperty("countStatistic")) : null; + } + +} + diff --git a/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemStatistic.java b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemStatistic.java new file mode 100644 index 00000000..8eae98c4 --- /dev/null +++ b/src/main/generated/com/moplus/moplus_server/statistic/Problem/domain/QProblemStatistic.java @@ -0,0 +1,53 @@ +package com.moplus.moplus_server.statistic.Problem.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QProblemStatistic is a Querydsl query type for ProblemStatistic + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QProblemStatistic extends EntityPathBase { + + private static final long serialVersionUID = 843488641L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QProblemStatistic problemStatistic = new QProblemStatistic("problemStatistic"); + + public final QCountStatistic countStatistic; + + public final NumberPath id = createNumber("id", Long.class); + + public final NumberPath problemId = createNumber("problemId", Long.class); + + public QProblemStatistic(String variable) { + this(ProblemStatistic.class, forVariable(variable), INITS); + } + + public QProblemStatistic(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QProblemStatistic(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QProblemStatistic(PathMetadata metadata, PathInits inits) { + this(ProblemStatistic.class, metadata, inits); + } + + public QProblemStatistic(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.countStatistic = inits.isInitialized("countStatistic") ? new QCountStatistic(forProperty("countStatistic")) : null; + } + +} + diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java index a69f4f99..9740c72c 100644 --- a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ChildProblemStatistic.java @@ -39,4 +39,12 @@ public void addViewCount() { public void addSubmitCount() { this.countStatistic.addSubmitCount(); } + + public Long getViewCount() { + return this.countStatistic.getViewCount(); + } + + public Long getSubmitCount() { + return this.countStatistic.getSubmitCount(); + } } diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java index 0e38e52d..91e1f0c6 100644 --- a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/CountStatistic.java @@ -1,7 +1,9 @@ package com.moplus.moplus_server.statistic.Problem.domain; import jakarta.persistence.Embeddable; +import lombok.Getter; +@Getter @Embeddable public class CountStatistic implements StatisticCounter { private Long viewCount; diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java index e7021d80..92db7f42 100644 --- a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemSetStatistic.java @@ -21,16 +21,13 @@ public class ProblemSetStatistic implements StatisticCounter { private Long id; private Long problemSetId; - private Long viewCount; - private Long submitCount; @Embedded private CountStatistic countStatistic; - public ProblemSetStatistic(Long problemSetId, Long viewCount, Long submitCount) { + public ProblemSetStatistic(Long problemSetId) { this.problemSetId = problemSetId; - this.viewCount = viewCount; - this.submitCount = submitCount; + this.countStatistic = new CountStatistic(); } @Override @@ -42,4 +39,12 @@ public void addViewCount() { public void addSubmitCount() { this.countStatistic.addSubmitCount(); } + + public Long getViewCount() { + return this.countStatistic.getViewCount(); + } + + public Long getSubmitCount() { + return this.countStatistic.getSubmitCount(); + } } diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java index ba3be5a0..0ab5c68e 100644 --- a/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/domain/ProblemStatistic.java @@ -22,17 +22,14 @@ public class ProblemStatistic implements StatisticCounter { private Long id; private Long problemId; - private Long viewCount; - private Long submitCount; @Embedded private CountStatistic countStatistic; @Builder - public ProblemStatistic(Long problemId, Long viewCount, Long submitCount) { + public ProblemStatistic(Long problemId) { this.problemId = problemId; - this.viewCount = viewCount; - this.submitCount = submitCount; + this.countStatistic = new CountStatistic(); } @Override @@ -44,4 +41,12 @@ public void addViewCount() { public void addSubmitCount() { this.countStatistic.addSubmitCount(); } + + public Long getViewCount() { + return this.countStatistic.getViewCount(); + } + + public Long getSubmitCount() { + return this.countStatistic.getSubmitCount(); + } } diff --git a/src/test/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateServiceTest.java b/src/test/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateServiceTest.java new file mode 100644 index 00000000..94e133e3 --- /dev/null +++ b/src/test/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateServiceTest.java @@ -0,0 +1,87 @@ +package com.moplus.moplus_server.statistic.Problem.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; + +import com.moplus.moplus_server.statistic.Problem.domain.ChildProblemStatistic; +import com.moplus.moplus_server.statistic.Problem.domain.ProblemSetStatistic; +import com.moplus.moplus_server.statistic.Problem.domain.ProblemStatistic; +import com.moplus.moplus_server.statistic.Problem.domain.StatisticEntityTarget; +import com.moplus.moplus_server.statistic.Problem.domain.StatisticFieldType; +import com.moplus.moplus_server.statistic.Problem.repository.ChildProblemStatisticRepository; +import com.moplus.moplus_server.statistic.Problem.repository.ProblemSetStatisticRepository; +import com.moplus.moplus_server.statistic.Problem.repository.ProblemStatisticRepository; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +class CountStatisticsUpdateServiceTest { + + @InjectMocks + private CountStatisticsUpdateService countStatisticsUpdateService; + + @Mock + private ProblemStatisticRepository problemStatisticRepository; + @Mock + private ProblemSetStatisticRepository problemSetStatisticRepository; + @Mock + private ChildProblemStatisticRepository childProblemStatisticRepository; + + @Test + void 문항_조회수_증가() { + // given + Long problemId = 1L; + ProblemStatistic problemStatistic = new ProblemStatistic(problemId); + given(problemStatisticRepository.findByIdElseThrow(problemId)) + .willReturn(problemStatistic); + + // when + countStatisticsUpdateService.updateStatistics(problemId, StatisticFieldType.VIEW, + StatisticEntityTarget.PROBLEM); + + // then + verify(problemStatisticRepository).findByIdElseThrow(problemId); + assertThat(problemStatistic.getViewCount()).isEqualTo(1L); + assertThat(problemStatistic.getSubmitCount()).isEqualTo(0L); + } + + @Test + void 문항세트_풀이수_증가() { + // given + Long problemSetId = 1L; + ProblemSetStatistic problemSetStatistic = new ProblemSetStatistic(problemSetId); + given(problemSetStatisticRepository.findByIdElseThrow(problemSetId)) + .willReturn(problemSetStatistic); + + // when + countStatisticsUpdateService.updateStatistics(problemSetId, StatisticFieldType.SUBMIT, + StatisticEntityTarget.PROBLEM_SET); + + // then + verify(problemSetStatisticRepository).findByIdElseThrow(problemSetId); + assertThat(problemSetStatistic.getSubmitCount()).isEqualTo(1L); + assertThat(problemSetStatistic.getViewCount()).isEqualTo(0L); + } + + @Test + void 새끼문항_조회수_증가() { + // given + Long childProblemId = 1L; + ChildProblemStatistic childProblemStatistic = new ChildProblemStatistic(childProblemId); + given(childProblemStatisticRepository.findByIdElseThrow(childProblemId)) + .willReturn(childProblemStatistic); + + // when + countStatisticsUpdateService.updateStatistics(childProblemId, StatisticFieldType.VIEW, + StatisticEntityTarget.CHILD_PROBLEM); + + // then + verify(childProblemStatisticRepository).findByIdElseThrow(childProblemId); + assertThat(childProblemStatistic.getViewCount()).isEqualTo(1L); + assertThat(childProblemStatistic.getSubmitCount()).isEqualTo(0L); + } +} \ No newline at end of file