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 @@ -27,4 +27,10 @@ public ResponseEntity<ApiResponse<HomeResponseDto>> getHomeScreenData(
HomeResponseDto response = homeService.getHomeScreenData(user.getId());
return ResponseEntity.ok(ApiResponse.success(response));
}

@GetMapping("/panel")
public ApiResponse<PannelResponseDTO> getPannelData(@AuthenticationPrincipal User user) {
PannelResponseDTO responseDTO = homeService.getPannelData(user);
return ApiResponse.success(responseDTO);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.cp_main_be.domain.home;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PannelResponseDTO {
private boolean isDairyCompleted;
private boolean isCheckingCompleted;
private boolean isQuizCompleted;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,17 @@

import com.example.cp_main_be.domain.garden.garden.domain.repository.GardenRepository;
import com.example.cp_main_be.domain.home.HomeResponseDto;
import com.example.cp_main_be.domain.home.PannelResponseDTO;
import com.example.cp_main_be.domain.member.notification.domain.repository.NotificationRepository;
import com.example.cp_main_be.domain.member.user.domain.User;
import com.example.cp_main_be.domain.member.user.domain.repository.UserRepository;
import com.example.cp_main_be.domain.mission.diary.domain.Diary;
import com.example.cp_main_be.domain.mission.diary.domain.repository.DiaryRepository;
import com.example.cp_main_be.domain.mission.diary.service.DiaryService;
import com.example.cp_main_be.domain.mission.user_daily_mission.domain.UserDailyMission;
import com.example.cp_main_be.domain.mission.user_daily_mission.domain.repository.UserDailyMissionRepository;
import com.example.cp_main_be.domain.realquiz.UserQuiz;
import com.example.cp_main_be.domain.realquiz.repository.UserQuizRepository;
import com.example.cp_main_be.global.common.CustomApiException;
import com.example.cp_main_be.global.common.ErrorCode;
import java.time.LocalDate;
Expand All @@ -30,6 +36,9 @@ public class HomeService {
private final GardenRepository gardenRepository;
private final UserDailyMissionRepository userDailyMissionRepository;
private final NotificationRepository notificationRepository;
private final DiaryRepository diaryRepository;
private final DiaryService diaryService;
private final UserQuizRepository userQuizRepository;

// GardenService에서 가져오거나, 공통 유틸리티로 분리하면 더 좋습니다.
private LocalDateTime getStartOfCurrentWateringDay() {
Expand Down Expand Up @@ -149,4 +158,27 @@ private List<Boolean> createWeeklyMissionStatus(Long userId) {
.map(completedDates::contains)
.collect(Collectors.toList());
}

public PannelResponseDTO getPannelData(User user) {
boolean isDiaryCompleted = false;
boolean isQuizCompleted = false;
boolean isCheckingCompleted = false;
LocalDateTime startOfDay = LocalDate.now().atStartOfDay();
LocalDateTime endOfDay = LocalDate.now().atTime(23, 59, 59);

Diary diary = diaryService.findMyDiaries(user).get(0);
if (diary.getCreatedAt().isAfter(LocalDate.now().atStartOfDay())) {
isDiaryCompleted = true;
}
UserQuiz userQuiz =
userQuizRepository.findAllTodayUserQuizByUser(user, startOfDay, endOfDay).get(0);
if (userQuiz != null && userQuiz.getIsCompleted()) { // 오늘의 퀴즈 성공시
isQuizCompleted = true;
}
return PannelResponseDTO.builder()
.isDairyCompleted(isDiaryCompleted)
.isQuizCompleted(isQuizCompleted)
.isCheckingCompleted(isCheckingCompleted)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,5 @@

public enum QuizType {
OX,
MULTI_CHOICE,
CHOICE_WITH_PICTURE;
MULTI_CHOICE
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@

import com.example.cp_main_be.domain.member.user.domain.User;
import com.example.cp_main_be.domain.mission.daily_mission_master.dto.response.DailyMissionResponseDTO;
import com.example.cp_main_be.domain.mission.quiz.dto.CompletedQuizResponseDTO;
import com.example.cp_main_be.domain.mission.quiz.dto.QuizRequestDTO;
import com.example.cp_main_be.domain.mission.quiz.dto.QuizResponseDTO;
import com.example.cp_main_be.domain.mission.quiz.enums.QuizType;
import com.example.cp_main_be.domain.mission.quiz.service.QuizService;
import com.example.cp_main_be.domain.mission.user_daily_mission.dto.MissionPanelResponse;
import com.example.cp_main_be.domain.mission.user_daily_mission.service.UserDailyMissionService;
Expand Down Expand Up @@ -54,23 +50,24 @@ public ResponseEntity<ApiResponse<Void>> completeDailyMission(
return ResponseEntity.ok(ApiResponse.success(null));
}

@GetMapping("/quiz/{userDailyMissionId}")
@Operation(summary = "퀴즈 문제 조회 API")
public ResponseEntity<ApiResponse<QuizResponseDTO>> getQuiz(
@PathVariable(name = "userDailyMissionId") Long userDailyMissionId) {

QuizResponseDTO result = quizService.getQuiz(userDailyMissionId);
return ResponseEntity.ok(ApiResponse.success(result));
}

@GetMapping("/quiz/")
@Operation(summary = "퀴즈 타입에 맞는 퀴즈 문제 랜덤 조회 API")
public ResponseEntity<ApiResponse<QuizResponseDTO>> getQuizByQuizType(
@RequestParam QuizType quizType) {
//
// @GetMapping("/quiz/{userDailyMissionId}")
// @Operation(summary = "퀴즈 문제 조회 API")
// public ResponseEntity<ApiResponse<QuizResponseDTO>> getQuiz(
// @PathVariable(name = "userDailyMissionId") Long userDailyMissionId) {
//
// QuizResponseDTO result = quizService.getQuiz(userDailyMissionId);
// return ResponseEntity.ok(ApiResponse.success(result));
// }

QuizResponseDTO result = quizService.getQuizByType(quizType);
return ResponseEntity.ok(ApiResponse.success(result));
}
// @GetMapping("/quiz/")
// @Operation(summary = "퀴즈 타입에 맞는 퀴즈 문제 랜덤 조회 API")
// public ResponseEntity<ApiResponse<QuizResponseDTO>> getQuizByQuizType(
// @RequestParam QuizType quizType) {
//
// QuizResponseDTO result = quizService.getQuizByType(quizType);
// return ResponseEntity.ok(ApiResponse.success(result));
// }

// // 새로운 엔드포인트 - 완료된 퀴즈 결과 조회
// @GetMapping("/quiz/{userDailyMissionId}/result")
Expand All @@ -93,12 +90,12 @@ public ResponseEntity<ApiResponse<String>> uploadPictureForMission(
return ResponseEntity.ok(ApiResponse.success(imageUrl));
}

@PostMapping("/quiz/{userDailyMissionId}/answer")
@Operation(summary = "퀴즈 답변 제출 API")
public ResponseEntity<ApiResponse<CompletedQuizResponseDTO>> summitAnswerToQuiz(
@PathVariable(name = "userDailyMissionId") Long userDailyMissionId,
@RequestBody QuizRequestDTO request) {
CompletedQuizResponseDTO result = quizService.summitQuizAnswer(request, userDailyMissionId);
return ResponseEntity.ok(ApiResponse.success(result));
}
// @PostMapping("/quiz/{userDailyMissionId}/answer")
// @Operation(summary = "퀴즈 답변 제출 API")
// public ResponseEntity<ApiResponse<CompletedQuizResponseDTO>> summitAnswerToQuiz(
// @PathVariable(name = "userDailyMissionId") Long userDailyMissionId,
// @RequestBody QuizRequestDTO request) {
// CompletedQuizResponseDTO result = quizService.summitQuizAnswer(request, userDailyMissionId);
// return ResponseEntity.ok(ApiResponse.success(result));
// }
}
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ public MissionPanelResponse getMissionPanelData(Long userId) {
.isCompleted(mission.isCompleted())
.build())
.collect(Collectors.toList());

Integer count = 0;
for (MissionPanelResponse.DailyMissionStatusDto mission : missionDtos) {
if (mission.isCompleted()) count++;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,5 @@ public class RealQuiz {
@Column(name = "reward_point")
private Long rewardPoints;

@Column private Boolean isCompleted;

@Column @CreationTimestamp private LocalDateTime createdAt;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import com.example.cp_main_be.domain.member.user.domain.User;
import jakarta.persistence.*;
import java.time.LocalDateTime;
import lombok.*;
import org.hibernate.annotations.CreationTimestamp;

@Entity
@Getter
Expand All @@ -22,4 +24,8 @@ public class UserQuiz {
@JoinColumn(name = "real_quiz_id")
@ManyToOne(fetch = FetchType.LAZY)
private RealQuiz realQuiz;

@Column @Builder.Default private Boolean isCompleted = false;

@Column @CreationTimestamp private LocalDateTime createdAt;
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,11 @@ public ApiResponse<RealQuizResponseDTO> getRealQuiz(
@PostMapping("/{quizId}/answer")
@Operation(summary = "퀴즈 정답 제출 API")
public ApiResponse<RealQuizAnswerResponseDTO> getRealQuizAnswer(
@PathVariable Long quizId, @RequestBody RealQuizAnswerRequestDTO requestDTO) {
RealQuizAnswerResponseDTO responseDTO = realQuizService.getRealQuizAnswer(quizId, requestDTO);
@PathVariable Long quizId,
@RequestBody RealQuizAnswerRequestDTO requestDTO,
@AuthenticationPrincipal User user) {
RealQuizAnswerResponseDTO responseDTO =
realQuizService.getRealQuizAnswer(quizId, requestDTO, user);
return ApiResponse.success(responseDTO);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,22 @@

import com.example.cp_main_be.domain.member.user.domain.User;
import com.example.cp_main_be.domain.realquiz.UserQuiz;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface UserQuizRepository extends JpaRepository<UserQuiz, Long> {
Optional<UserQuiz> findByUser(User user);

@Query(
"SELECT uq FROM UserQuiz uq "
+ "WHERE uq.user = :user "
+ "AND uq.createdAt BETWEEN :startDate AND :endDate")
List<UserQuiz> findAllTodayUserQuizByUser(
@Param("user") User user,
@Param("startDate") LocalDateTime startDate,
@Param("endDate") LocalDateTime endDate);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import com.example.cp_main_be.domain.realquiz.repository.UserQuizRepository;
import com.example.cp_main_be.global.exception.QuizNotFoundException;
import com.example.cp_main_be.global.exception.UserNotFoundException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Random;
import lombok.RequiredArgsConstructor;
Expand All @@ -36,7 +38,6 @@ public RealQuizResponseDTO createRealQuiz(RealQuizCreateRequestDTO requestDTO) {
// 퀴즈 생성
RealQuiz realQuiz =
RealQuiz.builder()
.isCompleted(false)
.quizQuestion(requestDTO.getQuizQuestion())
.quizType(requestDTO.getQuizType())
.answerDescription(requestDTO.getAnswerDescription())
Expand All @@ -62,7 +63,6 @@ public RealQuizResponseDTO createRealQuiz(RealQuizCreateRequestDTO requestDTO) {
List<RealQuizResponseDTO.RealQuizOptionResponseDTO> result =
transformToRealQuizOptionResponseDTO(realQuizOptionList);
return RealQuizResponseDTO.builder()
.isCompleted(realQuiz.getIsCompleted())
.quizId(realQuiz.getId())
.quizQuestion(realQuiz.getQuizQuestion())
.quizType(realQuiz.getQuizType())
Expand All @@ -83,7 +83,7 @@ public UserQuizCreateResponseDTO createUserQuiz(Long userId, Long realQuizId) {
.findById(realQuizId)
.orElseThrow(() -> new RuntimeException("퀴즈를 찾을 수 없습니다"));

UserQuiz userQuiz = UserQuiz.builder().realQuiz(realQuiz).user(user).build();
UserQuiz userQuiz = UserQuiz.builder().realQuiz(realQuiz).user(user).isCompleted(false).build();
UserQuiz savedUserQuiz = userQuizRepository.save(userQuiz);

return UserQuizCreateResponseDTO.builder()
Expand All @@ -97,7 +97,10 @@ public UserQuizCreateResponseDTO createUserQuiz(Long userId, Long realQuizId) {

public RealQuizResponseDTO getRealQuiz(User user, QuizType quizType) {

UserQuiz userQuiz = userQuizRepository.findByUser(user).orElse(null);
LocalDateTime startOfDay = LocalDate.now().atStartOfDay();
LocalDateTime endOfDay = LocalDate.now().atTime(23, 59, 59);
UserQuiz userQuiz =
userQuizRepository.findAllTodayUserQuizByUser(user, startOfDay, endOfDay).get(0);

// 퀴즈가 할당되지 않은 경우
if (userQuiz == null) {
Expand All @@ -108,7 +111,7 @@ public RealQuizResponseDTO getRealQuiz(User user, QuizType quizType) {
RealQuiz realQuiz = realQuizList.get(rand);

// 할당한다.
userQuiz = UserQuiz.builder().realQuiz(realQuiz).user(user).build();
userQuiz = UserQuiz.builder().realQuiz(realQuiz).user(user).isCompleted(false).build();
userQuizRepository.save(userQuiz);

return transformToRealQuizResponseDTO(realQuiz);
Expand All @@ -125,15 +128,17 @@ public RealQuizResponseDTO getRealQuiz(User user, QuizType quizType) {
}

public RealQuizAnswerResponseDTO getRealQuizAnswer(
Long quizId, RealQuizAnswerRequestDTO requestDTO) {
Long quizId, RealQuizAnswerRequestDTO requestDTO, User user) {
RealQuiz realQuiz =
realQuizRepostitory
.findById(quizId)
.orElseThrow(() -> new QuizNotFoundException("퀴즈를 찾을 수 없습니다."));

List<RealQuizOption> realQuizOptionList = realQuizOptionRepository.findAllByRealQuiz(realQuiz);

realQuiz.setIsCompleted(true);
UserQuiz userQuiz =
userQuizRepository
.findByUser(user)
.orElseThrow(() -> new RuntimeException("할당 된 퀴즈가 없습니다."));
userQuiz.setIsCompleted(true);

return RealQuizAnswerResponseDTO.builder()
.answerDescription(realQuiz.getAnswerDescription())
Expand All @@ -158,7 +163,6 @@ private RealQuizResponseDTO transformToRealQuizResponseDTO(RealQuiz realQuiz) {
.quizQuestion(realQuiz.getQuizQuestion())
.answerDescription(realQuiz.getAnswerDescription())
.quizOptions(result)
.isCompleted(realQuiz.getIsCompleted())
.build();
}

Expand Down