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] 채팅방 관련 기능 구현 #143

Merged
merged 8 commits into from
Oct 4, 2023
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package kr.codesquad.secondhand.api.chat.controller;

import static kr.codesquad.secondhand.global.util.HttpAuthorizationUtils.extractMemberId;

import javax.servlet.http.HttpServletRequest;
import kr.codesquad.secondhand.api.chat.dto.ChatRoomCreateDto;
import kr.codesquad.secondhand.api.chat.service.ChatFacadeService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class ChatRoomController {

private final ChatFacadeService chatService;

@PostMapping("/api/chat/room")
public ResponseEntity<ChatRoomCreateDto.Response> createChatRoom(HttpServletRequest httpServletRequest,
@Validated @RequestBody ChatRoomCreateDto.Request request) {
Long memberId = extractMemberId(httpServletRequest);
ChatRoomCreateDto.Response response = chatService.createChatRoom(memberId, request.getProductId());
return ResponseEntity
.status(HttpStatus.CREATED)
.body(response);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package kr.codesquad.secondhand.api.chat.domain;

import java.util.UUID;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import kr.codesquad.secondhand.api.member.domain.Member;
import kr.codesquad.secondhand.api.product.domain.Product;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class ChatRoom {

@Id
private String id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "product_id")
private Product product;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;

private ChatRoom(String id, Product product, Member member) {
this.id = id;
this.product = product;
this.member = member;
}

public static ChatRoom create(Product product, Member member) {
String id = UUID.randomUUID().toString();
return new ChatRoom(id, product, member);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package kr.codesquad.secondhand.api.chat.dto;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import lombok.Getter;

public class ChatRoomCreateDto {

@Getter
public static class Request {

@NotNull(message = "생성할 채팅방의 상품 정보가 비어있습니다.")
private Long productId;

@Valid
private MessageDTO message;
}

@Getter
private static class MessageDTO {

@NotNull(message = "생성할 채팅방의 senderId가 비어있습니다.")
private Long senderId;

@NotBlank(message = "생성할 채팅방의 메시지 내용이 없습니다.")
private String content;
}

@Getter
public static class Response {

private final String roomId;

public Response(String roomId) {
this.roomId = roomId;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package kr.codesquad.secondhand.api.chat.repository;

import kr.codesquad.secondhand.api.chat.domain.ChatRoom;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ChatRoomRepositoryImpl extends JpaRepository<ChatRoom, String> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package kr.codesquad.secondhand.api.chat.service;

import kr.codesquad.secondhand.api.chat.domain.ChatRoom;
import kr.codesquad.secondhand.api.chat.dto.ChatRoomCreateDto;
import kr.codesquad.secondhand.api.member.domain.Member;
import kr.codesquad.secondhand.api.member.service.MemberService;
import kr.codesquad.secondhand.api.product.domain.Product;
import kr.codesquad.secondhand.api.product.service.ProductService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class ChatFacadeService {

private final ChatService chatService;
private final ProductService productService;
private final MemberService memberService;

public ChatRoomCreateDto.Response createChatRoom(Long memberId, Long productId) {
Member member = memberService.getMemberReferenceById(memberId); // 없는 경우에 무슨 예외 터지는지 확인
Product product = productService.findById(productId);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일부러 프록시 조회, 일반 조회를 혼용하셨나요??

ChatRoom chatRoom = chatService.createChatRoom(product, member);

// TODO request의 첫 메시지 관련 처리 필요
return new ChatRoomCreateDto.Response(chatRoom.getId());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package kr.codesquad.secondhand.api.chat.service;

import kr.codesquad.secondhand.api.chat.domain.ChatRoom;
import kr.codesquad.secondhand.api.chat.repository.ChatRoomRepositoryImpl;
import kr.codesquad.secondhand.api.member.domain.Member;
import kr.codesquad.secondhand.api.product.domain.Product;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class ChatService {

private final ChatRoomRepositoryImpl chatRoomRepository;

public ChatRoom createChatRoom(Product product, Member member) {
ChatRoom chatRoom = ChatRoom.create(product, member);
chatRoomRepository.save(chatRoom);
return chatRoom;
}

}