Skip to content

Commit

Permalink
Feat : 퀘스트 목표 조회 구현 (#25)
Browse files Browse the repository at this point in the history
  • Loading branch information
chaen-ing committed Feb 5, 2025
1 parent 00f07a6 commit 4638629
Show file tree
Hide file tree
Showing 7 changed files with 89 additions and 1 deletion.
24 changes: 24 additions & 0 deletions src/main/java/com/ripple/BE/user/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,12 @@
import com.ripple.BE.user.domain.CustomUserDetails;
import com.ripple.BE.user.domain.type.Level;
import com.ripple.BE.user.dto.ProgressDTO;
import com.ripple.BE.user.dto.UserGoalDTO;
import com.ripple.BE.user.dto.UserInfoDTO;
import com.ripple.BE.user.dto.request.UpdateUserProfileRequest;
import com.ripple.BE.user.dto.request.UserGoalRequest;
import com.ripple.BE.user.dto.response.ProgressResponse;
import com.ripple.BE.user.dto.response.UserGoalResponse;
import com.ripple.BE.user.dto.response.UserInfoResponse;
import com.ripple.BE.user.service.MyPageService;
import com.ripple.BE.user.service.UserProgressService;
Expand Down Expand Up @@ -241,4 +244,25 @@ public ResponseEntity<ApiResponse<Object>> getUserInfo(
return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponse.from(UserInfoResponse.toUserInfoResponse(userInfo)));
}

@Operation(summary = "사용자 퀘스트 목표 조회", description = "로그인한 유저의 퀘스트 목표를 조회합니다.")
@GetMapping("/goal")
public ResponseEntity<ApiResponse<Object>> getUserGoal(
@AuthenticationPrincipal CustomUserDetails customUserDetails) {
UserGoalDTO userGoal = userService.getUserGoal(customUserDetails.getId());

return ResponseEntity.status(HttpStatus.OK)
.body(ApiResponse.from(UserGoalResponse.toUserGoalResponse(userGoal)));
}

@Operation(summary = "사용자 퀘스트 목표 수정", description = "로그인한 유저의 퀘스트 목표를 수정합니다. 목표는 1 이상이어야 합니다.")
@PostMapping("/goal")
public ResponseEntity<ApiResponse<?>> updateUserGoal(
@Valid @RequestBody UserGoalRequest userGoalRequest,
@AuthenticationPrincipal CustomUserDetails customUserDetails) {

userService.updateUserGoal(userGoalRequest, customUserDetails.getId());

return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.EMPTY_RESPONSE);
}
}
9 changes: 9 additions & 0 deletions src/main/java/com/ripple/BE/user/domain/UserGoal.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.ripple.BE.user.domain;

import com.ripple.BE.global.entity.BaseEntity;
import com.ripple.BE.user.dto.UserGoalDTO;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
Expand Down Expand Up @@ -33,6 +34,14 @@ public class UserGoal extends BaseEntity {
private User user;

private int quizGoal;

private int conceptGoal;

private int articleGoal;

public void updateQuizGoal(UserGoalDTO userGoalDTO) {
this.quizGoal = userGoalDTO.quizGoal();
this.conceptGoal = userGoalDTO.conceptGoal();
this.articleGoal = userGoalDTO.articleGoal();
}
}
11 changes: 11 additions & 0 deletions src/main/java/com/ripple/BE/user/dto/UserGoalDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.ripple.BE.user.dto;

import com.ripple.BE.user.dto.request.UserGoalRequest;

public record UserGoalDTO(int conceptGoal, int quizGoal, int articleGoal) {

public static UserGoalDTO toUserGoalDTO(UserGoalRequest userGoalRequest) {
return new UserGoalDTO(
userGoalRequest.conceptGoal(), userGoalRequest.quizGoal(), userGoalRequest.articleGoal());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.ripple.BE.user.dto.request;

import jakarta.validation.constraints.Min;

public record UserGoalRequest(
@Min(value = 1, message = "1 이상의 값을 입력해주세요.") int conceptGoal,
@Min(value = 1, message = "1 이상의 값을 입력해주세요.") int quizGoal,
@Min(value = 1, message = "1 이상의 값을 입력해주세요.") int articleGoal) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.ripple.BE.user.dto.response;

import com.ripple.BE.user.dto.UserGoalDTO;

public record UserGoalResponse(int conceptGoal, int quizGoal, int articleGoal) {
public static UserGoalResponse toUserGoalResponse(UserGoalDTO userGoalDTO) {
return new UserGoalResponse(
userGoalDTO.conceptGoal(), userGoalDTO.quizGoal(), userGoalDTO.articleGoal());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ public Long getCurrentStreak(Long id) {
.findByUserId(id)
.orElseThrow(() -> new UserException(ATTENDANCE_NOT_FOUND));

if (attendance.getLastAttendedDate().isBefore(LocalDate.now().minusDays(1))) {
if (attendance.getLastAttendedDate() != null
&& attendance.getLastAttendedDate().isBefore(LocalDate.now().minusDays(1))) {
attendance.updateCurrentStreak(1L);
}

Expand Down
25 changes: 25 additions & 0 deletions src/main/java/com/ripple/BE/user/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,15 @@
import com.ripple.BE.image.repository.ImageRepository;
import com.ripple.BE.learning.domain.quiz.FailQuiz;
import com.ripple.BE.user.domain.User;
import com.ripple.BE.user.domain.UserGoal;
import com.ripple.BE.user.domain.type.Level;
import com.ripple.BE.user.domain.type.LoginType;
import com.ripple.BE.user.dto.UserGoalDTO;
import com.ripple.BE.user.dto.UserInfoDTO;
import com.ripple.BE.user.dto.request.UpdateUserProfileRequest;
import com.ripple.BE.user.dto.request.UserGoalRequest;
import com.ripple.BE.user.exception.UserException;
import com.ripple.BE.user.repository.UserGoalRepository;
import com.ripple.BE.user.repository.UserRepository;
import java.util.Date;
import java.util.List;
Expand All @@ -33,6 +37,7 @@ public class UserService {
private final ImageRepository imageRepository;
private final AttendanceService attendanceService;

private final UserGoalRepository userGoalRepository;
private final PasswordEncoder passwordEncoder;

@Transactional
Expand Down Expand Up @@ -151,4 +156,24 @@ public UserInfoDTO getUserInfo(final long userId) {
.quizCorrectRate(quizCorrectRate)
.build();
}

public UserGoalDTO getUserGoal(final long userId) {
UserGoal userGoal =
userGoalRepository
.findByUserId(userId)
.orElseThrow(() -> new UserException(USER_GOAL_NOT_FOUND));

return new UserGoalDTO(
userGoal.getConceptGoal(), userGoal.getQuizGoal(), userGoal.getArticleGoal());
}

@Transactional
public void updateUserGoal(final UserGoalRequest userGoalRequest, final long userId) {
UserGoal userGoal =
userGoalRepository
.findByUserId(userId)
.orElseThrow(() -> new UserException(USER_GOAL_NOT_FOUND));

userGoal.updateQuizGoal(UserGoalDTO.toUserGoalDTO(userGoalRequest));
}
}

0 comments on commit 4638629

Please sign in to comment.