Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
efc8282
feat: 채팅 통합 마이그레이션 추가
dh2906 Feb 17, 2026
ca39fed
feat: 채팅 참가자 엔티티 추가
dh2906 Feb 17, 2026
95d3673
refactor: 채팅방/메시지 모델을 room-member 구조로 정리
dh2906 Feb 17, 2026
c14b62f
refactor: 1대1 채팅 서비스 읽음 처리 로직은 lastReadAt 기준으로 수정
dh2906 Feb 17, 2026
10b4ec9
refactor: 그룹 채팅 서비스와 DTO를 chat_room 기반으로 통합
dh2906 Feb 17, 2026
2f34c7b
refactor: 통합 채팅 API 흐름을 단일 roomId 기준으로 정리
dh2906 Feb 17, 2026
c119c04
refactor: 채팅 알림 뮤트 타겟을 CHAT_ROOM 단일 타입으로 통일
dh2906 Feb 17, 2026
b327250
refactor: 그룹 채팅 관련 클래스 제거
dh2906 Feb 17, 2026
9cdb8a6
refactor: 패키지 이동
dh2906 Feb 17, 2026
86d0104
refactor: 채팅 서비스 하나로 통합
dh2906 Feb 17, 2026
276e4d9
refactor: 불필요한 클래스 제거
dh2906 Feb 17, 2026
26ff535
refactor: 1대1, 단체 채팅 DTO 통일
dh2906 Feb 17, 2026
bc6465d
refactor: ChatService 응답 모델 단일화 및 중복 DTO 제거
dh2906 Feb 17, 2026
2e494ff
refactor: 채팅방 목록 응답 DTO를 ChatRoomsSummaryResponse로 정리
dh2906 Feb 17, 2026
0b0d8c0
feat: 동아리 멤버 변경 시 채팅방 멤버 자동 추가/제거 처리
dh2906 Feb 17, 2026
664623c
refactor: chat_room 테이블의 sender_id, receiver_id 컬럼 제거
dh2906 Feb 17, 2026
fb5043b
fix: direct 채팅방 생성 시 chat_room_member 누락 케이스 방지
dh2906 Feb 17, 2026
5219224
fix: 채팅 마지막으로 읽은 시간 NPE 문제 방지
dh2906 Feb 17, 2026
23ba0d0
fix: 1대1 채팅에서 참가자 없으면 발생하는 NPE 방지
dh2906 Feb 17, 2026
c793206
fix: clubMember.createdAt 기준으로 채팅 멤버십 기준 시각 강제
dh2906 Feb 18, 2026
bec91aa
fix: 채팅 멤버 기준 시각을 가입 시각으로 고정하고 unread 계산 로직 단순화
dh2906 Feb 18, 2026
29dc898
refactor: ChatService 메시지 unread 집계 로직 성능 개선
dh2906 Feb 18, 2026
d08b335
refactor: 불필요한 메소드 제거
dh2906 Feb 18, 2026
b563ef5
fix: V26 마이그레이션에서 deprecated된 VALUES() 구문 제거
dh2906 Feb 18, 2026
e3630d9
fix: lastReadAt null 값으로 인한 NPE 가능성 제거
dh2906 Feb 18, 2026
772642e
fix: 불필요한 메시지 제거
dh2906 Feb 18, 2026
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
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gg.agit.konect.domain.chat.unified.controller;
package gg.agit.konect.domain.chat.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
Expand All @@ -8,14 +8,13 @@
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import gg.agit.konect.domain.chat.direct.dto.ChatMessageSendRequest;
import gg.agit.konect.domain.chat.direct.dto.ChatRoomCreateRequest;
import gg.agit.konect.domain.chat.direct.dto.ChatRoomResponse;
import gg.agit.konect.domain.chat.unified.dto.UnifiedChatMuteResponse;
import gg.agit.konect.domain.chat.unified.dto.UnifiedChatMessageResponse;
import gg.agit.konect.domain.chat.unified.dto.UnifiedChatMessagesResponse;
import gg.agit.konect.domain.chat.unified.dto.UnifiedChatRoomsResponse;
import gg.agit.konect.domain.chat.unified.enums.ChatType;
import gg.agit.konect.domain.chat.dto.ChatMessageSendRequest;
import gg.agit.konect.domain.chat.dto.ChatRoomCreateRequest;
import gg.agit.konect.domain.chat.dto.ChatMessageDetailResponse;
import gg.agit.konect.domain.chat.dto.ChatMessagePageResponse;
import gg.agit.konect.domain.chat.dto.ChatMuteResponse;
import gg.agit.konect.domain.chat.dto.ChatRoomsSummaryResponse;
import gg.agit.konect.domain.chat.dto.ChatRoomResponse;
import gg.agit.konect.global.auth.annotation.UserId;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
Expand Down Expand Up @@ -54,7 +53,7 @@ ResponseEntity<ChatRoomResponse> createOrGetChatRoom(
- 최근 메시지가 있는 순서대로 정렬됩니다.
""")
@GetMapping("/rooms")
ResponseEntity<UnifiedChatRoomsResponse> getChatRooms(
ResponseEntity<ChatRoomsSummaryResponse> getChatRooms(
@UserId Integer userId
);

Expand All @@ -74,8 +73,7 @@ ResponseEntity<UnifiedChatRoomsResponse> getChatRooms(
- FORBIDDEN_CHAT_ROOM_ACCESS (403): 채팅방에 접근할 권한이 없습니다.
""")
@GetMapping("/rooms/{chatRoomId}")
ResponseEntity<UnifiedChatMessagesResponse> getChatRoomMessages(
@RequestParam(name = "type") ChatType type,
ResponseEntity<ChatMessagePageResponse> getChatRoomMessages(
@RequestParam(name = "page", defaultValue = "1") Integer page,
@RequestParam(name = "limit", defaultValue = "20", required = false) Integer limit,
@PathVariable(value = "chatRoomId") Integer chatRoomId,
Expand All @@ -97,17 +95,15 @@ ResponseEntity<UnifiedChatMessagesResponse> getChatRoomMessages(
- FORBIDDEN_CHAT_ROOM_ACCESS (403): 채팅방에 접근할 권한이 없습니다.
""")
@PostMapping("/rooms/{chatRoomId}/messages")
ResponseEntity<UnifiedChatMessageResponse> sendMessage(
@RequestParam(name = "type") ChatType type,
ResponseEntity<ChatMessageDetailResponse> sendMessage(
@PathVariable(value = "chatRoomId") Integer chatRoomId,
@Valid @RequestBody ChatMessageSendRequest request,
@UserId Integer userId
);

@Operation(summary = "채팅 알림 기능 유무를 토글한다.")
@PostMapping("/rooms/{chatRoomId}/mute")
ResponseEntity<UnifiedChatMuteResponse> toggleGroupChatMute(
@RequestParam(name = "type") ChatType type,
ResponseEntity<ChatMuteResponse> toggleChatMute(
@PathVariable(value = "chatRoomId") Integer chatRoomId,
@UserId Integer userId
);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package gg.agit.konect.domain.chat.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import gg.agit.konect.domain.chat.dto.ChatMessageSendRequest;
import gg.agit.konect.domain.chat.dto.ChatMessageDetailResponse;
import gg.agit.konect.domain.chat.dto.ChatMessagePageResponse;
import gg.agit.konect.domain.chat.dto.ChatMuteResponse;
import gg.agit.konect.domain.chat.dto.ChatRoomCreateRequest;
import gg.agit.konect.domain.chat.dto.ChatRoomResponse;
import gg.agit.konect.domain.chat.dto.ChatRoomsSummaryResponse;
import gg.agit.konect.domain.chat.service.ChatService;
import gg.agit.konect.global.auth.annotation.UserId;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;

@RestController
@RequiredArgsConstructor
@RequestMapping("/chats")
public class ChatController implements ChatApi {

private final ChatService chatService;

@Override
public ResponseEntity<ChatRoomResponse> createOrGetChatRoom(
@Valid @RequestBody ChatRoomCreateRequest request,
@UserId Integer userId
) {
ChatRoomResponse response = chatService.createOrGetChatRoom(userId, request);
return ResponseEntity.ok(response);
}

@Override
public ResponseEntity<ChatRoomsSummaryResponse> getChatRooms(
@UserId Integer userId
) {
ChatRoomsSummaryResponse response = chatService.getChatRooms(userId);
return ResponseEntity.ok(response);
}

@Override
public ResponseEntity<ChatMessagePageResponse> getChatRoomMessages(
@RequestParam(name = "page", defaultValue = "1") Integer page,
@RequestParam(name = "limit", defaultValue = "20", required = false) Integer limit,
@PathVariable(value = "chatRoomId") Integer chatRoomId,
@UserId Integer userId
) {
ChatMessagePageResponse response = chatService.getMessages(userId, chatRoomId, page, limit);
return ResponseEntity.ok(response);
}

@Override
public ResponseEntity<ChatMessageDetailResponse> sendMessage(
@PathVariable(value = "chatRoomId") Integer chatRoomId,
@Valid @RequestBody ChatMessageSendRequest request,
@UserId Integer userId
) {
ChatMessageDetailResponse response = chatService.sendMessage(userId, chatRoomId, request);
return ResponseEntity.ok(response);
}

@Override
public ResponseEntity<ChatMuteResponse> toggleChatMute(
@PathVariable(value = "chatRoomId") Integer chatRoomId,
@UserId Integer userId
) {
return ResponseEntity.ok(chatService.toggleMute(userId, chatRoomId));
}
}

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

Loading