Skip to content

Commit 180c084

Browse files
authored
Merge pull request #29 from ttakkeun/feat/22
[Feat] 사용자 포인트 조회 API 구현
2 parents 07ddfe2 + fc64875 commit 180c084

File tree

6 files changed

+125
-0
lines changed

6 files changed

+125
-0
lines changed

src/main/java/ttakkeun/ttakkeun_server/apiPayLoad/code/status/ErrorStatus.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public enum ErrorStatus implements BaseErrorCode {
1515
_BAD_REQUEST(HttpStatus.BAD_REQUEST, "COMMON400", "잘못된 요청입니다."),
1616
_UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "COMMON401", "인증이 필요합니다."),
1717
_FORBIDDEN(HttpStatus.FORBIDDEN, "COMMON403", "금지된 요청입니다."),
18+
_NOT_FOUND(HttpStatus.NOT_FOUND, "COMMON404", "요청한 리소스를 찾을 수 없습니다"),
1819

1920
//테스트 응답
2021
TEMP_EXCEPTION(HttpStatus.BAD_REQUEST, "TEMP4001", "this is test"),
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package ttakkeun.ttakkeun_server.controller;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.http.HttpStatus;
6+
import org.springframework.http.ResponseEntity;
7+
import org.springframework.web.bind.annotation.GetMapping;
8+
import org.springframework.web.bind.annotation.RequestMapping;
9+
import org.springframework.web.bind.annotation.RequestParam;
10+
import org.springframework.web.bind.annotation.RestController;
11+
import ttakkeun.ttakkeun_server.apiPayLoad.ApiResponse;
12+
import ttakkeun.ttakkeun_server.apiPayLoad.code.status.ErrorStatus;
13+
import ttakkeun.ttakkeun_server.apiPayLoad.code.status.SuccessStatus;
14+
import ttakkeun.ttakkeun_server.dto.GetMyPointResponseDTO;
15+
import ttakkeun.ttakkeun_server.service.DiagnoseService;
16+
17+
import java.util.NoSuchElementException;
18+
import java.util.Optional;
19+
20+
@RestController
21+
@RequiredArgsConstructor
22+
@RequestMapping("/api/diagnose")
23+
public class DiagnoseController {
24+
25+
@Autowired
26+
private DiagnoseService diagnoseService;
27+
28+
// memberId 임의로 입력받아서 조회하는 방식으로 구현함
29+
// 추후 액세스 토큰으로 멤버 아이디 받아와서 조회하는 방식으로 수정 예정
30+
@GetMapping("/point")
31+
public ResponseEntity<ApiResponse<GetMyPointResponseDTO>> getPointsByMember(@RequestParam("member-id") Long memberId) {
32+
try {
33+
Integer point = diagnoseService.getPointsByMember(memberId);
34+
ApiResponse<GetMyPointResponseDTO> response = ApiResponse.of(SuccessStatus._OK, new GetMyPointResponseDTO(point));
35+
return ResponseEntity.ok(response);
36+
} catch (NoSuchElementException e) {
37+
ApiResponse<GetMyPointResponseDTO> response = ApiResponse.ofFailure(ErrorStatus.MEMBER_NOT_FOUND, null);
38+
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
39+
} catch (Exception e) {
40+
ApiResponse<GetMyPointResponseDTO> response = ApiResponse.ofFailure(ErrorStatus._INTERNAL_SERVER_ERROR, null);
41+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
42+
}
43+
}
44+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package ttakkeun.ttakkeun_server.dto;
2+
3+
import lombok.Builder;
4+
5+
@Builder
6+
public record GetMyPointResponseDTO(Integer point) {
7+
8+
}

src/main/java/ttakkeun/ttakkeun_server/entity/Point.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22

33
import jakarta.persistence.*;
44
import lombok.*;
5+
import org.springframework.data.annotation.LastModifiedDate;
6+
7+
import java.time.LocalDateTime;
58

69
@Entity
710
@Getter
11+
@Setter // 포인트 조회 후 points와 updatedAt 값을 업데이트하는 부분이 있어 @Setter 어노테이션 추가함
812
@Builder
913
@NoArgsConstructor(access = AccessLevel.PROTECTED)
1014
@AllArgsConstructor
@@ -20,4 +24,8 @@ public class Point {
2024
@MapsId // 'memberId'를 'Member' 엔티티의 PK와 매핑
2125
@JoinColumn(name = "member_id")
2226
private Member member;
27+
28+
@LastModifiedDate
29+
@Column(name = "updated_at")
30+
private LocalDateTime updatedAt;
2331
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package ttakkeun.ttakkeun_server.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import ttakkeun.ttakkeun_server.entity.Point;
5+
6+
import java.util.Optional;
7+
8+
public interface PointRepository extends JpaRepository<Point, Long> {
9+
Optional<Point> findByMemberId(Long memberId);
10+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package ttakkeun.ttakkeun_server.service;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.stereotype.Service;
5+
import org.springframework.transaction.annotation.Transactional;
6+
import ttakkeun.ttakkeun_server.repository.PointRepository;
7+
import ttakkeun.ttakkeun_server.entity.Point;
8+
9+
import java.time.LocalDate;
10+
import java.time.LocalDateTime;
11+
import java.util.NoSuchElementException;
12+
import java.util.Optional;
13+
14+
@Transactional
15+
@Service
16+
public class DiagnoseService {
17+
private final PointRepository pointRepository;
18+
19+
@Autowired
20+
public DiagnoseService(PointRepository pointRepository) {
21+
this.pointRepository = pointRepository;
22+
}
23+
24+
public Integer getPointsByMember(Long memberId) throws Exception {
25+
Optional<Point> pointOpt = pointRepository.findByMemberId(memberId);
26+
27+
if (pointOpt.isPresent()) {
28+
Point point = pointOpt.get(); // Optinal 객체에서 point를 가져옴
29+
Integer points = point.getPoints();
30+
LocalDateTime updatedAt = point.getUpdatedAt();
31+
32+
if (isToday(updatedAt)) { // 최근 포인트 업데이트 날짜가 오늘이라면 그대로 해당 포인트를 반환함
33+
return points;
34+
} else {
35+
// 최근 포인트 업데이트 날짜가 오늘이 아니라면 10점으로 초기화 후 반환함
36+
point.setPoints(10);
37+
point.setUpdatedAt(LocalDateTime.now());
38+
pointRepository.save(point);
39+
return 10;
40+
}
41+
} else {
42+
// Optional 객체에서 값이 비어있는 경우 예외를 던짐
43+
// 0 반환에서 오류 발생하도록 수정함
44+
throw new NoSuchElementException("Member with ID " + memberId + " not found");
45+
}
46+
}
47+
48+
private boolean isToday(LocalDateTime dateTime) {
49+
LocalDate today = LocalDate.now(); // 오늘 날짜
50+
LocalDate date = dateTime.toLocalDate(); // 오늘 날짜와 비교하기 위해 받아온 dateTime을 date 형식으로 변환
51+
return today.equals(date);
52+
// 입력받은 값이 오늘 날짜와 같다면 true 반환, 오늘 날짜와 다르다면 false 반환
53+
}
54+
}

0 commit comments

Comments
 (0)