Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

@Schema(description = "답변 생성/수정 요청 DTO")
public record AnswerRequest(
@NotBlank(message = "답변 내용을 입력해주시기 바랍니다.")
@Size(max = 300, message = "답변 내용은 최대 300자까지 입력할 수 있습니다.")
@Schema(description = "답변 내용", example = "답변입니다.")
String content
String content,
@NotNull
Long memberId
) {

}
4 changes: 3 additions & 1 deletion src/main/java/com/oronaminc/join/emoji/dto/EmojiRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ public record EmojiRequest(
TargetType targetType,
@NotNull
@Schema(description = "공감 대상 ID", example = "1")
Long targetId
Long targetId,
@NotNull
Long memberId
) {

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package com.oronaminc.join.websocket.api;

import static com.oronaminc.join.global.exception.ErrorCode.TOO_MANY_REQUESTS_ANSWER;
import static com.oronaminc.join.global.exception.ErrorCode.UNAUTHORIZED_MEMBER;
import static com.oronaminc.join.global.exception.ErrorCode.*;

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;

import com.oronaminc.join.answer.domain.Answer;
import com.oronaminc.join.answer.dto.AnswerCreateResponse;
Expand All @@ -11,19 +16,14 @@
import com.oronaminc.join.answer.mapper.AnswerMapper;
import com.oronaminc.join.answer.service.AnswerService;
import com.oronaminc.join.global.exception.ErrorException;
import com.oronaminc.join.websocket.common.EventType;
import com.oronaminc.join.global.ratelimit.RateLimitService;
import com.oronaminc.join.global.ratelimit.RateLimitType;
import com.oronaminc.join.websocket.common.EventType;

import io.github.bucket4j.Bucket;
import jakarta.validation.Valid;
import java.security.Principal;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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;

@Slf4j
@Controller
Expand All @@ -38,10 +38,9 @@ public class AnswerWebsocketController {
public AnswerCreateResponse create(
@DestinationVariable Long roomId,
@DestinationVariable Long questionId,
@Payload @Valid AnswerRequest request,
Principal principal
@Payload @Valid AnswerRequest request
) {
Long memberId = getMemberId(principal);
Long memberId = request.memberId();

Bucket bucket = rateLimitService.getBucket(RateLimitType.CREATE_ANSWER, roomId, memberId, questionId);

Expand All @@ -60,11 +59,10 @@ public AnswerCreateResponse create(
@SendTo("/topic/rooms/{roomId}/answers")
public AnswerUpdateResponse update(
@DestinationVariable Long answerId,
@Payload @Valid AnswerRequest request,
Principal principal
@Payload @Valid AnswerRequest request
) {

Long memberId = getMemberId(principal);
Long memberId = request.memberId();

Answer answer = answerService.update(answerId, memberId, request);

Expand All @@ -77,9 +75,9 @@ public AnswerUpdateResponse update(
@SendTo("/topic/rooms/{roomId}/answers")
public AnswerDeleteResponse delete(
@DestinationVariable Long answerId,
Principal principal
@Payload @Valid StompMemberRequest request
) {
Long memberId = getMemberId(principal);
Long memberId = request.memberId();

answerService.delete(answerId, memberId);

Expand All @@ -88,11 +86,4 @@ public AnswerDeleteResponse delete(
return new AnswerDeleteResponse(answerId, EventType.DELETE);
}

private Long getMemberId(Principal principal) {
if (principal == null) {
throw new ErrorException(UNAUTHORIZED_MEMBER);
}
return Long.valueOf(principal.getName());
}

}
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
package com.oronaminc.join.websocket.api;

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;

import com.oronaminc.join.emoji.dto.EmojiRequest;
import com.oronaminc.join.emoji.dto.EmojiResponse;
import com.oronaminc.join.emoji.service.EmojiFacade;
import com.oronaminc.join.global.exception.ErrorCode;
import com.oronaminc.join.global.exception.ErrorException;
import com.oronaminc.join.global.ratelimit.RateLimitService;
import com.oronaminc.join.global.ratelimit.RateLimitType;

import io.github.bucket4j.Bucket;
import jakarta.validation.Valid;
import java.security.Principal;
import lombok.RequiredArgsConstructor;
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
Expand All @@ -28,10 +29,9 @@ public class EmojiWebsocketController {
@SendTo("/topic/rooms/{roomId}/emojis")
public EmojiResponse createEmoji(
@DestinationVariable Long roomId,
@Payload @Valid EmojiRequest emojiRequest,
Principal principal
@Payload @Valid EmojiRequest emojiRequest
) {
Long memberId = Long.valueOf(principal.getName());
Long memberId = emojiRequest.memberId();

Bucket bucket = rateLimitService.getBucket(RateLimitType.EMOJI, memberId,
emojiRequest.targetType(), emojiRequest.targetId());
Expand All @@ -47,10 +47,9 @@ public EmojiResponse createEmoji(
@SendTo("/topic/rooms/{roomId}/emojis")
public EmojiResponse deleteEmoji(
@DestinationVariable Long roomId,
@Payload @Valid EmojiRequest emojiRequest,
Principal principal
@Payload @Valid EmojiRequest emojiRequest
) {
Long memberId = Long.valueOf(principal.getName());
Long memberId = emojiRequest.memberId();

Bucket bucket = rateLimitService.getBucket(RateLimitType.EMOJI, memberId,
emojiRequest.targetType(), emojiRequest.targetId());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.oronaminc.join.websocket.api;

import java.security.Principal;

import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
Expand Down Expand Up @@ -37,11 +35,9 @@ public class QuestionWebsocketController {
@SendTo("/topic/rooms/{roomId}/questions")
public QuestionCreateResponse createQuestion(
@DestinationVariable Long roomId,
@Payload @Valid QuestionRequest request,
Principal principal
@Payload @Valid QuestionRequest request
) {
log.debug("수신한 메시지 = {}", request.content());
log.debug("principal = {}", principal);

Long memberId = request.memberId();

Expand All @@ -64,11 +60,10 @@ public QuestionCreateResponse createQuestion(
public QuestionUpdateResponse updateQuestion(
@DestinationVariable Long roomId,
@DestinationVariable Long questionId,
@Payload @Valid QuestionRequest request,
Principal principal
@Payload @Valid QuestionRequest request
) {

Long memberId = Long.valueOf(principal.getName());
Long memberId = request.memberId();

Question updated = questionService.update(memberId, roomId, questionId, request);

Expand All @@ -80,9 +75,9 @@ public QuestionUpdateResponse updateQuestion(
public QuestionDeleteResponse deleteQuestion(
@DestinationVariable Long roomId,
@DestinationVariable Long questionId,
Principal principal
@Payload @Valid StompMemberRequest request
) {
Long memberId = Long.valueOf(principal.getName());
Long memberId = request.memberId();

Long deletedId = questionService.delete(memberId, roomId, questionId);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.oronaminc.join.websocket.api;

import java.security.Principal;

import org.springframework.messaging.Message;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
Expand All @@ -25,10 +23,10 @@ public class RoomWebsocketController {
@SendTo("/topic/rooms/{roomId}/join")
public RoomJoinResponse joinRoom(
@DestinationVariable Long roomId,
Principal principal,
StompMemberRequest request,
Message<?> message
) {
Long memberId = Long.valueOf(principal.getName());
Long memberId = request.memberId();
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
String sessionId = accessor.getSessionId();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.oronaminc.join.websocket.api;

import jakarta.validation.constraints.NotNull;

public record StompMemberRequest(
@NotNull
Long memberId
) {
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,24 @@
package com.oronaminc.join.answer.service;

import static com.oronaminc.join.global.exception.ErrorCode.NOT_FOUND_ROOM;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
import static org.assertj.core.api.InstanceOfAssertFactories.LIST;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static com.oronaminc.join.global.exception.ErrorCode.*;
import static org.assertj.core.api.AssertionsForClassTypes.*;
import static org.assertj.core.api.InstanceOfAssertFactories.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.BDDMockito.*;

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

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.domain.Slice;
import org.springframework.test.util.ReflectionTestUtils;

import com.oronaminc.join.answer.dao.AnswerRepository;
import com.oronaminc.join.answer.domain.Answer;
Expand All @@ -31,18 +42,6 @@
import com.oronaminc.join.room.domain.Room;
import com.oronaminc.join.room.domain.RoomStatus;
import com.oronaminc.join.room.service.RoomReader;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.data.domain.Slice;
import org.springframework.test.util.ReflectionTestUtils;

@ExtendWith(MockitoExtension.class)
public class AnswerServiceTests {
Expand Down Expand Up @@ -114,7 +113,7 @@ void setUp() {
.participantType(ParticipantType.TEAM)
.build();

request = new AnswerRequest("답변입니다.");
request = new AnswerRequest("답변입니다.", mockMember.getId());
}

@Test
Expand Down Expand Up @@ -258,7 +257,7 @@ void updateAnswer_success() {
given(permissionValidator.validateAnswerUpdatePermission(1L, 1L))
.willReturn(answer);

AnswerRequest request = new AnswerRequest("수정된 내용");
AnswerRequest request = new AnswerRequest("수정된 내용", 1L);

// when
Answer result = answerService.update(answer.getId(), answer.getMember().getId(), request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ void createEmoji_success_test() throws InterruptedException {
executorService.submit(() -> {
try {
emojiFacade.createEmoji(members.get(idx).getId(),
new EmojiRequest(TargetType.ROOM, roomId));
new EmojiRequest(TargetType.ROOM, roomId, members.get(idx).getId()));
} catch (Exception e) {
e.printStackTrace();
} finally {
Expand Down Expand Up @@ -147,7 +147,7 @@ void deleteEmoji_success_test() throws InterruptedException {
executorService.submit(() -> {
try {
emojiFacade.deleteEmoji(members.get(idx).getId(),
new EmojiRequest(TargetType.ROOM, roomId));
new EmojiRequest(TargetType.ROOM, roomId, members.get(idx).getId()));
} catch (Exception e) {
e.printStackTrace();
} finally {
Expand Down
Loading