20240308 (금) 최종 프로젝트 티켓레이더 2주차 - 끝이 보이기 시작한 CRUD

2024. 3. 8. 21:04TIL

드디어 CRUD 구현의 끝이 보이기 시작한듯 하다.

1. PlaceServiceImpl 수정

기존에 있던 코드를 좀더 간결하고 반복되지 않는 코드로 변경하였다.

override fun updatePlace(placeId: Long, request: PlaceRequest) {
        val place = placeRepository.findByIdOrNull(placeId)
            ?: throw ModelNotFoundException("place", placeId)
        place.let { request.toPlace() }
        placeRepository.save(place)

        val seatList = availableSeatRepository.findByPlaceId(placeId)
        seatList.map {
            request.updateSeatByPlace(it!!, place)
            availableSeatRepository.save(it)
        }

        val ticketList = ticketRepository.findAllByPlaceId(placeId)
        ticketList.map {
            it!!.place = place.name
            ticketRepository.save(it)
        }
    }

 

2. UpdateEvent 관련 오류 및 수정작업

 

이벤트 생성시 이뤄져야하는 코드 순서

  1. 이벤트Id 기반으로 이벤트를 찾아옴
  2. 이어서 Price, Category, Place를 찾아옴
  3. 리퀘스트의 내용대로 기존 이벤트를 수정 > 저장
  4. 이벤트 생성시 Price를 자동생성하는 것처럼 Price의 내용을 자동으로 수정 > 저장
  5. 기존 이벤트와 달라진 이벤트의 startDate, endDate가 둘중 하나라도 다르면 Seat를 불러옴
  6. Seat리포지토리에서 겹치는 장소와 날짜가 있는지 검사
  7. 달라진 이벤트 이외의 날짜는 전부 삭제(isDeleted = true) 처리
  8. 달라진 이벤트 기준으로 startDate, endDate를 받아서 Seat리포지토리에 없다면 새로 생성 > 저장
@Transactional
    override fun updateEvent(eventId: Long, eventRequest: EventRequest) {
        val event = eventRepository.findByIdOrNull(eventId)
            ?: throw ModelNotFoundException("Event", eventId)
        val price = priceRepository.findByEventId(eventId)
            ?: throw ModelNotFoundException("Price", eventId)
        val category = categoryRepository.findByIdOrNull(eventRequest.categoryId)
            ?: throw ModelNotFoundException("category", eventRequest.categoryId)
        val place = placeRepository.findPlaceByName(eventRequest.place)
            ?: throw ModelNotFoundException("place", 0)
        val orgStartDate = event.startDate
        val orgEndDate = event.endDate
        //시작일과 끝나는 일 비교후 false 시 예외처리
        check(eventRequest.startDate < eventRequest.endDate) {
            "끝나는날짜는 시작날짜보다 빠를수 없습니다."
        }
        event.let {
            it.posterImage = eventRequest.posterImage
            it.title = eventRequest.title
            it.eventInfo = eventRequest.eventInfo
            it.startDate = eventRequest.startDate
            it.endDate = eventRequest.endDate
            it.place = place
            it.category = category
        }
        eventRepository.save(event)
        price.let {
            it.seatRPrice = eventRequest.seatRPrice
            it.seatSPrice = eventRequest.seatSPrice
            it.seatAPrice = eventRequest.seatAPrice
            it.event = event
        }
        event.price = price
        priceRepository.save(price)

        //날짜 변동이 생겼는지 확인
        if (orgStartDate != event.startDate || orgEndDate != event.endDate) {
            val date = event.startDate
            val duration = event.endDate.compareTo(event.startDate)
            for (i in 0..duration) {
                val seat = availableSeatRepository.findByPlaceIdAndDate(place.id!!, date.plusDays(i.toLong()))
                if (seat != null) {
                    check(seat.event!!.id == event.id) {
                        "다른 이벤트가 존재함"
                    }
                }
            }
            val seatList = availableSeatRepository.findAllByEventId(eventId)
            seatList.map{
                if(it!!.date.isBefore(event.startDate) || it.date.isAfter(event.endDate)){
                    it.isDeleted = true
                }
            }
            for (i in 0..duration) {
                val seat = availableSeatRepository.findByEventIdAndDate(eventId, date.plusDays(i.toLong()))
                if (seat == null) {
                    val newSeat = eventRequest.toAvailableSeat(event, place, date.plusDays(i.toLong()))
                    availableSeatRepository.save(newSeat)
                }
            }
        }
    }

 


다음주는 최대한 빨리 CRUD를 끝내고 테스트코드와 1차발표준비정도를 하면 좋을것 같다.