Skip to content

Commit

Permalink
Merge branch 'refs/heads/feature/#34' into feature/#29
Browse files Browse the repository at this point in the history
# Conflicts:
#	build.gradle
#	src/main/java/meltingpot/server/config/SecurityConfig.java
#	src/main/java/meltingpot/server/config/WebConfig.java
#	src/main/java/meltingpot/server/domain/entity/party/Party.java
#	src/main/resources/application.yml
  • Loading branch information
runasy-koonta committed May 26, 2024
2 parents 2664776 + 337e5b7 commit 1c31501
Show file tree
Hide file tree
Showing 56 changed files with 1,016 additions and 17 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -108,4 +108,6 @@ hs_err_pid*

# mac
.DS_Store
src/main/resources/application.yml
.idea/workspace.xml
.idea/workspace.xml
.idea/workspace.xml
20 changes: 20 additions & 0 deletions .idea/dataSources.local.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '3.2.5'
id 'io.spring.dependency-management' version '1.1.4'
}
Expand Down Expand Up @@ -34,13 +35,18 @@ dependencies {
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'

implementation 'org.springframework.boot:spring-boot-starter-websocket'
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
implementation 'com.amazonaws:aws-java-sdk-s3:1.12.265'
implementation 'software.amazon.ion:ion-java:1.0.3'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

tasks.named('test') {
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/meltingpot/server/ServerApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,18 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing
public class ServerApplication {
public class ServerApplication extends SpringBootServletInitializer {

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ServerApplication.class);
}

public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package meltingpot.server.chat.controller;

import lombok.RequiredArgsConstructor;
import meltingpot.server.chat.dto.ChatMessageCreateResponse;
import meltingpot.server.chat.dto.ChatMessageCreateRequest;
import meltingpot.server.chat.service.ChatService;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
@RequiredArgsConstructor
public class ChatController {
private final ChatService chatService;

@MessageMapping("/chat/rooms/{chatRoomId}/send") // <- 해당 경로로 들어오면 메서드 호출
@SendTo("/topic/public/rooms/{chatRoomId}") // 구독 중인 장소로 메세지 전달
public ChatMessageCreateResponse sendMessage(
@DestinationVariable Long chatRoomId,
@Payload ChatMessageCreateRequest request) {
ChatMessageCreateResponse response = chatService.createChatMessage(chatRoomId, request);
return response;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package meltingpot.server.chat.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import lombok.RequiredArgsConstructor;
import meltingpot.server.chat.dto.*;
import meltingpot.server.chat.service.ChatRoomQueryService;
import meltingpot.server.chat.service.ChatRoomService;
import meltingpot.server.util.PageResponse;
import meltingpot.server.util.ResponseData;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import static meltingpot.server.util.ResponseCode.SIGNIN_SUCCESS;

@RestController
@RequestMapping("/api/v1/chatRooms")
@RequiredArgsConstructor
public class ChatRoomController {
private final ChatRoomQueryService chatRoomQueryService;
private final ChatRoomService chatRoomService;

// [CHECK] /{userId}, PageResponse, param
@GetMapping("/{userId}")
@Operation(summary = "채팅방 전체 목록 조회")
@ApiResponse(responseCode = "100", description = "요청에 성공하였습니다.", content = @Content(mediaType = "application/json"))
@Parameter(name = "userId", description = "사용자 ID", required = true, example = "1")
public ResponseEntity<ResponseData<PageResponse<List<ChatRoomsGetResponse>>>> getChatRooms(
@PathVariable Long userId,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "5") int size
) {
return ResponseData.toResponseEntity(SIGNIN_SUCCESS, chatRoomQueryService.getChatRooms());
}

// [CHECK] /{userId}
@PatchMapping("/alarm/{chatRoomId}/{userId}")
@Operation(summary = "채팅방 알람 설정 변경")
@ApiResponse(responseCode = "1000", description = "요청에 성공하였습니다.", content = @Content(mediaType = "application/json"))
@Parameters({
@Parameter(name = "chatRoomId", description = "채팅룸 ID", required = true, example = "1"),
@Parameter(name = "userId", description = "사용자 ID", required = true, example = "1")
})
public ResponseEntity<ResponseData> updateAlarmStatus(
@PathVariable Long userId,
@PathVariable Long chatRoomId
) {
chatRoomService.updateAlarmStatus(userId, chatRoomId);
return ResponseData.toResponseEntity(SIGNIN_SUCCESS);
}

// [CHECK] PageResponse
@GetMapping("{chatRoomId}")
@Operation(summary = "채팅방 채팅 내역 조회")
@ApiResponse(responseCode = "1000", description = "요청에 성공하였습니다.", content = @Content(mediaType = "application/json"))
@Parameter(name = "chatRoomId", description = "채팅룸 ID", required = true, example = "1")
public ResponseEntity<ResponseData<PageResponse<List<ChatMessageGetResponse>>>> getChatMessage(
@PathVariable Long chatRoomId,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "5") int size
) {
ChatMessageListQuery query = ChatMessageListQuery.builder()
.chatRoomId(chatRoomId)
.page(page)
.size(size)
.build();
return ResponseData.toResponseEntity(SIGNIN_SUCCESS, chatRoomQueryService.getChatMessage(query));
}

@GetMapping("{chatRoomId}/detail")
@Operation(summary = "채팅방 상단")
@ApiResponse(responseCode = "1000", description = "요청에 성공하였습니다.", content = @Content(mediaType = "application/json"))
@Parameter(description = "채팅룸 ID", required = true, example = "1")
public ResponseEntity<ResponseData<ChatRoomDetailGetResponse>> getChatRoomDetail(@PathVariable Long chatRoomId) {
return ResponseData.toResponseEntity(SIGNIN_SUCCESS, chatRoomQueryService.getRoomDetail(chatRoomId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package meltingpot.server.chat.dto;

public record ChatMessageCreateRequest(
Long userId,
String content,
Long chatRoomId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package meltingpot.server.chat.dto;

import lombok.Builder;

@Builder
public record ChatMessageCreateResponse(
Long chatId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package meltingpot.server.chat.dto;

import meltingpot.server.domain.entity.chat.ChatMessage;
import meltingpot.server.domain.entity.chat.enums.Role;
import org.springframework.data.domain.Slice;

public record ChatMessageGetResponse(
Long chatId,
String content,
Role role
) {
public static ChatMessageGetResponse from(ChatMessage chatMessage) {
return new ChatMessageGetResponse(
chatMessage.getId(),
chatMessage.getContent(),
chatMessage.getRole()
);
}
}
11 changes: 11 additions & 0 deletions src/main/java/meltingpot/server/chat/dto/ChatMessageListQuery.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package meltingpot.server.chat.dto;

import lombok.Builder;

@Builder
public record ChatMessageListQuery(
Long chatRoomId,
int page,
int size
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package meltingpot.server.chat.dto;

public record ChatRoomAlarmUpdateResponse(
String status
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package meltingpot.server.chat.dto;

import meltingpot.server.domain.entity.party.Party;

public record ChatRoomDetailGetResponse(
String imageKey,
String title,
Integer userCnt
) {
public static ChatRoomDetailGetResponse of(Party party, int userCnt) {
return new ChatRoomDetailGetResponse(
// [CHECK] 프로필 이미지
// party.getUser().getProfileImages(),
"",
party.getPartySubject(),
userCnt
);
}
}
32 changes: 32 additions & 0 deletions src/main/java/meltingpot/server/chat/dto/ChatRoomsGetResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package meltingpot.server.chat.dto;

import meltingpot.server.domain.entity.party.Party;

import java.time.LocalDateTime;

public record ChatRoomsGetResponse(
Long chatRoomId,
String leaderName,
String imageKey,
String partySubject,
String partyStatus,
String partyLocationAddress,
LocalDateTime partyStartTime,
int userCnt,
int messageCnt
) {
// [CHECK] 유저 프로필 이미지
public static ChatRoomsGetResponse of(Party party, int userCnt, int messageCnt) {
// return new ChatRoomsGetResponse(
// party.getChatRoom().getId(),
// party.getUser().getUsername(),
// party.getUser().getProfileImages(),
// party.getPartySubject(),
// party.getPartyLocationAddress(),
// party.getPartyStartTime(),
// userCnt,
// messageCnt
// );
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package meltingpot.server.chat.service;

import lombok.RequiredArgsConstructor;
import meltingpot.server.chat.dto.ChatMessageGetResponse;
import meltingpot.server.chat.dto.ChatMessageListQuery;
import meltingpot.server.chat.dto.ChatRoomDetailGetResponse;
import meltingpot.server.chat.dto.ChatRoomsGetResponse;
import meltingpot.server.domain.entity.chat.ChatRoom;
import meltingpot.server.domain.entity.party.Party;
import meltingpot.server.domain.repository.chat.ChatMessageRepository;
import meltingpot.server.domain.repository.chat.ChatRoomRepository;
import meltingpot.server.domain.repository.chat.ChatRoomUserRepository;
import meltingpot.server.domain.repository.party.PartyRepository;
import meltingpot.server.util.PageResponse;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class ChatRoomQueryService {
private final ChatRoomUserRepository chatRoomUserRepository;
private final ChatRoomRepository chatRoomRepository;
private final ChatMessageRepository chatMessageRepository;
private final PartyRepository partyRepository;

public ChatRoomDetailGetResponse getRoomDetail(Long chatRoomId) {
Party party = partyRepository.findByChatRoomId(chatRoomId);
return ChatRoomDetailGetResponse.of(party, chatRoomUserRepository.countChatRoomUsersByChatRoomId(chatRoomId));
}

// [CHECK]
public PageResponse<List<ChatMessageGetResponse>> getChatMessage(ChatMessageListQuery query) {
ChatRoom chatRoom = chatRoomRepository.findById(query.chatRoomId())
.orElseThrow(() -> new IllegalArgumentException("ChatRoom not found"));
PageRequest pageRequest = PageRequest.of(query.page(), query.size(), Sort.by("chatMessageId").descending());
List<ChatMessageGetResponse> chatMessages = chatMessageRepository.findAllByChatRoom(chatRoom, pageRequest)
.stream().map(ChatMessageGetResponse::from).toList();

// return PageResponse.of(chatMessages, pageRequest);
return null;
}

public PageResponse<List<ChatRoomsGetResponse>> getChatRooms() {
return null;
}
}
21 changes: 21 additions & 0 deletions src/main/java/meltingpot/server/chat/service/ChatRoomService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package meltingpot.server.chat.service;

import lombok.RequiredArgsConstructor;
import meltingpot.server.domain.entity.chat.ChatRoomUser;
import meltingpot.server.domain.repository.chat.ChatRoomUserRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
@RequiredArgsConstructor
public class ChatRoomService {
private final ChatRoomUserRepository chatRoomUserRepository;

public void updateAlarmStatus(Long userId, Long chatRoomId) {
ChatRoomUser chatRoomUser = chatRoomUserRepository.findChatRoomUserByUserIdAndChatRoomId(userId, chatRoomId)
.orElseThrow(() -> new IllegalArgumentException("ChatRoomUser not found"));
chatRoomUser.toggleAlarm();
chatRoomUserRepository.save(chatRoomUser);
}
}
Loading

0 comments on commit 1c31501

Please sign in to comment.