diff --git a/backEnd/src/main/java/com/quiz/ourclass/domain/board/sevice/PostServiceImpl.java b/backEnd/src/main/java/com/quiz/ourclass/domain/board/sevice/PostServiceImpl.java index d08a3037..ede3adb3 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/domain/board/sevice/PostServiceImpl.java +++ b/backEnd/src/main/java/com/quiz/ourclass/domain/board/sevice/PostServiceImpl.java @@ -34,6 +34,7 @@ import com.quiz.ourclass.global.util.UserAccessUtil; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; @@ -201,8 +202,11 @@ public Boolean postDelete(Long postId) { } } else if (requesterRole == Role.TEACHER) { Long orgId = post.getOrganization().getId(); - userAccessUtil.isOrganizationManager(member, orgId) - .orElseThrow(() -> new GlobalException(ErrorCode.MEMBER_NOT_IN_ORGANIZATION)); + Optional organization = + userAccessUtil.isOrganizationManager(member, orgId); + if (organization.isEmpty()) { + throw new GlobalException(ErrorCode.MEMBER_NOT_IN_ORGANIZATION); + } } commentRepository.deleteByPostId(post.getId()); postRepository.delete(post); @@ -237,8 +241,11 @@ public Boolean postReport(Long postId) { Post post = postRepository.findById(postId) .orElseThrow(() -> new GlobalException(ErrorCode.POST_NOT_FOUND)); - userAccessUtil.isMemberOfOrganization(member, post.getOrganization().getId()) - .orElseThrow(() -> new GlobalException(ErrorCode.MEMBER_NOT_IN_ORGANIZATION)); + Optional memberOrganization = + userAccessUtil.isMemberOfOrganization(member, post.getOrganization().getId()); + if (memberOrganization.isEmpty()) { + throw new GlobalException(ErrorCode.MEMBER_NOT_IN_ORGANIZATION); + } String reportMember = member.getName(); String authorMember = post.getAuthor().getName(); diff --git a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatController.java b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatController.java index 1e894255..e845209e 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatController.java +++ b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatController.java @@ -39,7 +39,8 @@ public void exitChatRoom(@PathVariable(value = "id") Long id) { } @GetMapping - public ResponseEntity> chatListView(MessageSliceRequest request) { + public ResponseEntity> chatListView( + MessageSliceRequest request) { MessageResponse messageResponse = chatService.chatListView(request); return ResponseEntity.ok(ResultResponse.success(messageResponse)); } diff --git a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatControllerDocs.java b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatControllerDocs.java index e58c1f75..463864ff 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatControllerDocs.java +++ b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatControllerDocs.java @@ -52,7 +52,7 @@ void exitChatRoom( } ) @GetMapping - ResponseEntity> chatListView( + ResponseEntity> chatListView( MessageSliceRequest request ); } diff --git a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatFilterController.java b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatFilterController.java index 4363ffce..16970793 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatFilterController.java +++ b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatFilterController.java @@ -24,7 +24,7 @@ public class ChatFilterController implements ChatFilterControllerDocs { private final ChatFilterService chatFilterService; @PostMapping("/{organizationId}") - public ResponseEntity> register( + public ResponseEntity> register( @PathVariable(value = "organizationId") Long organizationId, @RequestBody ChatFilterRequest request ) { @@ -33,7 +33,7 @@ public ResponseEntity> register( } @PatchMapping("/{organizationId}/{id}") - public ResponseEntity> modify( + public ResponseEntity> modify( @PathVariable(value = "organizationId") Long organizationId, @PathVariable(value = "id") Long id, @RequestBody ChatFilterRequest request @@ -43,7 +43,7 @@ public ResponseEntity> modify( } @DeleteMapping("/{id}") - public ResponseEntity> delete( + public ResponseEntity> delete( @PathVariable(value = "id") Long id ) { Boolean isDelete = chatFilterService.delete(id); @@ -51,7 +51,7 @@ public ResponseEntity> delete( } @GetMapping - public ResponseEntity> select( + public ResponseEntity> select( ChatFilterSliceRequest request ) { ChatFilterResponse response = chatFilterService.select(request); diff --git a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatFilterControllerDocs.java b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatFilterControllerDocs.java index 4a27890c..24afbda6 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatFilterControllerDocs.java +++ b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/controller/ChatFilterControllerDocs.java @@ -34,7 +34,7 @@ public interface ChatFilterControllerDocs { } ) @PostMapping("/{organizationId}") - ResponseEntity> register( + ResponseEntity> register( @Parameter(name = "organizationId", description = "단체 ID 값", required = true, in = ParameterIn.PATH) @PathVariable(value = "organizationId") Long organizationId, @Parameter(name = "request", description = "필터링 단어 DTO", required = true, in = ParameterIn.DEFAULT) @@ -57,7 +57,7 @@ ResponseEntity> register( } ) @PatchMapping("/{organizationId}/{id}") - ResponseEntity> modify( + ResponseEntity> modify( @Parameter(name = "organizationId", description = "단체 ID", required = true, in = ParameterIn.PATH) @PathVariable(value = "organizationId") Long organizationId, @Parameter(name = "id", description = "단어 필터링 ID 값", required = true, in = ParameterIn.PATH) @@ -77,7 +77,7 @@ ResponseEntity> modify( } ) @DeleteMapping("/{id}") - ResponseEntity> delete( + ResponseEntity> delete( @Parameter(name = "id", description = "단어 필터링 ID 값", required = true, in = ParameterIn.PATH) @PathVariable(value = "id") Long chatFilterId ); @@ -96,7 +96,7 @@ ResponseEntity> delete( } ) @GetMapping - ResponseEntity> select( + ResponseEntity> select( ChatFilterSliceRequest request ); } diff --git a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/interceptor/ChatHandler.java b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/interceptor/ChatHandler.java index 9e807834..c948e0d8 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/interceptor/ChatHandler.java +++ b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/interceptor/ChatHandler.java @@ -48,10 +48,10 @@ private void handleMessage( } connectToChatRoom(accessor, memberId); break; - case SUBSCRIBE: - case SEND: + case SUBSCRIBE, SEND: verifyAccessToken(getAccessToken(accessor)); break; + default: } } diff --git a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/mapper/ChatFilterMapper.java b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/mapper/ChatFilterMapper.java index fb616e12..37b3c649 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/mapper/ChatFilterMapper.java +++ b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/mapper/ChatFilterMapper.java @@ -15,7 +15,7 @@ public interface ChatFilterMapper { @Mapping(target = "id", ignore = true) - ChatFilter RequestToChatFilter(Organization organization, String badWord); + ChatFilter requestToChatFilter(Organization organization, String badWord); ChatFilter updateChatFilterFromRequest( ChatFilterRequest request, diff --git a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/service/ChatFilterServiceImpl.java b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/service/ChatFilterServiceImpl.java index ae0888fe..0f030084 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/service/ChatFilterServiceImpl.java +++ b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/service/ChatFilterServiceImpl.java @@ -34,7 +34,7 @@ public Long register(Long organizationId, ChatFilterRequest request) { duplicateWordCheck(organization, request.badWord()); return chatFilterRepository.save( - chatFilterMapper.RequestToChatFilter(organization, request.badWord()) + chatFilterMapper.requestToChatFilter(organization, request.badWord()) ).getId(); } diff --git a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/service/ChatRoomServiceImpl.java b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/service/ChatRoomServiceImpl.java index f1b75e98..20bcbceb 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/domain/chat/service/ChatRoomServiceImpl.java +++ b/backEnd/src/main/java/com/quiz/ourclass/domain/chat/service/ChatRoomServiceImpl.java @@ -11,6 +11,7 @@ import com.quiz.ourclass.global.exception.GlobalException; import com.quiz.ourclass.global.util.RedisUtil; import com.quiz.ourclass.global.util.UserAccessUtil; +import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -60,8 +61,11 @@ public void isMemberAuthorizedToJoinRoom(Long memberId, Long chatRoomId) { throw new GlobalException(ErrorCode.MEMBER_NOT_IN_ORGANIZATION); } } else if (member.getRole() == Role.TEACHER) { - userAccessUtil.isOrganizationManager(member, chatRoomId) - .orElseThrow(() -> new GlobalException(ErrorCode.MEMBER_NOT_IN_ORGANIZATION)); + Optional organization = + userAccessUtil.isOrganizationManager(member, chatRoomId); + if (organization.isEmpty()) { + throw new GlobalException(ErrorCode.MEMBER_NOT_IN_ORGANIZATION); + } } } } diff --git a/backEnd/src/main/java/com/quiz/ourclass/global/config/SwaggerConfig.java b/backEnd/src/main/java/com/quiz/ourclass/global/config/SwaggerConfig.java index 9c33ec47..51ff4743 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/global/config/SwaggerConfig.java +++ b/backEnd/src/main/java/com/quiz/ourclass/global/config/SwaggerConfig.java @@ -1,5 +1,6 @@ package com.quiz.ourclass.global.config; +import com.quiz.ourclass.global.util.ConstantUtil; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; @@ -15,37 +16,13 @@ public class SwaggerConfig { @Bean - public GroupedOpenApi Api() { + public GroupedOpenApi api() { return GroupedOpenApi.builder() .group("all-api") .pathsToMatch("/**") .build(); } - @Bean - public GroupedOpenApi memberApi() { - return GroupedOpenApi.builder() - .group("member-api") - .pathsToMatch("/members/**") - .build(); - } - - @Bean - public GroupedOpenApi boardApi() { - return GroupedOpenApi.builder() - .group("board-api") - .pathsToMatch("/board/**") - .build(); - } - - @Bean - public GroupedOpenApi ChallengeApi() { - return GroupedOpenApi.builder() - .group("challenge-api") - .pathsToMatch("/challenge/**") - .build(); - } - @Bean public OpenAPI openAPI() { Info info = new Info() @@ -56,16 +33,16 @@ public OpenAPI openAPI() { SecurityScheme bearer = new SecurityScheme() .type(SecurityScheme.Type.HTTP) .scheme("bearer") - .bearerFormat("Authorization") + .bearerFormat(ConstantUtil.AUTHORIZATION) .in(SecurityScheme.In.HEADER) .name(HttpHeaders.AUTHORIZATION); // Security 요청 설정 SecurityRequirement addSecurityItem = new SecurityRequirement(); - addSecurityItem.addList("Authorization"); + addSecurityItem.addList(ConstantUtil.AUTHORIZATION); Components components = new Components() - .addSecuritySchemes("Authorization", bearer); + .addSecuritySchemes(ConstantUtil.AUTHORIZATION, bearer); return new OpenAPI() .components(components) diff --git a/backEnd/src/main/java/com/quiz/ourclass/global/util/ConstantUtil.java b/backEnd/src/main/java/com/quiz/ourclass/global/util/ConstantUtil.java index 7a0a439d..87f4a5a1 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/global/util/ConstantUtil.java +++ b/backEnd/src/main/java/com/quiz/ourclass/global/util/ConstantUtil.java @@ -6,7 +6,6 @@ public abstract class ConstantUtil { public static final String REDIS_ORG_KEY = "ORGANIZATION:"; public static final int REDIS_ORG_ALIVE_MINUTE = 10; public static final String REDIS_CHAT_ROOM_KEY = "chatRoom:"; - public static final String MONGO_DB_NAME = "chat"; public static final long HOME_FRIEND_COUNT = 3L; public static final String BLACKLIST_ACCESS_TOKEN = "AT:"; public static final String QUIZ_GAME = "quiz:"; @@ -14,11 +13,15 @@ public abstract class ConstantUtil { public static final int RELAY_REWARD = 50; public static final Long RELAY_TIMEOUT_DAY = 1L; public static final String FCM_KEY_PREFIX = "FCM_"; - public static final int MAX_RETRIES = 5; //최대 재시도 횟수 - public static final long INITIAL_BACKOFF = 1000L; //초기 백오프 시간 (1초) public static final String QUIZ_GAMER = "gamer"; public static final String QUIZ_QUESTION = "question"; public static final String RANKING = "ranking"; public static final String QUIZ_ANSWER = "answer"; + public static final String AUTHORIZATION = "Authorization"; + // 인스턴스화 방지 + private ConstantUtil() { + throw new UnsupportedOperationException( + "This is a utility class and cannot be instantiated"); + } } diff --git a/backEnd/src/main/java/com/quiz/ourclass/global/util/FcmType.java b/backEnd/src/main/java/com/quiz/ourclass/global/util/FcmType.java index 4bd95d3e..8810bfb5 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/global/util/FcmType.java +++ b/backEnd/src/main/java/com/quiz/ourclass/global/util/FcmType.java @@ -12,5 +12,5 @@ public enum FcmType { CHALLENGE("함께달리기"), RELAY("이어달리기"), ; - private final String Type; + private final String type; } diff --git a/backEnd/src/main/java/com/quiz/ourclass/global/util/FcmUtil.java b/backEnd/src/main/java/com/quiz/ourclass/global/util/FcmUtil.java index abb0c172..d7aca043 100644 --- a/backEnd/src/main/java/com/quiz/ourclass/global/util/FcmUtil.java +++ b/backEnd/src/main/java/com/quiz/ourclass/global/util/FcmUtil.java @@ -58,33 +58,6 @@ public void sendMessage(Message message) { } catch (FirebaseMessagingException e) { log.error("fcm send error"); } -// int attempt = 0; -// long backoff = ConstantUtil.INITIAL_BACKOFF; -// -// while (attempt < ConstantUtil.MAX_RETRIES) { //지수 백오프 전략 -// try { -// FirebaseMessaging.getInstance().send(message); -// log.info("FCM Send Success"); -// break; // 성공 시 루프 종료 -// } catch (FirebaseMessagingException e) { -// log.error("FCM Send Error: {}", e.getMessage()); -// attempt++; -// if (attempt >= ConstantUtil.MAX_RETRIES) { -// // 최대 재시도 횟수 도달 시 루프 종료 -// // 다른 메시지 시스템으로 알림을 전송하는 방법을 고려해볼 수 있음 -// log.error("Reached Maximum Retry Attempts"); -// break; -// } -// try { -// Thread.sleep(backoff); // 지수 백오프를 위한 대기 -// } catch (InterruptedException ie) { -// Thread.currentThread().interrupt(); -// log.error("Interrupted While Waiting For Retry"); -// break; // 인터럽트 발생 시 루프 종료 -// } -// backoff *= 2; -// } -// } } public FcmDTO makeFcmDTO(String title, String body) { diff --git a/backEnd/src/test/java/com/quiz/ourclass/OurClassApplicationTests.java b/backEnd/src/test/java/com/quiz/ourclass/OurClassApplicationTests.java index e4528293..9dbdeb05 100644 --- a/backEnd/src/test/java/com/quiz/ourclass/OurClassApplicationTests.java +++ b/backEnd/src/test/java/com/quiz/ourclass/OurClassApplicationTests.java @@ -1,13 +1,8 @@ package com.quiz.ourclass; -import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest(classes = OurClassApplicationTests.class) class OurClassApplicationTests { - @Test - void contextLoads() { - } - }