diff --git a/lionheart-api/src/main/java/com/chiwawa/lionheart/api/service/article/ArticleRetrieveService.java b/lionheart-api/src/main/java/com/chiwawa/lionheart/api/service/article/ArticleRetrieveService.java index 7e62d5d..05b4d21 100644 --- a/lionheart-api/src/main/java/com/chiwawa/lionheart/api/service/article/ArticleRetrieveService.java +++ b/lionheart-api/src/main/java/com/chiwawa/lionheart/api/service/article/ArticleRetrieveService.java @@ -72,6 +72,7 @@ public ArticleSummaryResponse findArticlesByWeekAndMemberId(Long memberId, short } + @Transactional public ArticleDetailResponse findArticleDetail(Long memberId, Long articleId) { Article article = ArticleServiceUtils.findArticleById(articleRepository, articleId); Member member = MemberServiceUtils.findMemberById(memberRepository, memberId); diff --git a/lionheart-api/src/main/java/com/chiwawa/lionheart/api/service/challenge/ChallengeService.java b/lionheart-api/src/main/java/com/chiwawa/lionheart/api/service/challenge/ChallengeService.java index 292c9d0..026dcc7 100644 --- a/lionheart-api/src/main/java/com/chiwawa/lionheart/api/service/challenge/ChallengeService.java +++ b/lionheart-api/src/main/java/com/chiwawa/lionheart/api/service/challenge/ChallengeService.java @@ -1,20 +1,16 @@ package com.chiwawa.lionheart.api.service.challenge; -import static com.chiwawa.lionheart.common.constant.message.AttendanceErrorMessage.*; - import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; +import java.util.Optional; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.chiwawa.lionheart.api.service.member.MemberServiceUtils; import com.chiwawa.lionheart.common.dto.WeekAndDay; -import com.chiwawa.lionheart.common.exception.ErrorCode; -import com.chiwawa.lionheart.common.exception.model.NotFoundException; import com.chiwawa.lionheart.common.util.DateUtils; -import com.chiwawa.lionheart.common.util.MessageUtils; import com.chiwawa.lionheart.domain.domain.article.Article; import com.chiwawa.lionheart.domain.domain.challenge.Attendance; import com.chiwawa.lionheart.domain.domain.challenge.repository.AttendanceRepository; @@ -33,6 +29,10 @@ public class ChallengeService { private final static int ZERO = 0; public void checkAttendance(Article article, Member member) { + if (isNotAttended(member)) { + return; + } + WeekAndDay weekAndDay = MemberServiceUtils.findMemberWeekAndDay(member); boolean isTodayArticle = weekAndDay.equals(WeekAndDay.of(article.getWeek(), article.getDay())); @@ -45,7 +45,7 @@ public void checkAttendance(Article article, Member member) { } private boolean validateLastAttendanceIsNotToday(Member member) { - Attendance latestMemberAttendance = findMemberLastAttendance(member); + Attendance latestMemberAttendance = findMemberLastAttendance(member).get(); int dayDifference = DateUtils.getDayDifference(LocalDateTime.now(), latestMemberAttendance.getCreatedAt()); if (dayDifference == ZERO) { @@ -54,13 +54,17 @@ private boolean validateLastAttendanceIsNotToday(Member member) { return false; } - private Attendance findMemberLastAttendance(Member member) { - List memberAttendances = attendanceRepository.findAttendancesByMember(member); + private boolean isNotAttended(Member member) { + Optional firstMemberAttendance = findMemberLastAttendance(member); + if (firstMemberAttendance.isEmpty()) { + return true; + } + + return DateUtils.getDayDifference(LocalDateTime.now(), firstMemberAttendance.get().getCreatedAt()) != ZERO; + } - return memberAttendances.stream().max(Comparator.comparing(Attendance::getCreatedAt)) - .orElseThrow(() -> - new NotFoundException( - MessageUtils.generate(NOT_EXIST_MEMBER_ATTENDANCE_DATA_ERROR_MESSAGE, member.getId()), - ErrorCode.NOT_FOUND_MEMBER_ATTENDANCE_DATA_EXCEPTION)); + private Optional findMemberLastAttendance(Member member) { + List memberAttendances = attendanceRepository.findAttendancesByMember(member); + return memberAttendances.stream().max(Comparator.comparing(Attendance::getCreatedAt)); } } diff --git a/lionheart-api/src/main/resources/application-local.yml b/lionheart-api/src/main/resources/application-local.yml index 56c6cc2..85dcf52 100644 --- a/lionheart-api/src/main/resources/application-local.yml +++ b/lionheart-api/src/main/resources/application-local.yml @@ -7,7 +7,7 @@ spring: sql: init: - mode: always + mode: never schema-locations: classpath:sql/schema.sql data-locations: classpath:sql/data.sql diff --git a/lionheart-common/src/main/java/com/chiwawa/lionheart/common/constant/message/AttendanceErrorMessage.java b/lionheart-common/src/main/java/com/chiwawa/lionheart/common/constant/message/AttendanceErrorMessage.java deleted file mode 100644 index 7debd45..0000000 --- a/lionheart-common/src/main/java/com/chiwawa/lionheart/common/constant/message/AttendanceErrorMessage.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.chiwawa.lionheart.common.constant.message; - -public class AttendanceErrorMessage { - - public static final String NOT_EXIST_MEMBER_ATTENDANCE_DATA_ERROR_MESSAGE = "해당 유저(%s)의 출석체크 정보가 존재하지 않습니다"; -} diff --git a/lionheart-common/src/main/java/com/chiwawa/lionheart/common/exception/ErrorCode.java b/lionheart-common/src/main/java/com/chiwawa/lionheart/common/exception/ErrorCode.java index a7b044d..300ea84 100644 --- a/lionheart-common/src/main/java/com/chiwawa/lionheart/common/exception/ErrorCode.java +++ b/lionheart-common/src/main/java/com/chiwawa/lionheart/common/exception/ErrorCode.java @@ -28,7 +28,6 @@ public enum ErrorCode { NOT_FOUND_CHALLENGE_EXCEPTION("N004", "존재하지 않는 챌린지입니다."), NOT_FOUND_ARTICLE_EXCEPTION("N005", "삭제되었거나 존재하지 않는 아티클입니다."), NOT_FOUND_ARTICLE_IN_WEEK_AND_DAY_EXCEPTION("N006", "해당 주차 일차에 해당하는 아티클이 존재하지 않습니다."), - NOT_FOUND_MEMBER_ATTENDANCE_DATA_EXCEPTION("N007", "해당 유저의 출석체크 정보가 존재하지 않습니다"), // Conflict Exception CONFLICT_EXCEPTION("C001", "이미 존재합니다."), diff --git a/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/article/Article.java b/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/article/Article.java index 21c5346..02b173d 100644 --- a/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/article/Article.java +++ b/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/article/Article.java @@ -47,6 +47,7 @@ public class Article extends BaseEntity { private String title; @Column(name = "CATEGORY", length = 30) + @Enumerated(value = EnumType.STRING) private Category category; @Column(name = "MAIN_IMAGE_URL", nullable = false, length = 300) @@ -59,10 +60,10 @@ public class Article extends BaseEntity { private String author; @Column(name = "WEEK") - private short week; + private Short week; @Column(name = "DAY") - private short day; + private Short day; @Column(name = "REQUIRED_TIME", nullable = false) private short requiredTime; diff --git a/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/challenge/Attendance.java b/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/challenge/Attendance.java index 2317e06..3ff12e9 100644 --- a/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/challenge/Attendance.java +++ b/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/challenge/Attendance.java @@ -35,4 +35,10 @@ public class Attendance extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "MEMBER_ID", nullable = false) private Member member; + + public static Attendance newInstance(Member member) { + return Attendance.builder() + .member(member) + .build(); + } } diff --git a/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/challenge/repository/ChallengeRepositoryCustom.java b/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/challenge/repository/ChallengeRepositoryCustom.java index 2df7522..d7e6893 100644 --- a/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/challenge/repository/ChallengeRepositoryCustom.java +++ b/lionheart-domain/src/main/java/com/chiwawa/lionheart/domain/domain/challenge/repository/ChallengeRepositoryCustom.java @@ -8,6 +8,4 @@ public interface ChallengeRepositoryCustom { Optional findChallengeByMember(Member member); - - void checkAttendance(Member member); }