Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/#34 group chat #37

Merged
merged 3 commits into from
Oct 2, 2024
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
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
@RestController
@RequestMapping("/api")
@Slf4j
@Tag(name = "Auth API", description = "๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์ด์›ƒ API")
@Tag(name = "Auth API", description = "๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ API")
public class AuthController {
private final AuthService authService;

Expand Down
18 changes: 9 additions & 9 deletions src/main/java/com/chat/liveon/auth/entity/Person.java
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
package com.chat.liveon.auth.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import com.chat.liveon.chat.entity.ChatMessage;
import com.chat.liveon.chat.entity.ChatRoom;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@NoArgsConstructor
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long Id;
private Long id;
private String personId;
private String personName;
private String personPassword;
Expand All @@ -27,8 +31,4 @@ public Person(String personId, String personName, String encodedPassword, Role r
this.role = Role.ROLE_USER;
this.profilePicture = profilePicture;
}

public Person() {
}

}
6 changes: 4 additions & 2 deletions src/main/java/com/chat/liveon/auth/service/AuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,18 @@
import com.chat.liveon.auth.entity.Role;
import com.chat.liveon.auth.exception.AuthenticationFailureException;
import com.chat.liveon.auth.repository.PersonRepository;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;

@Slf4j
@Service
public class AuthService {
private final PasswordEncoder passwordEncoder;
Expand Down Expand Up @@ -43,10 +46,9 @@ public void login(LoginRequest loginRequest, HttpServletRequest request, HttpSer
}
HttpSession session = request.getSession(true);
session.setAttribute("personId", loginRequest.personId());

String sessionId = session.getId();

jakarta.servlet.http.Cookie sessionCookie = new jakarta.servlet.http.Cookie("SESSIONID", sessionId);
Cookie sessionCookie = new Cookie("JSESSIONID", sessionId);
sessionCookie.setHttpOnly(true);
sessionCookie.setPath("/");
sessionCookie.setMaxAge(60 * 60);
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/com/chat/liveon/chat/config/WebSocketConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.chat.liveon.chat.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOriginPatterns("*")
.withSockJS();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.chat.liveon.chat.controller;

import com.chat.liveon.chat.dto.request.ChatMessageRequest;
import com.chat.liveon.chat.service.ChatMessageService;
import lombok.RequiredArgsConstructor;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/api")
@RequiredArgsConstructor
public class ChatMessageController {

private final ChatMessageService chatMessageService;

@MessageMapping("/chat/{roomId}")
@SendTo("/topic/public/{roomId}")
public ChatMessageRequest sendMessage(@DestinationVariable Long roomId, ChatMessageRequest message) {
return chatMessageService.sendMessage(roomId, message);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.chat.liveon.chat.controller;

import com.chat.liveon.chat.dto.request.ChatRoomRequest;
import com.chat.liveon.chat.dto.response.AllChatRoomResponse;
import com.chat.liveon.chat.dto.response.ChatRoomResponse;
import com.chat.liveon.chat.service.ChatRoomService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Tag(name = "ChatRoom API", description = "์ฑ„ํŒ…๋ฐฉ API")
@RequestMapping("/api")
@RequiredArgsConstructor
@RestController
public class ChatRoomController {

private final ChatRoomService chatRoomService;

@PostMapping("/chat-room")
@Operation(summary = "์ฑ„ํŒ…๋ฐฉ ์ƒ์„ฑ API")
public ResponseEntity<ChatRoomResponse> createChatRoom(@RequestBody ChatRoomRequest chatRoomRequest,
HttpSession session) {
String personId = (String) session.getAttribute("personId");
ChatRoomResponse response = chatRoomService.createChatRoom(chatRoomRequest, personId);
return ResponseEntity.ok(response);
}

@GetMapping("/chat-room")
@Operation(summary = "์ฑ„ํŒ…๋ฐฉ ์กฐํšŒ API")
public ResponseEntity<List<AllChatRoomResponse>> getChatRoom() {
List<AllChatRoomResponse> response = chatRoomService.getAllChatRoom();
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.chat.liveon.chat.dto.request;

import java.time.LocalDateTime;

public record ChatMessageRequest(
Long messageId,
Long chatRoomId,
String senderName,
String message,
LocalDateTime timestamp
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.chat.liveon.chat.dto.request;

public record ChatRoomRequest(
String chatRoomName
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.chat.liveon.chat.dto.response;

public record AllChatRoomResponse(
Long chatRoomId,
String chatRoomName
) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.chat.liveon.chat.dto.response;

public class ChatMessageResponse {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.chat.liveon.chat.dto.response;

public record ChatRoomResponse(
Long chatRoomId,
String chatRoomName,
Long creatorId
) {}
48 changes: 48 additions & 0 deletions src/main/java/com/chat/liveon/chat/entity/ChatMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.chat.liveon.chat.entity;

import com.chat.liveon.auth.entity.Person;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Getter
@NoArgsConstructor
@Entity
public class ChatMessage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "chat_message_id")
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "chat_room_id")
private ChatRoom chatRoom;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "sender_id")
private Person sender;

private String message;

private LocalDateTime sendDate;

@Builder
public ChatMessage(Person sender, String message, ChatRoom chatRoom) {
this.sender = sender;
this.message = message;
this.chatRoom = chatRoom;
this.sendDate = LocalDateTime.now();
}

public static ChatMessage createChatMessage(Person sender, String message, ChatRoom chatRoom) {
ChatMessage chatMessage = ChatMessage.builder()
.sender(sender)
.message(message)
.chatRoom(chatRoom)
.build();
return chatMessage;
}
}
29 changes: 29 additions & 0 deletions src/main/java/com/chat/liveon/chat/entity/ChatRoom.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.chat.liveon.chat.entity;

import com.chat.liveon.auth.entity.Person;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@Entity
public class ChatRoom {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "chat_room_id")
private Long id;

private String chatRoomName;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "person_id")
private Person person;

@Builder
public ChatRoom(String chatRoomName, Person person) {
this.chatRoomName = chatRoomName;
this.person = person;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.chat.liveon.chat.repository;

import com.chat.liveon.chat.entity.ChatMessage;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ChatMessageRepository extends JpaRepository<ChatMessage, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.chat.liveon.chat.repository;

import com.chat.liveon.chat.entity.ChatRoom;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
}
51 changes: 51 additions & 0 deletions src/main/java/com/chat/liveon/chat/service/ChatMessageService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.chat.liveon.chat.service;

import com.chat.liveon.auth.entity.Person;
import com.chat.liveon.auth.repository.PersonRepository;
import com.chat.liveon.chat.dto.request.ChatMessageRequest;
import com.chat.liveon.chat.entity.ChatMessage;
import com.chat.liveon.chat.entity.ChatRoom;
import com.chat.liveon.chat.repository.ChatMessageRepository;
import com.chat.liveon.chat.repository.ChatRoomRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Slf4j
@RequiredArgsConstructor
@Service
public class ChatMessageService {

private final ChatMessageRepository chatMessageRepository;
private final ChatRoomRepository chatRoomRepository;
private final PersonRepository personRepository;

@Transactional
public ChatMessageRequest sendMessage(Long roomId, ChatMessageRequest messageRequest) {
ChatRoom chatRoom = chatRoomRepository.findById(roomId)
.orElseThrow(() -> new RuntimeException("ChatRoom not found"));

Person sender = personRepository.findByPersonId(messageRequest.senderName())
.orElseThrow(() -> new RuntimeException("Sender not found"));

ChatMessage chatMessage = ChatMessage.builder()
.chatRoom(chatRoom)
.message(messageRequest.message())
.sender(sender)
.build();

chatMessage = chatMessageRepository.save(chatMessage);

log.info("[๋ฉ”์‹œ์ง€ ์ „์†ก ์„ฑ๊ณต] ์ฑ„ํŒ…๋ฐฉ: {}, ์‚ฌ์šฉ์ž: {}, ๋ฉ”์‹œ์ง€: {}", roomId, sender.getPersonName(), messageRequest.message());

return new ChatMessageRequest(
chatMessage.getId(),
chatMessage.getChatRoom().getId(),
sender.getPersonName(),
chatMessage.getMessage(),
chatMessage.getSendDate()
);

}
}
Loading