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
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
import com.cmc.mercury.domain.memo.dto.MemoUpdateRequest;
import com.cmc.mercury.domain.memo.entity.Memo;
import com.cmc.mercury.domain.memo.repository.MemoRepository;
import com.cmc.mercury.domain.mypage.entity.HabitHistory;
import com.cmc.mercury.domain.mypage.repository.HabitHistoryRepository;
import com.cmc.mercury.domain.mypage.service.MyPageService;
import com.cmc.mercury.domain.record.entity.Record;
import com.cmc.mercury.domain.record.entity.RecordDetail;
import com.cmc.mercury.domain.record.repository.RecordRepository;
Expand All @@ -17,6 +20,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;

@Service
Expand All @@ -30,7 +34,8 @@ public class MemoService {

private final MemoRepository memoRepository;
private final RecordRepository recordRepository;
private final UserService userService;
private final HabitHistoryRepository habitHistoryRepository;
private final MyPageService myPageService;

@Transactional
public MemoResponse createMemo(User user, Long recordId, MemoCreateRequest request) {
Expand Down Expand Up @@ -67,6 +72,12 @@ public MemoResponse createMemo(User user, Long recordId, MemoCreateRequest reque
// 사용자 경험치 업데이트
user.updateExp(user.getExp() + acquiredExp);

// 날짜별 습관쌓기 기록
LocalDate date = LocalDate.now();
HabitHistory history = myPageService.saveHabitHistoryIfNotExists(user.getId(), date, acquiredExp);
history.updateHasRecord();
habitHistoryRepository.save(history);

return MemoResponse.from(savedMemo, recordId);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.cmc.mercury.domain.mypage.controller;

import com.cmc.mercury.domain.mypage.dto.HabitDetailResponse;
import com.cmc.mercury.domain.mypage.dto.MyPageResponse;
import com.cmc.mercury.domain.mypage.service.MyPageService;
import com.cmc.mercury.domain.user.entity.User;
import com.cmc.mercury.global.oauth.annotation.AuthUser;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;

@RestController
@RequestMapping("/api/my-page")
@RequiredArgsConstructor
@Tag(name = "MyPageController", description = "마이페이지 관련 API")
public class MyPageController {

private final MyPageService myPageService;

@GetMapping("")
@Operation(summary = "마이페이지 조회", description = "마이페이지 메인 화면을 조회합니다.")
public ResponseEntity<MyPageResponse> getMyPage(@AuthUser User user) {
return ResponseEntity.ok(myPageService.getMyPage(user));
}

@GetMapping("/history")
@Operation(summary = "날짜별 습관쌓기 조회", description = "쿼리파라미터의 date 값은 YYYY-MM-DD 형식입니다.")
public ResponseEntity<HabitDetailResponse> getHabitDetail(
@AuthUser User user,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date) {
return ResponseEntity.ok(myPageService.getHabitDetail(user, date));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.cmc.mercury.domain.mypage.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;

@Schema(title = "날짜별 습관쌓기 응답 형식")
public record HabitDetailResponse(

@Schema(description = "날짜별 습관쌓기 ID")
Long habitHistoryID,
@Schema(description = "요일")
String day,
@Schema(description = "습관쌓기 연속 일수")
int streakCount,
@Schema(description = "획득한 경험치")
int acquiredExp,
@Schema(description = "독서기록 또는 메모 작성 여부")
boolean hasRecord,
@Schema(description = "타이머 완료 여부")
boolean hasTimer
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.cmc.mercury.domain.mypage.dto;

import io.swagger.v3.oas.annotations.media.Schema;

import java.util.List;

@Schema(title = "마이페이지 응답 형식")
public record MyPageResponse(

@Schema(description = "습관쌓기 ID")
Long habitID,
@Schema(description = "가입 기간")
int joinDays,
@Schema(description = "사용자 닉네임")
String nickname,
@Schema(description = "사용자 경험치")
int exp,
@Schema(description = "습관쌓기 연속 일수")
int streakDays,
@Schema(description = "최근 7일 streak 정보")
List<WeeklyStreakResponse> weeklyStreak
// @Schema(description = "가장 최근 독서기록 ID")
// Long latestRecordID
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.cmc.mercury.domain.mypage.dto;

import io.swagger.v3.oas.annotations.media.Schema;

@Schema(title = "요일별 성공 여부")
public record WeeklyStreakResponse(

@Schema(description = "요일")
String day,
@Schema(description = "성공 여부")
boolean isSuccess
) {

}
37 changes: 37 additions & 0 deletions src/main/java/com/cmc/mercury/domain/mypage/entity/Habit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.cmc.mercury.domain.mypage.entity;

import com.cmc.mercury.domain.user.entity.User;
import com.cmc.mercury.global.domain.BaseEntity;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Entity
@Getter
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
public class Habit extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "habit_id")
private Long id;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;

@Column(nullable = false)
private int streakDays;

@Builder
public Habit(User user, int streakDays) {
this.user = user;
this.streakDays = streakDays;
}

public void updateStreakDays(int streakDays) {
this.streakDays = streakDays;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.cmc.mercury.domain.mypage.entity;

import com.cmc.mercury.global.domain.BaseEntity;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Entity
@Getter
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
public class HabitHistory extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "habit_history_id")
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "habit_id")
private Habit habit;

@Column(nullable = false)
private boolean hasRecord = false;

@Column(nullable = false)
private boolean hasTimer = false;

@Column(nullable = false)
private int streakCount = 0;

@Column(nullable = false)
private int acquiredExp = 0;

@Builder
public HabitHistory(Habit habit, Integer streakCount, Integer acquiredExp, Boolean hasRecord, Boolean hasTimer) {
this.habit = habit;
this.streakCount = (streakCount != null) ? streakCount : 0;
this.acquiredExp = (acquiredExp != null) ? acquiredExp : 0;
this.hasRecord = (hasRecord != null) ? hasRecord : false;
this.hasTimer = (hasTimer != null) ? hasTimer : false;
}

public void updateHasRecord() {
this.hasRecord = true;
}

public void updateHasTimer() {
this.hasTimer = true;
}

public void updateAcquiredExp(int acquiredExp) {
this.acquiredExp += acquiredExp;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.cmc.mercury.domain.mypage.repository;

import com.cmc.mercury.domain.mypage.entity.HabitHistory;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

@Repository
public interface HabitHistoryRepository extends JpaRepository<HabitHistory, Long> {

// 해당 주간의 기록 조회
@Query("SELECT h FROM HabitHistory h WHERE h.habit.id = :habitId AND h.createdAt BETWEEN :startOfWeek AND :endOfWeek")
List<HabitHistory> findThisWeekByHabitId(
@Param("habitId") Long habitId,
@Param("startOfWeek") LocalDateTime startOfWeek, @Param("endOfWeek") LocalDateTime endOfWeek
);

// 날짜별 기록 조회
@Query("SELECT h FROM HabitHistory h WHERE h.habit.user.id = :userId AND h.createdAt BETWEEN :startOfDay AND :endOfDay")
Optional<HabitHistory> findByHabit_User_IdAndCreatedAt(
@Param("userId") Long userId,
@Param("startOfDay") LocalDateTime startOfDay, @Param("endOfDay") LocalDateTime endOfDay
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.cmc.mercury.domain.mypage.repository;

import com.cmc.mercury.domain.mypage.entity.Habit;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface HabitRepository extends JpaRepository<Habit, Long> {

Optional<Habit> findByUser_Id(Long userId);
}
Loading