From 402f5665e1a26cc699a986c9a8f7f353ea85a31c Mon Sep 17 00:00:00 2001 From: dong3058 Date: Mon, 4 Aug 2025 15:29:39 +0900 Subject: [PATCH 1/5] feat: inquriy mail send and admin read check fix --- .../admin/dto/request/ContentRequestDto.java | 8 +- .../admin/dto/request/ImproveRequestDto.java | 7 +- .../admin/dto/request/InquiryRequestDto.java | 6 +- .../repository/AdminDashBoardRepository.java | 9 +- .../service/AdminImprovementService.java | 16 +- .../admin/service/AdminInquiryService.java | 16 +- .../admin/service/ContentSearchService.java | 14 +- .../service/InquiryAnsSendService.java | 20 +- .../util/redis/service/RedisService.java | 28 +-- .../templates/mail/admin-to-user-reply.html | 180 +++++++++++++++ .../server/admin/AdminReadCheckTest.java | 212 ++++++++++++++++++ .../server/admin/inquriyimprovementtest.java | 40 ++++ 12 files changed, 511 insertions(+), 45 deletions(-) create mode 100644 src/main/resources/templates/mail/admin-to-user-reply.html create mode 100644 src/test/java/org/myteam/server/admin/AdminReadCheckTest.java diff --git a/src/main/java/org/myteam/server/admin/dto/request/ContentRequestDto.java b/src/main/java/org/myteam/server/admin/dto/request/ContentRequestDto.java index 3b5078a7..f342d22c 100644 --- a/src/main/java/org/myteam/server/admin/dto/request/ContentRequestDto.java +++ b/src/main/java/org/myteam/server/admin/dto/request/ContentRequestDto.java @@ -78,10 +78,16 @@ public static class RequestDetail { @NotNull(message ="contentid는 비면안됩니다.") @Schema(description = "필수값입니다.") private Long contentId; + @Schema(description = "관리자단 대시보드의 최신데이터 알람에서 신고목록을 클릭해서 넘어올떄만 넣어주세요") + private Long reportId; + @Schema(description = "관리자단 대시보드의 최신데이터 알람에서 넘어올경우에만 넣어주세요") + private String alarmCheck; @Builder - public RequestDetail(StaticDataType staticDataType, Long contentId) { + public RequestDetail(StaticDataType staticDataType, Long contentId,Long reportId,String alarmCheck) { this.staticDataType = staticDataType; this.contentId = contentId; + this.reportId=reportId; + this.alarmCheck=alarmCheck; } } diff --git a/src/main/java/org/myteam/server/admin/dto/request/ImproveRequestDto.java b/src/main/java/org/myteam/server/admin/dto/request/ImproveRequestDto.java index bcf98d48..d3a60416 100644 --- a/src/main/java/org/myteam/server/admin/dto/request/ImproveRequestDto.java +++ b/src/main/java/org/myteam/server/admin/dto/request/ImproveRequestDto.java @@ -80,10 +80,13 @@ public final static class RequestImprovementDetail { @NotNull(message = "contentid는 비면안됩니다.") @Schema(description = "필수값 입니다.") private Long contentId; - + @Schema(description = "관리자단 대시보드의 최신데이터 알림에서 넘어올경우에만 넘겨주시면됩니다." + + "그외엔 null로 주시면됩니다.") + private String alarmCheck; @Builder - public RequestImprovementDetail(Long contentId) { + public RequestImprovementDetail(Long contentId,String alarmCheck) { this.contentId = contentId; + this.alarmCheck=alarmCheck; } } diff --git a/src/main/java/org/myteam/server/admin/dto/request/InquiryRequestDto.java b/src/main/java/org/myteam/server/admin/dto/request/InquiryRequestDto.java index 56767561..c735162b 100644 --- a/src/main/java/org/myteam/server/admin/dto/request/InquiryRequestDto.java +++ b/src/main/java/org/myteam/server/admin/dto/request/InquiryRequestDto.java @@ -98,10 +98,14 @@ public final static class RequestInquiryDetail { @NotNull(message = "contentid 는 비면안됩니다.") @Schema(description = "inquiry id값입니다. 필수입니다.") private Long contentId; + @Schema(description = "관리자단 대시보드의 최신데이터 알림에서 넘어올경우에만 넘겨주시면됩니다." + + "그외엔 null로 주시면됩니다.") + private String alarmCheck; @Builder - public RequestInquiryDetail(Long id) { + public RequestInquiryDetail(Long id,String alarmCheck) { this.contentId = id; + this.alarmCheck=alarmCheck; } } diff --git a/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java b/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java index 60417975..6424c56f 100644 --- a/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java +++ b/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java @@ -264,7 +264,8 @@ public List getLatestData(RequestLatestData requestLatestDat .otherwise(JPAExpressions.select(board.title) .from(board) .where(board.id.eq(report.reportedContentId))), - report.createDate.stringValue() + report.createDate.stringValue(), + report.id )) .from(report) .join(member) @@ -276,7 +277,7 @@ public List getLatestData(RequestLatestData requestLatestDat responseLatestDataList.stream() .forEach(x -> { - boolean readCheck = redisService.AdminReadCheck("ADMIN_ALARM", admin.getPublicId().toString() + boolean readCheck = redisService.AdminReadCheck(admin.getPublicId().toString() , x.getStaticDataType(), x.getContentId()); x.mappingCheckRead(readCheck); x.updateCreateAt( @@ -334,7 +335,7 @@ public List getLatestData(RequestLatestData requestLatestDat DateFormatUtil.formatByDot.format( LocalDateTime.parse(x.getCreateAt(), DateFormatUtil.FLEXIBLE_NANO_FORMATTER))); - boolean readCheck = redisService.AdminReadCheck("ADMIN_ALARM", admin.getPublicId().toString() + boolean readCheck = redisService.AdminReadCheck(admin.getPublicId().toString() , x.getStaticDataType(), x.getContentId()); x.mappingCheckRead(readCheck); }); @@ -376,7 +377,7 @@ public List getLatestData(RequestLatestData requestLatestDat x.updateCreateAt( DateFormatUtil.formatByDot.format( LocalDateTime.parse(x.getCreateAt(), DateFormatUtil.FLEXIBLE_NANO_FORMATTER))); - boolean readCheck = redisService.AdminReadCheck("ADMIN_ALARM", admin.getPublicId().toString() + boolean readCheck = redisService.AdminReadCheck( admin.getPublicId().toString() , x.getStaticDataType(), x.getContentId()); x.mappingCheckRead(readCheck); }); diff --git a/src/main/java/org/myteam/server/admin/service/AdminImprovementService.java b/src/main/java/org/myteam/server/admin/service/AdminImprovementService.java index 857dcbbf..7d473ca4 100644 --- a/src/main/java/org/myteam/server/admin/service/AdminImprovementService.java +++ b/src/main/java/org/myteam/server/admin/service/AdminImprovementService.java @@ -3,6 +3,10 @@ import lombok.RequiredArgsConstructor; import org.myteam.server.admin.repository.AdminImprovementSearchRepo; +import org.myteam.server.admin.utill.StaticDataType; +import org.myteam.server.global.util.redis.service.RedisService; +import org.myteam.server.member.entity.Member; +import org.myteam.server.member.service.SecurityReadService; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; @@ -15,6 +19,8 @@ public class AdminImprovementService { private final AdminImprovementSearchRepo adminImprovementSearchRepo; + private final SecurityReadService securityReadService; + private final RedisService redisService; public Page getImproveListCond(RequestImprovementList requestImprovementList) { @@ -28,8 +34,14 @@ public Page getImproveListMember(RequestMemberImprove } public ResponseImprovementDetail getImproveDetail(RequestImprovementDetail requestImprovementList) { - - return adminImprovementSearchRepo.getImprovementDetail(requestImprovementList); + ResponseImprovementDetail responseImprovementDetail + =adminImprovementSearchRepo.getImprovementDetail(requestImprovementList);; + if(requestImprovementList.getAlarmCheck()!=null) { + Member admin = securityReadService.getMember(); + redisService.adminReadCheckUpdate(admin.getPublicId().toString() + , StaticDataType.Improvement, requestImprovementList.getContentId()); + } + return responseImprovementDetail; } public void addAdminMemo(AdminMemoImprovementRequest adminMemoRequest) { diff --git a/src/main/java/org/myteam/server/admin/service/AdminInquiryService.java b/src/main/java/org/myteam/server/admin/service/AdminInquiryService.java index e649eed5..850505e2 100644 --- a/src/main/java/org/myteam/server/admin/service/AdminInquiryService.java +++ b/src/main/java/org/myteam/server/admin/service/AdminInquiryService.java @@ -3,8 +3,12 @@ import lombok.RequiredArgsConstructor; import org.myteam.server.admin.entity.AdminContentMemo; import org.myteam.server.admin.repository.InquirySearchRepo; +import org.myteam.server.admin.utill.StaticDataType; import org.myteam.server.common.certification.service.InquiryAnsSendService; +import org.myteam.server.global.util.redis.service.RedisService; +import org.myteam.server.member.entity.Member; import org.myteam.server.member.service.MemberReadService; +import org.myteam.server.member.service.SecurityReadService; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import static org.myteam.server.admin.dto.request.AdminMemoRequestDto.AdminMemoInquiryRequest; @@ -21,6 +25,8 @@ public class AdminInquiryService { private final InquirySearchRepo inquirySearchRepo; private final InquiryAnsSendService inquiryAnsSendStrategy; private final MemberReadService memberReadService; + private final SecurityReadService securityReadService; + private final RedisService redisService; public Page getInquiryListCond(RequestInquiryListCond requestInquiryListCond) { @@ -28,8 +34,14 @@ public Page getInquiryListCond(RequestInquiryListCond r } public ResponseInquiryDetail getInquiryDetail(RequestInquiryDetail requestInquiryDetail) { - - return inquirySearchRepo.getInquiryDetail(requestInquiryDetail); + ResponseInquiryDetail responseInquiryDetail= + inquirySearchRepo.getInquiryDetail(requestInquiryDetail); + if(requestInquiryDetail.getAlarmCheck()!=null) { + Member admin = securityReadService.getMember(); + redisService.adminReadCheckUpdate(admin.getPublicId().toString() + , StaticDataType.Inquiry, requestInquiryDetail.getContentId()); + } + return responseInquiryDetail; } public Page getInquiryListMember(RequestInquiryList requestInquiryDetail) { diff --git a/src/main/java/org/myteam/server/admin/service/ContentSearchService.java b/src/main/java/org/myteam/server/admin/service/ContentSearchService.java index 182e8232..91260a47 100644 --- a/src/main/java/org/myteam/server/admin/service/ContentSearchService.java +++ b/src/main/java/org/myteam/server/admin/service/ContentSearchService.java @@ -3,6 +3,9 @@ import lombok.RequiredArgsConstructor; import org.myteam.server.admin.repository.ContentSearchRepository; +import org.myteam.server.global.util.redis.service.RedisService; +import org.myteam.server.member.entity.Member; +import org.myteam.server.member.service.SecurityReadService; import org.springframework.data.domain.Page; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; @@ -17,6 +20,8 @@ public class ContentSearchService { private final ContentSearchRepository contentSearchRepository; + private final SecurityReadService securityReadService; + private final RedisService redisService; public Page getReportList(RequestReportList requestReportList){ @@ -27,8 +32,13 @@ public Page getContentList(RequestContentData requestRepo return contentSearchRepository.getDataList(requestReportList); } public ResponseDetail getContentDetail(RequestDetail requestDetail){ - - return contentSearchRepository.getDetail(requestDetail); + ResponseDetail responseDetail=contentSearchRepository.getDetail(requestDetail); + if(requestDetail.getAlarmCheck()!=null&&requestDetail.getReportId()!=null) { + Member admin = securityReadService.getMember(); + redisService.adminReadCheckUpdate(admin.getPublicId().toString() + , requestDetail.getStaticDataType(), requestDetail.getContentId()); + } + return responseDetail; } public void addAdminMemo(AdminMemoContentRequest adminMemoContentRequest){ contentSearchRepository.addAdminMemo(adminMemoContentRequest); diff --git a/src/main/java/org/myteam/server/common/certification/service/InquiryAnsSendService.java b/src/main/java/org/myteam/server/common/certification/service/InquiryAnsSendService.java index 79f395e0..d934519a 100644 --- a/src/main/java/org/myteam/server/common/certification/service/InquiryAnsSendService.java +++ b/src/main/java/org/myteam/server/common/certification/service/InquiryAnsSendService.java @@ -8,6 +8,8 @@ import org.myteam.server.global.exception.ErrorCode; import org.myteam.server.global.exception.PlayHiveException; import org.myteam.server.global.util.date.DateFormatUtil; +import org.myteam.server.inquiry.domain.Inquiry; +import org.myteam.server.inquiry.repository.InquiryRepository; import org.myteam.server.member.controller.response.MemberResponse; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.MailException; @@ -28,19 +30,23 @@ public class InquiryAnsSendService { private final JavaMailSender javaMailSender; private final SpringTemplateEngine templateEngine; + private final InquiryRepository inquiryRepository; @Value("${SENDER_EMAIL}") private String senderEmail; private String getSubject() { return "문의 답변 메일입니다."; } - private String getBody(String content,String email) { - LocalDateTime now=LocalDateTime.now(); + private String getBody(AdminContentMemo adminContentMemo,MemberResponse memberResponse) { + Long inquiryId=adminContentMemo.getContentId(); + Inquiry inquiry=inquiryRepository.findById(inquiryId).get(); Context context = new Context(); - context.setVariable("email",email); - context.setVariable("content",content); - context.setVariable("setTime", DateFormatUtil.formatByDot.format(now)); - return templateEngine.process("mail/signup-complete-template", context); + context.setVariable("content",inquiry.getContent()); + context.setVariable("answer",adminContentMemo.getContent()); + context.setVariable("inquiryMeta.meta.ip",inquiry.getClientIp()); + context.setVariable(" inquiryMeta.meta.created_at", + DateFormatUtil.formatByDot.format(inquiry.getCreatedAt())); + return templateEngine.process("mail/admin-to-user-reply", context); } @Async public CompletableFuture send(AdminContentMemo adminMemo, MemberResponse memberResponse) { @@ -49,7 +55,7 @@ public CompletableFuture send(AdminContentMemo adminMemo, MemberResponse m try { String subject = getSubject(); - String body = getBody(adminMemo.getContent(),memberResponse.getEmail()); + String body = getBody(adminMemo,memberResponse); MimeMessage message = createMail(memberResponse.getEmail(), subject, body); javaMailSender.send(message); diff --git a/src/main/java/org/myteam/server/global/util/redis/service/RedisService.java b/src/main/java/org/myteam/server/global/util/redis/service/RedisService.java index 0eee2452..74c6ad98 100644 --- a/src/main/java/org/myteam/server/global/util/redis/service/RedisService.java +++ b/src/main/java/org/myteam/server/global/util/redis/service/RedisService.java @@ -73,28 +73,8 @@ public boolean isAdminLoginAllowed(String category,String identifier){ return true; } - public boolean AdminReadCheck(String category, String adminIdentifier, StaticDataType staticDataType, Long contentId){ - - String redisKey=getRateLimitKey(category,adminIdentifier+staticDataType.name()+String.valueOf(contentId)); - String requestCountStr=redisTemplate.opsForValue().get(redisKey); - int requestCount = requestCountStr == null ? 0 : Integer.parseInt(requestCountStr); - if(requestCount==0){ - return false; - } - return true; - } - - public void adminReadCheckUpdate(String category, String adminIdentifier, StaticDataType staticDataType, Long contentId){ - String redisKey=getRateLimitKey(category,adminIdentifier+staticDataType.name()+String.valueOf(contentId)); - String requestCountStr=redisTemplate.opsForValue().get(redisKey); - int requestCount = requestCountStr == null ? 0 : Integer.parseInt(requestCountStr); - if(requestCount==0) { - redisTemplate.opsForValue().increment(redisKey); - redisTemplate.expire(redisKey, Duration.ofMinutes(ADMIN_ALARM_READ_EXPIRE_TIME)); - } - } - /*public boolean AdminReadCheck(String adminIdentifier, StaticDataType staticDataType, Long contentId){ - String redisKey=ADMIN_ALARM_KEY+adminIdentifier+staticDataType.name()+String.valueOf(contentId); + public boolean AdminReadCheck(String adminIdentifier, StaticDataType staticDataType, Long contentId){ + String redisKey=ADMIN_ALARM_KEY+adminIdentifier+staticDataType.name()+contentId; String requestCountStr=redisTemplate.opsForValue().get(redisKey); int requestCount = requestCountStr == null ? 0 : Integer.parseInt(requestCountStr); if(requestCount==0){ @@ -103,14 +83,14 @@ public void adminReadCheckUpdate(String category, String adminIdentifier, Static return true; } public void adminReadCheckUpdate(String adminIdentifier, StaticDataType staticDataType, Long contentId){ - String redisKey=ADMIN_ALARM_KEY+adminIdentifier+staticDataType.name()+String.valueOf(contentId); + String redisKey=ADMIN_ALARM_KEY+adminIdentifier+staticDataType.name()+contentId; String requestCountStr=redisTemplate.opsForValue().get(redisKey); int requestCount = requestCountStr == null ? 0 : Integer.parseInt(requestCountStr); if(requestCount==0) { redisTemplate.opsForValue().increment(redisKey); redisTemplate.expire(redisKey, Duration.ofDays(30L)); } - }*/ + } /** * 요청 제한을 적용할 Redis Key 생성 * diff --git a/src/main/resources/templates/mail/admin-to-user-reply.html b/src/main/resources/templates/mail/admin-to-user-reply.html new file mode 100644 index 00000000..0594f149 --- /dev/null +++ b/src/main/resources/templates/mail/admin-to-user-reply.html @@ -0,0 +1,180 @@ + + + + + + + + + PlayHive 문의하기 답변 + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ PlayHive 로고 이미지 + +

+ 모두 함께 즐기는 클린 스포츠 커뮤니티, 플레이 하이브! +

+
+
+
+ 문의하기 고객센터 발송메일 +
+
+ + + + + + + + + +
+ 작성날짜 + 2025.05.05 / 18:24:32 (IP + 106.101.44.321)
+ 내용 + 문의하려고하는데요 로그인이 안돼요
+
+
+ 문의하기 답변
+

+ 안녕하세요. 플레이 하이브 입니다. +
+ 문의에 대해 답변드립니다. 해당부분은 빠른시일 내에 조치하겠습니다. +

+
+ + 플레이하이브 보러가기 + + + 플레이하이브 고객센터 문의하기 + +
+ 본 메일은 발신전용으로 회신하실 경우 답변이 되지 않습니다. 자세한 사항은 + + 플레이하이브 고객센터 + + 를 이용하세요. +
+
+ + +
+ + + + +
+ + + + + + + + + + + + +
+
+ PlayHive +
+
+

+ 열정적으로 응원하고 서로를 존중하며
+ + 모두 함께 즐기는 클린 스포츠 커뮤니티, 플레이 하이브! + +

+
+

+ 서비스명: PlayHive · 대표: 홍길표 · 개인정보 보호책임자: 홍길표
+ 콘텐츠 내용에 대한 저작권 및 법적 책임은 자료제공자 또는 글쓴이에 있으며 PlayHive의 입장과 다를 수 있습니다. +

+
+ + + + +
+

+ Copyright © PlayHive Co., Ltd All rights reserved. +

+
+
+
+ + + \ No newline at end of file diff --git a/src/test/java/org/myteam/server/admin/AdminReadCheckTest.java b/src/test/java/org/myteam/server/admin/AdminReadCheckTest.java new file mode 100644 index 00000000..7ed932c7 --- /dev/null +++ b/src/test/java/org/myteam/server/admin/AdminReadCheckTest.java @@ -0,0 +1,212 @@ +package org.myteam.server.admin; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.myteam.server.admin.dto.request.ImproveRequestDto.RequestImprovementDetail; +import org.myteam.server.admin.repository.AdminDashBoardRepository; +import org.myteam.server.admin.service.AdminImprovementService; +import org.myteam.server.admin.service.AdminInquiryService; +import org.myteam.server.admin.service.ContentSearchService; +import org.myteam.server.admin.utill.StaticDataType; +import org.myteam.server.board.domain.Board; +import org.myteam.server.board.domain.CategoryType; +import org.myteam.server.chat.block.domain.BanReason; +import org.myteam.server.common.certification.service.InquiryAnsSendService; +import org.myteam.server.global.domain.Category; +import org.myteam.server.improvement.domain.Improvement; +import org.myteam.server.inquiry.domain.Inquiry; +import org.myteam.server.member.entity.Member; +import org.myteam.server.report.domain.Report; +import org.myteam.server.report.domain.ReportType; +import org.myteam.server.support.IntegrationTestSupport; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.mock.mockito.MockBean; + +import java.util.List; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; +import static org.myteam.server.admin.dto.request.AdminDashBoardRequestDto.*; +import static org.myteam.server.admin.dto.request.ContentRequestDto.*; +import static org.myteam.server.admin.dto.request.InquiryRequestDto.*; +import static org.myteam.server.admin.dto.response.AdminDashBoardResponseDto.*; + +public class AdminReadCheckTest extends IntegrationTestSupport { + + + @Autowired + AdminDashBoardRepository adminDashBoardRepository; + @Autowired + AdminInquiryService adminInquiryService; + @Autowired + AdminImprovementService adminImprovementService; + + + @Autowired + ContentSearchService contentSearchService; + Member admin; + Improvement improvement; + Inquiry inquiry; + + Board board; + Report report; + + @BeforeEach + public void setting(){ + + admin=createAdmin(0); + Member member=createMember(0); + board=createBoard(admin, Category.BASEBALL, CategoryType.FREE,"title", + "zzzz"); + report=createReport(admin,member, BanReason.SEXUAL_CONTENT, ReportType.BOARD,board.getId()); + improvement=createImprovement(admin,false); + inquiry=createInquiry(admin); + } + + @DisplayName("읽지않음이 정상 처리되는지") + void testNotRead(){ + when(redisService.AdminReadCheck(admin.getPublicId().toString() + , StaticDataType.Inquiry,inquiry.getId())) + .thenReturn(false); + when(redisService.AdminReadCheck(admin.getPublicId().toString() + , StaticDataType.Improvement,improvement.getId())) + .thenReturn(false); + RequestLatestData requestLatestData=RequestLatestData + .builder() + .staticDataType(StaticDataType.Inquiry) + .build(); + RequestLatestData requestLatestData2=RequestLatestData + .builder() + .staticDataType(StaticDataType.Improvement) + .build(); + List responseLatestData=adminDashBoardRepository.getLatestData(requestLatestData); + List responseLatestData2=adminDashBoardRepository.getLatestData(requestLatestData2); + responseLatestData.stream() + .forEach(x->{ + Assertions.assertThat(x.getCheckRead()).isFalse(); + }); + responseLatestData2.stream() + .forEach(x->{ + Assertions.assertThat(x.getCheckRead()).isFalse(); + }); + } + @DisplayName("읽음으로 정상 처리되는지") + void testRead(){ + when(redisService.AdminReadCheck(admin.getPublicId().toString() + , StaticDataType.Inquiry,inquiry.getId())) + .thenReturn(true); + when(redisService.AdminReadCheck(admin.getPublicId().toString() + , StaticDataType.Improvement,improvement.getId())) + .thenReturn(true); + RequestLatestData requestLatestData=RequestLatestData + .builder() + .staticDataType(StaticDataType.Inquiry) + .build(); + RequestLatestData requestLatestData2=RequestLatestData + .builder() + .staticDataType(StaticDataType.Improvement) + .build(); + List responseLatestData=adminDashBoardRepository.getLatestData(requestLatestData); + List responseLatestData2=adminDashBoardRepository.getLatestData(requestLatestData2); + responseLatestData.stream() + .forEach(x->{ + Assertions.assertThat(x.getCheckRead()).isTrue(); + }); + responseLatestData2.stream() + .forEach(x->{ + Assertions.assertThat(x.getCheckRead()).isTrue(); + }); + } + + @DisplayName("content detail 서비스로 접근시 호출이잘되는가") + @Test + void testContentReadDetail(){ + + RequestDetail requestDetail=RequestDetail + .builder() + .alarmCheck("zczx") + .contentId(board.getId()) + .staticDataType(StaticDataType.BOARD) + .reportId(report.getId()) + .build(); + contentSearchService.getContentDetail(requestDetail); + verify(redisService).adminReadCheckUpdate(any(String.class),any(StaticDataType.class), + any(Long.class)); + } + + + @DisplayName("content detail 서비스로 접근시 호출이안되는가") + @Test + void testContentReadDetail2(){ + + RequestDetail requestDetail=RequestDetail + .builder() + .alarmCheck("zczx") + .contentId(board.getId()) + .staticDataType(StaticDataType.BOARD) + .build(); + contentSearchService.getContentDetail(requestDetail); + RequestDetail requestDetail2=RequestDetail + .builder() + .contentId(board.getId()) + .reportId(report.getId()) + .staticDataType(StaticDataType.BOARD) + .build(); + contentSearchService.getContentDetail(requestDetail2); + RequestDetail requestDetail3=RequestDetail + .builder() + .contentId(board.getId()) + .staticDataType(StaticDataType.BOARD) + .build(); + contentSearchService.getContentDetail(requestDetail3); + + + verify(redisService,never()).adminReadCheckUpdate(any(String.class),any(StaticDataType.class), + any(Long.class)); + } + + @DisplayName("detail 서비스로 접근시에 adminreadcheckupdate가 호출이되는가") + @Test + void testInquiryReadDetail(){ + RequestInquiryDetail requestInquiryDetail=RequestInquiryDetail + .builder() + .alarmCheck("dsfdsf") + .id(inquiry.getId()) + .build(); + adminInquiryService.getInquiryDetail(requestInquiryDetail); + verify(redisService).adminReadCheckUpdate(any(String.class),any(StaticDataType.class), + any(Long.class)); + + } + @DisplayName("detail 서비스로 접근시에 adminreadcheckupdate가 호출이되는가") + @Test + void testImprovementReadDetail(){ + RequestImprovementDetail requestImprovementDetail= + RequestImprovementDetail + .builder() + .alarmCheck("check") + .contentId(improvement.getId()) + .build(); + adminImprovementService.getImproveDetail(requestImprovementDetail); + verify(redisService).adminReadCheckUpdate(any(String.class),any(StaticDataType.class), + any(Long.class)); + + } + @DisplayName("detail 서비스로 접근시에 adminreadcheckupdate가 호출이 안되는가") + @Test + void testNotReadDetail(){ + RequestImprovementDetail requestImprovementDetail= RequestImprovementDetail + .builder() + .contentId(improvement.getId()) + .build(); + adminImprovementService.getImproveDetail(requestImprovementDetail); + RequestInquiryDetail requestInquiryDetail=RequestInquiryDetail + .builder() + .id(inquiry.getId()) + .build(); + adminInquiryService.getInquiryDetail(requestInquiryDetail); + verify(redisService,never()).adminReadCheckUpdate(any(String.class),any(StaticDataType.class), + any(Long.class)); + } +} diff --git a/src/test/java/org/myteam/server/admin/inquriyimprovementtest.java b/src/test/java/org/myteam/server/admin/inquriyimprovementtest.java index b78db05f..e2a978f0 100644 --- a/src/test/java/org/myteam/server/admin/inquriyimprovementtest.java +++ b/src/test/java/org/myteam/server/admin/inquriyimprovementtest.java @@ -3,21 +3,35 @@ import com.querydsl.jpa.impl.JPAQueryFactory; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.myteam.server.admin.entity.AdminContentMemo; import org.myteam.server.admin.entity.AdminImproveChangeLog; import org.myteam.server.admin.entity.AdminInquiryChangeLog; +import org.myteam.server.admin.entity.AdminMemberMemo; import org.myteam.server.admin.repository.AdminImprovementSearchRepo; import org.myteam.server.admin.repository.InquirySearchRepo; +import org.myteam.server.admin.service.AdminInquiryService; +import org.myteam.server.common.certification.service.InquiryAnsSendService; import org.myteam.server.improvement.domain.ImportantStatus; import org.myteam.server.improvement.domain.Improvement; import org.myteam.server.improvement.domain.ImprovementStatus; import org.myteam.server.inquiry.domain.Inquiry; +import org.myteam.server.member.controller.response.MemberResponse; import org.myteam.server.member.entity.Member; +import org.myteam.server.member.service.MemberReadService; import org.myteam.server.support.IntegrationTestSupport; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.mock.mockito.MockBeans; + import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.myteam.server.admin.dto.request.AdminMemoRequestDto.AdminMemoImprovementRequest; import static org.myteam.server.admin.dto.request.AdminMemoRequestDto.AdminMemoInquiryRequest; import static org.myteam.server.admin.dto.response.ImprovementResponseDto.*; @@ -37,12 +51,21 @@ public class inquriyimprovementtest extends IntegrationTestSupport { AdminImprovementSearchRepo adminImprovementSearchRepo; @Autowired InquirySearchRepo inquirySearchRepo; + @MockBean + InquiryAnsSendService inquiryAnsSendService; + + + @MockBean + MemberReadService memberReadService; Member admin; Improvement improvement1; Inquiry inquiry1; + @Autowired + AdminInquiryService adminInquiryService; + @Autowired JPAQueryFactory queryFactory; @@ -157,6 +180,23 @@ void getdetailandmemo() { assertThat(adminInquiryChangeLogs.size()).isEqualTo(1); } + @Test + @DisplayName("문의 메일 전송 호출 테스트") + void inquriyMailSendVerify(){ + AdminMemoInquiryRequest adminMemoInquiryRequest=AdminMemoInquiryRequest + .builder() + .contentId(inquiry1.getId()) + .content("Zcxzcxzcxzc") + .email("wsdas") + .build(); + + when(memberReadService.getByEmail(any(String.class))) + .thenReturn(MemberResponse.createMemberResponse(admin)); + + adminInquiryService.sendInquiryAnswer(adminMemoInquiryRequest); + + verify(inquiryAnsSendService).send(any(AdminContentMemo.class), any(MemberResponse.class)); + } @Test void addMemberImproveInquriy() { From fa424bf50eb3b81a70aa7e051a9f73110c937156 Mon Sep 17 00:00:00 2001 From: dong3058 Date: Mon, 4 Aug 2025 15:38:01 +0900 Subject: [PATCH 2/5] fix: add column to dto --- .../admin/dto/response/AdminDashBoardResponseDto.java | 7 +++++-- .../server/admin/repository/AdminDashBoardRepository.java | 2 +- .../myteam/server/admin/service/ContentSearchService.java | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java b/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java index ebab76e5..079792b1 100644 --- a/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java +++ b/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java @@ -38,11 +38,13 @@ public static class ResponseLatestData { @Schema(example = "2025.06.06") private String createAt; @Schema(description = "이값이 true이면 이미 읽은것,아니면은 읽지않은것입니다.") - private boolean checkRead; + private Boolean checkRead; + @Schema(description = "신고 관련 최신 리스트라면은 들어있는값입니다.") + private Long reportId; public ResponseLatestData(String reportType, StaticDataType staticDataType, String mainStatus, String subStatus, Long contentId, - String name, String content, String createAt) { + String name, String content, String createAt,Long reportId) { this.reportType = reportType; this.staticDataType = staticDataType; this.mainStatus = mainStatus; @@ -51,6 +53,7 @@ public ResponseLatestData(String reportType, StaticDataType staticDataType, this.name = name; this.content = content; this.createAt = createAt; + this.reportId=reportId; } public void updateCreateAt(String createAt) { diff --git a/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java b/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java index 6424c56f..15ce3517 100644 --- a/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java +++ b/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java @@ -278,7 +278,7 @@ public List getLatestData(RequestLatestData requestLatestDat responseLatestDataList.stream() .forEach(x -> { boolean readCheck = redisService.AdminReadCheck(admin.getPublicId().toString() - , x.getStaticDataType(), x.getContentId()); + ,StaticDataType.Report, x.getContentId()); x.mappingCheckRead(readCheck); x.updateCreateAt( DateFormatUtil.formatByDot.format( diff --git a/src/main/java/org/myteam/server/admin/service/ContentSearchService.java b/src/main/java/org/myteam/server/admin/service/ContentSearchService.java index 91260a47..fddf047f 100644 --- a/src/main/java/org/myteam/server/admin/service/ContentSearchService.java +++ b/src/main/java/org/myteam/server/admin/service/ContentSearchService.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import org.myteam.server.admin.repository.ContentSearchRepository; +import org.myteam.server.admin.utill.StaticDataType; import org.myteam.server.global.util.redis.service.RedisService; import org.myteam.server.member.entity.Member; import org.myteam.server.member.service.SecurityReadService; @@ -36,7 +37,7 @@ public ResponseDetail getContentDetail(RequestDetail requestDetail){ if(requestDetail.getAlarmCheck()!=null&&requestDetail.getReportId()!=null) { Member admin = securityReadService.getMember(); redisService.adminReadCheckUpdate(admin.getPublicId().toString() - , requestDetail.getStaticDataType(), requestDetail.getContentId()); + , StaticDataType.Report, requestDetail.getReportId()); } return responseDetail; } From e4c58b7c301732f28a2b74d4311d9257b356bf88 Mon Sep 17 00:00:00 2001 From: dong3058 <140478288+dong3058@users.noreply.github.com> Date: Mon, 4 Aug 2025 15:56:08 +0900 Subject: [PATCH 3/5] Update AdminDashBoardResponseDto.java --- .../server/admin/dto/response/AdminDashBoardResponseDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java b/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java index 59fb09ed..470a79c9 100644 --- a/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java +++ b/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java @@ -59,7 +59,7 @@ public ResponseLatestData(String reportType, this.content = content; this.createAt = createAt; this.reportId=reportId; - this.staticDataType=staticDataType + this.staticDataType=staticDataType; } public void updateCreateAt(String createAt) { From 34c67c7604a57c4c8ac431ed9d8c7f8e954335b0 Mon Sep 17 00:00:00 2001 From: dong3058 <140478288+dong3058@users.noreply.github.com> Date: Mon, 4 Aug 2025 16:02:47 +0900 Subject: [PATCH 4/5] Update AdminDashBoardRepository.java --- .../server/admin/repository/AdminDashBoardRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java b/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java index 12faa6b2..f5c7b058 100644 --- a/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java +++ b/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java @@ -264,7 +264,7 @@ public Map> getLatestData() { x.updateCreateAt( DateFormatUtil.formatByDot.format( LocalDateTime.parse(x.getCreateAt(), DateFormatUtil.FLEXIBLE_NANO_FORMATTER))); - boolean readCheck = redisService.AdminReadCheck("ADMIN_ALARM", admin.getPublicId().toString() + boolean readCheck = redisService.AdminReadCheck(admin.getPublicId().toString() , StaticDataType.Improvement, x.getContentId()); x.mappingCheckRead(readCheck); }); From 77560a8aa0c9cb361fe70679c09d6125b32ff4f4 Mon Sep 17 00:00:00 2001 From: dong3058 Date: Mon, 4 Aug 2025 16:21:09 +0900 Subject: [PATCH 5/5] fix: constructor fix --- .../server/admin/dto/response/AdminDashBoardResponseDto.java | 4 ++-- .../server/admin/repository/AdminDashBoardRepository.java | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java b/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java index 470a79c9..ff1c14ac 100644 --- a/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java +++ b/src/main/java/org/myteam/server/admin/dto/response/AdminDashBoardResponseDto.java @@ -29,7 +29,7 @@ public static class ResponseStatic { @Getter public static class ResponseLatestData { - @Schema(description = "불러온 데이터 타입이 신고일때 어떤 콘텐츠에대한 신고인지를 나타냅니다.") + @Schema(description = "불러온 최신 데이터 타입이 신고일때 어떤 콘텐츠에대한 신고인지를 나타냅니다.") private String reportType; @Schema(description = "최신 데이터를 관리자단의 우측 하단에서 표시할때 가장 왼쪽에오는 상태값입니다.") private String mainStatus; @@ -44,7 +44,7 @@ public static class ResponseLatestData { private StaticDataType staticDataType; @Schema(description = "이값이 true이면 이미 읽은것,아니면은 읽지않은것입니다.") private Boolean checkRead; - @Schema(description = "신고 관련 최신 리스트라면은 들어있는값입니다.") + @Schema(description = "신고 관련 최신 리스트일떄 참조하는 값으로 다른 관련 최신 리스트라면 무시해주세요") private Long reportId; public ResponseLatestData(String reportType, diff --git a/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java b/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java index f5c7b058..a05a60a9 100644 --- a/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java +++ b/src/main/java/org/myteam/server/admin/repository/AdminDashBoardRepository.java @@ -214,6 +214,7 @@ public Map> getLatestData() { .otherwise(member.nickname), inquiry.content.substring(0, 20), inquiry.createdAt.stringValue(), + Expressions.constant(0L), Expressions.constant(StaticDataType.Inquiry) )) .from(inquiry) @@ -249,6 +250,7 @@ public Map> getLatestData() { member.nickname, improvement.content, improvement.createDate.stringValue(), + Expressions.constant(0L), Expressions.constant(StaticDataType.Improvement) ))