Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 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
36 changes: 0 additions & 36 deletions src/main/java/com/back/domain/study/entity/StudyPlan.java

This file was deleted.

5 changes: 0 additions & 5 deletions src/main/java/com/back/domain/study/entity/StudyStatus.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.back.domain.study.plan.controller;

import com.back.domain.study.plan.dto.StudyPlanCreateRequest;
import com.back.domain.study.plan.dto.StudyPlanResponse;
import com.back.domain.study.plan.service.StudyPlanService;
import com.back.global.common.dto.RsData;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/plans")
public class StudyPlanController {
private final StudyPlanService studyPlanService;

@PostMapping
public ResponseEntity<RsData<StudyPlanResponse>> createStudyPlan(
// 로그인 유저 정보 받기 @AuthenticationPrincipal CustomUserDetails user,
@RequestBody StudyPlanCreateRequest request) {
//커스텀 디테일 구현 시 사용 int userId = user.getId();
Long userId = 1L; // 임시로 userId를 1로 설정
StudyPlanResponse response = studyPlanService.createStudyPlan(userId, request);
return ResponseEntity.ok(RsData.success("학습 계획이 성공적으로 생성되었습니다.", response));
}

@DeleteMapping("/{planId}")
public ResponseEntity<RsData<Void>> deleteStudyPlan(@PathVariable Long planId) {
//studyPlanService.deleteStudyPlan(planId);
return ResponseEntity.ok(RsData.success("학습 계획이 성공적으로 삭제되었습니다.", null));
}




}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.back.domain.study.plan.dto;

import com.back.domain.study.plan.entity.Color;
import com.back.domain.study.plan.entity.Frequency;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDateTime;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class StudyPlanCreateRequest {
private String subject;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime startDate;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime endDate;

private Color color;

// RepeatRule 중첩 객체
private RepeatRuleRequest repeatRule;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public static class RepeatRuleRequest {
private Frequency frequency;
private Integer intervalValue;
private String byDay; // "MON" 형태의 문자열

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private String untilDate; // "2025-12-31" 형태
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package com.back.domain.study.plan.dto;

import com.back.domain.study.plan.entity.Color;
import com.back.domain.study.plan.entity.Frequency;
import com.back.domain.study.plan.entity.StudyPlan;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class StudyPlanResponse {
private Long id;
private String subject;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime startDate;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime endDate;

private Color color;

private Long parentPlanId;
private List<StudyPlanResponse> childPlans;

// RepeatRule 정보
private RepeatRuleResponse repeatRule;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public static class RepeatRuleResponse {
private Frequency frequency;
private Integer repeatInterval;
private String byDay; // "MON" 형태의 문자열

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime until;

public RepeatRuleResponse(com.back.domain.study.plan.entity.RepeatRule repeatRule) {
if (repeatRule != null) {
this.frequency = repeatRule.getFrequency();
this.repeatInterval = repeatRule.getRepeatInterval();
this.byDay = repeatRule.getByDay();
this.until = repeatRule.getUntilDate();
}
}
}
//엔티티를 DTO로 변환하는 생성자
public StudyPlanResponse(StudyPlan studyPlan) {
if (studyPlan != null) {
this.id = studyPlan.getId();
this.subject = studyPlan.getSubject();
this.startDate = studyPlan.getStartDate();
this.endDate = studyPlan.getEndDate();
this.color = studyPlan.getColor();

// 부모 계획 ID 설정
if (studyPlan.getParentPlan() != null) {
this.parentPlanId = studyPlan.getParentPlan().getId();
}

// 자식 계획들 변환
if (studyPlan.getChildPlans() != null && !studyPlan.getChildPlans().isEmpty()) {
this.childPlans = studyPlan.getChildPlans().stream()
.map(StudyPlanResponse::new)
.collect(Collectors.toList());
}

// RepeatRule 변환
if (studyPlan.getRepeatRule() != null) {
this.repeatRule = new RepeatRuleResponse(studyPlan.getRepeatRule());
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.back.domain.study.entity;
package com.back.domain.study.plan.entity;

public enum Color {
RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE, PINK
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.back.domain.study.entity;
package com.back.domain.study.plan.entity;

public enum DayOfWeek {
MON, TUE, WED, THU, FRI, SAT, SUN
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.back.domain.study.entity;
package com.back.domain.study.plan.entity;

public enum Frequency {
DAILY, WEEKLY, MONTHLY
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,33 @@
package com.back.domain.study.entity;
package com.back.domain.study.plan.entity;

import com.back.global.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDateTime;

@Entity
@NoArgsConstructor
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class RepeatRule extends BaseEntity {
@OneToOne
@JoinColumn(name = "study_plan_id")
@JoinColumn(name = "study_plan_id", nullable = false)
private StudyPlan studyPlan;

@Enumerated(EnumType.STRING)
private Frequency frequency;

@Column(name = "interval_value", nullable = false)
private int RepeatInterval;

//필요 시 요일 지정
@Enumerated(EnumType.STRING)
private DayOfWeek byDay;
private String byDay;

private LocalDateTime until;
private LocalDateTime untilDate;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.back.domain.study.entity;
package com.back.domain.study.plan.entity;

//삭제 예정
public enum RepeatType {
NONE, DAILY, WEEKLY, MONTHLY
}
55 changes: 55 additions & 0 deletions src/main/java/com/back/domain/study/plan/entity/StudyPlan.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.back.domain.study.plan.entity;

import com.back.domain.study.record.entity.StudyRecord;
import com.back.domain.user.entity.User;
import com.back.global.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@NoArgsConstructor
@Getter
@Setter
public class StudyPlan extends BaseEntity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;

@Column(nullable = false, length = 100)
private String subject;


@Column(name = "start_date", nullable = false)
private LocalDateTime startDate;

@Column(name = "end_date", nullable = false)
private LocalDateTime endDate;

@Enumerated(EnumType.STRING)
private Color color;

// 부모 계획과의 연관관계
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_plan_id",
foreignKey = @ForeignKey(name = "fk_study_plan_parent"))
private StudyPlan parentPlan;

// 자식 계획들과 연관관계
@OneToMany(mappedBy = "parentPlan", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<StudyPlan> childPlans = new ArrayList<>();

@OneToOne(mappedBy = "studyPlan",cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private RepeatRule repeatRule;

@OneToMany(mappedBy = "todo", cascade = CascadeType.ALL, orphanRemoval = true)
private List<StudyRecord> studyRecords;

@OneToMany(mappedBy = "studyPlan", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<StudyPlanException> exceptions = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.back.domain.study.plan.entity;

import com.back.global.entity.BaseEntity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDateTime;

@Entity
@Table(name = "study_plan_exception")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
//이후 날짜 반복 계획 모두 삭제는 원본 엔티티의 untilDate를 수정해 구현
//단일 삭제 또는 단일, 이후 모두 수정은 이 엔티티로 구현
public class StudyPlanException extends BaseEntity {

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "study_plan_id", nullable = false)
private StudyPlan studyPlan;

// 예외가 발생한 날짜
@Column(name = "exception_date", nullable = false)
private LocalDateTime exceptionDate;

//예외 유형 (수정 / 삭제)
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private ExceptionType exceptionType;

// 적용 범위 (이 날짜만 / 이후 모든 날짜)
@Enumerated(EnumType.STRING)
@Column(name = "apply_scope")
private ApplyScope applyScope;

// 수정된 내용 (MODIFIED 타입인 경우)
@Column(name = "modified_subject")
private String modifiedSubject;

@Column(name = "modified_start_date")
private LocalDateTime modifiedStartDate;

@Column(name = "modified_end_date")
private LocalDateTime modifiedEndDate;

@Enumerated(EnumType.STRING)
@Column(name = "modified_color")
private Color modifiedColor;

public enum ExceptionType {
DELETED, // 해당 날짜 삭제
MODIFIED // 해당 날짜 수정
}

public enum ApplyScope {
THIS_ONLY, // 이 날짜만
FROM_THIS_DATE // 이 날짜부터 이후 모든 날짜
}
}
Loading
Loading