Skip to content

Commit

Permalink
Merge pull request #99 from MODU-TAXI/MS-195-delete-enter-info
Browse files Browse the repository at this point in the history
[MS-195] Feat: Pessimistic Lock
  • Loading branch information
tjdgns8439 authored Aug 5, 2024
2 parents 46abfe5 + 276bd23 commit c919d1c
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public enum ParticipateErrorCode implements ErrorCode {
USER_NOT_IN_ROOM("PRT_007", "사용자가 해당 채팅방에 없습니다.", HttpStatus.BAD_REQUEST),
USER_ALREADY_IN_OTHER_ROOM("PRT_008", "해당 사용자가 다른 방에 참여한 상태입니다.", HttpStatus.BAD_REQUEST),
USER_ALONE_IN_ROOM("PRT_009", "혼자 있는 방은 매칭완료할 수 없습니다.", HttpStatus.BAD_REQUEST),
YOUR_NOT_STUDENT_CERTIFICATED("PRT_010", "학생 인증 후 입장 가능한 방입니다.", HttpStatus.BAD_REQUEST),
;

private final String errorCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,18 @@

import com.modutaxi.api.domain.member.entity.Member;
import com.modutaxi.api.domain.member.entity.Role;
import jakarta.persistence.LockModeType;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {

Optional<Member> findByIdAndStatusTrue(@Param("memberId") Long memberId);

Optional<Member> findBySnsIdAndStatusTrue(String snsId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public class RegisterParticipantService {
*/
@Transactional
public ApplyResponse acceptForParticipate(Member member, Long roomId, Long memberId) {
Room room = roomRepository.findByIdAndRoomStatusIsNotDelete(roomId)
Room room = roomRepository.findActiveRoomByIdForUpdate(roomId)
.orElseThrow(() -> new BaseException(RoomErrorCode.EMPTY_ROOM));

Member participant = memberRepository.findByIdAndStatusTrue(memberId)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.modutaxi.api.domain.room.repository;

import com.modutaxi.api.domain.room.entity.Room;
import jakarta.persistence.LockModeType;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Query;

public interface RoomRepository extends JpaRepository<Room, Long> {
Expand All @@ -14,4 +16,8 @@ public interface RoomRepository extends JpaRepository<Room, Long> {

@Query(value = "SELECT r FROM Room r WHERE r.id =:id AND r.roomStatus < 4")
Optional<Room> findByIdAndRoomStatusIsNotDelete(Long id);

@Lock(value = LockModeType.PESSIMISTIC_WRITE)
@Query(value = "SELECT r FROM Room r WHERE r.id =:id AND r.roomStatus < 4")
Optional<Room> findActiveRoomByIdForUpdate(Long id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@
import com.modutaxi.api.domain.member.entity.Member;
import com.modutaxi.api.domain.room.entity.Room;
import com.modutaxi.api.domain.roomwaiting.entity.RoomWaiting;
import jakarta.persistence.LockModeType;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import org.springframework.data.jpa.repository.Lock;

public interface RoomWaitingRepository extends JpaRepository<RoomWaiting, Long> {

List<RoomWaiting> findAllByRoomId(Long roomId);

boolean existsByMemberAndRoom(Member member, Room room);

@Lock(value = LockModeType.PESSIMISTIC_WRITE)
void deleteByMemberAndRoom(Member member, Room room);
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import com.modutaxi.api.domain.member.repository.MemberRepository;
import com.modutaxi.api.domain.room.entity.Room;
import com.modutaxi.api.domain.room.entity.RoomStatus;
import com.modutaxi.api.domain.room.entity.RoomTagBitMask;
import com.modutaxi.api.domain.room.repository.RoomRepository;
import com.modutaxi.api.domain.roomwaiting.dto.RoomWaitingResponseDto.ApplyResponse;
import com.modutaxi.api.domain.roomwaiting.dto.RoomWaitingResponseDto.RoomWaitingResponseList;
Expand Down Expand Up @@ -79,13 +80,22 @@ public ApplyResponse applyForParticipate(Long memberId, String roomId) {
throw new BaseException(ParticipateErrorCode.PARTICIPATE_NOT_ALLOW);
}

if (isStudentCertificationIncluded(room.getRoomTagBitMask()) && !member.isCertified()) {
throw new BaseException(ParticipateErrorCode.YOUR_NOT_STUDENT_CERTIFICATED);
}

roomWaitingRepository.save(RoomWaitingMapper.toEntity(member, room));
fcmService.sendNewParticipant(room.getRoomManager(), roomId, member.getNickname());
registerAlarmService.registerAlarm(
AlarmType.PARTICIPATE_REQUEST, Long.valueOf(roomId), room.getRoomManager().getId());
return new ApplyResponse(true);
}

public boolean isStudentCertificationIncluded(int bitMask) {
return (bitMask & RoomTagBitMask.STUDENT_CERTIFICATION.getValue()) != 0;
}



/**
* 매칭 대기 인원리스트 조회
Expand Down

0 comments on commit c919d1c

Please sign in to comment.