Skip to content

Commit

Permalink
Merge pull request #39 from Re-4aliens/#36_chatting
Browse files Browse the repository at this point in the history
Feat/#36 채팅 도메인 구현
  • Loading branch information
mjj111 authored Feb 10, 2024
2 parents 77bcc25 + 73bdbc2 commit 462b515
Show file tree
Hide file tree
Showing 44 changed files with 1,324 additions and 1 deletion.
8 changes: 7 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ dependencies {
//SMTP
implementation 'org.springframework.boot:spring-boot-starter-mail'

//WEBSOCKET
implementation 'org.springframework.boot:spring-boot-starter-websocket'

//MONGO_DB
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'

//FCM
implementation 'com.google.firebase:firebase-admin:9.1.1'
}
Expand Down Expand Up @@ -74,4 +80,4 @@ bootJar {

tasks.named('test') {
useJUnitPlatform()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.aliens.backend.chat.controller;

import com.aliens.backend.chat.controller.dto.request.ChatBlockRequest;
import com.aliens.backend.chat.service.ChatBlockService;
import com.aliens.backend.global.config.resolver.Login;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collections;
import java.util.Map;


@RestController
public class ChatBlockController {

private final ChatBlockService chatBlockService;

public ChatBlockController(ChatBlockService chatBlockService) {
this.chatBlockService = chatBlockService;
}

@PostMapping("/chat/block")
public ResponseEntity<Map<String, String>> blockPartner(@Login Long memberId, @RequestBody ChatBlockRequest chatBlockRequest) {
String result = chatBlockService.blockPartner(memberId, chatBlockRequest);
Map<String, String> response = Collections.singletonMap("response", result);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.aliens.backend.chat.controller;

import com.aliens.backend.chat.controller.dto.request.MessageSendRequest;
import com.aliens.backend.chat.controller.dto.request.ReadRequest;
import com.aliens.backend.chat.controller.dto.response.ChatSummaryResponse;
import com.aliens.backend.chat.domain.Message;
import com.aliens.backend.chat.service.ChatService;
import com.aliens.backend.global.config.resolver.Login;
import org.springframework.http.ResponseEntity;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collections;
import java.util.List;
import java.util.Map;


@RestController
public class ChatController {

private final ChatService chatService;

public ChatController(ChatService chatService) {
this.chatService = chatService;
}

@MessageMapping("/send")
public void sendMessage(@Payload MessageSendRequest messageSendRequest) {
chatService.sendMessage(messageSendRequest);
}

@MessageMapping("/read")
public void readMessage(@Payload ReadRequest readRequest) {
chatService.readMessages(readRequest);
}

@GetMapping("/chat/summaries")
public ResponseEntity<Map<String, ChatSummaryResponse>> getChatSummaries(@Login Long memberId) {
ChatSummaryResponse chatSummaryResponse = chatService.getChatSummaries(memberId);
Map<String, ChatSummaryResponse> response = Collections.singletonMap("response", chatSummaryResponse);
return ResponseEntity.ok(response);
}

@GetMapping("/chat/room/{roomId}/messages")
public ResponseEntity<Map<String, List>> getMessages(@PathVariable("roomId") Long chatRoomId,
@RequestParam(value = "lastMessageId", required = false) String lastMessageId) {
List<Message> messages = chatService.getMessages(chatRoomId,lastMessageId);
Map<String, List> response = Collections.singletonMap("response", messages);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.aliens.backend.chat.controller;

import com.aliens.backend.chat.controller.dto.request.ChatReportRequest;
import com.aliens.backend.chat.service.ChatReportService;
import com.aliens.backend.global.config.resolver.Login;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.Collections;
import java.util.Map;


@RestController
public class ChatReportController {

private final ChatReportService chatReportService;

public ChatReportController(ChatReportService chatReportService) {
this.chatReportService = chatReportService;
}

@PostMapping("/chat/report")
public ResponseEntity<Map<String, String>> reportPartner(@Login Long memberId, @RequestBody ChatReportRequest chatReportRequest) {
String result = chatReportService.reportPartner(memberId, chatReportRequest);
Map<String, String> response = Collections.singletonMap("response", result);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.aliens.backend.chat.controller.dto.request;

public record ChatBlockRequest(Long partnerId, Long chatRoomId) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.aliens.backend.chat.controller.dto.request;

public record ChatReportRequest(Long partnerId, Long chatRoomId, String category, String content) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.aliens.backend.chat.controller.dto.request;

public record MessageSendRequest(String type, String content, Long roomId, Long senderId, Long receiverId) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.aliens.backend.chat.controller.dto.request;

public record ReadRequest(Long roomId, Long memberId) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.aliens.backend.chat.controller.dto.response;

import com.aliens.backend.chat.domain.ChatRoom;
import com.aliens.backend.chat.service.model.ChatMessageSummary;

import java.util.List;

public record ChatSummaryResponse(List<ChatRoom> chatRooms, List<ChatMessageSummary> chatMessageSummaries) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.aliens.backend.chat.controller.dto.response;

public record ReadResponse(Long readBy) {
}
27 changes: 27 additions & 0 deletions src/main/java/com/aliens/backend/chat/domain/ChatBlock.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.aliens.backend.chat.domain;

import com.aliens.backend.chat.controller.dto.request.ChatBlockRequest;
import jakarta.persistence.*;

@Entity
@Table(name = "CHAT_BLOCK")
public class ChatBlock {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private Long id;
@Column(name = "blocked_member_id")
private Long blockedMemberId;
@Column(name = "blocking_member_id")
private Long blockingMemberId;

protected ChatBlock() {
}

public static ChatBlock of(Long blockingMemberId, ChatBlockRequest chatBlockRequest) {
ChatBlock chatBlock = new ChatBlock();
chatBlock.blockedMemberId = chatBlockRequest.partnerId();
chatBlock.blockingMemberId = blockingMemberId;
return chatBlock;
}
}
36 changes: 36 additions & 0 deletions src/main/java/com/aliens/backend/chat/domain/ChatReport.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.aliens.backend.chat.domain;

import com.aliens.backend.chat.controller.dto.request.ChatReportRequest;
import com.aliens.backend.global.error.ChatError;
import com.aliens.backend.global.exception.RestApiException;
import jakarta.persistence.*;

@Entity
@Table(name = "CHAT_REPORT")
public class ChatReport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private Long id;
@Column(name = "reported_member_id")
private Long reportedMemberId;
@Column(name = "reporting_member_id")
private Long reportingMemberId;
@Column
private ChatReportCategory category;
@Column
private String content;

protected ChatReport() {
}

public static ChatReport of(Long reportingMemberId, ChatReportRequest chatReportRequest) {
ChatReport chatReport = new ChatReport();
chatReport.reportedMemberId = chatReportRequest.partnerId();
chatReport.reportingMemberId = reportingMemberId;
chatReport.category = ChatReportCategory.fromString(chatReportRequest.category())
.orElseThrow(() -> new RestApiException(ChatError.INVALID_REPORT_CATEGORY));
chatReport.content = chatReportRequest.content();
return chatReport;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.aliens.backend.chat.domain;

import java.util.Optional;

public enum ChatReportCategory {
SEXUAL_HARASSMENT, VIOLENCE, SPAM, SCAM, ETC;

public static Optional<ChatReportCategory> fromString(String category) {
for (ChatReportCategory reportCategory : ChatReportCategory.values()) {
if (reportCategory.name().equalsIgnoreCase(category)) {
return Optional.of(reportCategory);
}
}
return Optional.empty();
}
}
38 changes: 38 additions & 0 deletions src/main/java/com/aliens/backend/chat/domain/ChatRoom.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.aliens.backend.chat.domain;

import jakarta.persistence.*;

@Entity
@Table(name = "CHAT_ROOM")
public class ChatRoom {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private Long id;
private Long roomId;
@Column(name = "member_id")
private Long memberId;
@Column(name = "partner_id")
private Long partnerId;
@Column
private ChatRoomStatus status;

protected ChatRoom() {
}

public Long getRoomId() {
return roomId;
}

public Long getPartnerId() {
return partnerId;
}

public ChatRoomStatus getStatus() {
return status;
}

public void block() {
this.status = ChatRoomStatus.BLOCKED;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.aliens.backend.chat.domain;

public enum ChatRoomStatus {
WAITING, OPEN, CLOSE, BLOCKED;
}
53 changes: 53 additions & 0 deletions src/main/java/com/aliens/backend/chat/domain/Message.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.aliens.backend.chat.domain;

import com.aliens.backend.chat.controller.dto.request.MessageSendRequest;
import com.aliens.backend.global.error.ChatError;
import com.aliens.backend.global.exception.RestApiException;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Date;


@Document(collection = "message")
public class Message {
@Id
private String id;
private MessageType type;
private String content;
private Long roomId;
private Long senderId;
private Long receiverId;
private Date sendTime;
private Boolean isRead;

protected Message() {
}

public static Message of(MessageSendRequest messageSendRequest){
Message message = new Message();
message.type = MessageType.fromString(messageSendRequest.type())
.orElseThrow(() -> new RestApiException(ChatError.INVALID_MESSAGE_TYPE));
message.content = messageSendRequest.content();
message.roomId = messageSendRequest.roomId();
message.senderId = messageSendRequest.senderId();
message.receiverId = messageSendRequest.receiverId();
message.sendTime = new Date();
message.isRead = false;
return message;
}

@Override
public String toString() {
return "Message{" +
"id=" + id +
", type=" + type +
", content='" + content + '\'' +
", roomId=" + roomId +
", senderId=" + senderId +
", receiverId=" + receiverId +
", sendTime=" + sendTime +
", isRead=" + isRead +
'}';
}
}
16 changes: 16 additions & 0 deletions src/main/java/com/aliens/backend/chat/domain/MessageType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.aliens.backend.chat.domain;

import java.util.Optional;

public enum MessageType {
NORMAL, BALANCE_GAME;

public static Optional<MessageType> fromString(String type) {
for (MessageType messageType : MessageType.values()) {
if (messageType.name().equalsIgnoreCase(type)) {
return Optional.of(messageType);
}
}
return Optional.empty();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.aliens.backend.chat.domain.repository;

import com.aliens.backend.chat.domain.ChatBlock;
import com.aliens.backend.chat.domain.ChatReport;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ChatBlockRepository extends JpaRepository<ChatBlock, Long> {
}
Loading

0 comments on commit 462b515

Please sign in to comment.