Skip to content

Commit

Permalink
feat: 어드민 전체 스터디 조회 V2 API 구현 (#875)
Browse files Browse the repository at this point in the history
* feat: 학생 / 관리자 페이지 별 스터디 DTO 추가

* feat: 스터디 애그리거트 페치 조인해서 조회하는 로직 추가

* feat: DTO 정적 팩토리 추가

* feat: 전체 스터디 조회 어드민 API 추가

* refactor: V2 네이밍 제거
  • Loading branch information
uwoobeat authored Feb 9, 2025
1 parent efe4a8f commit 246d20d
Show file tree
Hide file tree
Showing 12 changed files with 178 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@

import com.gdschongik.gdsc.domain.studyv2.application.AdminStudyServiceV2;
import com.gdschongik.gdsc.domain.studyv2.dto.request.StudyCreateRequest;
import com.gdschongik.gdsc.domain.studyv2.dto.response.StudyManagerResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand All @@ -26,4 +29,11 @@ public ResponseEntity<Void> createStudy(@Valid @RequestBody StudyCreateRequest r
adminStudyServiceV2.createStudy(request);
return ResponseEntity.ok().build();
}

@Operation(summary = "전체 스터디 조회", description = "모든 스터디를 조회합니다. 코어멤버만 접근 가능합니다.")
@GetMapping
public ResponseEntity<List<StudyManagerResponse>> getStudies() {
var response = adminStudyServiceV2.getAllStudies();
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
import com.gdschongik.gdsc.domain.studyv2.domain.StudyFactory;
import com.gdschongik.gdsc.domain.studyv2.domain.StudyV2;
import com.gdschongik.gdsc.domain.studyv2.dto.request.StudyCreateRequest;
import com.gdschongik.gdsc.domain.studyv2.dto.response.StudyManagerResponse;
import com.gdschongik.gdsc.global.exception.CustomException;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -53,4 +55,11 @@ public void createStudy(StudyCreateRequest request) {

log.info("[AdminStudyService] 스터디 생성 완료: studyId = {}", study.getId());
}

@Transactional(readOnly = true)
public List<StudyManagerResponse> getAllStudies() {
return studyV2Repository.findFetchAll().stream()
.map(StudyManagerResponse::from)
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package com.gdschongik.gdsc.domain.studyv2.dao;

import com.gdschongik.gdsc.domain.studyv2.domain.StudyV2;
import java.util.List;
import java.util.Optional;

public interface StudyV2CustomRepository {
Optional<StudyV2> findFetchById(Long id);

List<StudyV2> findFetchAll();
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import com.gdschongik.gdsc.domain.studyv2.domain.StudyV2;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor;

Expand All @@ -21,4 +22,13 @@ public Optional<StudyV2> findFetchById(Long id) {
.where(studyV2.id.eq(id))
.fetchOne());
}

@Override
public List<StudyV2> findFetchAll() {
return queryFactory
.selectFrom(studyV2)
.join(studyV2.studySessions)
.fetchJoin()
.fetch();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public class StudySessionV2 extends BaseEntity {

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "study_v2_id")
private StudyV2 studyV2;
private StudyV2 study;

/**
* 모든 스터디회차는 인자로 전달되는 스터디 애그리거트 루트 엔티티에 종속됩니다.
Expand All @@ -80,27 +80,27 @@ private StudySessionV2(
Period lessonPeriod,
String assignmentDescriptionLink,
Period assignmentPeriod,
StudyV2 studyV2) {
StudyV2 study) {
this.position = position;
this.title = title;
this.description = description;
this.lessonAttendanceNumber = lessonAttendanceNumber;
this.lessonPeriod = lessonPeriod;
this.assignmentDescriptionLink = assignmentDescriptionLink;
this.assignmentPeriod = assignmentPeriod;
this.studyV2 = studyV2;
studyV2.getStudySessions().add(this);
this.study = study;
study.getStudySessions().add(this);
}

public static void createEmptyForLive(Integer position, String lessonAttendanceNumber, StudyV2 studyV2) {
public static void createEmptyForLive(Integer position, String lessonAttendanceNumber, StudyV2 study) {
StudySessionV2.builder()
.position(position)
.lessonAttendanceNumber(lessonAttendanceNumber)
.studyV2(studyV2)
.study(study)
.build();
}

public static void createEmptyForAssignment(Integer position, StudyV2 studyV2) {
StudySessionV2.builder().position(position).studyV2(studyV2).build();
public static void createEmptyForAssignment(Integer position, StudyV2 study) {
StudySessionV2.builder().position(position).study(study).build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public class StudyV2 extends BaseEntity {
@JoinColumn(name = "member_id")
private Member mentor;

@OneToMany(mappedBy = "studyV2", cascade = CascadeType.ALL, orphanRemoval = true)
@OneToMany(mappedBy = "study", cascade = CascadeType.ALL, orphanRemoval = true)
private List<StudySessionV2> studySessions = new ArrayList<>();

@Builder(access = AccessLevel.PRIVATE)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.gdschongik.gdsc.domain.studyv2.dto.dto;

import com.gdschongik.gdsc.domain.common.vo.Period;
import com.gdschongik.gdsc.domain.common.vo.Semester;
import com.gdschongik.gdsc.domain.study.domain.StudyType;
import com.gdschongik.gdsc.domain.studyv2.domain.StudyV2;
import java.time.DayOfWeek;
import java.time.LocalTime;

/**
* 스터디 관리자 DTO입니다. 디스코드 관련 ID가 포함되어 있습니다.
*/
public record StudyManagerDto(
Long studyId,
StudyType type,
String title,
String description,
String descriptionNotionLink,
Semester semester,
Integer totalRound,
DayOfWeek dayOfWeek,
LocalTime startTime,
LocalTime endTime,
Period applicationPeriod,
String discordChannelId,
String discordRoleId,
Long mentorId) {
public static StudyManagerDto from(StudyV2 study) {
return new StudyManagerDto(
study.getId(),
study.getType(),
study.getTitle(),
study.getDescription(),
study.getDescriptionNotionLink(),
study.getSemester(),
study.getTotalRound(),
study.getDayOfWeek(),
study.getStartTime(),
study.getEndTime(),
study.getApplicationPeriod(),
study.getDiscordChannelId(),
study.getDiscordRoleId(),
study.getMentor().getId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.gdschongik.gdsc.domain.studyv2.dto.dto;

import com.gdschongik.gdsc.domain.common.vo.Period;
import com.gdschongik.gdsc.domain.studyv2.domain.StudySessionV2;

/**
* 스터디 회차 관리자 DTO입니다. 출결번호가 포함되어 있습니다.
*/
public record StudySessionManagerDto(
Long studySessionId,
Integer position,
String title,
String description,
String lessonAttendanceNumber,
Period lessonPeriod,
String assignmentDescriptionLink,
Period assignmentPeriod,
Long studyId) {
public static StudySessionManagerDto from(StudySessionV2 studySession) {
return new StudySessionManagerDto(
studySession.getId(),
studySession.getPosition(),
studySession.getTitle(),
studySession.getDescription(),
studySession.getLessonAttendanceNumber(),
studySession.getLessonPeriod(),
studySession.getAssignmentDescriptionLink(),
studySession.getAssignmentPeriod(),
studySession.getStudy().getId());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.gdschongik.gdsc.domain.studyv2.dto.dto;

/**
* 스터디 회차 학생 DTO입니다. 출결번호가 포함되어 있지 않습니다.
*/
public record StudySessionStudentDto(
Long studySessionId,
Integer position,
String title,
String description,
String lessonAttendanceStatus,
String assignmentDescriptionLink,
String assignmentStatus,
Long studyId) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.gdschongik.gdsc.domain.studyv2.dto.dto;

import com.gdschongik.gdsc.domain.common.vo.Period;
import com.gdschongik.gdsc.domain.common.vo.Semester;
import com.gdschongik.gdsc.domain.study.domain.StudyType;
import java.time.DayOfWeek;
import java.time.LocalTime;

/**
* 스터디 학생 DTO입니다. 디스코드 관련 ID가 포함되어 있지 않습니다.
*/
public record StudyStudentDto(
Long studyId,
StudyType type,
String title,
String description,
String descriptionNotionLink,
Semester semester,
Integer totalRound,
DayOfWeek dayOfWeek,
LocalTime startTime,
LocalTime endTime,
Period applicationPeriod,
Long mentorId) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.gdschongik.gdsc.domain.studyv2.dto.response;

import com.gdschongik.gdsc.domain.studyv2.domain.StudyV2;
import com.gdschongik.gdsc.domain.studyv2.dto.dto.StudyManagerDto;
import com.gdschongik.gdsc.domain.studyv2.dto.dto.StudySessionManagerDto;
import java.util.List;

public record StudyManagerResponse(StudyManagerDto study, List<StudySessionManagerDto> studySessions) {
public static StudyManagerResponse from(StudyV2 study) {
return new StudyManagerResponse(
StudyManagerDto.from(study),
study.getStudySessions().stream()
.map(StudySessionManagerDto::from)
.toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.gdschongik.gdsc.domain.studyv2.dto.response;

import com.gdschongik.gdsc.domain.studyv2.dto.dto.StudySessionStudentDto;
import com.gdschongik.gdsc.domain.studyv2.dto.dto.StudyStudentDto;
import java.util.List;

public record StudyStudentResponse(StudyStudentDto study, List<StudySessionStudentDto> studySessions) {}

0 comments on commit 246d20d

Please sign in to comment.