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

[Chat] 채팅 수정 API 구현 #166

Merged
merged 27 commits into from
Jun 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
15fa38f
feat: Chat model으로 ServerChat과 RoomChat 통합
minisundev Jun 10, 2024
24f64a3
refac: Chat model으로 ServerChat과 RoomChat 통합
minisundev Jun 10, 2024
868210f
refac: Chat model으로 ServerChat과 RoomChat 통합
minisundev Jun 10, 2024
3485157
refac: RoomChatRepository가 RoomChat대신 Chat을 저장하도록 변경
minisundev Jun 10, 2024
44957fa
refac: ServerChatRepository가 ServerChat대신 Chat을 저장하도록 변경
minisundev Jun 10, 2024
9b2090a
remove: RoomChat 삭제
minisundev Jun 10, 2024
e974fa2
remove: ServerChat 삭제
minisundev Jun 10, 2024
1a0e342
refac: RoomChat을 Chat으로 변경
minisundev Jun 10, 2024
1a8ef8d
feat: Chat에 verifyAccess 메서드 구현
minisundev Jun 10, 2024
9a0f861
feat: updateChat Controller Layer 구현
minisundev Jun 10, 2024
c638d6b
feat: updateRoomChat,updateServerChat ChatService에 구현
minisundev Jun 10, 2024
fcafda7
feat: CHAT_NOT_FOUND ErrorCode 정의
minisundev Jun 10, 2024
1865a58
feat: UpdateChatRequest 생성
minisundev Jun 10, 2024
5e609fe
feat: MongoAuditing 적용
minisundev Jun 10, 2024
a9a6756
chore: MongoAuditing 적용하기 위한 설정 추가
minisundev Jun 10, 2024
9730302
feat: updateChat 테스트코드 작성
minisundev Jun 10, 2024
3aa0306
feat: updateChat 테스트코드 작성
minisundev Jun 10, 2024
39ff4bf
Merge branch 'dev' into feat/edit-chat
minisundev Jun 10, 2024
abc4fa4
chore: 테스트에서 mongoAuditing을 이용하기 위한 설정 추가
minisundev Jun 10, 2024
0ed93d7
feat: 테스트에서 mongoAuditing을 이용하기 위해 TestMongoConfig 생성
minisundev Jun 10, 2024
51275cc
feat: 테스트에서 mongoAuditing을 이용하기 위해 TestMongoConfig ChatControllerTest…
minisundev Jun 10, 2024
b39fdcc
Merge remote-tracking branch 'origin/feat/edit-chat' into feat/edit-chat
minisundev Jun 10, 2024
ee82aa1
fix: 잘못 병합된 파일 수정
minisundev Jun 10, 2024
d91e903
feat: ChatRoomControllerTest에 MongoConfig Import
minisundev Jun 10, 2024
9b30e85
refac: 불필요한 예외케이스 발생 삭제
minisundev Jun 11, 2024
8c75710
refac: verifyAccess Service Layer로 이동
minisundev Jun 11, 2024
4957831
feat: verifyIfAuthor 메서드 구현
minisundev Jun 11, 2024
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
2 changes: 2 additions & 0 deletions chat/src/main/kotlin/kpring/chat/ChatApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package kpring.chat

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.data.mongodb.config.EnableMongoAuditing

@EnableMongoAuditing
@SpringBootApplication
class ChatApplication

Expand Down
19 changes: 17 additions & 2 deletions chat/src/main/kotlin/kpring/chat/chat/api/v1/ChatController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import kpring.chat.global.exception.GlobalException
import kpring.core.auth.client.AuthClient
import kpring.core.chat.chat.dto.request.ChatType
import kpring.core.chat.chat.dto.request.CreateChatRequest
import kpring.core.chat.chat.dto.request.UpdateChatRequest
import kpring.core.global.dto.response.ApiResponse
import kpring.core.server.client.ServerClient
import kpring.core.server.dto.request.GetServerCondition
Expand All @@ -18,8 +19,8 @@ import org.springframework.web.bind.annotation.*
@RequestMapping("/api/v1")
class ChatController(
private val chatService: ChatService,
val authClient: AuthClient,
val serverClient: ServerClient,
private val authClient: AuthClient,
private val serverClient: ServerClient,
) {
@PostMapping("/chat")
fun createChat(
Expand Down Expand Up @@ -59,4 +60,18 @@ class ChatController(
}
return ResponseEntity.ok().body(ApiResponse(data = result, status = 200))
}

@PatchMapping("/chat")
fun updateChat(
@Validated @RequestBody request: UpdateChatRequest,
@RequestHeader("Authorization") token: String,
): ResponseEntity<*> {
val userId = authClient.getTokenInfo(token).data!!.userId
val result =
when (request.type) {
ChatType.Room -> chatService.updateRoomChat(request, userId)
ChatType.Server -> chatService.updateServerChat(request, userId)
}
return ResponseEntity.ok().body(ApiResponse<Nothing>(status = 200))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,20 @@ import org.springframework.data.mongodb.core.mapping.Document

@NoArg
@Document(collection = "chats")
class RoomChat(
class Chat(
val userId: String,
val roomId: String,
val content: String,
// roomId or serverId
val contextId: String,
var content: String,
) : BaseTime() {
@Id
var id: String? = null

fun isEdited(): Boolean {
return !createdAt.equals(updatedAt)
}

fun updateContent(content: String) {
this.content = content
}
}
21 changes: 0 additions & 21 deletions chat/src/main/kotlin/kpring/chat/chat/model/ServerChat.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package kpring.chat.chat.repository

import kpring.chat.chat.model.RoomChat
import kpring.chat.chat.model.Chat
import org.springframework.data.domain.Pageable
import org.springframework.data.mongodb.repository.MongoRepository
import org.springframework.data.querydsl.QuerydslPredicateExecutor
import org.springframework.stereotype.Repository

@Repository
interface RoomChatRepository : MongoRepository<RoomChat, String>, QuerydslPredicateExecutor<RoomChat> {
fun findAllByRoomId(
roomId: String,
interface RoomChatRepository : MongoRepository<Chat, String>, QuerydslPredicateExecutor<Chat> {
fun findAllByContextId(
contextId: String,
pageable: Pageable,
): List<RoomChat>
): List<Chat>
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package kpring.chat.chat.repository

import kpring.chat.chat.model.ServerChat
import kpring.chat.chat.model.Chat
import org.springframework.data.domain.Pageable
import org.springframework.data.mongodb.repository.MongoRepository
import org.springframework.data.querydsl.QuerydslPredicateExecutor
import org.springframework.stereotype.Repository

@Repository
interface ServerChatRepository : MongoRepository<ServerChat, String>, QuerydslPredicateExecutor<ServerChat> {
fun findAllByServerId(
interface ServerChatRepository : MongoRepository<Chat, String>, QuerydslPredicateExecutor<Chat> {
fun findAllByContextId(
serverId: String,
pageable: Pageable,
): List<ServerChat>
): List<Chat>
}
61 changes: 42 additions & 19 deletions chat/src/main/kotlin/kpring/chat/chat/service/ChatService.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package kpring.chat.chat.service

import kpring.chat.chat.model.RoomChat
import kpring.chat.chat.model.ServerChat
import kpring.chat.chat.model.Chat
import kpring.chat.chat.repository.RoomChatRepository
import kpring.chat.chat.repository.ServerChatRepository
import kpring.chat.chatroom.repository.ChatRoomRepository
import kpring.chat.global.exception.ErrorCode
import kpring.chat.global.exception.GlobalException
import kpring.core.chat.chat.dto.request.CreateChatRequest
import kpring.core.chat.chat.dto.request.UpdateChatRequest
import kpring.core.chat.chat.dto.response.ChatResponse
import kpring.core.server.dto.ServerSimpleInfo
import org.springframework.beans.factory.annotation.Value
Expand All @@ -28,9 +28,9 @@ class ChatService(
): Boolean {
val chat =
roomChatRepository.save(
RoomChat(
Chat(
userId = userId,
roomId = request.id,
contextId = request.id,
content = request.content,
),
)
Expand All @@ -43,9 +43,9 @@ class ChatService(
): Boolean {
val chat =
serverChatRepository.save(
ServerChat(
Chat(
userId = userId,
serverId = request.id,
contextId = request.id,
content = request.content,
),
)
Expand All @@ -60,9 +60,9 @@ class ChatService(
verifyChatRoomAccess(chatRoomId, userId)

val pageable: Pageable = PageRequest.of(page, pageSize)
val roomChats: List<RoomChat> = roomChatRepository.findAllByRoomId(chatRoomId, pageable)
val roomChats: List<Chat> = roomChatRepository.findAllByContextId(chatRoomId, pageable)

return convertRoomChatsToResponses(roomChats)
return convertChatsToResponses(roomChats)
}

fun getServerChats(
Expand All @@ -74,9 +74,40 @@ class ChatService(
verifyServerAccess(servers, serverId)

val pageable: Pageable = PageRequest.of(page, pageSize)
val chats: List<ServerChat> = serverChatRepository.findAllByServerId(serverId, pageable)
val chats: List<Chat> = serverChatRepository.findAllByContextId(serverId, pageable)

return convertServerChatsToResponses(chats)
return convertChatsToResponses(chats)
}

fun updateRoomChat(
request: UpdateChatRequest,
userId: String,
): Boolean {
val chat = roomChatRepository.findById(request.id).orElseThrow { GlobalException(ErrorCode.CHAT_NOT_FOUND) }
verifyIfAuthor(userId, chat)
chat.updateContent(request.content)
roomChatRepository.save(chat)
return true
}

fun updateServerChat(
request: UpdateChatRequest,
userId: String,
): Boolean {
val chat = serverChatRepository.findById(request.id).orElseThrow { GlobalException(ErrorCode.CHAT_NOT_FOUND) }
verifyIfAuthor(userId, chat)
chat.updateContent(request.content)
serverChatRepository.save(chat)
return true
}

fun verifyIfAuthor(
userId: String,
chat: Chat,
) {
if (userId != chat.userId) {
throw GlobalException(ErrorCode.FORBIDDEN_CHAT)
}
}

private fun verifyServerAccess(
Expand All @@ -100,15 +131,7 @@ class ChatService(
}
}

private fun convertRoomChatsToResponses(roomChats: List<RoomChat>): List<ChatResponse> {
val chatResponse =
roomChats.map { chat ->
ChatResponse(chat.id!!, chat.isEdited(), chat.createdAt.toString(), chat.content)
}
return chatResponse
}

private fun convertServerChatsToResponses(chats: List<ServerChat>): List<ChatResponse> {
private fun convertChatsToResponses(chats: List<Chat>): List<ChatResponse> {
val chatResponse =
chats.map { chat ->
ChatResponse(chat.id!!, chat.isEdited(), chat.createdAt.toString(), chat.content)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ enum class ErrorCode(val httpStatus: Int, val message: String) {
// 403
FORBIDDEN_CHATROOM(HttpStatus.FORBIDDEN.value(), "접근이 제한된 채팅방 입니다"),
FORBIDDEN_SERVER(HttpStatus.FORBIDDEN.value(), "접근이 제한된 서버 입니다"),
FORBIDDEN_CHAT(HttpStatus.FORBIDDEN.value(), "접근이 제한된 채팅 입니다"),

// 404
CHATROOM_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "해당 id로 chatroom을 찾을 수 없습니다"),
CHAT_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "해당 id로 채팅을 찾을 수 없습니다"),

// 500
INVITATION_LINK_SAVE_FAILURE(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Invitation Code가 저장되지 않았습니다"),
Expand Down
4 changes: 4 additions & 0 deletions chat/src/main/resources/application.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
spring:
application:
name: chat
main:
allow-bean-definition-overriding: true
data:
mongodb:
host: localhost
Expand All @@ -10,6 +12,8 @@ spring:
database: mongodb
authentication-database: admin
authSource: admin
repositories:
enabled: true

redis:
host: localhost
Expand Down
Loading