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
5 changes: 5 additions & 0 deletions src/main/java/stackpot/mongo/ChatRepository.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package stackpot.mongo;

import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

Expand All @@ -25,4 +26,8 @@ public interface ChatRepository extends MongoRepository<Chat, String> {
int countByChatRoomId(Long chatRoomId);

int countByChatRoomIdAndIdGreaterThan(Long chatRoomId, Long lastReadChatId);

void deleteByUserIdAndChatRoomId(Long userId, Long chatRoomId);


}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public enum ErrorStatus implements BaseErrorCode {
// Pot 관련 에러
POT_NOT_FOUND(HttpStatus.NOT_FOUND, "POT4004", "팟이 존재하지 않습니다."),
POT_FORBIDDEN(HttpStatus.FORBIDDEN, "POT4003", "팟 생성자가 아닙니다."),
POT_OWNERSHIP_TRANSFER_REQUIRED(HttpStatus.CONFLICT, "POT4005", "권한을 위임해 주세요."),

// Pot Comment 관련 에러
POT_COMMENT_NOT_FOUND(HttpStatus.NOT_FOUND, "POTCOMMENT4001", "Pot Comment를 찾을 수 없습니다"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import java.time.format.DateTimeFormatter;
import java.util.List;

import static stackpot.stackpot.user.entity.enums.Role.UNKNOWN;

@Component
public class ChatConverter {

Expand All @@ -21,10 +23,18 @@ public ChatResponseDto.ChatFileDto toChatFileDto(String fileUrl) {
}

public ChatResponseDto.ChatDto toChatDto(Chat chat) {

String userNameWithRole;

if (chat.getUserName() == null || chat.getUserName().equals("(알 수 없음)") || chat.getRole() == null) {
userNameWithRole = chat.getUserName();
} else {
userNameWithRole = chat.getUserName() + " " + chat.getRole().getVegetable();
}
return ChatResponseDto.ChatDto.builder()
.userId(chat.getUserId())
.chatId(chat.getId())
.userName(chat.getUserName() + " " + chat.getRole().getVegetable())
.userName(userNameWithRole)
.role(chat.getRole())
.message(chat.getMessage())
.fileUrl(chat.getFileUrl())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package stackpot.stackpot.chat.repository;

import io.lettuce.core.dynamic.annotation.Param;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;
import stackpot.stackpot.chat.entity.ChatRoomInfo;

import java.util.List;
Expand All @@ -27,4 +28,10 @@ public interface ChatRoomInfoRepository extends JpaRepository<ChatRoomInfo, Long
@Modifying
@Query("delete from ChatRoomInfo cri where cri.potMember.potMemberId in :potMemberIds")
void deleteByPotMemberIdIn(@Param("potMemberIds") List<Long> potMemberIds);

@Modifying
@Transactional
@Query("DELETE FROM ChatRoomInfo cri WHERE cri.potMember.potMemberId = :potMemberId AND cri.chatRoom.id IN :chatRoomIds")
void deleteByPotMemberIdAndChatRoomIds(@Param("potMemberId") Long potMemberId, @Param("chatRoomIds") List<Long> chatRoomIds);

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import org.springframework.data.jpa.repository.Query;
import stackpot.stackpot.chat.dto.ChatRoomDto;
import stackpot.stackpot.chat.entity.ChatRoom;
import stackpot.stackpot.user.entity.User;

import java.util.List;
import java.util.Optional;

public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
Expand All @@ -26,4 +28,11 @@ public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
@Modifying
@Query("delete from ChatRoom c where c.pot.potId = :potId")
void deleteByPotId(@Param("potId") Long potId);



@Query("select cr.id from ChatRoom cr where cr.pot.potId in :potIds")
List<Long> findIdsByPotIdIn(@Param("potIds") List<Long> potIds);


}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,8 @@ public Chat saveChatMessage(ChatRequestDto.ChatMessageDto chatMessageDto, Long u

return chatRepository.save(chat);
}

public void deleteChatMessage(Long userId, Long chatRoomId) {
chatRepository.deleteByUserIdAndChatRoomId(userId, chatRoomId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,7 @@ public class ChatSendService {
public void sendMessage(Chat chat, Long chatRoomId) {
messagingTemplate.convertAndSend(CHAT_SUB_URL + chatRoomId, chatConverter.toChatDto(chat));
}
public void deleteMessage(Long chatRoomId, Long chatId) {
messagingTemplate.convertAndSend(CHAT_SUB_URL + chatRoomId, "DELETE_" + chatId); // DELETE_<chatId> 형식으로 클라이언트에게 삭제 알림
}
}
14 changes: 14 additions & 0 deletions src/main/java/stackpot/stackpot/common/util/RoleNameMapper.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package stackpot.stackpot.common.util;

import stackpot.stackpot.user.entity.User;

import java.util.Map;

public final class RoleNameMapper {
Expand All @@ -26,4 +28,16 @@ private RoleNameMapper() {} // 인스턴스화 방지
public static String mapRoleName(String potRole) {
return roleMap.getOrDefault(potRole, "멤버");
}
public static String getWriterNickname(User user) {
String writerNickname = user.getNickname();

// 사용자가 탈퇴한 경우 "새싹"을 제거
if (user.isDeleted()) {
writerNickname = writerNickname; // 탈퇴한 경우 "새싹" 제거
} else {
writerNickname += " 새싹"; // 탈퇴하지 않은 경우 "새싹" 추가
}

return writerNickname;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import stackpot.stackpot.common.util.DateFormatter;
import stackpot.stackpot.common.util.RoleNameMapper;
import stackpot.stackpot.feed.dto.FeedCacheDto;
import stackpot.stackpot.feed.entity.Feed;
import stackpot.stackpot.feed.dto.FeedRequestDto;
Expand All @@ -30,10 +31,12 @@ public class FeedConverter{
public FeedResponseDto.FeedDto feedDto(Feed feed, Boolean isOwner, Boolean isLiked, Boolean isSaved, long saveCount) {

Long commentCount = feedCommentRepository.countByFeedId(feed.getFeedId());
String writerNickname = RoleNameMapper.getWriterNickname(feed.getUser());

return FeedResponseDto.FeedDto.builder()
.feedId(feed.getFeedId())
.writerId(feed.getUser().getId())
.writer(feed.getUser().getNickname() + " 새싹")
.writer(writerNickname)
.writerRole(feed.getUser().getRole())
.title(feed.getTitle())
.content(feed.getContent())
Expand All @@ -55,6 +58,8 @@ public FeedResponseDto.CreatedFeedDto createFeedDto(Feed feed) {
"comment", feed.getSeries().getComment()
);
}
Long commentCount = feedCommentRepository.countByFeedId(feed.getFeedId());


return FeedResponseDto.CreatedFeedDto.builder()
.feedId(feed.getFeedId())
Expand Down Expand Up @@ -106,11 +111,11 @@ public FeedResponseDto.AuthorizedFeedDto toAuthorizedFeedDto(Feed feed, boolean
"comment", feed.getSeries().getComment()
);
}

String writerNickname = RoleNameMapper.getWriterNickname(feed.getUser());
FeedResponseDto.CreatedFeedDto createdDto = FeedResponseDto.CreatedFeedDto.builder()
.feedId(feed.getFeedId())
.writerId(feed.getUser().getId())
.writer(feed.getUser().getNickname()+" 새싹")
.writer(writerNickname)
.writerRole(feed.getUser().getRole())
.title(feed.getTitle())
.content(feed.getContent())
Expand Down Expand Up @@ -165,4 +170,5 @@ public FeedCacheDto toFeedCacheDto(Feed feed) {
}



}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public PotApplication toEntity(PotApplicationRequestDto dto, Pot pot, User user)

public PotApplicationResponseDto toDto(PotApplication entity) {
String roleName = entity.getPotRole().name();

String userNickname = RoleNameMapper.getWriterNickname(entity.getUser());
Map<String, String> roleInfo = new HashMap<>();
roleInfo.put("name", roleName);
roleInfo.put("koreanName", Role.toKoreanName(roleName));
Expand All @@ -45,8 +45,9 @@ public PotApplicationResponseDto toDto(PotApplication entity) {
.applicationId(entity.getApplicationId())
.potRole(roleInfo)
.userId(entity.getUser().getId())
.userNickname(entity.getUser().getNickname() + " 새싹")
.userNickname(userNickname)
.build();

}

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package stackpot.stackpot.pot.converter;

import org.springframework.stereotype.Component;
import stackpot.stackpot.common.util.RoleNameMapper;
import stackpot.stackpot.pot.dto.PotCommentDto;
import stackpot.stackpot.pot.dto.PotCommentResponseDto;
import stackpot.stackpot.user.entity.User;
import stackpot.stackpot.user.entity.enums.Role;

import java.time.LocalDateTime;
Expand Down Expand Up @@ -48,9 +50,20 @@ public PotCommentResponseDto.PotCommentUpdateDto toPotCommentUpdateDto(String co
}

public PotCommentResponseDto.AllPotCommentDto toAllPotCommentDto(PotCommentDto.PotCommentInfoDto dto, Long currentUserId) {

String finalUserName;

if ("(알 수 없음)".equals(dto.getUserName())) {

finalUserName = dto.getUserName();
} else {
finalUserName = dto.getUserName() + " 새싹";
}


return PotCommentResponseDto.AllPotCommentDto.builder()
.userId(dto.getUserId())
.userName(dto.getUserName() + " 새싹")
.userName(finalUserName)
.isCommentWriter(Objects.equals(dto.getUserId(), currentUserId))
.isPotWriter(Objects.equals(dto.getPotWriterId(), dto.getUserId()))
.commentId(dto.getCommentId())
Expand All @@ -60,4 +73,5 @@ public PotCommentResponseDto.AllPotCommentDto toAllPotCommentDto(PotCommentDto.P
.children(new ArrayList<>())
.build();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,16 @@ public PotMember toCreatorEntity(User user, Pot pot, Role role) {

public PotMemberAppealResponseDto toDto(PotMember entity) {
String roleName = entity.getRoleName() != null ? entity.getRoleName().name() : "멤버";
String nicknameWithRole = entity.getUser().getNickname() + " " + RoleNameMapper.mapRoleName(roleName);
String nicknameWithRole;

if (entity.getUser() == null || entity.getUser().isDeleted()) {
// 탈퇴한 사용자라면 roleName 제외
nicknameWithRole = entity.getUser() != null ? entity.getUser().getNickname() : "(알 수 없음)";
} else {
// 정상 사용자
nicknameWithRole = entity.getUser().getNickname() + " " + RoleNameMapper.mapRoleName(roleName);
}


return PotMemberAppealResponseDto.builder()
.potMemberId(entity.getPotMemberId())
Expand Down Expand Up @@ -69,7 +78,17 @@ public PotMemberInfoResponseDto toKaKaoMemberDto(PotMember entity) {
String roleName = entity.getPotApplication() != null
? entity.getPotApplication().getPotRole().name()
: "멤버";
String nicknameWithRole = entity.getUser().getNickname() + " " + RoleNameMapper.mapRoleName(roleName);


String nicknameWithRole;

if (entity.getUser() == null || entity.getUser().isDeleted()) {
// 탈퇴한 사용자라면 roleName 제외
nicknameWithRole = entity.getUser() != null ? entity.getUser().getNickname() : "(알 수 없음)";
} else {
// 정상 사용자
nicknameWithRole = entity.getUser().getNickname() + " " + RoleNameMapper.mapRoleName(roleName);
}

return PotMemberInfoResponseDto.builder()
.potMemberId(entity.getPotMemberId())
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/stackpot/stackpot/pot/entity/Pot.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public class Pot extends BaseEntity {
@JoinColumn(name = "user_id", nullable = false)
private User user;

@OneToMany(mappedBy = "pot")
@OneToMany(mappedBy = "pot",cascade = CascadeType.ALL, orphanRemoval = true)
private List<PotRecruitmentDetails> recruitmentDetails;

@OneToMany(mappedBy = "pot", cascade = CascadeType.REMOVE, orphanRemoval = true)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package stackpot.stackpot.pot.repository;

import jakarta.persistence.QueryHint;
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.jpa.repository.QueryHints;
import org.springframework.data.repository.query.Param;
import stackpot.stackpot.pot.entity.mapping.PotApplication;

Expand All @@ -22,4 +24,10 @@ public interface PotApplicationRepository extends JpaRepository<PotApplication,
@Query("DELETE FROM PotApplication f WHERE f.pot.potId = :potId")
void deleteByPotId(@Param("potId") Long potId);

@Modifying
@Query("DELETE FROM PotApplication pa WHERE pa.pot.potId IN :potIds")
@QueryHints({ @QueryHint(name = "javax.persistence.query.timeout", value = "5000") })
void deleteByPotIds(@Param("potIds") List<Long> potIds);


}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public interface PotMemberRepository extends JpaRepository<PotMember, Long> {

boolean existsByPotAndUser(Pot pot, User user);

// 특정 Pot에 속한 사용자(userId)의 역할(Role) 찾기
// 특정 Pot에 속한 사용자(userId)의 역할(Role) 찾기
@Query("SELECT pm.roleName FROM PotMember pm WHERE pm.pot.potId = :potId AND pm.user.id = :userId")
Optional<Role> findRoleByUserId(@Param("potId") Long potId, @Param("userId") Long userId);

Expand Down Expand Up @@ -89,4 +89,9 @@ public interface PotMemberRepository extends JpaRepository<PotMember, Long> {

@Query("SELECT pm.pot.potId FROM PotMember pm WHERE pm.user.id = :userId AND pm.pot.potId IN :potIds")
Set<Long> findPotIdsByUserIdAndPotIds(@Param("userId") Long userId, @Param("potIds") List<Long> potIds);


@Modifying
@Query("DELETE FROM PotMember pm WHERE pm.pot.potId IN :potIds AND pm.user.id = :userId")
void deleteByUserIdAndPotIdIn(@Param("userId") Long userId, @Param("potIds") List<Long> potIds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,17 @@
import org.springframework.data.repository.query.Param;
import stackpot.stackpot.pot.entity.PotRecruitmentDetails;

import java.util.List;

public interface PotRecruitmentDetailsRepository extends JpaRepository<PotRecruitmentDetails, Long> {
@Modifying
@Transactional
@Query("DELETE FROM PotRecruitmentDetails r WHERE r.pot.potId = :potId")
void deleteByPot_PotId(@Param("potId") Long potId);


@Modifying
@Transactional
@Query("DELETE FROM PotRecruitmentDetails prd WHERE prd.pot.potId IN :potIds")
void deleteByPotIds(@Param("potIds") List<Long> potIds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ public interface PotRepository extends JpaRepository<Pot, Long> {
@Modifying
@Query("DELETE FROM Pot f WHERE f.user.id = :userId")
void deleteByUserId(@Param("userId") Long userId);

@Modifying
@Query("DELETE FROM Pot p WHERE p.user.id = :userId AND p.potId IN :potIds AND p.potStatus = 'RECRUITING'")
void deleteByUserIdAndPotIds(@Param("userId") Long userId, @Param("potIds") List<Long> potIds);
boolean existsByUserId(Long userId);

// 지원자 수 기준으로 모든 Pot 정렬
Expand All @@ -76,5 +78,11 @@ public interface PotRepository extends JpaRepository<Pot, Long> {

List<Pot> findByPotMembers_UserIdOrderByCreatedAtDesc(Long userId);

@Query("select p.potId from Pot p where p.user.id = :userId and p.potStatus = :status")
List<Long> findIdsByUserIdAndStatus(@Param("userId") Long userId,
@Param("status") String status);

@Query("select p.potId from Pot p where p.user.id = :userId and p.potStatus not in :statuses")
List<Long> findIdsByUserIdAndStatusNotIn(@Param("userId") Long userId,
@Param("statuses") List<String> statuses);
}
Loading