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 b746cf6d..0f461046 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 @@ -21,7 +21,6 @@ interface GuestUseCase { ): Guest fun respondInvitation( - guestId: UUID?, invitationId: UUID, memberId: UUID, nickname: 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 52b0ff79..5319b50e 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 @@ -24,4 +24,6 @@ interface GuestPersistencePort { fun findAttendanceByMemberAndInvitation(memberId: UUID, invitationId: UUID): Boolean? fun findOwnerNickname(invitationId: UUID, memberId: UUID): String + + fun findIdByMemberAndInvitation(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 c6e72709..7ca55780 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 @@ -48,7 +48,6 @@ class GuestService( } override fun respondInvitation( - guestId: UUID?, invitationId: UUID, memberId: UUID, nickname: String, @@ -59,6 +58,8 @@ class GuestService( val invitation = invitationUseCase.findById(invitationId) + val guestId = guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) + if (guestId == null) { guestPersistencePort.save( GuestVO( 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 2156825d..7375ad2c 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 @@ -133,8 +133,9 @@ class GuestServiceTest : DescribeSpec({ modifiedAt = LocalDateTime.now() ) + every { guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) } returns null + guestService.respondInvitation( - guestId = null, invitationId = invitationId, memberId = memberId, nickname = guestNickname, @@ -144,78 +145,8 @@ class GuestServiceTest : DescribeSpec({ verify(exactly = 1) { memberUseCase.findById(memberId) } verify(exactly = 1) { invitationUseCase.findById(invitationId) } verify(exactly = 1) { - guestPersistencePort.save(match { guestVO -> - guestVO.member == member && - guestVO.invitation == invitation && - guestVO.nickname == guestNickname && - guestVO.attendance == attendance - }) + guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) } - confirmVerified(memberUseCase, invitationUseCase, guestPersistencePort) - } - - it("guestId가 null이 아니면 기존 Guest의 attendance만 업데이트한다.") { - val guestId = UUID.randomUUID() - val expectedGuest = Guest( - id = guestId, - member = member, - invitation = invitation, - nickname = guestNickname, - attendance = true, - createdAt = LocalDateTime.now(), - modifiedAt = LocalDateTime.now() - ) - - every { guestPersistencePort.findById(any()) } returns expectedGuest - - val updatedAttendance = false - expectedGuest.updateAttendance(updatedAttendance) - - val slotGuest = slot() - every { guestPersistencePort.save(capture(slotGuest)) } just runs - - guestService.respondInvitation( - guestId = guestId, - invitationId = invitationId, - memberId = memberId, - nickname = guestNickname, - attendance = updatedAttendance - ) - - slotGuest.captured.attendance shouldBe updatedAttendance - - verify(exactly = 1) { memberUseCase.findById(memberId) } - verify(exactly = 1) { invitationUseCase.findById(invitationId) } - verify(exactly = 1) { guestPersistencePort.findById(any()) } - verify(exactly = 1) { guestPersistencePort.save(any()) } - confirmVerified(memberUseCase, invitationUseCase, guestPersistencePort) - } - } - - context("respondInvitation 메서드를 통해서") { - it("guestId가 null이면 새로운 Guest를 생성한다.") { - val attendance = true - - every { guestPersistencePort.save(any()) } returns Guest( - id = UUID.randomUUID(), - member = member, - invitation = invitation, - nickname = guestNickname, - attendance = attendance, - createdAt = LocalDateTime.now(), - modifiedAt = LocalDateTime.now() - ) - - guestService.respondInvitation( - guestId = null, - invitationId = invitationId, - memberId = memberId, - nickname = guestNickname, - attendance = attendance - ) - - verify(exactly = 1) { memberUseCase.findById(memberId) } - verify(exactly = 1) { invitationUseCase.findById(invitationId) } verify(exactly = 1) { guestPersistencePort.save(match { guestVO -> guestVO.member == member && @@ -240,6 +171,7 @@ class GuestServiceTest : DescribeSpec({ ) every { guestPersistencePort.findById(any()) } returns expectedGuest + every { guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) } returns guestId val updatedAttendance = false expectedGuest.updateAttendance(updatedAttendance) @@ -248,7 +180,6 @@ class GuestServiceTest : DescribeSpec({ every { guestPersistencePort.save(capture(slotGuest)) } just runs guestService.respondInvitation( - guestId = guestId, invitationId = invitationId, memberId = memberId, nickname = guestNickname, @@ -261,9 +192,13 @@ class GuestServiceTest : DescribeSpec({ verify(exactly = 1) { invitationUseCase.findById(invitationId) } verify(exactly = 1) { guestPersistencePort.findById(any()) } verify(exactly = 1) { guestPersistencePort.save(any()) } + verify(exactly = 1) { + guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId) + } confirmVerified(memberUseCase, invitationUseCase, guestPersistencePort) } } + context("findAttendGuestsByInvitation, findNotAttendGuestsByInvitation 메서드를 통해서") { it("참석하는 게스트와 참석하지 않는 게스트 목록이 반환되어야 한다.") { val attendingGuest1 = Guest( 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 035a5005..9f9b6138 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 @@ -52,4 +52,10 @@ interface GuestJPARepository : JpaRepository { "WHERE g.member.id = :memberId " + "AND g.invitation.id = :invitationId") fun findOwnerNickname(invitationId: UUID, memberId: UUID): String + + @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 474555d4..429d71aa 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 @@ -16,10 +16,9 @@ import kotlin.jvm.optionals.getOrNull class GuestRepository( private val guestJPARepository: GuestJPARepository, ) : GuestPersistencePort { - override fun save(guestVo: GuestVO): Guest { - return guestJPARepository.save(GuestEntity.from(guestVo)) + override fun save(guestVo: GuestVO) = + guestJPARepository.save(GuestEntity.from(guestVo)) .toDomain() - } override fun save(guest: Guest) { guestJPARepository.save(GuestEntity.from(guest)) @@ -46,10 +45,12 @@ class GuestRepository( .map(GuestEntity::toDomain) } - override fun findAttendanceByMemberAndInvitation(memberId: UUID, invitationId: UUID): Boolean? { - return guestJPARepository.findAttendanceByMemberIdAndInvitationId(memberId, invitationId) - } + override fun findAttendanceByMemberAndInvitation(memberId: UUID, invitationId: UUID) = + guestJPARepository.findAttendanceByMemberIdAndInvitationId(memberId, invitationId) override fun findOwnerNickname(invitationId: UUID, memberId: UUID): String = guestJPARepository.findOwnerNickname(invitationId, memberId) + + override fun findIdByMemberAndInvitation(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 324efc8a..cd14a9a1 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 @@ -28,7 +28,7 @@ class GuestRepositoryTest( lateinit var invitationEntity: InvitationEntity lateinit var memberEntity: MemberEntity - beforeSpec { + beforeEach { memberEntity = MemberEntity.from( MemberVO( socialId = "6316", @@ -54,7 +54,7 @@ class GuestRepositoryTest( ) } - afterSpec { + afterEach { guestJPARepository.deleteAllInBatch() invitationJPARepository.deleteAllInBatch() memberJPARepository.deleteAllInBatch() @@ -72,5 +72,27 @@ class GuestRepositoryTest( savedGuest.invitation.id shouldBe invitationEntity.id } } + + context("findIdByMemberIdAndInvitationId() 메서드에서") { + it("Guest가 존재하면 guestId를 반환해야 한다.") { + val savedGuest = guestRepository.save(guestVO) + + val memberId = memberEntity.id!! + val invitationId = invitationEntity.id!! + + val guestId = guestRepository.findIdByMemberAndInvitation(memberId, invitationId) + + guestId shouldBe savedGuest.id + } + + it("Guest가 존재하지 않으면 null을 반환해야 한다.") { + val memberId = memberEntity.id!! + val invitationId = invitationEntity.id!! + + val guestId = guestRepository.findIdByMemberAndInvitation(memberId, invitationId) + + guestId shouldBe null + } + } } }) diff --git a/module-presentation/src/main/kotlin/site/yourevents/guest/dto/request/InvitationRespondRequest.kt b/module-presentation/src/main/kotlin/site/yourevents/guest/dto/request/InvitationRespondRequest.kt index 0cbeefb5..e917be96 100644 --- a/module-presentation/src/main/kotlin/site/yourevents/guest/dto/request/InvitationRespondRequest.kt +++ b/module-presentation/src/main/kotlin/site/yourevents/guest/dto/request/InvitationRespondRequest.kt @@ -3,7 +3,6 @@ package site.yourevents.guest.dto.request import java.util.UUID data class InvitationRespondRequest( - val guestId: UUID?, val invitationId: UUID, val nickname: String, val attendance: Boolean, diff --git a/module-presentation/src/main/kotlin/site/yourevents/guest/facade/GuestFacade.kt b/module-presentation/src/main/kotlin/site/yourevents/guest/facade/GuestFacade.kt index f24b147c..828b990c 100644 --- a/module-presentation/src/main/kotlin/site/yourevents/guest/facade/GuestFacade.kt +++ b/module-presentation/src/main/kotlin/site/yourevents/guest/facade/GuestFacade.kt @@ -16,7 +16,6 @@ class GuestFacade( val memberId = authDetails.uuid guestUseCase.respondInvitation( - invitationRespondRequest.guestId, invitationRespondRequest.invitationId, memberId, invitationRespondRequest.nickname, diff --git a/module-presentation/src/test/kotlin/site/yourevents/guest/facade/GuestFacadeTest.kt b/module-presentation/src/test/kotlin/site/yourevents/guest/facade/GuestFacadeTest.kt index ae7f7a0f..4d1792d4 100644 --- a/module-presentation/src/test/kotlin/site/yourevents/guest/facade/GuestFacadeTest.kt +++ b/module-presentation/src/test/kotlin/site/yourevents/guest/facade/GuestFacadeTest.kt @@ -25,12 +25,10 @@ class GuestFacadeTest : DescribeSpec({ any(), any(), any(), - any() ) } just runs val request = InvitationRespondRequest( - guestId = UUID.randomUUID(), invitationId = UUID.randomUUID(), nickname = "nickname", attendance = true @@ -49,7 +47,6 @@ class GuestFacadeTest : DescribeSpec({ any(), any(), any(), - any() ) } confirmVerified(guestUseCase)