Skip to content
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
27 changes: 0 additions & 27 deletions src/main/java/com/back/domain/study/entity/RepeatRule.java

This file was deleted.

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,88 @@
package com.back.domain.study.plan.dto;

import com.back.domain.study.plan.entity.Color;
import com.back.domain.study.plan.entity.DayOfWeek;
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.Arrays;
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();
}
}

// 요일을 리스트로 접근 ("MON,TUE" -> [MON, TUE])
public List<DayOfWeek> getByDaysList() {
if (byDay == null || byDay.isEmpty()) {
return List.of();
}
return Arrays.stream(byDay.split(","))
.map(String::trim)
.map(com.back.domain.study.plan.entity.DayOfWeek::valueOf)
.collect(Collectors.toList());
}
}
//엔티티를 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();


// 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
34 changes: 34 additions & 0 deletions src/main/java/com/back/domain/study/plan/entity/RepeatRule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
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
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class RepeatRule extends BaseEntity {
@OneToOne
@JoinColumn(name = "plan_id", nullable = false)
private StudyPlan studyPlan;

@Enumerated(EnumType.STRING)
private Frequency frequency;

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

//필요 시 요일 지정. 여러 요일 지정 시 ,로 구분
//현재는 요일 하나만 지정하는 형태로 구현
@Column(name = "by_day")
private String byDay;

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
}
47 changes: 47 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,47 @@
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;


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

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

//반복 주기 설정 시 예외 리스트
@OneToMany(mappedBy = "studyPlan", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List<StudyPlanException> exceptions = new ArrayList<>();
}
Loading
Loading