diff --git a/module-domain/src/main/kotlin/site/yourevents/guest/port/in/GuestUseCase.kt b/module-domain/src/main/kotlin/site/yourevents/guest/port/in/GuestUseCase.kt index 0f46104..4c1a14c 100644 --- a/module-domain/src/main/kotlin/site/yourevents/guest/port/in/GuestUseCase.kt +++ b/module-domain/src/main/kotlin/site/yourevents/guest/port/in/GuestUseCase.kt @@ -33,5 +33,5 @@ interface GuestUseCase { fun getInvitationAttendance(memberId: UUID, invitationId: UUID): Boolean? - fun getOwnerNickname(invitationId: UUID, memberId: UUID): String + fun getNicknameByInvitationIdAndMemberId(invitationId: UUID, memberId: UUID): String? } diff --git a/module-domain/src/main/kotlin/site/yourevents/guest/port/out/GuestPersistencePort.kt b/module-domain/src/main/kotlin/site/yourevents/guest/port/out/GuestPersistencePort.kt index 5319b50..f29f5e7 100644 --- a/module-domain/src/main/kotlin/site/yourevents/guest/port/out/GuestPersistencePort.kt +++ b/module-domain/src/main/kotlin/site/yourevents/guest/port/out/GuestPersistencePort.kt @@ -21,9 +21,9 @@ interface GuestPersistencePort { fun findNotAttendGuestsByInvitation(invitation: Invitation): List - fun findAttendanceByMemberAndInvitation(memberId: UUID, invitationId: UUID): Boolean? + fun findAttendanceByMemberIdAndInvitationId(memberId: UUID, invitationId: UUID): Boolean? - fun findOwnerNickname(invitationId: UUID, memberId: UUID): String + fun findNicknameByInvitationIdAndMemberId(invitationId: UUID, memberId: UUID): String? - fun findIdByMemberAndInvitation(memberId: UUID, invitationId: UUID): UUID? + fun findIdByMemberIdAndInvitationId(memberId: UUID, invitationId: UUID): UUID? } diff --git a/module-domain/src/main/kotlin/site/yourevents/guest/service/GuestService.kt b/module-domain/src/main/kotlin/site/yourevents/guest/service/GuestService.kt index 7ca5578..414e1e6 100644 --- a/module-domain/src/main/kotlin/site/yourevents/guest/service/GuestService.kt +++ b/module-domain/src/main/kotlin/site/yourevents/guest/service/GuestService.kt @@ -58,7 +58,7 @@ class GuestService( val invitation = invitationUseCase.findById(invitationId) - val guestId = guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) + val guestId = guestPersistencePort.findIdByMemberIdAndInvitationId(memberId, invitationId) if (guestId == null) { guestPersistencePort.save( @@ -83,10 +83,11 @@ class GuestService( } override fun getInvitationAttendance(memberId: UUID, invitationId: UUID): Boolean? = - guestPersistencePort.findAttendanceByMemberAndInvitation(memberId, invitationId) + guestPersistencePort.findAttendanceByMemberIdAndInvitationId(memberId, invitationId) + + override fun getNicknameByInvitationIdAndMemberId(invitationId: UUID, memberId: UUID) = + guestPersistencePort.findNicknameByInvitationIdAndMemberId(invitationId, memberId) - override fun getOwnerNickname(invitationId: UUID, memberId: UUID): String = - guestPersistencePort.findOwnerNickname(invitationId, memberId) private fun updateAttendance(guestId: UUID, attendance: Boolean) { val guest = guestPersistencePort.findById(guestId) diff --git a/module-domain/src/test/kotlin/site/yourevents/guest/service/GuestServiceTest.kt b/module-domain/src/test/kotlin/site/yourevents/guest/service/GuestServiceTest.kt index 7375ad2..b361873 100644 --- a/module-domain/src/test/kotlin/site/yourevents/guest/service/GuestServiceTest.kt +++ b/module-domain/src/test/kotlin/site/yourevents/guest/service/GuestServiceTest.kt @@ -2,7 +2,6 @@ package site.yourevents.guest.service import io.kotest.core.spec.style.DescribeSpec import io.kotest.matchers.shouldBe -import io.mockk.confirmVerified import io.mockk.* import site.yourevents.guest.domain.Guest import site.yourevents.guest.domain.GuestVO @@ -83,7 +82,7 @@ class GuestServiceTest : DescribeSpec({ result shouldBe expectedCount verify(exactly = 1) { guestPersistencePort.getReceivedInvitationCount(member) } - } + } } context("createGuest() 메서드를 통해서") { @@ -133,7 +132,7 @@ class GuestServiceTest : DescribeSpec({ modifiedAt = LocalDateTime.now() ) - every { guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) } returns null + every { guestPersistencePort.findIdByMemberIdAndInvitationId(memberId, invitationId) } returns null guestService.respondInvitation( invitationId = invitationId, @@ -145,7 +144,7 @@ class GuestServiceTest : DescribeSpec({ verify(exactly = 1) { memberUseCase.findById(memberId) } verify(exactly = 1) { invitationUseCase.findById(invitationId) } verify(exactly = 1) { - guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) + guestPersistencePort.findIdByMemberIdAndInvitationId(memberId, invitationId) } verify(exactly = 1) { guestPersistencePort.save(match { guestVO -> @@ -171,7 +170,7 @@ class GuestServiceTest : DescribeSpec({ ) every { guestPersistencePort.findById(any()) } returns expectedGuest - every { guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) } returns guestId + every { guestPersistencePort.findIdByMemberIdAndInvitationId(memberId, invitationId) } returns guestId val updatedAttendance = false expectedGuest.updateAttendance(updatedAttendance) @@ -193,7 +192,7 @@ class GuestServiceTest : DescribeSpec({ verify(exactly = 1) { guestPersistencePort.findById(any()) } verify(exactly = 1) { guestPersistencePort.save(any()) } verify(exactly = 1) { - guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) + guestPersistencePort.findIdByMemberIdAndInvitationId(memberId, invitationId) } confirmVerified(memberUseCase, invitationUseCase, guestPersistencePort) } @@ -253,26 +252,71 @@ class GuestServiceTest : DescribeSpec({ it("참석 여부가 true로 반환되어야 한다") { val isAttending = true - every { guestPersistencePort.findAttendanceByMemberAndInvitation(memberId, invitationId) } returns isAttending + every { + guestPersistencePort.findAttendanceByMemberIdAndInvitationId( + memberId, + invitationId + ) + } returns isAttending val result = guestService.getInvitationAttendance(memberId, invitationId) result shouldBe isAttending - verify(exactly = 1) { guestPersistencePort.findAttendanceByMemberAndInvitation(memberId, invitationId) } + verify(exactly = 1) { + guestPersistencePort.findAttendanceByMemberIdAndInvitationId( + memberId, + invitationId + ) + } confirmVerified(guestPersistencePort) } it("참석 여부가 false로 반환되어야 한다") { val isAttending = false - every { guestPersistencePort.findAttendanceByMemberAndInvitation(memberId, invitationId) } returns isAttending + every { + guestPersistencePort.findAttendanceByMemberIdAndInvitationId( + memberId, + invitationId + ) + } returns isAttending val result = guestService.getInvitationAttendance(memberId, invitationId) result shouldBe isAttending - verify(exactly = 1) { guestPersistencePort.findAttendanceByMemberAndInvitation(memberId, invitationId) } + verify(exactly = 1) { + guestPersistencePort.findAttendanceByMemberIdAndInvitationId( + memberId, + invitationId + ) + } + confirmVerified(guestPersistencePort) + } + } + + context("findNicknameByInvitationIdAndMemberId 메서드를 통해서") { + it("정상적으로 nickname이 반환되어야 한다") { + val expectedNickname = "nickname" + + every { + guestPersistencePort.findNicknameByInvitationIdAndMemberId( + invitationId, + memberId + ) + } returns expectedNickname + + val result = guestService.getNicknameByInvitationIdAndMemberId(invitationId, memberId) + + result shouldBe expectedNickname + + verify(exactly = 1) { + guestPersistencePort.findNicknameByInvitationIdAndMemberId( + invitationId, + memberId + ) + } confirmVerified(guestPersistencePort) } } diff --git a/module-infrastructure/persistence-db/src/main/kotlin/site/yourevents/guest/repository/GuestJPARepository.kt b/module-infrastructure/persistence-db/src/main/kotlin/site/yourevents/guest/repository/GuestJPARepository.kt index 9f9b613..bf2dd92 100644 --- a/module-infrastructure/persistence-db/src/main/kotlin/site/yourevents/guest/repository/GuestJPARepository.kt +++ b/module-infrastructure/persistence-db/src/main/kotlin/site/yourevents/guest/repository/GuestJPARepository.kt @@ -19,43 +19,53 @@ interface GuestJPARepository : JpaRepository { @Query( "SELECT DISTINCT i " + - "FROM guest g " + - "JOIN g.invitation i " + - "WHERE g.member = :memberEntity " + - "AND i.member <> :memberEntity " + - "AND i.deleted = false" + "FROM guest g " + + "JOIN g.invitation i " + + "WHERE g.member = :memberEntity " + + "AND i.member <> :memberEntity " + + "AND i.deleted = false" ) fun getReceivedInvitations(memberEntity: MemberEntity): List - @Query("SELECT g " + - "FROM guest g " + - "WHERE g.invitation = :invitationEntity " + - "AND g.attendance = true " + - "AND g.invitation.deleted = false") + @Query( + "SELECT g " + + "FROM guest g " + + "WHERE g.invitation = :invitationEntity " + + "AND g.attendance = true " + + "AND g.invitation.deleted = false" + ) fun findAttendGuestsByInvitation(invitationEntity: InvitationEntity): List - @Query("SELECT g " + + @Query( + "SELECT g " + "FROM guest g " + "WHERE g.invitation = :invitationEntity " + "AND g.attendance = false " + - "AND g.invitation.deleted = false") + "AND g.invitation.deleted = false" + ) fun findNotAttendGuestsByInvitation(invitationEntity: InvitationEntity): List - @Query("SELECT g.attendance " + - "FROM guest g " + - "WHERE g.member.id = :memberId " + - "AND g.invitation.id = :invitationId") + @Query( + "SELECT g.attendance " + + "FROM guest g " + + "WHERE g.member.id = :memberId " + + "AND g.invitation.id = :invitationId" + ) fun findAttendanceByMemberIdAndInvitationId(memberId: UUID, invitationId: UUID): Boolean? - @Query("SELECT g.nickname " + - "FROM guest g " + - "WHERE g.member.id = :memberId " + - "AND g.invitation.id = :invitationId") - fun findOwnerNickname(invitationId: UUID, memberId: UUID): String + @Query( + "SELECT g.nickname " + + "FROM guest g " + + "WHERE g.member.id = :memberId " + + "AND g.invitation.id = :invitationId" + ) + fun findNicknameByInvitationIdAndMemberId(invitationId: UUID, memberId: UUID): String? - @Query("SELECT g.id " + - "FROM guest g " + - "WHERE g.member.id = :memberId " + - "AND g.invitation.id = :invitationId") + @Query( + "SELECT g.id " + + "FROM guest g " + + "WHERE g.member.id = :memberId " + + "AND g.invitation.id = :invitationId" + ) fun findIdByMemberIdAndInvitationId(memberId: UUID, invitationId: UUID): UUID? } diff --git a/module-infrastructure/persistence-db/src/main/kotlin/site/yourevents/guest/repository/GuestRepository.kt b/module-infrastructure/persistence-db/src/main/kotlin/site/yourevents/guest/repository/GuestRepository.kt index 429d71a..aa89def 100644 --- a/module-infrastructure/persistence-db/src/main/kotlin/site/yourevents/guest/repository/GuestRepository.kt +++ b/module-infrastructure/persistence-db/src/main/kotlin/site/yourevents/guest/repository/GuestRepository.kt @@ -45,12 +45,12 @@ class GuestRepository( .map(GuestEntity::toDomain) } - override fun findAttendanceByMemberAndInvitation(memberId: UUID, invitationId: UUID) = + override fun findAttendanceByMemberIdAndInvitationId(memberId: UUID, invitationId: UUID) = guestJPARepository.findAttendanceByMemberIdAndInvitationId(memberId, invitationId) - override fun findOwnerNickname(invitationId: UUID, memberId: UUID): String = - guestJPARepository.findOwnerNickname(invitationId, memberId) + override fun findNicknameByInvitationIdAndMemberId(invitationId: UUID, memberId: UUID) = + guestJPARepository.findNicknameByInvitationIdAndMemberId(invitationId, memberId) - override fun findIdByMemberAndInvitation(memberId: UUID, invitationId: UUID) = + override fun findIdByMemberIdAndInvitationId(memberId: UUID, invitationId: UUID) = guestJPARepository.findIdByMemberIdAndInvitationId(memberId, invitationId) } diff --git a/module-infrastructure/persistence-db/src/test/kotlin/site/yourevents/guest/repository/GuestRepositoryTest.kt b/module-infrastructure/persistence-db/src/test/kotlin/site/yourevents/guest/repository/GuestRepositoryTest.kt index cd14a9a..a148020 100644 --- a/module-infrastructure/persistence-db/src/test/kotlin/site/yourevents/guest/repository/GuestRepositoryTest.kt +++ b/module-infrastructure/persistence-db/src/test/kotlin/site/yourevents/guest/repository/GuestRepositoryTest.kt @@ -20,7 +20,7 @@ import site.yourevents.member.repository.MemberJPARepository class GuestRepositoryTest( @Autowired private val guestJPARepository: GuestJPARepository, @Autowired private val memberJPARepository: MemberJPARepository, - @Autowired private val invitationJPARepository: InvitationJPARepository + @Autowired private val invitationJPARepository: InvitationJPARepository, ) : DescribeSpec({ val guestRepository = GuestRepository(guestJPARepository) @@ -80,7 +80,7 @@ class GuestRepositoryTest( val memberId = memberEntity.id!! val invitationId = invitationEntity.id!! - val guestId = guestRepository.findIdByMemberAndInvitation(memberId, invitationId) + val guestId = guestRepository.findIdByMemberIdAndInvitationId(memberId, invitationId) guestId shouldBe savedGuest.id } @@ -89,7 +89,7 @@ class GuestRepositoryTest( val memberId = memberEntity.id!! val invitationId = invitationEntity.id!! - val guestId = guestRepository.findIdByMemberAndInvitation(memberId, invitationId) + val guestId = guestRepository.findIdByMemberIdAndInvitationId(memberId, invitationId) guestId shouldBe null } diff --git a/module-presentation/src/main/kotlin/site/yourevents/invitation/dto/response/InvitationAttendanceResponse.kt b/module-presentation/src/main/kotlin/site/yourevents/invitation/dto/response/InvitationAttendanceResponse.kt index 9c51f12..cbc9bfe 100644 --- a/module-presentation/src/main/kotlin/site/yourevents/invitation/dto/response/InvitationAttendanceResponse.kt +++ b/module-presentation/src/main/kotlin/site/yourevents/invitation/dto/response/InvitationAttendanceResponse.kt @@ -5,5 +5,6 @@ import java.util.UUID data class InvitationAttendanceResponse( val invitationId: UUID, val memberId: UUID, - val attendance: Boolean? + val nickname: String?, + val attendance: Boolean?, ) diff --git a/module-presentation/src/main/kotlin/site/yourevents/invitation/facade/InvitationFacade.kt b/module-presentation/src/main/kotlin/site/yourevents/invitation/facade/InvitationFacade.kt index a2ad1f5..9fe5a11 100644 --- a/module-presentation/src/main/kotlin/site/yourevents/invitation/facade/InvitationFacade.kt +++ b/module-presentation/src/main/kotlin/site/yourevents/invitation/facade/InvitationFacade.kt @@ -4,7 +4,10 @@ import jakarta.transaction.Transactional import org.springframework.stereotype.Service import site.yourevents.guest.port.`in`.GuestUseCase import site.yourevents.invitation.dto.request.CreateInvitationRequest -import site.yourevents.invitation.dto.response.* +import site.yourevents.invitation.dto.response.InvitationAttendanceResponse +import site.yourevents.invitation.dto.response.InvitationGuestResponse +import site.yourevents.invitation.dto.response.InvitationInfoResponse +import site.yourevents.invitation.dto.response.InvitationQrResponse import site.yourevents.invitation.exception.UnauthorizedException import site.yourevents.invitation.port.`in`.InvitationUseCase import site.yourevents.invitationinformation.port.`in`.InvitationInformationUseCase @@ -64,7 +67,7 @@ class InvitationFacade( fun getInvitation(invitationId: UUID): InvitationInfoResponse { val invitation = invitationUseCase.findById(invitationId) - val ownerNickname = guestUseCase.getOwnerNickname(invitationId, invitation.member.id) + val ownerNickname = guestUseCase.getNicknameByInvitationIdAndMemberId(invitationId, invitation.member.id) val invitationInformation = invitationInformationUseCase.findByInvitation(invitation) @@ -72,7 +75,7 @@ class InvitationFacade( return InvitationInfoResponse.of( invitation, - ownerNickname, + ownerNickname!!, invitationInformation, invitationThumbnail ) @@ -95,10 +98,12 @@ class InvitationFacade( fun getInvitationAttendance(invitationId: UUID, authDetails: AuthDetails): InvitationAttendanceResponse { val memberId = authDetails.uuid val invitationAttendance = guestUseCase.getInvitationAttendance(memberId, invitationId) + val nickname = guestUseCase.getNicknameByInvitationIdAndMemberId(invitationId, memberId) return InvitationAttendanceResponse( invitationId = invitationId, memberId = memberId, + nickname = nickname, attendance = invitationAttendance ) } diff --git a/module-presentation/src/main/kotlin/site/yourevents/memeber/facade/MemberFacade.kt b/module-presentation/src/main/kotlin/site/yourevents/memeber/facade/MemberFacade.kt index 6aeb575..d7f7abf 100644 --- a/module-presentation/src/main/kotlin/site/yourevents/memeber/facade/MemberFacade.kt +++ b/module-presentation/src/main/kotlin/site/yourevents/memeber/facade/MemberFacade.kt @@ -68,13 +68,13 @@ class MemberFacade( private fun createInvitationInfoResponse(invitation: Invitation): InvitationInfoResponse { val invitationInfo = invitationInformationUseCase.findByInvitation(invitation) - val ownerNickname = guestUseCase.getOwnerNickname(invitation.id, invitation.member.id) + val ownerNickname = guestUseCase.getNicknameByInvitationIdAndMemberId(invitation.id, invitation.member.id) val invitationThumbnail = invitationThumbnailUseCase.findByInvitation(invitation) return InvitationInfoResponse.of( invitation, - ownerNickname, + ownerNickname!!, invitationInfo, invitationThumbnail ) diff --git a/module-presentation/src/test/kotlin/site/yourevents/invitation/facade/InvitationFacadeTest.kt b/module-presentation/src/test/kotlin/site/yourevents/invitation/facade/InvitationFacadeTest.kt index a7076b9..c6ce063 100644 --- a/module-presentation/src/test/kotlin/site/yourevents/invitation/facade/InvitationFacadeTest.kt +++ b/module-presentation/src/test/kotlin/site/yourevents/invitation/facade/InvitationFacadeTest.kt @@ -152,7 +152,12 @@ class InvitationFacadeTest : DescribeSpec({ context("getInvitation 메서드가 호출되었을 때") { it("존재하는 초대장 정보를 반환해야 한다") { every { invitationUseCase.findById(invitationId) } returns invitation - every { guestUseCase.getOwnerNickname(invitationId, invitation.member.id) } returns ownerNickname + every { + guestUseCase.getNicknameByInvitationIdAndMemberId( + invitationId, + invitation.member.id + ) + } returns ownerNickname every { invitationInformationUseCase.findByInvitation(invitation) } returns invitationInformation every { invitationThumbnailUseCase.findByInvitation(invitation) } returns invitationThumbnail @@ -217,12 +222,13 @@ class InvitationFacadeTest : DescribeSpec({ confirmVerified(guestUseCase) } } - + context("getInvitationAttendance 메서드가 호출되었을 때") { it("참석 여부가 true로 반환되어야 한다") { val isAttending = true every { guestUseCase.getInvitationAttendance(memberId, invitationId) } returns isAttending + every { guestUseCase.getNicknameByInvitationIdAndMemberId(any(), any()) } returns ownerNickname val response = invitationFacade.getInvitationAttendance(invitationId, authDetails) @@ -231,6 +237,7 @@ class InvitationFacadeTest : DescribeSpec({ response.attendance shouldBe isAttending verify(exactly = 1) { guestUseCase.getInvitationAttendance(memberId, invitationId) } + verify(exactly = 1) { guestUseCase.getNicknameByInvitationIdAndMemberId(any(), any()) } confirmVerified(invitationUseCase, guestUseCase) } @@ -238,6 +245,7 @@ class InvitationFacadeTest : DescribeSpec({ val isAttending = false every { guestUseCase.getInvitationAttendance(memberId, invitationId) } returns isAttending + every { guestUseCase.getNicknameByInvitationIdAndMemberId(any(), any()) } returns ownerNickname val response = invitationFacade.getInvitationAttendance(invitationId, authDetails) @@ -246,10 +254,11 @@ class InvitationFacadeTest : DescribeSpec({ response.attendance shouldBe isAttending verify(exactly = 1) { guestUseCase.getInvitationAttendance(memberId, invitationId) } + verify(exactly = 1) { guestUseCase.getNicknameByInvitationIdAndMemberId(any(), any()) } confirmVerified(invitationUseCase, guestUseCase) } } - + context("verifySender 메서드가 호출되었을 때") { it("초대장 주인이 사용자이면 true를 반환해야한다.") { every { invitationUseCase.getOwnerId(any()) } returns memberId diff --git a/module-presentation/src/test/kotlin/site/yourevents/member/facade/MemberFacadeTest.kt b/module-presentation/src/test/kotlin/site/yourevents/member/facade/MemberFacadeTest.kt index 37d5d9d..ab84696 100644 --- a/module-presentation/src/test/kotlin/site/yourevents/member/facade/MemberFacadeTest.kt +++ b/module-presentation/src/test/kotlin/site/yourevents/member/facade/MemberFacadeTest.kt @@ -1,4 +1,4 @@ -package site.yourevents.memeber.facade +package site.yourevents.member.facade import io.kotest.core.spec.style.DescribeSpec import io.kotest.matchers.shouldBe @@ -15,6 +15,7 @@ import site.yourevents.invitationthumnail.port.`in`.InvitationThumbnailUseCase import site.yourevents.member.domain.Member import site.yourevents.member.port.`in`.MemberUseCase import site.yourevents.memeber.dto.response.MemberInfoResponse +import site.yourevents.memeber.facade.MemberFacade import site.yourevents.principal.AuthDetails import java.time.LocalDateTime import java.util.UUID @@ -113,7 +114,12 @@ class MemberFacadeTest : DescribeSpec({ every { memberUseCase.findById(authDetails.uuid) } returns member every { invitationUseCase.findByMember(member) } returns listOf(invitation) - every { guestUseCase.getOwnerNickname(invitation.id, invitation.member.id) } returns ownerNickname + every { + guestUseCase.getNicknameByInvitationIdAndMemberId( + invitation.id, + invitation.member.id + ) + } returns ownerNickname every { invitationInformationUseCase.findByInvitation(invitation) } returns invitationInfo every { invitationThumbnailUseCase.findByInvitation(invitation) } returns invitationThumbnail @@ -163,7 +169,12 @@ class MemberFacadeTest : DescribeSpec({ every { memberUseCase.findById(authDetails.uuid) } returns member every { guestUseCase.getReceivedInvitations(member) } returns listOf(invitation) - every { guestUseCase.getOwnerNickname(invitation.id, invitation.member.id) } returns ownerNickname + every { + guestUseCase.getNicknameByInvitationIdAndMemberId( + invitation.id, + invitation.member.id + ) + } returns ownerNickname every { invitationInformationUseCase.findByInvitation(invitation) } returns invitationInfo every { invitationThumbnailUseCase.findByInvitation(invitation) } returns invitationThumbnail