Skip to content

Commit

Permalink
Merge pull request #44 from Leets-Official/refactor/#43
Browse files Browse the repository at this point in the history
refactor: 초대장 참석 여부 API 응답에 nickname 필드 추가
  • Loading branch information
yechan-kim authored Feb 4, 2025
2 parents 95198ac + 9f164e4 commit ed232a9
Show file tree
Hide file tree
Showing 12 changed files with 143 additions and 62 deletions.
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

0 comments on commit ed232a9

Please sign in to comment.