Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,5 @@ interface GuestUseCase {

fun getInvitationAttendance(memberId: UUID, invitationId: UUID): Boolean?

fun getOwnerNickname(invitationId: UUID, memberId: UUID): String
fun findNicknameByInvitationIdAndMemberId(invitationId: UUID, memberId: UUID): String
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ interface GuestPersistencePort {

fun findAttendanceByMemberAndInvitation(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?
}
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,10 @@ class GuestService(
override fun getInvitationAttendance(memberId: UUID, invitationId: UUID): Boolean? =
guestPersistencePort.findAttendanceByMemberAndInvitation(memberId, invitationId)

override fun getOwnerNickname(invitationId: UUID, memberId: UUID): String =
guestPersistencePort.findOwnerNickname(invitationId, memberId)
override fun findNicknameByInvitationIdAndMemberId(invitationId: UUID, memberId: UUID) =
guestPersistencePort.findNicknameByInvitationIdAndMemberId(invitationId, memberId)
?: throw GuestNotFoundException()


private fun updateAttendance(guestId: UUID, attendance: Boolean) {
val guest = guestPersistencePort.findById(guestId)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package site.yourevents.guest.service

import io.kotest.assertions.throwables.shouldThrow
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
import site.yourevents.guest.exception.GuestNotFoundException
import site.yourevents.guest.port.out.GuestPersistencePort
import site.yourevents.invitation.domain.Invitation
import site.yourevents.invitation.port.`in`.InvitationUseCase
Expand Down Expand Up @@ -83,7 +84,7 @@ class GuestServiceTest : DescribeSpec({
result shouldBe expectedCount

verify(exactly = 1) { guestPersistencePort.getReceivedInvitationCount(member) }
}
}
}

context("createGuest() 메서드를 통해서") {
Expand Down Expand Up @@ -253,7 +254,12 @@ class GuestServiceTest : DescribeSpec({
it("참석 여부가 true로 반환되어야 한다") {
val isAttending = true

every { guestPersistencePort.findAttendanceByMemberAndInvitation(memberId, invitationId) } returns isAttending
every {
guestPersistencePort.findAttendanceByMemberAndInvitation(
memberId,
invitationId
)
} returns isAttending

val result = guestService.getInvitationAttendance(memberId, invitationId)

Expand All @@ -266,7 +272,12 @@ class GuestServiceTest : DescribeSpec({
it("참석 여부가 false로 반환되어야 한다") {
val isAttending = false

every { guestPersistencePort.findAttendanceByMemberAndInvitation(memberId, invitationId) } returns isAttending
every {
guestPersistencePort.findAttendanceByMemberAndInvitation(
memberId,
invitationId
)
} returns isAttending

val result = guestService.getInvitationAttendance(memberId, invitationId)

Expand All @@ -276,5 +287,51 @@ class GuestServiceTest : DescribeSpec({
confirmVerified(guestPersistencePort)
}
}

context("findNicknameByInvitationIdAndMemberId 메서드를 통해서") {
it("정상적으로 nickname이 반환되어야 한다") {
val expectedNickname = "nickname"

every {
guestPersistencePort.findNicknameByInvitationIdAndMemberId(
invitationId,
memberId
)
} returns expectedNickname

val result = guestService.findNicknameByInvitationIdAndMemberId(invitationId, memberId)

result shouldBe expectedNickname

verify(exactly = 1) {
guestPersistencePort.findNicknameByInvitationIdAndMemberId(
invitationId,
memberId
)
}
confirmVerified(guestPersistencePort)
}

it("DB에 충족하는 nickname이 없으면, 예외가 발생해야 한다.") {
every {
guestPersistencePort.findNicknameByInvitationIdAndMemberId(
invitationId,
memberId
)
} returns null

shouldThrow<GuestNotFoundException> {
guestService.findNicknameByInvitationIdAndMemberId(invitationId, memberId)
}

verify(exactly = 1) {
guestPersistencePort.findNicknameByInvitationIdAndMemberId(
invitationId,
memberId
)
}
confirmVerified(guestPersistencePort)
}
}
}
})
Original file line number Diff line number Diff line change
Expand Up @@ -19,43 +19,53 @@ interface GuestJPARepository : JpaRepository<GuestEntity, UUID> {

@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<InvitationEntity>

@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<GuestEntity>

@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<GuestEntity>

@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?
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ class GuestRepository(
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 findNicknameByInvitationIdAndMemberId(invitationId: UUID, memberId: UUID) =
guestJPARepository.findNicknameByInvitationIdAndMemberId(invitationId, memberId)

override fun findIdByMemberAndInvitation(memberId: UUID, invitationId: UUID) =
guestJPARepository.findIdByMemberIdAndInvitationId(memberId, invitationId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.findNicknameByInvitationIdAndMemberId(invitationId, invitation.member.id)

val invitationInformation = invitationInformationUseCase.findByInvitation(invitation)

Expand Down Expand Up @@ -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.findNicknameByInvitationIdAndMemberId(invitationId, memberId)

return InvitationAttendanceResponse(
invitationId = invitationId,
memberId = memberId,
nickname = nickname,
attendance = invitationAttendance
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ 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.findNicknameByInvitationIdAndMemberId(invitation.id, invitation.member.id)

val invitationThumbnail = invitationThumbnailUseCase.findByInvitation(invitation)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.findNicknameByInvitationIdAndMemberId(
invitationId,
invitation.member.id
)
} returns ownerNickname
every { invitationInformationUseCase.findByInvitation(invitation) } returns invitationInformation
every { invitationThumbnailUseCase.findByInvitation(invitation) } returns invitationThumbnail

Expand Down Expand Up @@ -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.findNicknameByInvitationIdAndMemberId(any(), any()) } returns ownerNickname

val response = invitationFacade.getInvitationAttendance(invitationId, authDetails)

Expand All @@ -231,13 +237,15 @@ class InvitationFacadeTest : DescribeSpec({
response.attendance shouldBe isAttending

verify(exactly = 1) { guestUseCase.getInvitationAttendance(memberId, invitationId) }
verify(exactly = 1) { guestUseCase.findNicknameByInvitationIdAndMemberId(any(), any()) }
confirmVerified(invitationUseCase, guestUseCase)
}

it("참석 여부가 false로 반환되어야 한다") {
val isAttending = false

every { guestUseCase.getInvitationAttendance(memberId, invitationId) } returns isAttending
every { guestUseCase.findNicknameByInvitationIdAndMemberId(any(), any()) } returns ownerNickname

val response = invitationFacade.getInvitationAttendance(invitationId, authDetails)

Expand All @@ -246,10 +254,11 @@ class InvitationFacadeTest : DescribeSpec({
response.attendance shouldBe isAttending

verify(exactly = 1) { guestUseCase.getInvitationAttendance(memberId, invitationId) }
verify(exactly = 1) { guestUseCase.findNicknameByInvitationIdAndMemberId(any(), any()) }
confirmVerified(invitationUseCase, guestUseCase)
}
}

context("verifySender 메서드가 호출되었을 때") {
it("초대장 주인이 사용자이면 true를 반환해야한다.") {
every { invitationUseCase.getOwnerId(any()) } returns memberId
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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.findNicknameByInvitationIdAndMemberId(
invitation.id,
invitation.member.id
)
} returns ownerNickname
every { invitationInformationUseCase.findByInvitation(invitation) } returns invitationInfo
every { invitationThumbnailUseCase.findByInvitation(invitation) } returns invitationThumbnail

Expand Down Expand Up @@ -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.findNicknameByInvitationIdAndMemberId(
invitation.id,
invitation.member.id
)
} returns ownerNickname
every { invitationInformationUseCase.findByInvitation(invitation) } returns invitationInfo
every { invitationThumbnailUseCase.findByInvitation(invitation) } returns invitationThumbnail

Expand Down