diff --git a/smeem-api/src/main/java/com/smeem/api/badge/service/BadgeService.java b/smeem-api/src/main/java/com/smeem/api/badge/service/BadgeService.java index 948bb3f5..99753537 100644 --- a/smeem-api/src/main/java/com/smeem/api/badge/service/BadgeService.java +++ b/smeem-api/src/main/java/com/smeem/api/badge/service/BadgeService.java @@ -1,12 +1,15 @@ package com.smeem.api.badge.service; +import com.smeem.api.badge.service.dto.response.BadgeGetServiceResponse; import com.smeem.api.badge.service.dto.response.BadgeListServiceResponse; import com.smeem.domain.badge.adapter.BadgeFinder; import com.smeem.domain.badge.model.Badge; import com.smeem.domain.badge.model.BadgeType; +import com.smeem.domain.member.adapter.member.MemberFinder; import com.smeem.domain.member.adapter.memberbadge.MemberBadgeFinder; import com.smeem.domain.member.adapter.memberbadge.MemberBadgeSaver; import com.smeem.domain.member.model.Member; +import com.smeem.domain.member.model.MemberBadge; import lombok.RequiredArgsConstructor; import lombok.val; import org.springframework.stereotype.Service; @@ -22,6 +25,16 @@ public class BadgeService { private final BadgeFinder badgeFinder; private final MemberBadgeSaver memberBadgeSaver; private final MemberBadgeFinder memberBadgeFinder; + private final MemberFinder memberFinder; + + public BadgeGetServiceResponse getBadge(final long badgeId, final long memberId) { + val memberBadge = memberBadgeFinder.findByBadgeIdAndMemberId(badgeId, memberId); + val badge = memberBadge.getBadge(); + val memberCount = memberFinder.count(); + val badgeAcquiredMemberCount = memberBadgeFinder.countByBadgeId(memberId); + val badgeAcquiredPercent = String.format("%.2f", (float) badgeAcquiredMemberCount / memberCount * 100); + return BadgeGetServiceResponse.of(badge, badgeAcquiredPercent); + } public BadgeListServiceResponse getBadges(final long memberId) { val badges = badgeFinder.findAllOrderById(); diff --git a/smeem-domain/src/main/java/com/smeem/domain/member/adapter/member/MemberFinder.java b/smeem-domain/src/main/java/com/smeem/domain/member/adapter/member/MemberFinder.java index 81b409fb..b7cb5916 100644 --- a/smeem-domain/src/main/java/com/smeem/domain/member/adapter/member/MemberFinder.java +++ b/smeem-domain/src/main/java/com/smeem/domain/member/adapter/member/MemberFinder.java @@ -42,6 +42,10 @@ public Member findMemberCanWriteDiaryById(final long id) { } return member; } + + public long count() { + return memberRepository.count(); + } } diff --git a/smeem-domain/src/main/java/com/smeem/domain/member/adapter/memberbadge/MemberBadgeFinder.java b/smeem-domain/src/main/java/com/smeem/domain/member/adapter/memberbadge/MemberBadgeFinder.java index 8f768dc2..a370c7e1 100644 --- a/smeem-domain/src/main/java/com/smeem/domain/member/adapter/memberbadge/MemberBadgeFinder.java +++ b/smeem-domain/src/main/java/com/smeem/domain/member/adapter/memberbadge/MemberBadgeFinder.java @@ -18,9 +18,18 @@ public class MemberBadgeFinder { public List findAllByMemberId(final long id) { return memberBadgeRepository.findAllByMemberId(id); } + public MemberBadge findByBadgeIdAndMemberId(final long badgeId, final long memberId) { + return memberBadgeRepository.findByBadgeIdAndMemberId(badgeId, memberId) + .orElseThrow(() -> new MemberException(MemberFailureCode.EMPTY_MEMBER)); + } public MemberBadge findFirstByMemberIdOrderByCreatedAtDesc(final long id) { return memberBadgeRepository.findFirstByMemberIdOrderByCreatedAtDesc(id) .orElseThrow(() -> new MemberException(MemberFailureCode.EMPTY_MEMBER)); } + + public long countByBadgeId(final long badgeId) { + return memberBadgeRepository.countByBadgeId(badgeId); + } + } diff --git a/smeem-domain/src/main/java/com/smeem/domain/member/repository/MemberBadgeRepository.java b/smeem-domain/src/main/java/com/smeem/domain/member/repository/MemberBadgeRepository.java index 03c97f98..93892f55 100644 --- a/smeem-domain/src/main/java/com/smeem/domain/member/repository/MemberBadgeRepository.java +++ b/smeem-domain/src/main/java/com/smeem/domain/member/repository/MemberBadgeRepository.java @@ -9,5 +9,9 @@ public interface MemberBadgeRepository extends JpaRepository { List findAllByMemberId(final long memberId); + + Optional findByBadgeIdAndMemberId(final long badgeId, final long memberId); Optional findFirstByMemberIdOrderByCreatedAtDesc(final long memberId); + + long countByBadgeId(final long memberId); }