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 getNicknameByInvitationIdAndMemberId(invitationId: UUID, memberId: UUID): String?
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ interface GuestPersistencePort {

fun findNotAttendGuestsByInvitation(invitation: Invitation): List<Guest>

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?
}
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -83,7 +82,7 @@ class GuestServiceTest : DescribeSpec({
result shouldBe expectedCount

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

context("createGuest() 메서드를 통해서") {
Expand Down Expand Up @@ -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,
Expand All @@ -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> { guestVO ->
Expand All @@ -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)
Expand All @@ -193,7 +192,7 @@ class GuestServiceTest : DescribeSpec({
verify(exactly = 1) { guestPersistencePort.findById(any()) }
verify(exactly = 1) { guestPersistencePort.save(any<Guest>()) }
verify(exactly = 1) {
guestPersistencePort.findIdByMemberAndInvitation(memberId, invitationId)
guestPersistencePort.findIdByMemberIdAndInvitationId(memberId, invitationId)
}
confirmVerified(memberUseCase, invitationUseCase, guestPersistencePort)
}
Expand Down Expand Up @@ -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)
}
}
Expand Down
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 @@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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
}
Expand All @@ -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
}
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,15 +67,15 @@ 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)

val invitationThumbnail = invitationThumbnailUseCase.findByInvitation(invitation)

return InvitationInfoResponse.of(
invitation,
ownerNickname,
ownerNickname!!,
invitationInformation,
invitationThumbnail
)
Expand All @@ -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
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand Down
Loading