Skip to content

Commit

Permalink
Merge pull request #81 from Att-ies/Feature/55-get-chat-room-id
Browse files Browse the repository at this point in the history
Feature/55 post chat room
  • Loading branch information
JunYoung-C authored Jan 16, 2023
2 parents b0d50fd + 6261595 commit 4286115
Show file tree
Hide file tree
Showing 10 changed files with 431 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Table(uniqueConstraints = {@UniqueConstraint(
name = "CHAT_ROOM_UNIQUE",
columnNames = {"artist_id", "member_id", "art_work_id"})})
public class ChatRoom extends BaseEntity {

@Id
Expand All @@ -27,8 +30,8 @@ public class ChatRoom extends BaseEntity {
private Member artist;

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "art_work_id")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,8 @@

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
Optional<ChatRoom> findByMemberIdAndArtistIdAndArtWorkId(Long artistId, Long MemberId, Long artWorkId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.sptp.backend.chat_room.service;

import com.sptp.backend.art_work.repository.ArtWorkRepository;
import com.sptp.backend.chat_room.repository.ChatRoom;
import com.sptp.backend.chat_room.repository.ChatRoomRepository;
import com.sptp.backend.chat_room.web.dto.ChatRoomDetailResponse;
import com.sptp.backend.common.exception.CustomException;
import com.sptp.backend.common.exception.ErrorCode;
import com.sptp.backend.member.repository.MemberRepository;
import com.sptp.backend.message.repository.Message;
import com.sptp.backend.message.repository.MessageRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
@Transactional
public class ChatRoomService {

private final ChatRoomRepository chatRoomRepository;
private final MemberRepository memberRepository;
private final ArtWorkRepository artWorkRepository;
private final MessageRepository messageRepository;

public long createChatRoom(Long loginMemberId, Long artistId, Long artWorkId) {

Optional<ChatRoom> chatRoomOptional =
chatRoomRepository.findByMemberIdAndArtistIdAndArtWorkId(loginMemberId, artistId, artWorkId);

// 기존 채팅방이 존재하는 경우 해당 id 반환
if (chatRoomOptional.isPresent()) {
return chatRoomOptional.get().getId();
}

ChatRoom chatRoom = ChatRoom.builder()
.member(memberRepository.findById(loginMemberId)
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_MEMBER)))
.artist(memberRepository.findById(artistId)
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_ARTIST)))
.artWork(artWorkRepository.findById(artWorkId)
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_ARTWORK)))
.build();

return chatRoomRepository.save(chatRoom).getId();
}

public ChatRoomDetailResponse getChatRoomDetail(Long chatRoomId) {

ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId)
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_CHAT_ROOM));
List<Message> messages = messageRepository.findAllByChatRoomOrderByIdAsc(chatRoom);

return ChatRoomDetailResponse.builder()
.chatRoomId(chatRoomId)
.artist(ChatRoomDetailResponse.MemberDto.from(chatRoom.getArtist()))
.member(ChatRoomDetailResponse.MemberDto.from(chatRoom.getMember()))
.messages(messages.stream()
.map(ChatRoomDetailResponse.MessageDto::from)
.collect(Collectors.toList()))
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.sptp.backend.chat_room.web;

import com.sptp.backend.chat_room.service.ChatRoomService;
import com.sptp.backend.chat_room.web.dto.ChatRoomCreateRequest;
import com.sptp.backend.chat_room.web.dto.ChatRoomDetailResponse;
import com.sptp.backend.jwt.service.dto.CustomUserDetails;
import lombok.RequiredArgsConstructor;
import org.apache.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequiredArgsConstructor
@RequestMapping("/chat-rooms")
public class ChatRoomController {

private final ChatRoomService chatRoomService;

@PostMapping
public ResponseEntity<Void> createChatRoom(@Valid @RequestBody ChatRoomCreateRequest chatRoomCreateRequest,
@AuthenticationPrincipal CustomUserDetails userDetails) {

long chatRoomId = chatRoomService.createChatRoom(userDetails.getMember().getId(),
chatRoomCreateRequest.getArtistId(), chatRoomCreateRequest.getArtWorkId());

return ResponseEntity.status(HttpStatus.MOVED_PERMANENTLY)
.header(HttpHeaders.LOCATION, "/chat-rooms/" + chatRoomId).build();
}

@GetMapping("/{chatRoomId}")
public ResponseEntity<ChatRoomDetailResponse> getChatRoomDetail(@PathVariable Long chatRoomId) {

return ResponseEntity.ok(chatRoomService.getChatRoomDetail(chatRoomId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.sptp.backend.chat_room.web.dto;

import com.sptp.backend.art_work.repository.ArtWork;
import com.sptp.backend.member.repository.Member;
import lombok.*;

import javax.validation.constraints.NotNull;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ChatRoomCreateRequest {

@NotNull(message = "작가 고유 번호는 필수입니다.")
private Long artistId;

@NotNull(message = "작품 고유 번호는 필수입니다.")
private Long artWorkId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.sptp.backend.chat_room.web.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.sptp.backend.member.repository.Member;
import com.sptp.backend.message.repository.Message;
import lombok.*;

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

@Data
@Builder
public class ChatRoomDetailResponse {

private Long chatRoomId;
private MemberDto artist;
private MemberDto member;
private List<MessageDto> messages;

@Data
@Builder
public static class MemberDto {
private Long id;
private String name;
// private String responseTime; 추후 구현 예정

public static MemberDto from(Member member) {
return MemberDto.builder()
.id(member.getId())
.name(member.getNickname())
.build();
}
}

@Data
@Builder
public static class MessageDto {
private Long senderId;
private String message;

@JsonFormat(pattern = "yyyy-MM-dd-HH-mm-ss")
private LocalDateTime sendTime;

public static MessageDto from(Message message) {
return MessageDto.builder()
.senderId(message.getSender().getId())
.message(message.getMessage())
.sendTime(message.getCreatedDate())
.build();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
package com.sptp.backend.message.repository;

import com.sptp.backend.chat_room.repository.ChatRoom;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface MessageRepository extends JpaRepository<Message, Long> {

@EntityGraph(attributePaths = {"sender"})
List<Message> findAllByChatRoomOrderByIdAsc(ChatRoom chatRom);
}
Loading

0 comments on commit 4286115

Please sign in to comment.