diff --git a/src/main/java/com/soongsil/poppin/heart/application/HeartService.java b/src/main/java/com/soongsil/poppin/heart/application/HeartService.java index 51b36e8..960dc25 100644 --- a/src/main/java/com/soongsil/poppin/heart/application/HeartService.java +++ b/src/main/java/com/soongsil/poppin/heart/application/HeartService.java @@ -13,7 +13,7 @@ public class HeartService { private final HeartRepository HeartRepository; public Boolean getIsLikedById( long popupId, long userId){ - Boolean isLiked = HeartRepository.getIsLikedById(popupId, userId); + Boolean isLiked = HeartRepository.existsByPopupPopupIdAndMemberUserId(popupId, userId); return isLiked; } diff --git a/src/main/java/com/soongsil/poppin/heart/domain/HeartRepository.java b/src/main/java/com/soongsil/poppin/heart/domain/HeartRepository.java index e186388..d80e400 100644 --- a/src/main/java/com/soongsil/poppin/heart/domain/HeartRepository.java +++ b/src/main/java/com/soongsil/poppin/heart/domain/HeartRepository.java @@ -16,7 +16,7 @@ public interface HeartRepository extends JpaRepository { Long countHeartByPopup(Long popupId); @Query("SELECT COUNT(h) > 0 FROM Heart h WHERE h.popup.id = :popupId AND h.member.id = :userId") - Boolean getIsLikedById(Long popupId, Long userId); + Boolean existsByPopupPopupIdAndMemberUserId(Long popupId, Long userId); @Query("SELECT h.heartId FROM Heart h WHERE h.popup.id = :popupId AND h.member.id = :userId") Long findHeartById(Long popupId, Long userId); @@ -28,7 +28,7 @@ public interface HeartRepository extends JpaRepository { @Modifying @Transactional - @Query(" DELETE FROM Heart WHERE heartId = :heartId") + @Query("DELETE FROM Heart WHERE heartId = :heartId") void deleteHeart(Long heartId); } diff --git a/src/main/java/com/soongsil/poppin/popup/domain/Popup.java b/src/main/java/com/soongsil/poppin/popup/domain/Popup.java index 8a81934..5fa5b25 100644 --- a/src/main/java/com/soongsil/poppin/popup/domain/Popup.java +++ b/src/main/java/com/soongsil/poppin/popup/domain/Popup.java @@ -3,15 +3,13 @@ import com.soongsil.poppin.category.domain.Category; import com.soongsil.poppin.heart.domain.Heart; import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDateTime; import java.util.List; @Getter +@Setter @Entity @Table(name = "popup") @NoArgsConstructor(access = AccessLevel.PROTECTED) diff --git a/src/main/java/com/soongsil/poppin/user/domain/UserRepository.java b/src/main/java/com/soongsil/poppin/user/domain/UserRepository.java index 734c331..c3073b6 100644 --- a/src/main/java/com/soongsil/poppin/user/domain/UserRepository.java +++ b/src/main/java/com/soongsil/poppin/user/domain/UserRepository.java @@ -1,6 +1,8 @@ package com.soongsil.poppin.user.domain; +import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -11,4 +13,13 @@ public interface UserRepository extends JpaRepository { Member getWithEmail(@Param("email") String email); Member findBynickName(String nickName); + + @Query("select m.point from Member m where m.userId = :userId") + Long getPointById(@Param("userId") Long userId); + + + @Modifying + @Transactional + @Query("update Member m set m.point = :point where m.userId = :userId") + void updatePayPoint(@Param("userId") Long userid, @Param("point") Long point); } diff --git a/src/main/java/com/soongsil/poppin/userchat/application/UserChatSearchService.java b/src/main/java/com/soongsil/poppin/userchat/application/UserChatSearchService.java index 22aea99..fb13fd5 100644 --- a/src/main/java/com/soongsil/poppin/userchat/application/UserChatSearchService.java +++ b/src/main/java/com/soongsil/poppin/userchat/application/UserChatSearchService.java @@ -1,5 +1,10 @@ package com.soongsil.poppin.userchat.application; +import com.soongsil.poppin.popup.domain.Popup; +import com.soongsil.poppin.popup.domain.PopupRepository; +import com.soongsil.poppin.user.domain.Member; +import com.soongsil.poppin.user.domain.UserRepository; +import com.soongsil.poppin.userchat.application.response.JoinUserChat; import com.soongsil.poppin.userchat.application.response.UserChatInfo; import com.soongsil.poppin.userchat.domain.UserChat; import com.soongsil.poppin.userchat.domain.UserChatRepository; @@ -17,6 +22,8 @@ @RequiredArgsConstructor public class UserChatSearchService { private final UserChatRepository userChatRepository; + private final UserRepository userRepository; + private final PopupRepository popupRepository; // 유저 채팅 리스트 불러오기 public List getUserChats(int page, int size, Long userId){ @@ -35,4 +42,42 @@ public List getUserChats(int page, int size, Long userId){ return userChats; } + + public JoinUserChat joinLive(Long userId, Long popupId, Integer minusPoint){ + JoinUserChat joinUserChat =null; + //참여하고 있는 채팅방인지 확인 + Boolean isJoin = userChatRepository.existsByMemberUserIdAndPopupPopupId(userId, popupId); + + //이미 참여 하고 있다면 + if(isJoin) { + joinUserChat = new JoinUserChat(isJoin,null, popupId, null); + return joinUserChat; + } + + // 포인트 충분한지 확인 + Long userPoint = userRepository.getPointById(userId); + Long leftPoint = userPoint - minusPoint; + if(leftPoint < 0){ //포인트 부족하다면 + joinUserChat = new JoinUserChat(isJoin, false, popupId, null); + return joinUserChat; + } + + + userRepository.updatePayPoint(userId,leftPoint); //채팅 방에서 값 차감 + + Member member = userRepository.findById(userId).orElseThrow(() -> new IllegalArgumentException("Invalid user ID")); + Popup popup = popupRepository.findById(popupId).orElseThrow(() -> new IllegalArgumentException("Invalid popup ID")); + + UserChat userChat = UserChat.builder() + .member(member) + .popup(popup) + .price(minusPoint) + .build(); + + userChatRepository.save(userChat); + joinUserChat = new JoinUserChat(isJoin, true, popupId, leftPoint); + + + return joinUserChat; + } } diff --git a/src/main/java/com/soongsil/poppin/userchat/application/response/JoinUserChat.java b/src/main/java/com/soongsil/poppin/userchat/application/response/JoinUserChat.java new file mode 100644 index 0000000..20dae24 --- /dev/null +++ b/src/main/java/com/soongsil/poppin/userchat/application/response/JoinUserChat.java @@ -0,0 +1,29 @@ +package com.soongsil.poppin.userchat.application.response; + +import lombok.Builder; +import lombok.Getter; + +@Getter +public class JoinUserChat { + private final Boolean isJoin; //이미 가입 되어있는지? + private final Boolean isMoney; //돈이 있는지? + private final Long popupId; + private final Long leftPoint; + + @Builder + public JoinUserChat(Boolean isJoin, Boolean isMoney, Long popupId, Long leftPoint) { + this.isJoin =isJoin; + this.isMoney =isMoney; + this.popupId = popupId; + this.leftPoint= leftPoint; + } + + public Boolean getJoin() { + return isJoin; + } + + public Boolean getMoney() { + return isMoney; + } + +} diff --git a/src/main/java/com/soongsil/poppin/userchat/domain/UserChat.java b/src/main/java/com/soongsil/poppin/userchat/domain/UserChat.java index 5c746f6..e9bf25d 100644 --- a/src/main/java/com/soongsil/poppin/userchat/domain/UserChat.java +++ b/src/main/java/com/soongsil/poppin/userchat/domain/UserChat.java @@ -3,14 +3,12 @@ import com.soongsil.poppin.popup.domain.Popup; import com.soongsil.poppin.user.domain.Member; import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDateTime; @Getter +@Setter @Entity @Table(name = "chat") @NoArgsConstructor(access = AccessLevel.PROTECTED) diff --git a/src/main/java/com/soongsil/poppin/userchat/domain/UserChatRepository.java b/src/main/java/com/soongsil/poppin/userchat/domain/UserChatRepository.java index 35bbcde..ef0a394 100644 --- a/src/main/java/com/soongsil/poppin/userchat/domain/UserChatRepository.java +++ b/src/main/java/com/soongsil/poppin/userchat/domain/UserChatRepository.java @@ -1,9 +1,12 @@ package com.soongsil.poppin.userchat.domain; +import jakarta.transaction.Transactional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jdbc.repository.query.Query; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @@ -16,4 +19,11 @@ public interface UserChatRepository extends JpaRepository { "FROM UserChat uc " + "WHERE uc.member.userId = :userId") List findUserChatsByMemberUserId(Long userId); + + //userId와 해당하는 팝업에 있는 채팅 리스트인지 + @Query("SELECT COUNT(uc) > 0 FROM UserChat uc " + + "WHERE (uc.member.userId = :userId " + + "AND uc.popup.id = :popupId ) ") + Boolean existsByMemberUserIdAndPopupPopupId(Long userId, Long popupId); + } diff --git a/src/main/java/com/soongsil/poppin/userchat/presentation/UserChatController.java b/src/main/java/com/soongsil/poppin/userchat/presentation/UserChatController.java index 172a460..9feb388 100644 --- a/src/main/java/com/soongsil/poppin/userchat/presentation/UserChatController.java +++ b/src/main/java/com/soongsil/poppin/userchat/presentation/UserChatController.java @@ -1,7 +1,9 @@ package com.soongsil.poppin.userchat.presentation; import com.soongsil.poppin.global.response.ResponseDto; +import com.soongsil.poppin.heart.application.response.PostHeart; import com.soongsil.poppin.userchat.application.UserChatSearchService; +import com.soongsil.poppin.userchat.application.response.JoinUserChat; import com.soongsil.poppin.userchat.application.response.UserChatInfo; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -35,4 +37,15 @@ public ResponseDto> getUserChatList(@RequestParam(value = "us return ResponseDto.map(HttpStatus.NOT_FOUND.value(), "getUserChatList 에러 발생.", null); } } + + @PostMapping("/joinLive") + public ResponseDto joinLive(@RequestParam(value = "userId") Long userId, @RequestParam(value = "popupId") Long popupId, @RequestParam(value = "minusPoint") Integer minusPoint) { + JoinUserChat joinUserChat = userChatSearchService.joinLive(userId, popupId, minusPoint); + if(joinUserChat.getJoin()){ + return ResponseDto.map(HttpStatus.OK.value(), "이미 참가중인 채팅 방입니다.", joinUserChat); + }else if(!joinUserChat.getIsMoney()){ + ResponseDto.map(HttpStatus.OK.value(), "포인트가 부족합니다.", joinUserChat); + } + return ResponseDto.map(HttpStatus.OK.value(), "결제가 성공적으로 이루어졌습니다.", joinUserChat); + } }