Skip to content
This repository was archived by the owner on Jan 11, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import com.example.spot.post.presentation.dto.PostCreateRequest;
import com.example.spot.post.presentation.dto.PostCreateResponse;
import com.example.spot.post.presentation.dto.PostLikeResponse;
import com.example.spot.report.presentation.dto.PostReportResponse;
import com.example.spot.post.presentation.dto.PostUpdateRequest;
import com.example.spot.post.presentation.dto.ScrapAllDeleteRequest;
import com.example.spot.post.presentation.dto.ScrapPostResponse;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@
import com.example.spot.member.domain.Member;
import com.example.spot.post.domain.Post;
import com.example.spot.comment.domain.PostComment;
import com.example.spot.report.domain.PostReport;
import com.example.spot.post.domain.enums.Board;
import com.example.spot.post.domain.enums.PostStatus;
import com.example.spot.post.domain.association.MemberScrap;
import com.example.spot.comment.domain.association.LikedPostCommentRepository;
import com.example.spot.post.domain.association.LikedPostRepository;
Expand All @@ -25,7 +23,6 @@
import com.example.spot.post.presentation.dto.PostCreateRequest;
import com.example.spot.post.presentation.dto.PostCreateResponse;
import com.example.spot.post.presentation.dto.PostLikeResponse;
import com.example.spot.report.presentation.dto.PostReportResponse;
import com.example.spot.post.presentation.dto.PostUpdateRequest;
import com.example.spot.post.presentation.dto.ScrapAllDeleteRequest;
import com.example.spot.post.presentation.dto.ScrapPostResponse;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import com.example.spot.post.presentation.dto.PostCreateResponse;
import com.example.spot.post.presentation.dto.PostLikeResponse;
import com.example.spot.post.presentation.dto.PostPagingResponse;
import com.example.spot.report.presentation.dto.PostReportResponse;
import com.example.spot.post.presentation.dto.PostRepresentativeResponse;
import com.example.spot.post.presentation.dto.PostSingleResponse;
import com.example.spot.post.presentation.dto.PostUpdateRequest;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
package com.example.spot.report.application;

import com.example.spot.member.presentation.dto.MemberResponseDTO;
import com.example.spot.report.presentation.dto.PostReportResponse;
import com.example.spot.story.web.dto.response.StoryResDTO;
import com.example.spot.study.presentation.dto.request.StudyMemberReportDTO;
import com.example.spot.report.presentation.dto.PostReportDTO;
import com.example.spot.story.web.dto.response.StoryResponseDTO;
import com.example.spot.report.presentation.dto.StudyMemberReportDTO;
import jakarta.validation.Valid;

public interface ReportCommandService {

// 게시글 신고
PostReportResponse reportPost(Long postId, Long memberId);
PostReportDTO reportPost(Long postId, Long memberId);

// 스터디 회원 신고
MemberResponseDTO.ReportedMemberDTO reportStudyMember(Long studyId, Long memberId, @Valid StudyMemberReportDTO studyMemberReportDTO);

// 스터디 게시글 신고
StoryResDTO.PostPreviewDTO reportStudyPost(Long studyId, Long postId);
StoryResponseDTO.StoryPreviewDTO reportStudyPost(Long studyId, Long postId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@
import com.example.spot.post.domain.PostRepository;
import com.example.spot.post.domain.enums.PostStatus;
import com.example.spot.report.domain.*;
import com.example.spot.report.presentation.dto.PostReportResponse;
import com.example.spot.report.presentation.dto.PostReportDTO;
import com.example.spot.story.domain.Story;
import com.example.spot.story.domain.StoryRepository;
import com.example.spot.story.web.dto.response.StoryResDTO;
import com.example.spot.story.web.dto.response.StoryResponseDTO;
import com.example.spot.study.domain.Study;
import com.example.spot.study.domain.StudyRepository;
import com.example.spot.study.domain.enums.StudyApplicationStatus;
import com.example.spot.study.domain.repository.StudyMemberRepository;
import com.example.spot.study.presentation.dto.request.StudyMemberReportDTO;
import com.example.spot.report.presentation.dto.StudyMemberReportDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -41,7 +41,7 @@ public class ReportCommandServiceImpl implements ReportCommandService {
private final PostReportRepository postReportRepository;

@Override
public PostReportResponse reportPost(Long postId, Long memberId) {
public PostReportDTO reportPost(Long postId, Long memberId) {

// 동일한 게시글에 대한 중복 신고 방지
if (postReportRepository.existsByPostIdAndMemberId(postId, memberId)) {
Expand All @@ -65,7 +65,7 @@ public PostReportResponse reportPost(Long postId, Long memberId) {

postReportRepository.save(postReport);

return PostReportResponse.toDTO(postId, memberId);
return PostReportDTO.toDTO(postId, memberId);
}

/**
Expand Down Expand Up @@ -122,7 +122,7 @@ public MemberResponseDTO.ReportedMemberDTO reportStudyMember(Long studyId, Long
* @return 신고를 당한 스터디 게시글의 아이디와 제목을 반환합니다.
*/
@Override
public StoryResDTO.PostPreviewDTO reportStudyPost(Long studyId, Long postId) {
public StoryResponseDTO.StoryPreviewDTO reportStudyPost(Long studyId, Long postId) {

//=== Exception ===//
Long reporterId = SecurityUtils.getCurrentUserId();
Expand Down Expand Up @@ -151,6 +151,6 @@ public StoryResDTO.PostPreviewDTO reportStudyPost(Long studyId, Long postId) {
storyReport = storyReportRepository.save(storyReport);
story.addStudyPostReport(storyReport);

return StoryResDTO.PostPreviewDTO.toDTO(story);
return StoryResponseDTO.StoryPreviewDTO.toDTO(story);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import com.example.spot.member.presentation.dto.MemberResponseDTO;
import com.example.spot.report.application.ReportCommandService;
import com.example.spot.story.domain.validation.annotation.ExistStory;
import com.example.spot.story.web.dto.response.StoryResDTO;
import com.example.spot.story.web.dto.response.StoryResponseDTO;
import com.example.spot.study.domain.validation.annotation.ExistStudy;
import com.example.spot.study.presentation.dto.request.StudyMemberReportDTO;
import com.example.spot.report.presentation.dto.StudyMemberReportDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
Expand Down Expand Up @@ -50,10 +50,10 @@ public ApiResponse<MemberResponseDTO.ReportedMemberDTO> reportStudyMember(
@Parameter(name = "studyId", description = "스터디의 id를 입력합니다.", required = true)
@Parameter(name = "postId", description = "신고할 스터디 게시글의 id를 입력합니다.", required = true)
@PostMapping("/studies/{studyId}/posts/{postId}/reports")
public ApiResponse<StoryResDTO.PostPreviewDTO> reportStudyPost(
public ApiResponse<StoryResponseDTO.StoryPreviewDTO> reportStudyPost(
@PathVariable @ExistStudy Long studyId,
@PathVariable @ExistStory Long postId) {
StoryResDTO.PostPreviewDTO postPreviewDTO = reportCommandService.reportStudyPost(studyId, postId);
return ApiResponse.onSuccess(SuccessStatus._STUDY_POST_REPORTED, postPreviewDTO);
StoryResponseDTO.StoryPreviewDTO storyPreviewDTO = reportCommandService.reportStudyPost(studyId, postId);
return ApiResponse.onSuccess(SuccessStatus._STUDY_POST_REPORTED, storyPreviewDTO);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
@Builder
@Getter
@AllArgsConstructor
public class PostReportResponse {
public class PostReportDTO {
private Long reportedPostId;
private Long reporterId;
private LocalDateTime reportedAt;

public static PostReportResponse toDTO(Long reportedPostId, Long reporterId) {
return PostReportResponse.builder()
public static PostReportDTO toDTO(Long reportedPostId, Long reporterId) {
return PostReportDTO.builder()
.reportedPostId(reportedPostId)
.reporterId(reporterId)
.reportedAt(LocalDateTime.now())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.spot.study.presentation.dto.request;
package com.example.spot.report.presentation.dto;

import com.example.spot.common.presentation.validator.TextLength;
import lombok.AllArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.example.spot.schedule.application;

import com.example.spot.schedule.presentation.dto.request.ScheduleRequestDTO;
import com.example.spot.schedule.presentation.dto.request.StudyQuizRequestDTO;
import com.example.spot.schedule.presentation.dto.request.QuizRequestDTO;
import com.example.spot.schedule.presentation.dto.response.ScheduleResponseDTO;
import com.example.spot.schedule.presentation.dto.response.StudyQuizResponseDTO;
import com.example.spot.schedule.presentation.dto.response.QuizResponseDTO;

import java.time.LocalDate;

Expand All @@ -16,11 +16,11 @@ public interface ScheduleCommandService {
ScheduleResponseDTO.ScheduleDTO modSchedule(Long studyId, Long scheduleId, ScheduleRequestDTO.ScheduleDTO scheduleModDTO);

// 스터디 퀴즈 생성
StudyQuizResponseDTO.QuizDTO createAttendanceQuiz(Long studyId, Long scheduleId, StudyQuizRequestDTO.QuizDTO quizRequestDTO);
QuizResponseDTO.QuestionDTO createAttendanceQuiz(Long studyId, Long scheduleId, QuizRequestDTO.QuizDTO quizRequestDTO);

// 스터디 출석
StudyQuizResponseDTO.AttendanceDTO attendantStudy(Long studyId, Long scheduleId, StudyQuizRequestDTO.AttendanceDTO attendanceRequestDTO);
QuizResponseDTO.AttendanceDTO attendantStudy(Long studyId, Long scheduleId, QuizRequestDTO.AttendanceDTO attendanceRequestDTO);

// 스터디 퀴즈 삭제
StudyQuizResponseDTO.QuizDTO deleteAttendanceQuiz(Long studyId, Long scheduleId, LocalDate date);
QuizResponseDTO.QuestionDTO deleteAttendanceQuiz(Long studyId, Long scheduleId, LocalDate date);
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@
import com.example.spot.study.domain.enums.StudyApplicationStatus;
import com.example.spot.study.domain.repository.StudyMemberRepository;
import com.example.spot.schedule.presentation.dto.request.ScheduleRequestDTO;
import com.example.spot.schedule.presentation.dto.request.StudyQuizRequestDTO;
import com.example.spot.schedule.presentation.dto.request.QuizRequestDTO;
import com.example.spot.schedule.presentation.dto.response.ScheduleResponseDTO;
import com.example.spot.schedule.presentation.dto.response.StudyQuizResponseDTO;
import com.example.spot.schedule.presentation.dto.response.QuizResponseDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand Down Expand Up @@ -204,7 +204,7 @@ private static void checkStartAndFinishDate(ScheduleRequestDTO.ScheduleDTO sched
* @return 생성된 퀴즈의 아이디와 질문이 반환됩니다.
*/
@Override
public StudyQuizResponseDTO.QuizDTO createAttendanceQuiz(Long studyId, Long scheduleId, StudyQuizRequestDTO.QuizDTO quizRequestDTO) {
public QuizResponseDTO.QuestionDTO createAttendanceQuiz(Long studyId, Long scheduleId, QuizRequestDTO.QuizDTO quizRequestDTO) {

//=== Exception ===//
Long memberId = SecurityUtils.getCurrentUserId();
Expand Down Expand Up @@ -247,7 +247,7 @@ public StudyQuizResponseDTO.QuizDTO createAttendanceQuiz(Long studyId, Long sche
schedule.addQuiz(quiz);
member.addQuiz(quiz);

return StudyQuizResponseDTO.QuizDTO.toDTO(quiz);
return QuizResponseDTO.QuestionDTO.toDTO(quiz);
}

/**
Expand All @@ -259,7 +259,7 @@ public StudyQuizResponseDTO.QuizDTO createAttendanceQuiz(Long studyId, Long sche
* @return 회원 아이디, 퀴즈 아이디, 출석 아이디, 정답 여부, 시도 횟수, 출석 정보 생성 시각을 반환합니다.
*/
@Override
public StudyQuizResponseDTO.AttendanceDTO attendantStudy(Long studyId, Long scheduleId, StudyQuizRequestDTO.AttendanceDTO attendanceRequestDTO) {
public QuizResponseDTO.AttendanceDTO attendantStudy(Long studyId, Long scheduleId, QuizRequestDTO.AttendanceDTO attendanceRequestDTO) {

//=== Exception ===//
Long memberId = SecurityUtils.getCurrentUserId();
Expand Down Expand Up @@ -314,7 +314,7 @@ public StudyQuizResponseDTO.AttendanceDTO attendantStudy(Long studyId, Long sche
quiz.addMemberAttendance(quizSubmission);
quizSubmission = quizSubmissionRepository.save(quizSubmission);

return StudyQuizResponseDTO.AttendanceDTO.toDTO(quizSubmission, try_num+1);
return QuizResponseDTO.AttendanceDTO.toDTO(quizSubmission, try_num+1);
}

/**
Expand All @@ -326,7 +326,7 @@ public StudyQuizResponseDTO.AttendanceDTO attendantStudy(Long studyId, Long sche
* @return 삭제된 퀴즈의 아이디와 질문을 반환합니다.
*/
@Override
public StudyQuizResponseDTO.QuizDTO deleteAttendanceQuiz(Long studyId, Long scheduleId, LocalDate date) {
public QuizResponseDTO.QuestionDTO deleteAttendanceQuiz(Long studyId, Long scheduleId, LocalDate date) {

//=== Exception ===//
Long memberId = SecurityUtils.getCurrentUserId();
Expand Down Expand Up @@ -362,7 +362,7 @@ public StudyQuizResponseDTO.QuizDTO deleteAttendanceQuiz(Long studyId, Long sche
});
quizRepository.delete(quiz);

return StudyQuizResponseDTO.QuizDTO.toDTO(quiz);
return QuizResponseDTO.QuestionDTO.toDTO(quiz);
}


Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.example.spot.schedule.application;

import com.example.spot.schedule.presentation.dto.response.ScheduleResponseDTO;
import com.example.spot.schedule.presentation.dto.response.StudyQuizResponseDTO;
import com.example.spot.schedule.presentation.dto.response.StudyScheduleResponseDTO;
import com.example.spot.schedule.presentation.dto.response.QuizResponseDTO;
import org.springframework.data.domain.Pageable;

import java.time.LocalDate;
Expand All @@ -16,11 +15,11 @@ public interface ScheduleQueryService {
ScheduleResponseDTO.MonthlyScheduleDTO getSchedule(Long studyId, Long scheduleId);

// 다가오는 모임 일정 조회하기
StudyScheduleResponseDTO findStudySchedule(Long studyId, Pageable pageable);
ScheduleResponseDTO.SchedulePageDTO findStudySchedule(Long studyId, Pageable pageable);

// 금일 회원 출석 여부 조회하기
StudyQuizResponseDTO.AttendanceListDTO getAllAttendances(Long studyId, Long scheduleId, LocalDate date);
QuizResponseDTO.AttendanceListDTO getAllAttendances(Long studyId, Long scheduleId, LocalDate date);

// 스터디 출석퀴즈 조회하기
StudyQuizResponseDTO.QuizDTO getAttendanceQuiz(Long studyId, Long scheduleId, LocalDate date);
QuizResponseDTO.QuestionDTO getAttendanceQuiz(Long studyId, Long scheduleId, LocalDate date);
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,12 @@
import com.example.spot.schedule.domain.enums.SchedulePeriod;
import com.example.spot.schedule.domain.repository.QuizRepository;
import com.example.spot.schedule.domain.repository.QuizSubmissionRepository;
import com.example.spot.schedule.presentation.dto.response.StudyScheduleResponseDTO;
import com.example.spot.study.domain.Study;
import com.example.spot.study.domain.StudyRepository;
import com.example.spot.study.domain.enums.StudyApplicationStatus;
import com.example.spot.study.domain.repository.StudyMemberRepository;
import com.example.spot.schedule.presentation.dto.response.ScheduleResponseDTO;
import com.example.spot.schedule.presentation.dto.response.StudyQuizResponseDTO;
import com.example.spot.schedule.presentation.dto.response.QuizResponseDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
Expand Down Expand Up @@ -129,7 +128,7 @@ public ScheduleResponseDTO.MonthlyScheduleDTO getSchedule(Long studyId, Long sch
* @throws GeneralException 스터디 멤버가 아닌 경우
*/
@Override
public StudyScheduleResponseDTO findStudySchedule(Long studyId, Pageable pageable) {
public ScheduleResponseDTO.SchedulePageDTO findStudySchedule(Long studyId, Pageable pageable) {

// 로그인한 회원이 해당 스터디 회원인지 확인
if (!isMember(SecurityUtils.getCurrentUserId(), studyId))
Expand All @@ -143,15 +142,15 @@ public StudyScheduleResponseDTO findStudySchedule(Long studyId, Pageable pageabl
throw new GeneralException(ErrorStatus._STUDY_SCHEDULE_NOT_FOUND);

// DTO로 변환하여 반환
List<StudyScheduleResponseDTO.StudyScheduleDTO> scheduleDTOS = schedules.stream().map(schedule -> StudyScheduleResponseDTO.StudyScheduleDTO.builder()
List<ScheduleResponseDTO.SchedulePreviewDTO> scheduleDTOS = schedules.stream().map(schedule -> ScheduleResponseDTO.SchedulePreviewDTO.builder()
.title(schedule.getTitle())
.location(schedule.getLocation())
.startedAt(schedule.getStartedAt())
.finishedAt(schedule.getFinishedAt())
.build()).toList();

// 페이징 처리
return new StudyScheduleResponseDTO(new PageImpl<>(scheduleDTOS, pageable, schedules.size()), scheduleDTOS, schedules.size());
return new ScheduleResponseDTO.SchedulePageDTO(new PageImpl<>(scheduleDTOS, pageable, schedules.size()), scheduleDTOS, schedules.size());
}

/**
Expand Down Expand Up @@ -233,7 +232,7 @@ private void addPeriodSchedules(Schedule schedule, int year, int month, List<Sch
* @return 모든 스터디 회원에 대한 정보와 출석 여부를 담은 리스트를 반환합니다.
*/
@Override
public StudyQuizResponseDTO.AttendanceListDTO getAllAttendances(Long studyId, Long scheduleId, LocalDate date) {
public QuizResponseDTO.AttendanceListDTO getAllAttendances(Long studyId, Long scheduleId, LocalDate date) {

//=== Exception ===//
Long memberId = SecurityUtils.getCurrentUserId();
Expand All @@ -258,25 +257,25 @@ public StudyQuizResponseDTO.AttendanceListDTO getAllAttendances(Long studyId, Lo
.orElseThrow(() -> new StudyHandler(ErrorStatus._STUDY_MEMBER_NOT_FOUND));

//=== Feature ===//
List<StudyQuizResponseDTO.StudyMemberDTO> studyMembers = studyMemberRepository.findAllByStudyIdAndStatus(studyId, StudyApplicationStatus.APPROVED).stream()
List<QuizResponseDTO.AttendingMemberDTO> studyMembers = studyMemberRepository.findAllByStudyIdAndStatus(studyId, StudyApplicationStatus.APPROVED).stream()
.map(memberStudy -> {
List<QuizSubmission> attendanceList = quizSubmissionRepository.findByQuizIdAndMemberId(quiz.getId(), memberStudy.getMember().getId());
for (QuizSubmission attendance : attendanceList) {
// MemberAttendance에 퀴즈에 대한 정답이 저장되어 있으면 금일 출석 성공
if (attendance.getIsCorrect())
return StudyQuizResponseDTO.StudyMemberDTO.toDTO(memberStudy, Boolean.TRUE);
return QuizResponseDTO.AttendingMemberDTO.toDTO(memberStudy, Boolean.TRUE);
}
// 퀴즈를 풀지 않았거나 MemberAttendance에 오답만 저장되어 있으면 금일 출석 실패
return StudyQuizResponseDTO.StudyMemberDTO.toDTO(memberStudy, Boolean.FALSE);
return QuizResponseDTO.AttendingMemberDTO.toDTO(memberStudy, Boolean.FALSE);
})
.toList();

return StudyQuizResponseDTO.AttendanceListDTO.toDTO(quiz, studyMembers);
return QuizResponseDTO.AttendanceListDTO.toDTO(quiz, studyMembers);

}

@Override
public StudyQuizResponseDTO.QuizDTO getAttendanceQuiz(Long studyId, Long scheduleId, LocalDate date) {
public QuizResponseDTO.QuestionDTO getAttendanceQuiz(Long studyId, Long scheduleId, LocalDate date) {

// Authorization
Long memberId = SecurityUtils.getCurrentUserId();
Expand Down Expand Up @@ -307,7 +306,7 @@ public StudyQuizResponseDTO.QuizDTO getAttendanceQuiz(Long studyId, Long schedul
}
Quiz quiz = todayQuizzes.get(0);

return StudyQuizResponseDTO.QuizDTO.toDTO(quiz);
return QuizResponseDTO.QuestionDTO.toDTO(quiz);
}


Expand Down
Loading