Skip to content
Open
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
13 changes: 13 additions & 0 deletions chat-service/build.gradle
Original file line number Diff line number Diff line change
@@ -1,15 +1,28 @@
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-config-client'
implementation 'org.springframework.boot:spring-boot-starter-actuator'

// dynamodb
implementation platform('software.amazon.awssdk:bom:2.20.85')
implementation 'software.amazon.awssdk:dynamodb-enhanced'

// kafka & websocket
implementation 'org.springframework.kafka:spring-kafka'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
testImplementation 'org.springframework.kafka:spring-kafka-test'

runtimeOnly 'org.postgresql:postgresql:42.7.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.3'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.12.3'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing
@EnableDiscoveryClient
@SpringBootApplication
public class ChatServiceApplication {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.rljj.chatservice.domain.chat.controller;

import com.rljj.chatservice.domain.chat.dto.ChatMessageListResponse;
import com.rljj.chatservice.domain.chat.dto.ChatRoomListResponse;
import com.rljj.chatservice.domain.chat.dto.ChatRoomRequest;
import com.rljj.chatservice.domain.chat.dto.Message;
import com.rljj.chatservice.domain.chat.service.ChatService;
import com.rljj.chatservice.global.util.SecurityUtils;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RequestMapping("/api/chat")
@RestController
@RequiredArgsConstructor
public class ChatController {

private final ChatService chatService;

// 채팅방 만들기
@PostMapping("/rooms")
public ResponseEntity<Void> createChatRoom(@RequestBody @Valid final ChatRoomRequest request) {
chatService.makeChatRoom(SecurityUtils.getMemberId(), request);
return ResponseEntity.ok().build();
}

// 채팅방 리스트 조회하기
@GetMapping("/rooms")
public ResponseEntity<ChatRoomListResponse> getChatRoomList() {
ChatRoomListResponse chatRoomList = chatService.getChatRoomList(SecurityUtils.getMemberId());
return ResponseEntity.ok(chatRoomList);
}

// TODO 채팅방 삭제하기
// TODO 채팅방 및 메시지 내역 페이징 방법 정하기

// 채팅메시지 내역 조회하기
@GetMapping("/rooms/{roomId}")
public ResponseEntity<ChatMessageListResponse> getChatMessageList(@PathVariable("roomId") Long roomId) {
ChatMessageListResponse chatMessageList = chatService.getChatMessageList(roomId, SecurityUtils.getMemberId());
return ResponseEntity.ok(chatMessageList);
}

// 채팅메시지 보내기
@MessageMapping("/messages")
public void sendMessage(@Valid Message message, @Header("Authorization") final String accessToken) {
chatService.sendMessage(message, accessToken);
}

}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.rljj.chatservice.domain.chat.dto;

import com.rljj.chatservice.domain.chat.model.ChatMessage;
import lombok.Getter;

import java.time.LocalDateTime;
import java.util.List;

@Getter
public class ChatMessageDto {
private String chatMessageId;

private Long chatRoomId;
private LocalDateTime sendDate;

private Long senderId;
private String message;

private boolean isMine;

public ChatMessageDto(ChatMessage chatMessage, Long memberId) {
this.chatMessageId = chatMessage.getMessageId();
this.chatRoomId = chatMessage.getChatRoomId();
this.sendDate = chatMessage.getCreatedAt();
this.senderId = chatMessage.getSenderId();
this.message = chatMessage.getMessage();
this.isMine = chatMessage.getSenderId().equals(memberId); // 내가 보낸 메시지 여부
}

public static List<ChatMessageDto> from(List<ChatMessage> chatMessageList, Long memberId) {
return chatMessageList.stream()
.map(chatMessage -> new ChatMessageDto(chatMessage, memberId))
.toList();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.rljj.chatservice.domain.chat.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;

@Getter
@AllArgsConstructor
public class ChatMessageListResponse {
private List<ChatMessageDto> messages;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.rljj.chatservice.domain.chat.dto;

import com.rljj.switchswitchentity.chat.ChatRoom;
import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;

@Getter
@AllArgsConstructor
public class ChatRoomDto {

private Long chatRoomId;
private Long memberId; // 현재 멤버 ID
private Long chatPartnerId; // 채팅 상대방 ID
private Long chipPostId; // 게시물 ID
// private String latestMessage;
// private LocalDateTime latestMessageCreatedAt;

public ChatRoomDto(ChatRoom chatRoom, Long memberId) {
this.chatRoomId = chatRoom.getId();
this.memberId = memberId;
this.chatPartnerId = chatRoom.getAuthor().getId().equals(memberId)
? chatRoom.getRequester().getId() // 내가 author 상대방 = requester
: chatRoom.getAuthor().getId();
this.chipPostId = chatRoom.getChipPost().getId();
}

public static List<ChatRoomDto> from(List<ChatRoom> chatRoomList, Long memberId) {
return chatRoomList.stream()
.map(chatRoom -> new ChatRoomDto(chatRoom, memberId))
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.rljj.chatservice.domain.chat.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.List;

@Getter
@AllArgsConstructor
public class ChatRoomListResponse {
private List<ChatRoomDto> rooms;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.rljj.chatservice.domain.chat.dto;

import com.rljj.switchswitchentity.chat.ChatRoom;
import com.rljj.switchswitchentity.chip.chippost.ChipPost;
import com.rljj.switchswitchentity.member.Member;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class ChatRoomRequest {

@NotNull
private Long chipPostId; // 게시물 id
@NotNull
private Long requesterId; // 거래요청건 멤버 id

public ChatRoom toEntity(Long memberId) {
return ChatRoom.create(
ChipPost.builder().id(chipPostId).build(),
Member.builder().id(memberId).build(),
Member.builder().id(requesterId).build()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.rljj.chatservice.domain.chat.dto;

import com.rljj.chatservice.domain.chat.model.ChatMessage;
import jakarta.validation.constraints.NotNull;
import lombok.*;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.UUID;

@Getter
@Builder
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Message implements Serializable {
private String id;

@NotNull
private Long chatRoomId;

@NotNull
private String message;

private Long senderId;
//private Long senderNickname;

private LocalDateTime createdAt;

// Method to set id, senderId, and createdAt at once
public void setMessageDetails(Long senderId, LocalDateTime createdAt) {
this.id = UUID.randomUUID().toString();
this.senderId = senderId;
this.createdAt = createdAt;
}

// Message를 ChatMessage로 변환하는 메서드
public ChatMessage toChatMessage() {
return ChatMessage.builder()
.chatRoomId(this.chatRoomId)
.createdAt(this.createdAt)
.messageId(this.id)
.senderId(this.senderId)
.message(this.message)
.build();
}

}


Loading