From be32c3eeda7eaef22b7375908a79ee985764faeb Mon Sep 17 00:00:00 2001 From: eun-seong Date: Thu, 7 Mar 2024 02:23:25 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20PopulationStatistic=EC=9D=98=20Dash?= =?UTF-8?q?boareType=EC=97=90=20=EB=94=B0=EB=9D=BC=20DashboareComponent=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95(#114)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/dashboard/DashboardService.java | 8 +-- .../dashboard/model/entity/Dashboard.java | 12 ++-- .../statistic/StatisticsRepository.java | 3 + .../domain/statistic/StatisticsService.java | 65 +++++++++---------- .../model/entity/PopulationStatistic.java | 7 ++ .../type/StatisticsCalculationType.java | 8 +++ .../domain/survey/model/entity/Answer.java | 30 +++++++++ 7 files changed, 88 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/dnd/namuiwiki/domain/dashboard/DashboardService.java b/src/main/java/com/dnd/namuiwiki/domain/dashboard/DashboardService.java index dd306bc0..22a69647 100644 --- a/src/main/java/com/dnd/namuiwiki/domain/dashboard/DashboardService.java +++ b/src/main/java/com/dnd/namuiwiki/domain/dashboard/DashboardService.java @@ -5,9 +5,7 @@ import com.dnd.namuiwiki.domain.dashboard.model.DashboardComponent; import com.dnd.namuiwiki.domain.dashboard.model.dto.DashboardDto; import com.dnd.namuiwiki.domain.dashboard.model.entity.Dashboard; -import com.dnd.namuiwiki.domain.dashboard.type.DashboardType; import com.dnd.namuiwiki.domain.jwt.dto.TokenUserInfoDto; -import com.dnd.namuiwiki.domain.question.type.QuestionName; import com.dnd.namuiwiki.domain.statistic.StatisticsService; import com.dnd.namuiwiki.domain.statistic.model.entity.PopulationStatistic; import com.dnd.namuiwiki.domain.survey.model.entity.Answer; @@ -40,12 +38,12 @@ public DashboardDto getDashboard(TokenUserInfoDto tokenUserInfoDto, Period perio } Dashboard dashboard = optionalDashboard.get(); + List populationStatistics = statisticsService.getPopulationStatistics(period, relation); + List populationDashboards = dashboard.getPopulationDashboards(populationStatistics); List userDashboards = dashboard.getUserDashboards(); - PopulationStatistic populationStatistic = statisticsService.getPopulationStatistic(period, relation, QuestionName.BORROWING_LIMIT); - DashboardComponent populationDashboard = dashboard.getPopulationDashboard(populationStatistic, DashboardType.MONEY); List components = new ArrayList<>(userDashboards); - components.add(populationDashboard); + components.addAll(populationDashboards); return new DashboardDto(components); } diff --git a/src/main/java/com/dnd/namuiwiki/domain/dashboard/model/entity/Dashboard.java b/src/main/java/com/dnd/namuiwiki/domain/dashboard/model/entity/Dashboard.java index d706245d..4145c7c5 100644 --- a/src/main/java/com/dnd/namuiwiki/domain/dashboard/model/entity/Dashboard.java +++ b/src/main/java/com/dnd/namuiwiki/domain/dashboard/model/entity/Dashboard.java @@ -49,10 +49,14 @@ public List getUserDashboards() { .toList(); } - public DashboardComponent getPopulationDashboard(PopulationStatistic populationStatistic, DashboardType dashboardType) { - List statisticsByDashboardType = statistics.getStatisticsByDashboardType(dashboardType); - - return DashboardFactory.create(dashboardType, statisticsByDashboardType, populationStatistic); + public List getPopulationDashboards(List populationStatistics) { + return populationStatistics.stream() + .map(populationStatistic -> { + DashboardType dashboardType = populationStatistic.getDashboardType(); + List statisticsByDashboardType = statistics.getStatisticsByDashboardType(dashboardType); + return DashboardFactory.create(dashboardType, statisticsByDashboardType, populationStatistic); + }) + .toList(); } public static Dashboard createNew(User owner, Period period, Relation relation, List answers) { diff --git a/src/main/java/com/dnd/namuiwiki/domain/statistic/StatisticsRepository.java b/src/main/java/com/dnd/namuiwiki/domain/statistic/StatisticsRepository.java index f41a277c..5b947731 100644 --- a/src/main/java/com/dnd/namuiwiki/domain/statistic/StatisticsRepository.java +++ b/src/main/java/com/dnd/namuiwiki/domain/statistic/StatisticsRepository.java @@ -6,8 +6,11 @@ import com.dnd.namuiwiki.domain.survey.type.Relation; import org.springframework.data.mongodb.repository.MongoRepository; +import java.util.List; import java.util.Optional; public interface StatisticsRepository extends MongoRepository { Optional findByPeriodAndRelationAndQuestionName(Period period, Relation relation, QuestionName name); + + List findAllByPeriodAndRelation(Period period, Relation relation); } diff --git a/src/main/java/com/dnd/namuiwiki/domain/statistic/StatisticsService.java b/src/main/java/com/dnd/namuiwiki/domain/statistic/StatisticsService.java index 1ec2d994..1af895b9 100644 --- a/src/main/java/com/dnd/namuiwiki/domain/statistic/StatisticsService.java +++ b/src/main/java/com/dnd/namuiwiki/domain/statistic/StatisticsService.java @@ -1,11 +1,10 @@ package com.dnd.namuiwiki.domain.statistic; -import com.dnd.namuiwiki.common.exception.ApplicationErrorException; -import com.dnd.namuiwiki.common.exception.ApplicationErrorType; -import com.dnd.namuiwiki.domain.option.entity.Option; +import com.dnd.namuiwiki.domain.dashboard.type.DashboardType; import com.dnd.namuiwiki.domain.question.type.QuestionName; import com.dnd.namuiwiki.domain.statistic.model.AverageEntireStatistic; import com.dnd.namuiwiki.domain.statistic.model.entity.PopulationStatistic; +import com.dnd.namuiwiki.domain.statistic.type.StatisticsCalculationType; import com.dnd.namuiwiki.domain.survey.model.entity.Answer; import com.dnd.namuiwiki.domain.survey.model.entity.Survey; import com.dnd.namuiwiki.domain.survey.type.Period; @@ -24,14 +23,34 @@ public void updateStatistics(Survey survey) { Period period = survey.getPeriod(); Relation relation = survey.getRelation(); - var statisticalAnswers = survey.getAnswers().stream() - .filter(answer -> answer.getQuestion().getDashboardType().getStatisticsCalculationType().isNotNone()) - .toList(); + survey.getAnswers().stream() + .filter(answer -> answer.getQuestion().getDashboardType().getAnalysisType().isPopulation()) + .forEach(answer -> { + QuestionName questionName = answer.getQuestion().getName(); + DashboardType dashboardType = answer.getQuestion().getDashboardType(); + StatisticsCalculationType calculationType = dashboardType.getStatisticsCalculationType(); + if (calculationType.isAverage()) { + updateAverageStatistic(questionName, period, relation, answer); + } + }); + } + + private void updateAverageStatistic(QuestionName questionName, Period period, Relation relation, Answer answer) { + long newValue = answer.getAnswer(Long.class); - updateBorrowingLimitStatistic(period, relation, statisticalAnswers); + updateAverageStatisticByCategory(questionName, null, null, newValue); + updateAverageStatisticByCategory(questionName, period, null, newValue); + updateAverageStatisticByCategory(questionName, null, relation, newValue); } - public PopulationStatistic getPopulationStatistic(Period period, Relation relation, QuestionName questionName) { + private void updateAverageStatisticByCategory(QuestionName questionName, Period period, Relation relation, long newValue) { + PopulationStatistic populationStatistic = getPopulationStatistic(period, relation, questionName); + populationStatistic.updateStatistic(String.valueOf(newValue)); + + statisticsRepository.save(populationStatistic); + } + + private PopulationStatistic getPopulationStatistic(Period period, Relation relation, QuestionName questionName) { return statisticsRepository .findByPeriodAndRelationAndQuestionName(period, relation, questionName) .orElseGet(() -> PopulationStatistic.builder() @@ -42,34 +61,8 @@ public PopulationStatistic getPopulationStatistic(Period period, Relation relati .build()); } - private void updateBorrowingLimitStatistic(Period period, Relation relation, List answers) { - Answer borroingLimitAnswer = answers.stream() - .filter(answer -> answer.getQuestion().getName() == QuestionName.BORROWING_LIMIT) - .findFirst() - .orElseThrow(() -> new ApplicationErrorException(ApplicationErrorType.INVALID_DATA_ARGUMENT)); - - long borrowingLimit; - if (borroingLimitAnswer.getType().isOption()) { - Option option = borroingLimitAnswer.getQuestion().getOptions().get(borroingLimitAnswer.getAnswer().toString()); - borrowingLimit = (long) option.getValue(); - } else { - borrowingLimit = (long) borroingLimitAnswer.getAnswer(); - } - - updateBorrowingLimitStatisticByCategory(null, null, borrowingLimit); - updateBorrowingLimitStatisticByCategory(period, null, borrowingLimit); - updateBorrowingLimitStatisticByCategory(null, relation, borrowingLimit); - } - - private void updateBorrowingLimitStatisticByCategory(Period period, Relation relation, long borrowingLimit) { - PopulationStatistic populationStatistic = getPopulationStatistic(period, relation, QuestionName.BORROWING_LIMIT); - - AverageEntireStatistic statistic = (AverageEntireStatistic) populationStatistic.getStatistic(); - statistic.updateStatistic(String.valueOf(borrowingLimit)); - - populationStatistic.setStatistic(statistic); - - statisticsRepository.save(populationStatistic); + public List getPopulationStatistics(Period period, Relation relation) { + return statisticsRepository.findAllByPeriodAndRelation(period, relation); } } diff --git a/src/main/java/com/dnd/namuiwiki/domain/statistic/model/entity/PopulationStatistic.java b/src/main/java/com/dnd/namuiwiki/domain/statistic/model/entity/PopulationStatistic.java index 6ba829cf..4144c429 100644 --- a/src/main/java/com/dnd/namuiwiki/domain/statistic/model/entity/PopulationStatistic.java +++ b/src/main/java/com/dnd/namuiwiki/domain/statistic/model/entity/PopulationStatistic.java @@ -1,5 +1,6 @@ package com.dnd.namuiwiki.domain.statistic.model.entity; +import com.dnd.namuiwiki.domain.dashboard.type.DashboardType; import com.dnd.namuiwiki.domain.question.type.QuestionName; import com.dnd.namuiwiki.domain.statistic.model.EntireStatistic; import com.dnd.namuiwiki.domain.survey.type.Period; @@ -25,6 +26,12 @@ public class PopulationStatistic { private QuestionName questionName; + private DashboardType dashboardType; + private EntireStatistic statistic; + public void updateStatistic(String... args) { + statistic.updateStatistic(args); + } + } diff --git a/src/main/java/com/dnd/namuiwiki/domain/statistic/type/StatisticsCalculationType.java b/src/main/java/com/dnd/namuiwiki/domain/statistic/type/StatisticsCalculationType.java index bd8a742e..a8625ae9 100644 --- a/src/main/java/com/dnd/namuiwiki/domain/statistic/type/StatisticsCalculationType.java +++ b/src/main/java/com/dnd/namuiwiki/domain/statistic/type/StatisticsCalculationType.java @@ -10,4 +10,12 @@ public boolean isNotNone() { return this != NONE; } + public boolean isRatio() { + return this == RATIO; + } + + public boolean isAverage() { + return this == AVERAGE; + } + } diff --git a/src/main/java/com/dnd/namuiwiki/domain/survey/model/entity/Answer.java b/src/main/java/com/dnd/namuiwiki/domain/survey/model/entity/Answer.java index ddf7b2f6..0a4ca8f3 100644 --- a/src/main/java/com/dnd/namuiwiki/domain/survey/model/entity/Answer.java +++ b/src/main/java/com/dnd/namuiwiki/domain/survey/model/entity/Answer.java @@ -2,6 +2,7 @@ import com.dnd.namuiwiki.common.exception.ApplicationErrorException; import com.dnd.namuiwiki.common.exception.ApplicationErrorType; +import com.dnd.namuiwiki.domain.option.entity.Option; import com.dnd.namuiwiki.domain.question.entity.Question; import com.dnd.namuiwiki.domain.question.type.QuestionType; import com.dnd.namuiwiki.domain.survey.type.AnswerType; @@ -42,6 +43,35 @@ public Answer(Question question, AnswerType type, Object answer, String reason) this.reason = reason; } + public T getAnswer(Class returnType) { + Object value; + + if (type.isOption()) { + Option option = question.getOptions().get(answer.toString()); + value = option.getValue(); + } else { + value = answer; + } + + if (value == null) { + throw new ApplicationErrorException(ApplicationErrorType.INTERNAL_ERROR); + } + + if (returnType == Long.class) { + if (isNumericAnswerNeeded()) { + return (T) value; + } else { + throw new ApplicationErrorException(ApplicationErrorType.NOT_INTEGER_ANSWER); + } + } + + return returnType.cast(value); + } + + private boolean isNumericAnswerNeeded() { + return question.getType().isNumericType() && type.isManual(); + } + private void validateBorrowingLimit(long longAnswer) { if (!(0 <= longAnswer && longAnswer <= 1_000_000_000)) { throw new ApplicationErrorException(ApplicationErrorType.INVALID_BORROWING_LIMIT);