Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 62 additions & 7 deletions src/main/kotlin/com/tripsync/application/room/RoomService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import com.tripsync.domain.repository.*
import org.springframework.http.HttpStatus
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import java.time.Instant
import java.time.LocalDate
import java.util.*

Expand All @@ -24,6 +25,10 @@ class RoomService(
private val roomMemberProfileRepository: RoomMemberProfileRepository,
private val tptiResultRepository: TptiResultRepository,
private val scheduleRepository: ScheduleRepository,
private val scheduleSlotRepository: ScheduleSlotRepository,
private val satisfactionScoreRepository: SatisfactionScoreRepository,
private val conflictMapRepository: ConflictMapRepository,
private val tripPhotoRepository: TripPhotoRepository,
private val scheduleResponseMapper: ScheduleResponseMapper,
) {

Expand Down Expand Up @@ -71,8 +76,8 @@ class RoomService(

@Transactional(readOnly = true)
fun getRoom(roomId: Long, user: User): ApiResponse<Map<String, Any?>> {
validateRoomMember(roomId, user.id)
val room = getActiveRoom(roomId)
validateRoomMember(room.id, user.id)
val memberCount = roomMemberRepository.findAllByRoomIdAndDelYn(room.id, YnFlag.N).size

return ApiResponse.ok(roomSummary(room, memberCount, includeScheduleState = true))
Expand Down Expand Up @@ -116,7 +121,7 @@ class RoomService(
val room = tripRoomRepository.findByShareCodeAndDelYn(shareCode, YnFlag.N)
?: throw DomainException(HttpStatus.NOT_FOUND, "INVALID_SHARE_CODE", "유효하지 않은 공유 코드입니다.")

val existingMember = roomMemberRepository.findByRoomIdAndUserIdAndDelYn(room.id, user.id, YnFlag.N)
val existingMember = roomMemberRepository.findByRoomIdAndUserId(room.id, user.id)
if (existingMember == null) {
roomMemberRepository.save(
RoomMember(
Expand All @@ -125,6 +130,9 @@ class RoomService(
role = if (room.hostUser.id == user.id) RoomMemberRole.HOST else RoomMemberRole.MEMBER,
)
)
} else {
existingMember.delYn = YnFlag.N
existingMember.role = if (room.hostUser.id == user.id) RoomMemberRole.HOST else existingMember.role
}

if (tptiResultId != null) {
Expand All @@ -135,7 +143,7 @@ class RoomService(
upsertMemberProfile(room, user, result)
}

val roomStatus = refreshRoomStatus(room.id)
val roomStatus = if (room.status == TripRoomStatus.COMPLETED) room.status else refreshRoomStatus(room.id)
return ApiResponse.ok(
mapOf(
"roomId" to room.id,
Expand All @@ -148,14 +156,15 @@ class RoomService(

@Transactional(readOnly = true)
fun getMembers(roomId: Long, user: User): ApiResponse<Map<String, Any?>> {
validateRoomMember(roomId, user.id)
val members = roomMemberRepository.findAllByRoomIdAndDelYn(roomId, YnFlag.N)
val profilesByUserId = roomMemberProfileRepository.findAllByRoomIdAndDelYn(roomId, YnFlag.N)
val room = getActiveRoom(roomId)
validateRoomMember(room.id, user.id)
val members = roomMemberRepository.findAllByRoomIdAndDelYn(room.id, YnFlag.N)
val profilesByUserId = roomMemberProfileRepository.findAllByRoomIdAndDelYn(room.id, YnFlag.N)
.associateBy { it.user.id }

return ApiResponse.ok(
mapOf(
"roomId" to roomId,
"roomId" to room.id,
"members" to members.sortedBy { it.joinedAt }.map { member ->
val profile = profilesByUserId[member.user.id]
mapOf(
Expand All @@ -178,6 +187,52 @@ class RoomService(
)
}

@Transactional
fun deleteRoom(roomId: Long, user: User): ApiResponse<Map<String, Any?>> {
if (user.isGuest) {
throw DomainException(HttpStatus.FORBIDDEN, "FORBIDDEN", "로그인한 계정으로만 여행 방을 삭제하거나 나갈 수 있습니다.")
}

val room = getActiveRoom(roomId)
val member = roomMemberRepository.findByRoomIdAndUserIdAndDelYn(room.id, user.id, YnFlag.N)
?: throw DomainException(HttpStatus.FORBIDDEN, "FORBIDDEN", "방 멤버만 여행 방을 삭제하거나 나갈 수 있습니다.")

if (member.role != RoomMemberRole.HOST) {
return leaveRoom(room, member)
}

val schedules = scheduleRepository.findByRoomIdAndDelYn(room.id, YnFlag.N)
schedules.forEach { schedule ->
satisfactionScoreRepository.findAllByScheduleIdAndDelYn(schedule.id, YnFlag.N).forEach { it.delYn = YnFlag.Y }
scheduleSlotRepository.findAllByScheduleIdAndDelYn(schedule.id, YnFlag.N).forEach { it.delYn = YnFlag.Y }
schedule.delYn = YnFlag.Y
}

val deletedAt = Instant.now()
tripPhotoRepository.findAllByRoomIdAndDelYn(room.id, YnFlag.N).forEach { photo ->
photo.delYn = YnFlag.Y
photo.deletedBy = user
photo.deletedAt = deletedAt
}
conflictMapRepository.findAllByRoomIdAndDelYn(room.id, YnFlag.N).forEach { it.delYn = YnFlag.Y }
roomMemberProfileRepository.findAllByRoomIdAndDelYn(room.id, YnFlag.N).forEach { it.delYn = YnFlag.Y }
roomMemberRepository.findAllByRoomIdAndDelYn(room.id, YnFlag.N).forEach { it.delYn = YnFlag.Y }
room.delYn = YnFlag.Y

return ApiResponse.ok(mapOf("roomId" to room.id, "deleted" to true, "left" to false))
}

private fun leaveRoom(room: TripRoom, member: RoomMember): ApiResponse<Map<String, Any?>> {
member.delYn = YnFlag.Y
roomMemberProfileRepository.findByRoomIdAndUserId(room.id, member.user.id)?.delYn = YnFlag.Y
satisfactionScoreRepository.findAllByScheduleRoomIdAndUserIdAndDelYn(room.id, member.user.id, YnFlag.N)
.forEach { it.delYn = YnFlag.Y }
if (room.status != TripRoomStatus.COMPLETED) {
refreshRoomStatus(room.id)
}
return ApiResponse.ok(mapOf("roomId" to room.id, "deleted" to false, "left" to true))
}


private fun upsertMemberProfile(room: TripRoom, user: User, result: com.tripsync.domain.entity.TptiResult): RoomMemberProfile {
val profile = roomMemberProfileRepository.findByRoomIdAndUserId(room.id, user.id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ import org.springframework.stereotype.Repository
@Repository
interface ConflictMapRepository : JpaRepository<ConflictMap, Long> {
fun findTopByRoomIdAndDelYnOrderByCreatedAtDesc(roomId: Long, delYn: YnFlag): ConflictMap?
fun findAllByRoomIdAndDelYn(roomId: Long, delYn: YnFlag): List<ConflictMap>
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import org.springframework.stereotype.Repository

@Repository
interface RoomMemberRepository : JpaRepository<RoomMember, Long> {
fun findByRoomIdAndUserId(roomId: Long, userId: Long): RoomMember?
fun findByRoomIdAndUserIdAndDelYn(roomId: Long, userId: Long, delYn: YnFlag): RoomMember?
fun existsByRoomIdAndUserIdAndDelYn(roomId: Long, userId: Long, delYn: YnFlag): Boolean
fun findAllByRoomIdAndDelYn(roomId: Long, delYn: YnFlag): List<RoomMember>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.tripsync.domain.repository

import com.tripsync.domain.entity.SatisfactionScore
import com.tripsync.domain.enums.YnFlag
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository

@Repository
interface SatisfactionScoreRepository : JpaRepository<SatisfactionScore, Long>
interface SatisfactionScoreRepository : JpaRepository<SatisfactionScore, Long> {
fun findAllByScheduleIdAndDelYn(scheduleId: Long, delYn: YnFlag): List<SatisfactionScore>
fun findAllByScheduleRoomIdAndUserIdAndDelYn(roomId: Long, userId: Long, delYn: YnFlag): List<SatisfactionScore>
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ interface TripPhotoRepository : JpaRepository<TripPhoto, Long> {
status: PhotoStatus,
): List<TripPhoto>

fun findAllByRoomIdAndDelYn(roomId: Long, delYn: YnFlag): List<TripPhoto>

fun countByScheduleIdAndDelYnAndStatus(scheduleId: Long, delYn: YnFlag, status: PhotoStatus): Long
fun countByScheduleSlotIdAndDelYnAndStatus(scheduleSlotId: Long, delYn: YnFlag, status: PhotoStatus): Long
fun countByScheduleIdAndUploaderIdAndDelYnAndStatus(scheduleId: Long, uploaderId: Long, delYn: YnFlag, status: PhotoStatus): Long
Expand Down
5 changes: 5 additions & 0 deletions src/main/kotlin/com/tripsync/web/room/RoomController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,11 @@ class RoomController(
return roomService.getMembers(roomId, user)
}

@DeleteMapping("/{roomId}")
fun deleteRoom(@PathVariable roomId: Long, @CurrentUser user: User): ApiResponse<Map<String, Any?>> {
return roomService.deleteRoom(roomId, user)
}

@GetMapping("/{roomId}")
fun getRoom(@PathVariable roomId: Long, @CurrentUser user: User): ApiResponse<Map<String, Any?>> {
return roomService.getRoom(roomId, user)
Expand Down
Loading
Loading