diff --git a/src/main/java/com/haru/api/domain/lastOpened/service/UserDocumentLastOpenedService.java b/src/main/java/com/haru/api/domain/lastOpened/service/UserDocumentLastOpenedService.java index bcfa9074..3154187a 100644 --- a/src/main/java/com/haru/api/domain/lastOpened/service/UserDocumentLastOpenedService.java +++ b/src/main/java/com/haru/api/domain/lastOpened/service/UserDocumentLastOpenedService.java @@ -15,7 +15,5 @@ public interface UserDocumentLastOpenedService { void deleteRecordsForWorkspaceUsers(Documentable document); - void updateRecordsForWorkspaceUsers(Documentable document); - void updateRecordsForWorkspaceUsers(Documentable document, TitleHolder titleHolder); } diff --git a/src/main/java/com/haru/api/domain/lastOpened/service/UserDocumentLastOpenedServiceImpl.java b/src/main/java/com/haru/api/domain/lastOpened/service/UserDocumentLastOpenedServiceImpl.java index 68997067..353796d8 100644 --- a/src/main/java/com/haru/api/domain/lastOpened/service/UserDocumentLastOpenedServiceImpl.java +++ b/src/main/java/com/haru/api/domain/lastOpened/service/UserDocumentLastOpenedServiceImpl.java @@ -73,19 +73,6 @@ public void deleteRecordsForWorkspaceUsers(Documentable documentable) { } - @Override - public void updateRecordsForWorkspaceUsers(Documentable documentable) { - - // 해당 문서 id, 문서 타입에 해당하는 last opened 튜플 검색 - List recordsToUpdate = userDocumentLastOpenedRepository.findByDocumentIdAndDocumentType(documentable.getId(), documentable.getDocumentType()); - - if (!recordsToUpdate.isEmpty()) { - for (UserDocumentLastOpened record : recordsToUpdate) { - record.updateTitle(documentable.getTitle()); - } - } - } - @Override @Transactional public void updateRecordsForWorkspaceUsers(Documentable documentable, TitleHolder titleHolder) { diff --git a/src/main/java/com/haru/api/domain/meeting/service/MeetingQueryServiceImpl.java b/src/main/java/com/haru/api/domain/meeting/service/MeetingQueryServiceImpl.java index f70562e9..ab5c79af 100644 --- a/src/main/java/com/haru/api/domain/meeting/service/MeetingQueryServiceImpl.java +++ b/src/main/java/com/haru/api/domain/meeting/service/MeetingQueryServiceImpl.java @@ -1,6 +1,5 @@ package com.haru.api.domain.meeting.service; -import com.haru.api.domain.lastOpened.entity.enums.DocumentType; import com.haru.api.domain.meeting.converter.MeetingConverter; import com.haru.api.domain.meeting.dto.MeetingResponseDTO; import com.haru.api.domain.meeting.entity.Meeting; @@ -40,7 +39,7 @@ public List getMeetings(User user, Worksp } @Override - @TrackLastOpened(type = DocumentType.AI_MEETING_MANAGER) + @TrackLastOpened public MeetingResponseDTO.getMeetingProceeding getMeetingProceeding(User user, Meeting meeting){ User foundMeetingCreator = meeting.getCreator(); diff --git a/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java b/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java index 0d3b0807..552073d5 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java +++ b/src/main/java/com/haru/api/domain/moodTracker/controller/MoodTrackerController.java @@ -2,12 +2,16 @@ import com.haru.api.domain.moodTracker.dto.MoodTrackerRequestDTO; import com.haru.api.domain.moodTracker.dto.MoodTrackerResponseDTO; +import com.haru.api.domain.moodTracker.entity.MoodTracker; import com.haru.api.domain.moodTracker.service.MoodTrackerCommandService; import com.haru.api.domain.moodTracker.service.MoodTrackerQueryService; import com.haru.api.domain.snsEvent.entity.enums.Format; -import com.haru.api.domain.user.security.jwt.SecurityUtil; +import com.haru.api.domain.user.entity.User; +import com.haru.api.domain.workspace.entity.Workspace; +import com.haru.api.global.annotation.AuthMoodTracker; +import com.haru.api.global.annotation.AuthUser; +import com.haru.api.global.annotation.AuthWorkspace; import com.haru.api.global.apiPayload.code.status.SuccessStatus; -import com.haru.api.global.util.HashIdUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; @@ -29,7 +33,6 @@ public class MoodTrackerController { // 읽기 전용 private final MoodTrackerQueryService moodTrackerQueryService; - private final HashIdUtil hashIdUtil; @GetMapping("/workspaces/{workspaceId}") @Operation( @@ -40,11 +43,15 @@ public class MoodTrackerController { @Parameter(name = "workspaceId", description = "워크스페이스 ID (Path Variable)", required = true) }) public ApiResponse getMoodTrackerPreviewListByWorkspace( - @PathVariable String workspaceId + @PathVariable String workspaceId, + @Parameter(hidden = true) @AuthUser User user, + @Parameter(hidden = true) @AuthWorkspace Workspace workspace ) { - Long userId = SecurityUtil.getCurrentUserId(); - MoodTrackerResponseDTO.PreviewList result = moodTrackerQueryService.getMoodTrackerPreviewList(userId, Long.parseLong(workspaceId)); + + MoodTrackerResponseDTO.PreviewList result = moodTrackerQueryService.getMoodTrackerPreviewList(user, workspace); + return ApiResponse.onSuccess(result); + } @PostMapping("/workspaces/{workspaceId}") @@ -57,11 +64,15 @@ public ApiResponse getMoodTrackerPreviewList }) public ApiResponse createMoodTracker( @PathVariable String workspaceId, - @RequestBody @Valid MoodTrackerRequestDTO.CreateRequest request + @RequestBody @Valid MoodTrackerRequestDTO.CreateRequest request, + @Parameter(hidden = true) @AuthUser User user, + @Parameter(hidden = true) @AuthWorkspace Workspace workspace ) { - Long userId = SecurityUtil.getCurrentUserId(); - MoodTrackerResponseDTO.CreateResult result = moodTrackerCommandService.create(userId, Long.parseLong(workspaceId),request); + + MoodTrackerResponseDTO.CreateResult result = moodTrackerCommandService.create(user, workspace,request); + return ApiResponse.of(SuccessStatus.MOOD_TRACKER_CREATED, result); + } @PatchMapping("/{mood-tracker-hashed-Id}") @@ -74,12 +85,15 @@ public ApiResponse createMoodTracker( }) public ApiResponse updateMoodTrackerTitle( @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId, - @RequestBody @Valid MoodTrackerRequestDTO.UpdateTitleRequest request + @RequestBody @Valid MoodTrackerRequestDTO.UpdateTitleRequest request, + @Parameter(hidden = true) @AuthUser User user, + @Parameter(hidden = true) @AuthMoodTracker MoodTracker moodTracker ) { - Long userId = SecurityUtil.getCurrentUserId(); - Long moodTrackerId = hashIdUtil.decode(moodTrackerHashedId); - moodTrackerCommandService.updateTitle(userId, moodTrackerId, request); + + moodTrackerCommandService.updateTitle(user, moodTracker, request); + return ApiResponse.of(SuccessStatus.MOOD_TRACKER_UPDATED, null); + } @DeleteMapping("/{mood-tracker-hashed-Id}") @@ -91,12 +105,15 @@ public ApiResponse updateMoodTrackerTitle( @Parameter(name = "mood-tracker-hashed-Id", description = "해시된 16자 분위기 트래커 ID (Path Variable)", required = true) }) public ApiResponse deleteMoodTracker( - @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId + @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId, + @Parameter(hidden = true) @AuthUser User user, + @Parameter(hidden = true) @AuthMoodTracker MoodTracker moodTracker ) { - Long userId = SecurityUtil.getCurrentUserId(); - Long moodTrackerId = hashIdUtil.decode(moodTrackerHashedId); - moodTrackerCommandService.delete(userId, moodTrackerId); + + moodTrackerCommandService.delete(user, moodTracker); + return ApiResponse.of(SuccessStatus.MOOD_TRACKER_DELETED, null); + } @PostMapping("/{mood-tracker-hashed-Id}/emails") @@ -108,11 +125,14 @@ public ApiResponse deleteMoodTracker( @Parameter(name = "mood-tracker-hashed-Id", description = "해시된 16자 분위기 트래커 ID (Path Variable)", required = true) }) public ApiResponse sendMoodTrackerSurveyLink( - @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId + @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId, + @Parameter(hidden = true) @AuthMoodTracker MoodTracker moodTracker ) { - Long moodTrackerId = hashIdUtil.decode(moodTrackerHashedId); - moodTrackerCommandService.sendSurveyLink(moodTrackerId); + + moodTrackerCommandService.sendSurveyLink(moodTracker); + return ApiResponse.of(SuccessStatus.MOOD_TRACKER_EMAIL_SENT, null); + } @PostMapping("/{mood-tracker-hashed-Id}/answer") @@ -125,11 +145,14 @@ public ApiResponse sendMoodTrackerSurveyLink( }) public ApiResponse submitMoodTrackerSurveyAnswers( @PathVariable("mood-tracker-hashed-Id") String moodTrackerHashedId, - @RequestBody MoodTrackerRequestDTO.SurveyAnswerList request + @RequestBody MoodTrackerRequestDTO.SurveyAnswerList request, + @Parameter(hidden = true) @AuthMoodTracker MoodTracker moodTracker ) { - Long moodTrackerId = hashIdUtil.decode(moodTrackerHashedId); - moodTrackerCommandService.submitSurveyAnswers(moodTrackerId, request); + + moodTrackerCommandService.submitSurveyAnswers(moodTracker, request); + return ApiResponse.of(SuccessStatus.MOOD_TRACKER_ANSWER_SUBMIT, null); + } @GetMapping("/{mood-tracker-hashed-Id}/questions") @@ -141,12 +164,15 @@ public ApiResponse submitMoodTrackerSurveyAnswers( @Parameter(name = "mood-tracker-hashed-Id", description = "분위기 트래커 ID (Hashed, Path Variable)", required = true) }) public ApiResponse getMoodTrackerQuestionResult( - @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId + @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId, + @Parameter(hidden = true) @AuthUser User user, + @Parameter(hidden = true) @AuthMoodTracker MoodTracker moodTracker ) { - Long userId = SecurityUtil.getCurrentUserId(); - Long moodTrackerId = hashIdUtil.decode(moodTrackerHashedId); - MoodTrackerResponseDTO.QuestionResult result = moodTrackerQueryService.getQuestionResult(userId, moodTrackerId); + + MoodTrackerResponseDTO.QuestionResult result = moodTrackerQueryService.getQuestionResult(user, moodTracker); + return ApiResponse.onSuccess(result); + } @GetMapping("/{mood-tracker-hashed-Id}/reports") @@ -158,12 +184,15 @@ public ApiResponse getMoodTrackerQuestion @Parameter(name = "mood-tracker-hashed-Id", description = "분위기 트래커 ID (Hashed, Path Variable)", required = true) }) public ApiResponse getMoodTrackerReportResult( - @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId + @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId, + @Parameter(hidden = true) @AuthUser User user, + @Parameter(hidden = true) @AuthMoodTracker MoodTracker moodTracker ) { - Long userId = SecurityUtil.getCurrentUserId(); - Long moodTrackerId = hashIdUtil.decode(moodTrackerHashedId); - MoodTrackerResponseDTO.ReportResult result = moodTrackerQueryService.getReportResult(userId, moodTrackerId); + + MoodTrackerResponseDTO.ReportResult result = moodTrackerQueryService.getReportResult(user, moodTracker); + return ApiResponse.onSuccess(result); + } @GetMapping("/{mood-tracker-hashed-Id}/responses") @@ -175,12 +204,15 @@ public ApiResponse getMoodTrackerReportResu @Parameter(name = "mood-tracker-hashed-Id", description = "분위기 트래커 ID (Hashed, Path Variable)", required = true) }) public ApiResponse getMoodTrackerResponseResult( - @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId + @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId, + @Parameter(hidden = true) @AuthUser User user, + @Parameter(hidden = true) @AuthMoodTracker MoodTracker moodTracker ) { - Long userId = SecurityUtil.getCurrentUserId(); - Long moodTrackerId = hashIdUtil.decode(moodTrackerHashedId); - MoodTrackerResponseDTO.ResponseResult result = moodTrackerQueryService.getResponseResult(userId, moodTrackerId); + + MoodTrackerResponseDTO.ResponseResult result = moodTrackerQueryService.getResponseResult(user, moodTracker); + return ApiResponse.onSuccess(result); + } @GetMapping("/{mood-tracker-hashed-Id}/download") @@ -193,12 +225,15 @@ public ApiResponse getMoodTrackerResponse }) public ApiResponse downloadList( @PathVariable(name = "mood-tracker-hashed-Id") String moodTrackerHashedId, - @RequestParam Format format + @RequestParam Format format, + @Parameter(hidden = true) @AuthUser User user, + @Parameter(hidden = true) @AuthMoodTracker MoodTracker moodTracker ) { - Long userId = SecurityUtil.getCurrentUserId(); - Long moodTrackerId = hashIdUtil.decode(moodTrackerHashedId); - MoodTrackerResponseDTO.ReportDownLoadLinkResponse result = moodTrackerCommandService.getDownloadLink(userId, moodTrackerId, format); + + MoodTrackerResponseDTO.ReportDownLoadLinkResponse result = moodTrackerCommandService.getDownloadLink(user, moodTracker, format); + return ApiResponse.onSuccess(result); + } @PostMapping("/{mood-tracker-hashed-Id}/report-test") @@ -210,11 +245,14 @@ public ApiResponse downloadLi @Parameter(name = "mood-tracker-hashed-Id", description = "해시된 16자 분위기 트래커 ID (Path Variable)", required = true) }) public ApiResponse generateMoodTrackerReportTest ( - @PathVariable("mood-tracker-hashed-Id") String moodTrackerHashedId + @PathVariable("mood-tracker-hashed-Id") String moodTrackerHashedId, + @Parameter(hidden = true) @AuthMoodTracker MoodTracker moodTracker ) { - Long moodTrackerId = hashIdUtil.decode(moodTrackerHashedId); - moodTrackerCommandService.generateReportTest(moodTrackerId); + + moodTrackerCommandService.generateReportTest(moodTracker); + return ApiResponse.of(SuccessStatus._OK, null); + } @PostMapping("/{mood-tracker-hashed-Id}/report-file-thumbnail-test") @@ -226,10 +264,13 @@ public ApiResponse generateMoodTrackerReportTest ( @Parameter(name = "mood-tracker-hashed-Id", description = "해시된 16자 분위기 트래커 ID (Path Variable)", required = true) }) public ApiResponse generateMoodTrackerReportFileAndThumbnailTest ( - @PathVariable("mood-tracker-hashed-Id") String moodTrackerHashedId + @PathVariable("mood-tracker-hashed-Id") String moodTrackerHashedId, + @Parameter(hidden = true) @AuthMoodTracker MoodTracker moodTracker ) { - Long moodTrackerId = hashIdUtil.decode(moodTrackerHashedId); - moodTrackerCommandService.generateReportFileAndThumbnailTest(moodTrackerId); + + moodTrackerCommandService.generateReportFileAndThumbnailTest(moodTracker); + return ApiResponse.of(SuccessStatus._OK, null); + } } diff --git a/src/main/java/com/haru/api/domain/moodTracker/dto/MoodTrackerRequestDTO.java b/src/main/java/com/haru/api/domain/moodTracker/dto/MoodTrackerRequestDTO.java index fd91d964..e2cd96ce 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/dto/MoodTrackerRequestDTO.java +++ b/src/main/java/com/haru/api/domain/moodTracker/dto/MoodTrackerRequestDTO.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.haru.api.domain.moodTracker.entity.enums.MoodTrackerVisibility; import com.haru.api.domain.moodTracker.entity.enums.QuestionType; +import com.haru.api.global.common.entity.TitleHolder; import com.haru.api.global.util.json.ToLongDeserializer; import com.haru.api.global.util.json.ToLongListDeserializer; import io.swagger.v3.oas.annotations.media.ArraySchema; @@ -60,7 +61,7 @@ public static class SurveyQuestion { @Builder @NoArgsConstructor @AllArgsConstructor - public static class UpdateTitleRequest { + public static class UpdateTitleRequest implements TitleHolder { @NotBlank private String title; } diff --git a/src/main/java/com/haru/api/domain/moodTracker/entity/MoodTracker.java b/src/main/java/com/haru/api/domain/moodTracker/entity/MoodTracker.java index f3f4341d..335cc19a 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/entity/MoodTracker.java +++ b/src/main/java/com/haru/api/domain/moodTracker/entity/MoodTracker.java @@ -30,7 +30,7 @@ public class MoodTracker extends BaseEntity implements Documentable { private Long id; // 설문ID // 🔹 만든 사람 (User)와 N:1 관계 - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "user_id", nullable = false) private User creator; diff --git a/src/main/java/com/haru/api/domain/moodTracker/repository/MoodTrackerRepository.java b/src/main/java/com/haru/api/domain/moodTracker/repository/MoodTrackerRepository.java index a0bbc442..f0410980 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/repository/MoodTrackerRepository.java +++ b/src/main/java/com/haru/api/domain/moodTracker/repository/MoodTrackerRepository.java @@ -1,7 +1,6 @@ package com.haru.api.domain.moodTracker.repository; import com.haru.api.domain.moodTracker.entity.MoodTracker; -import com.haru.api.domain.workspace.entity.Workspace; import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; @@ -10,6 +9,7 @@ import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Repository public interface MoodTrackerRepository extends JpaRepository { @@ -27,4 +27,11 @@ public interface MoodTrackerRepository extends JpaRepository "WHERE mt.workspace.id = :workspaceId " + "AND mt.createdAt BETWEEN :startDate AND :endDate") List findAllDocumentForCalendars(Long workspaceId, LocalDateTime startDate, LocalDateTime endDate); + + @Query("SELECT mt FROM MoodTracker mt " + + "WHERE mt.id = :moodTrackerId AND EXISTS (" + + " SELECT 1 FROM UserWorkspace uw " + + " WHERE uw.user.id = :userId AND uw.workspace.id = mt.workspace.id" + + ")") + Optional findMoodTrackerByIdIfUserHasAccess(Long userId, Long moodTrackerId); } diff --git a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandService.java b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandService.java index 6186e6cd..660f5dfa 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandService.java +++ b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandService.java @@ -2,39 +2,42 @@ import com.haru.api.domain.moodTracker.dto.MoodTrackerRequestDTO; import com.haru.api.domain.moodTracker.dto.MoodTrackerResponseDTO; +import com.haru.api.domain.moodTracker.entity.MoodTracker; import com.haru.api.domain.snsEvent.entity.enums.Format; +import com.haru.api.domain.user.entity.User; +import com.haru.api.domain.workspace.entity.Workspace; public interface MoodTrackerCommandService { MoodTrackerResponseDTO.CreateResult create( - Long userId, - Long workspaceId, + User user, + Workspace workspace, MoodTrackerRequestDTO.CreateRequest request ); void updateTitle( - Long userId, - Long moodTrackerId, + User user, + MoodTracker moodTracker, MoodTrackerRequestDTO.UpdateTitleRequest request ); void delete( - Long userId, - Long moodTrackerId + User user, + MoodTracker moodTracker ); void sendSurveyLink( - Long moodTrackerId + MoodTracker moodTracker ); void submitSurveyAnswers( - Long moodTrackerId, + MoodTracker moodTracker, MoodTrackerRequestDTO.SurveyAnswerList request ); MoodTrackerResponseDTO.ReportDownLoadLinkResponse getDownloadLink( - Long userId, - Long moodTrackerId, + User user, + MoodTracker moodTracker, Format format ); void generateReportTest( - Long moodTrackerId + MoodTracker moodTracker ); void generateReportFileAndThumbnailTest( - Long moodTrackerId + MoodTracker moodTracker ); } diff --git a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java index 98438dea..785ad404 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java +++ b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerCommandServiceImpl.java @@ -10,17 +10,16 @@ import com.haru.api.domain.moodTracker.repository.*; import com.haru.api.domain.snsEvent.entity.enums.Format; import com.haru.api.domain.user.entity.User; -import com.haru.api.domain.user.repository.UserRepository; import com.haru.api.domain.userWorkspace.entity.UserWorkspace; import com.haru.api.domain.userWorkspace.entity.enums.Auth; import com.haru.api.domain.userWorkspace.repository.UserWorkspaceRepository; import com.haru.api.domain.workspace.entity.Workspace; -import com.haru.api.domain.workspace.repository.WorkspaceRepository; +import com.haru.api.global.annotation.DeleteDocument; +import com.haru.api.global.annotation.UpdateDocumentTitle; import com.haru.api.global.apiPayload.code.status.ErrorStatus; import com.haru.api.global.apiPayload.exception.handler.*; import com.haru.api.global.util.HashIdUtil; import com.haru.api.infra.redis.RedisReportProducer; -import com.haru.api.infra.s3.AmazonS3Manager; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -31,7 +30,6 @@ import java.util.stream.Collectors; import static com.haru.api.domain.moodTracker.entity.enums.QuestionType.*; -import static com.haru.api.global.apiPayload.code.status.ErrorStatus.*; @Slf4j @Service @@ -40,8 +38,6 @@ public class MoodTrackerCommandServiceImpl implements MoodTrackerCommandService { private final MoodTrackerRepository moodTrackerRepository; - private final WorkspaceRepository workspaceRepository; - private final UserRepository userRepository; private final UserWorkspaceRepository userWorkspaceRepository; private final SurveyQuestionRepository surveyQuestionRepository; @@ -60,9 +56,6 @@ public class MoodTrackerCommandServiceImpl implements MoodTrackerCommandService private final HashIdUtil hashIdUtil; private final UserDocumentLastOpenedService userDocumentLastOpenedService; - private final UserDocumentLastOpenedRepository userDocumentLastOpenedRepository; - - private final AmazonS3Manager amazonS3Manager; /** * 분위기 트래커 생성 @@ -70,18 +63,13 @@ public class MoodTrackerCommandServiceImpl implements MoodTrackerCommandService @Override @Transactional public MoodTrackerResponseDTO.CreateResult create( - Long userId, - Long workspaceId, + User user, + Workspace workspace, MoodTrackerRequestDTO.CreateRequest request ) { - User foundUser = userRepository.findById(userId) - .orElseThrow(() -> new MemberHandler(MEMBER_NOT_FOUND)); - - Workspace foundWorkspace = workspaceRepository.findById(workspaceId) - .orElseThrow(() -> new WorkspaceHandler(ErrorStatus.WORKSPACE_NOT_FOUND)); // 분위기 트래커 생성 및 저장 - MoodTracker moodTracker = MoodTrackerConverter.toMoodTracker(request, foundUser, foundWorkspace); + MoodTracker moodTracker = MoodTrackerConverter.toMoodTracker(request, user, workspace); MoodTracker savedMoodTracker = moodTrackerRepository.save(moodTracker); // 선택지 생성 및 저장 @@ -103,7 +91,7 @@ public MoodTrackerResponseDTO.CreateResult create( // mood tracker 생성 시 워크스페이스에 속해있는 모든 유저에 대해 // last opened 테이블에 마지막으로 연 시간은 null로하여 추가 - List usersInWorkspace = userWorkspaceRepository.findUsersByWorkspaceId(foundWorkspace.getId()); + List usersInWorkspace = userWorkspaceRepository.findUsersByWorkspaceId(workspace.getId()); userDocumentLastOpenedService.createInitialRecordsForWorkspaceUsers(usersInWorkspace, savedMoodTracker); return MoodTrackerConverter.toCreateResultDTO(moodTracker, hashIdUtil); @@ -114,32 +102,23 @@ public MoodTrackerResponseDTO.CreateResult create( */ @Override @Transactional - public void updateTitle(Long userId, - Long moodTrackerId, - MoodTrackerRequestDTO.UpdateTitleRequest request + @UpdateDocumentTitle + public void updateTitle( + User user, + MoodTracker moodTracker, + MoodTrackerRequestDTO.UpdateTitleRequest request ) { - User foundUser = userRepository.findById(userId) - .orElseThrow(() -> new MemberHandler(MEMBER_NOT_FOUND)); - - MoodTracker foundMoodTracker = moodTrackerRepository.findById(moodTrackerId) - .orElseThrow(() -> new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FOUND)); - Workspace foundWorkspace = workspaceRepository.findByMoodTrackerId(moodTrackerId) - .orElseThrow(() -> new WorkspaceHandler(ErrorStatus.WORKSPACE_NOT_FOUND)); - - UserWorkspace foundUserWorkspace = userWorkspaceRepository.findByWorkspaceIdAndUserId(foundWorkspace.getId(), foundUser.getId()) + UserWorkspace foundUserWorkspace = userWorkspaceRepository.findByWorkspaceIdAndUserId(moodTracker.getWorkspace().getId(), user.getId()) .orElseThrow(() -> new UserWorkspaceHandler(ErrorStatus.USER_WORKSPACE_NOT_FOUND)); // 워크스페이스 생성자이거나 해당 분위기 트래커 생성자인 경우 허용 if (!(foundUserWorkspace.getAuth().equals(Auth.ADMIN) - || foundMoodTracker.getCreator().getId().equals(userId))) + || moodTracker.getCreator().getId().equals(user.getId()))) throw new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_MODIFY_NOT_ALLOWED); - foundMoodTracker.updateTitle(request.getTitle()); + moodTracker.updateTitle(request.getTitle()); - // mood tracker 수정 시 워크스페이스에 속해있는 모든 유저에 대해 - // last opened 테이블에서 해당 문서 정보 업데이트 - userDocumentLastOpenedService.updateRecordsForWorkspaceUsers(foundMoodTracker); } /** @@ -147,32 +126,22 @@ public void updateTitle(Long userId, */ @Override @Transactional + @DeleteDocument public void delete( - Long userId, - Long moodTrackerId + User user, + MoodTracker moodTracker ) { - User foundUser = userRepository.findById(userId) - .orElseThrow(() -> new MemberHandler(MEMBER_NOT_FOUND)); - - MoodTracker foundMoodTracker = moodTrackerRepository.findById(moodTrackerId) - .orElseThrow(() -> new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FOUND)); - - Workspace foundWorkspace = workspaceRepository.findByMoodTrackerId(moodTrackerId) - .orElseThrow(() -> new WorkspaceHandler(ErrorStatus.WORKSPACE_NOT_FOUND)); - UserWorkspace foundUserWorkspace = userWorkspaceRepository.findByWorkspaceIdAndUserId(foundWorkspace.getId(), foundUser.getId()) + UserWorkspace foundUserWorkspace = userWorkspaceRepository.findByWorkspaceIdAndUserId(moodTracker.getWorkspace().getId(), user.getId()) .orElseThrow(() -> new UserWorkspaceHandler(ErrorStatus.USER_WORKSPACE_NOT_FOUND)); // 워크스페이스 생성자이거나 해당 분위기 트래커 생성자인 경우 허용 if (!(foundUserWorkspace.getAuth().equals(Auth.ADMIN) - || foundMoodTracker.getCreator().getId().equals(userId))) + || moodTracker.getCreator().getId().equals(user.getId()))) throw new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_MODIFY_NOT_ALLOWED); - moodTrackerRepository.delete(foundMoodTracker); + moodTrackerRepository.delete(moodTracker); - // mood tracker 삭제 시 워크스페이스에 속해있는 모든 유저에 대해 - // last opened 테이블에서 해당 문서 id를 가지고 있는 튜플 모두 삭제 - userDocumentLastOpenedService.deleteRecordsForWorkspaceUsers(foundMoodTracker); } /** @@ -181,18 +150,16 @@ public void delete( @Override @Transactional public void sendSurveyLink( - Long moodTrackerId + MoodTracker moodTracker ) { - MoodTracker foundMoodTracker = moodTrackerRepository.findById(moodTrackerId) - .orElseThrow(() -> new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FOUND)); - String creatorName = foundMoodTracker.getCreator().getName(); // 작성자 이름 - String surveyTitle = foundMoodTracker.getTitle(); // 설문 제목 + String creatorName = moodTracker.getCreator().getName(); // 작성자 이름 + String surveyTitle = moodTracker.getTitle(); // 설문 제목 String mailTitle = "%s 님이 나에게 [%s] 설문을 공유했습니다.".formatted(creatorName, surveyTitle); String mailContent = "%s 님의 [%s] 설문에 대한 소중한 의견을 보내주세요.".formatted(creatorName, surveyTitle); - moodTrackerMailService.sendSurveyLinkToEmail(moodTrackerId, mailTitle, mailContent); + moodTrackerMailService.sendSurveyLinkToEmail(moodTracker.getId(), mailTitle, mailContent); } /** @@ -201,7 +168,7 @@ public void sendSurveyLink( @Override @Transactional public void submitSurveyAnswers( - Long moodTrackerId, + MoodTracker moodTracker, MoodTrackerRequestDTO.SurveyAnswerList request ) { List subjectiveAnswers = new ArrayList<>(); @@ -209,7 +176,7 @@ public void submitSurveyAnswers( List checkboxChoiceAnswers = new ArrayList<>(); // 전체 질문을 미리 조회 및 맵에 캐싱 - List foundQuestions = surveyQuestionRepository.findAllByMoodTrackerId(moodTrackerId); + List foundQuestions = surveyQuestionRepository.findAllByMoodTrackerId(moodTracker.getId()); Map questionMap = foundQuestions.stream() .collect(Collectors.toMap(SurveyQuestion::getId, q -> q)); @@ -266,39 +233,37 @@ public void submitSurveyAnswers( subjectiveAnswerRepository.saveAll(subjectiveAnswers); // 답변자 수 증가 - moodTrackerRepository.addRespondentsNum(moodTrackerId); + moodTrackerRepository.addRespondentsNum(moodTracker.getId()); } @Override @Transactional public MoodTrackerResponseDTO.ReportDownLoadLinkResponse getDownloadLink( - Long userId, - Long moodTrackerId, + User user, + MoodTracker moodTracker, Format format ) { - MoodTracker foundMoodTracker = moodTrackerRepository.findById(moodTrackerId) - .orElseThrow(() -> new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FOUND)); // 권한 확인 UserWorkspace userWorkspace = userWorkspaceRepository.findByWorkspaceIdAndUserId( - foundMoodTracker.getWorkspace().getId(), userId + moodTracker.getWorkspace().getId(), user.getId() ).orElseThrow(() -> new UserWorkspaceHandler(ErrorStatus.USER_WORKSPACE_NOT_FOUND)); boolean hasAccess = userWorkspace.getAuth().equals(Auth.ADMIN) || - foundMoodTracker.getCreator().getId().equals(userId) || - foundMoodTracker.getVisibility().equals(MoodTrackerVisibility.PUBLIC); + moodTracker.getCreator().getId().equals(user.getId()) || + moodTracker.getVisibility().equals(MoodTrackerVisibility.PUBLIC); if (!hasAccess) { throw new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_ACCESS_DENIED); } // 마감 여부 확인 - if (LocalDateTime.now().isBefore(foundMoodTracker.getDueDate())) { + if (LocalDateTime.now().isBefore(moodTracker.getDueDate())) { throw new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FINISHED); } - String generatedReportUrl = moodTrackerReportService.generateDownloadLink(foundMoodTracker, format); + String generatedReportUrl = moodTrackerReportService.generateDownloadLink(moodTracker, format); return MoodTrackerResponseDTO.ReportDownLoadLinkResponse.builder() .downloadLink(generatedReportUrl) @@ -308,16 +273,16 @@ public MoodTrackerResponseDTO.ReportDownLoadLinkResponse getDownloadLink( @Override @Transactional public void generateReportTest( - Long moodTrackerId + MoodTracker moodTracker ) { - moodTrackerReportService.generateReport(moodTrackerId); + moodTrackerReportService.generateReport(moodTracker.getId()); } @Override @Transactional public void generateReportFileAndThumbnailTest( - Long moodTrackerId + MoodTracker moodTracker ) { - moodTrackerReportService.generateAndUploadReportFileAndThumbnail(moodTrackerId); + moodTrackerReportService.generateAndUploadReportFileAndThumbnail(moodTracker.getId()); } } diff --git a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerQueryService.java b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerQueryService.java index 96433497..fe7a7641 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerQueryService.java +++ b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerQueryService.java @@ -1,13 +1,16 @@ package com.haru.api.domain.moodTracker.service; import com.haru.api.domain.moodTracker.dto.MoodTrackerResponseDTO; +import com.haru.api.domain.moodTracker.entity.MoodTracker; +import com.haru.api.domain.user.entity.User; +import com.haru.api.domain.workspace.entity.Workspace; public interface MoodTrackerQueryService { - MoodTrackerResponseDTO.PreviewList getMoodTrackerPreviewList(Long userId, Long workspaceId); + MoodTrackerResponseDTO.PreviewList getMoodTrackerPreviewList(User user, Workspace workspace); - MoodTrackerResponseDTO.QuestionResult getQuestionResult(Long userId, Long moodTrackerId); + MoodTrackerResponseDTO.QuestionResult getQuestionResult(User user, MoodTracker moodTracker); - MoodTrackerResponseDTO.ReportResult getReportResult(Long userId, Long moodTrackerId); + MoodTrackerResponseDTO.ReportResult getReportResult(User user, MoodTracker moodTracker); - MoodTrackerResponseDTO.ResponseResult getResponseResult(Long userId, Long moodTrackerId); + MoodTrackerResponseDTO.ResponseResult getResponseResult(User user, MoodTracker moodTracker); } diff --git a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerQueryServiceImpl.java b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerQueryServiceImpl.java index 4dee77a6..6638a7d1 100644 --- a/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerQueryServiceImpl.java +++ b/src/main/java/com/haru/api/domain/moodTracker/service/MoodTrackerQueryServiceImpl.java @@ -1,6 +1,5 @@ package com.haru.api.domain.moodTracker.service; -import com.haru.api.domain.lastOpened.entity.enums.DocumentType; import com.haru.api.domain.moodTracker.converter.MoodTrackerConverter; import com.haru.api.domain.moodTracker.dto.MoodTrackerResponseDTO; import com.haru.api.domain.moodTracker.entity.MoodTracker; @@ -8,18 +7,14 @@ import com.haru.api.domain.moodTracker.entity.enums.MoodTrackerVisibility; import com.haru.api.domain.moodTracker.repository.*; import com.haru.api.domain.user.entity.User; -import com.haru.api.domain.user.repository.UserRepository; import com.haru.api.domain.userWorkspace.entity.UserWorkspace; import com.haru.api.domain.userWorkspace.entity.enums.Auth; import com.haru.api.domain.userWorkspace.repository.UserWorkspaceRepository; import com.haru.api.domain.workspace.entity.Workspace; -import com.haru.api.domain.workspace.repository.WorkspaceRepository; import com.haru.api.global.annotation.TrackLastOpened; import com.haru.api.global.apiPayload.code.status.ErrorStatus; -import com.haru.api.global.apiPayload.exception.handler.MemberHandler; import com.haru.api.global.apiPayload.exception.handler.MoodTrackerHandler; import com.haru.api.global.apiPayload.exception.handler.UserWorkspaceHandler; -import com.haru.api.global.apiPayload.exception.handler.WorkspaceHandler; import com.haru.api.global.util.HashIdUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -36,8 +31,6 @@ public class MoodTrackerQueryServiceImpl implements MoodTrackerQueryService { private final MoodTrackerRepository moodTrackerRepository; - private final UserRepository userRepository; - private final WorkspaceRepository workspaceRepository; private final UserWorkspaceRepository userWorkspaceRepository; private final HashIdUtil hashIdUtil; @@ -45,18 +38,13 @@ public class MoodTrackerQueryServiceImpl implements MoodTrackerQueryService { private final SurveyQuestionRepository surveyQuestionRepository; @Override - public MoodTrackerResponseDTO.PreviewList getMoodTrackerPreviewList(Long userId, Long workspaceId) { - User foundUser = userRepository.findById(userId) - .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); + public MoodTrackerResponseDTO.PreviewList getMoodTrackerPreviewList(User user, Workspace workspace) { - Workspace foundWorkspace = workspaceRepository.findById(workspaceId) - .orElseThrow(() -> new WorkspaceHandler(ErrorStatus.WORKSPACE_NOT_FOUND)); - - UserWorkspace foundUserWorkspace = userWorkspaceRepository.findByWorkspaceIdAndUserId(foundWorkspace.getId(), foundUser.getId()) + UserWorkspace foundUserWorkspace = userWorkspaceRepository.findByWorkspaceIdAndUserId(workspace.getId(), user.getId()) .orElseThrow(() -> new UserWorkspaceHandler(ErrorStatus.USER_WORKSPACE_NOT_FOUND)); // 모든 분위기 트래커 조회 - List foundMoodTrackers = moodTrackerRepository.findAllByWorkspaceId(workspaceId); + List foundMoodTrackers = moodTrackerRepository.findAllByWorkspaceId(workspace.getId()); // 권한에 따른 필터링 List accessibleMoodTrackers = foundMoodTrackers.stream() @@ -65,7 +53,7 @@ public MoodTrackerResponseDTO.PreviewList getMoodTrackerPreviewList(Long userId, foundUserWorkspace.getAuth().equals(Auth.ADMIN) // 또는 해당 설문 생성자인 경우 허용 - || moodTracker.getCreator().getId().equals(userId) + || moodTracker.getCreator().getId().equals(user.getId()) // 또는 공개된 설문인 경우 허용 || moodTracker.getVisibility().equals(MoodTrackerVisibility.PUBLIC) @@ -78,78 +66,72 @@ public MoodTrackerResponseDTO.PreviewList getMoodTrackerPreviewList(Long userId, @Override @Transactional(readOnly = true) - @TrackLastOpened(type = DocumentType.TEAM_MOOD_TRACKER) - public MoodTrackerResponseDTO.QuestionResult getQuestionResult(Long userId, Long moodTrackerId) { - MoodTracker foundMoodTracker = moodTrackerRepository.findById(moodTrackerId) - .orElseThrow(() -> new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FOUND)); + @TrackLastOpened + public MoodTrackerResponseDTO.QuestionResult getQuestionResult(User user, MoodTracker moodTracker) { - List questionList = surveyQuestionRepository.findAllByMoodTrackerId(moodTrackerId); + List questionList = surveyQuestionRepository.findAllByMoodTrackerId(moodTracker.getId()); - return MoodTrackerConverter.toQuestionResultDTO(foundMoodTracker, questionList, hashIdUtil); + return MoodTrackerConverter.toQuestionResultDTO(moodTracker, questionList, hashIdUtil); } @Override @Transactional(readOnly = true) - @TrackLastOpened(type = DocumentType.TEAM_MOOD_TRACKER) - public MoodTrackerResponseDTO.ReportResult getReportResult(Long userId, Long moodTrackerId) { - MoodTracker foundMoodTracker = moodTrackerRepository.findById(moodTrackerId) - .orElseThrow(() -> new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FOUND)); + @TrackLastOpened + public MoodTrackerResponseDTO.ReportResult getReportResult(User user, MoodTracker moodTracker) { // 권한 확인 UserWorkspace userWorkspace = userWorkspaceRepository.findByWorkspaceIdAndUserId( - foundMoodTracker.getWorkspace().getId(), userId + moodTracker.getWorkspace().getId(), user.getId() ).orElseThrow(() -> new UserWorkspaceHandler(ErrorStatus.USER_WORKSPACE_NOT_FOUND)); boolean hasAccess = userWorkspace.getAuth().equals(Auth.ADMIN) || - foundMoodTracker.getCreator().getId().equals(userId) || - foundMoodTracker.getVisibility().equals(MoodTrackerVisibility.PUBLIC); + moodTracker.getCreator().getId().equals(user.getId()) || + moodTracker.getVisibility().equals(MoodTrackerVisibility.PUBLIC); if (!hasAccess) { throw new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_ACCESS_DENIED); } // 마감 여부 확인 - if (LocalDateTime.now().isBefore(foundMoodTracker.getDueDate())) { + if (LocalDateTime.now().isBefore(moodTracker.getDueDate())) { throw new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FINISHED); } - List suggestionList = surveyQuestionRepository.findAllByMoodTrackerId(moodTrackerId).stream() + List suggestionList = surveyQuestionRepository.findAllByMoodTrackerId(moodTracker.getId()).stream() .map(SurveyQuestion::getSuggestion) .filter(Objects::nonNull) .collect(Collectors.toList()); - return MoodTrackerConverter.toReportResultDTO(foundMoodTracker, suggestionList, hashIdUtil); + return MoodTrackerConverter.toReportResultDTO(moodTracker, suggestionList, hashIdUtil); } @Override @Transactional(readOnly = true) - @TrackLastOpened(type = DocumentType.TEAM_MOOD_TRACKER) - public MoodTrackerResponseDTO.ResponseResult getResponseResult(Long userId, Long moodTrackerId) { - MoodTracker foundMoodTracker = moodTrackerRepository.findById(moodTrackerId) - .orElseThrow(() -> new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FOUND)); + @TrackLastOpened + public MoodTrackerResponseDTO.ResponseResult getResponseResult(User user, MoodTracker moodTracker) { // 권한 확인 UserWorkspace userWorkspace = userWorkspaceRepository.findByWorkspaceIdAndUserId( - foundMoodTracker.getWorkspace().getId(), userId + moodTracker.getWorkspace().getId(), user.getId() ).orElseThrow(() -> new UserWorkspaceHandler(ErrorStatus.USER_WORKSPACE_NOT_FOUND)); boolean hasAccess = userWorkspace.getAuth().equals(Auth.ADMIN) || - foundMoodTracker.getCreator().getId().equals(userId) || - foundMoodTracker.getVisibility().equals(MoodTrackerVisibility.PUBLIC); + moodTracker.getCreator().getId().equals(user.getId()) || + moodTracker.getVisibility().equals(MoodTrackerVisibility.PUBLIC); if (!hasAccess) { throw new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_ACCESS_DENIED); } // 마감 여부 확인 - if (LocalDateTime.now().isBefore(foundMoodTracker.getDueDate())) { + if (LocalDateTime.now().isBefore(moodTracker.getDueDate())) { throw new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FINISHED); } - List questions = surveyQuestionRepository.findAllByMoodTrackerId(moodTrackerId); + List questions = surveyQuestionRepository.findAllByMoodTrackerId(moodTracker.getId()); - return MoodTrackerConverter.toResponseResultDTO(foundMoodTracker, questions, hashIdUtil); + return MoodTrackerConverter.toResponseResultDTO(moodTracker, questions, hashIdUtil); } } diff --git a/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventQueryServiceImpl.java b/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventQueryServiceImpl.java index cbe8128a..27bf5255 100644 --- a/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventQueryServiceImpl.java +++ b/src/main/java/com/haru/api/domain/snsEvent/service/SnsEventQueryServiceImpl.java @@ -1,6 +1,5 @@ package com.haru.api.domain.snsEvent.service; -import com.haru.api.domain.lastOpened.entity.enums.DocumentType; import com.haru.api.domain.snsEvent.converter.SnsEventConverter; import com.haru.api.domain.snsEvent.dto.SnsEventResponseDTO; import com.haru.api.domain.snsEvent.entity.Participant; @@ -35,7 +34,7 @@ public SnsEventResponseDTO.GetSnsEventListRequest getSnsEventList(User user, Wor } @Override - @TrackLastOpened(type = DocumentType.SNS_EVENT_ASSISTANT) + @TrackLastOpened public SnsEventResponseDTO.GetSnsEventRequest getSnsEvent(User user, SnsEvent snsEvent) { List participantList = participantRepository.findAllBySnsEvent(snsEvent); diff --git a/src/main/java/com/haru/api/global/annotation/AuthMoodTracker.java b/src/main/java/com/haru/api/global/annotation/AuthMoodTracker.java new file mode 100644 index 00000000..5ed51897 --- /dev/null +++ b/src/main/java/com/haru/api/global/annotation/AuthMoodTracker.java @@ -0,0 +1,14 @@ +package com.haru.api.global.annotation; + +import com.haru.api.domain.lastOpened.entity.enums.DocumentType; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +@AuthDocument(documentType = DocumentType.TEAM_MOOD_TRACKER, pathVariableName = "mood-tracker-hashed-Id") +public @interface AuthMoodTracker { +} diff --git a/src/main/java/com/haru/api/global/annotation/TrackLastOpened.java b/src/main/java/com/haru/api/global/annotation/TrackLastOpened.java index ffa9904c..699732f3 100644 --- a/src/main/java/com/haru/api/global/annotation/TrackLastOpened.java +++ b/src/main/java/com/haru/api/global/annotation/TrackLastOpened.java @@ -1,7 +1,5 @@ package com.haru.api.global.annotation; -import com.haru.api.domain.lastOpened.entity.enums.DocumentType; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -10,7 +8,4 @@ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface TrackLastOpened { - DocumentType type(); - int userIdIndex() default 0; - int documentIdIndex() default 1; } diff --git a/src/main/java/com/haru/api/global/argumentResolver/AuthDocumentArgumentResolver.java b/src/main/java/com/haru/api/global/argumentResolver/AuthDocumentArgumentResolver.java index b6a40caf..6f2a0e5c 100644 --- a/src/main/java/com/haru/api/global/argumentResolver/AuthDocumentArgumentResolver.java +++ b/src/main/java/com/haru/api/global/argumentResolver/AuthDocumentArgumentResolver.java @@ -69,14 +69,13 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m if (idString == null) { throw new IllegalStateException("경로 변수 '" + pathVariableName + "'를 찾을 수 없습니다."); } - Long id = Long.parseLong(idString); // DocumentType에 맞는 finder를 찾아 객체를 조회 DocumentFinder finder = finders.get(documentType); if (finder == null) throw new IllegalStateException(documentType + " 타입을 처리할 Finder가 없습니다."); - return finder.findById(id); + return finder.findById(idString); } } diff --git a/src/main/java/com/haru/api/global/aspect/LastOpenedAspect.java b/src/main/java/com/haru/api/global/aspect/LastOpenedAspect.java index 2891b4d9..a03bcd46 100644 --- a/src/main/java/com/haru/api/global/aspect/LastOpenedAspect.java +++ b/src/main/java/com/haru/api/global/aspect/LastOpenedAspect.java @@ -26,16 +26,12 @@ public Object trackLastOpened(ProceedingJoinPoint joinPoint, TrackLastOpened tra // 실제 메서드 실행 Object result = joinPoint.proceed(); - DocumentType type = trackLastOpened.type(); - int userIdIndex = trackLastOpened.userIdIndex(); - int documentIdIndex = trackLastOpened.documentIdIndex(); - - // 메서드의 인자에서 userId와 documentId 추출 + // 메서드의 인자에서 user와 document 추출 Object[] args = joinPoint.getArgs(); // 인덱스를 사용하여 user와 document 추출 - User user = (User)args[userIdIndex]; - Documentable document = (Documentable)args[documentIdIndex]; + User user = (User)args[0]; + Documentable document = (Documentable)args[1]; if (user != null && document != null) { diff --git a/src/main/java/com/haru/api/global/documentFinder/MoodTrackerFinder.java b/src/main/java/com/haru/api/global/documentFinder/MoodTrackerFinder.java new file mode 100644 index 00000000..f307ee3a --- /dev/null +++ b/src/main/java/com/haru/api/global/documentFinder/MoodTrackerFinder.java @@ -0,0 +1,29 @@ +package com.haru.api.global.documentFinder; + +import com.haru.api.domain.lastOpened.entity.enums.DocumentType; +import com.haru.api.domain.moodTracker.repository.MoodTrackerRepository; +import com.haru.api.global.apiPayload.code.status.ErrorStatus; +import com.haru.api.global.apiPayload.exception.handler.MoodTrackerHandler; +import com.haru.api.global.util.HashIdUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class MoodTrackerFinder implements DocumentFinder{ + + private final MoodTrackerRepository moodTrackerRepository; + private final HashIdUtil hashIdUtil; + + @Override + public DocumentType getSupportType() { + return DocumentType.TEAM_MOOD_TRACKER; + } + + @Override + public Object findById(Object id) { + Long decodedId = hashIdUtil.decode((String) id); + return moodTrackerRepository.findById(decodedId) + .orElseThrow(() -> new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FOUND)); + } +} diff --git a/src/main/java/com/haru/api/global/interceptor/DocumentMemberAuthInterceptor.java b/src/main/java/com/haru/api/global/interceptor/DocumentMemberAuthInterceptor.java index 1bbea75e..558bfb39 100644 --- a/src/main/java/com/haru/api/global/interceptor/DocumentMemberAuthInterceptor.java +++ b/src/main/java/com/haru/api/global/interceptor/DocumentMemberAuthInterceptor.java @@ -2,6 +2,7 @@ import com.haru.api.domain.lastOpened.entity.enums.DocumentType; import com.haru.api.domain.meeting.repository.MeetingRepository; +import com.haru.api.domain.moodTracker.repository.MoodTrackerRepository; import com.haru.api.domain.snsEvent.repository.SnsEventRepository; import com.haru.api.domain.user.entity.User; import com.haru.api.domain.user.repository.UserRepository; @@ -10,7 +11,9 @@ import com.haru.api.global.annotation.AuthUser; import com.haru.api.global.apiPayload.code.status.ErrorStatus; import com.haru.api.global.apiPayload.exception.handler.MemberHandler; +import com.haru.api.global.apiPayload.exception.handler.MoodTrackerHandler; import com.haru.api.global.apiPayload.exception.handler.SnsEventHandler; +import com.haru.api.global.util.HashIdUtil; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -29,8 +32,11 @@ public class DocumentMemberAuthInterceptor implements HandlerInterceptor { private final UserRepository userRepository; + private final HashIdUtil hashIdUtil; + private final MeetingRepository meetingRepository; private final SnsEventRepository snsEventRepository; + private final MoodTrackerRepository moodTrackerRepository; @Override public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception { @@ -78,24 +84,26 @@ public boolean preHandle(final HttpServletRequest request, final HttpServletResp throw new BadRequestException("경로 변수 " + pathVariableName + "가 없습니다."); } - // userId, documentId 추출 + // userId final Long userId = SecurityUtil.getCurrentUserId(); - final Long documentId = Long.parseLong(documentIdStr); - - Object foundDocument = null; - // 유저가 해당 문서가 속한 워크스페이스에 속해있는지 확인하고, 해당 객체를 반환함 - switch (documentType) { - case AI_MEETING_MANAGER: - foundDocument = meetingRepository.findMeetingByIdIfUserHasAccess(userId, documentId) + Object foundDocument = switch (documentType) { + case AI_MEETING_MANAGER -> { + Long documentId = Long.parseLong(documentIdStr); + yield meetingRepository.findMeetingByIdIfUserHasAccess(userId, documentId) .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_HAS_NO_ACCESS_TO_MEETING)); - break; - - case SNS_EVENT_ASSISTANT: - foundDocument = snsEventRepository.findSnsEventByIdIfUserHasAccess(userId, documentId) + } + case SNS_EVENT_ASSISTANT -> { + Long documentId = Long.parseLong(documentIdStr); + yield snsEventRepository.findSnsEventByIdIfUserHasAccess(userId, documentId) .orElseThrow(() -> new SnsEventHandler(ErrorStatus.SNS_EVENT_NOT_FOUND)); - break; - } + } + case TEAM_MOOD_TRACKER -> { + Long documentId = hashIdUtil.decode(documentIdStr); + yield moodTrackerRepository.findMoodTrackerByIdIfUserHasAccess(userId, documentId) + .orElseThrow(() -> new MoodTrackerHandler(ErrorStatus.MOOD_TRACKER_NOT_FOUND)); + } + }; // 유저 조회 User foundUser = userRepository.findById(userId)