Skip to content

Commit ca19e47

Browse files
authored
Merge pull request #282 from 7-umc-GrowIT/feat/#280
[#280] Feat : 약관 목록 조회 및 검증 로직 변경
2 parents 241d853 + 9b92aa3 commit ca19e47

File tree

6 files changed

+71
-22
lines changed

6 files changed

+71
-22
lines changed

src/main/java/umc/GrowIT/Server/apiPayload/code/status/ErrorStatus.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public enum ErrorStatus implements BaseErrorCode {
3434
//약관 관련 에러
3535
TERM_NOT_FOUND(HttpStatus.NOT_FOUND, "TERM4001", "존재하지 않는 약관을 요청했습니다."),
3636
MANDATORY_TERMS_REQUIRED(HttpStatus.BAD_REQUEST, "TERM4002", "필수 약관에 반드시 동의해야 합니다."),
37-
ALL_TERMS_REQUIRED(HttpStatus.BAD_REQUEST, "TERM4003", "전체 약관 정보를 주세요."),
37+
INVALID_TERM(HttpStatus.BAD_REQUEST, "TERM4004", "약관 정보가 유효하지 않습니다."),
3838

3939
//인증 관련 에러
4040
EMAIL_NOT_VERIFIED(HttpStatus.BAD_REQUEST, "AUTH4001", "이메일 인증을 완료해주세요."),

src/main/java/umc/GrowIT/Server/domain/Term.java

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,26 @@
11
package umc.GrowIT.Server.domain;
22

3-
import jakarta.persistence.*;
4-
import lombok.*;
5-
import umc.GrowIT.Server.domain.common.BaseEntity;
6-
import umc.GrowIT.Server.domain.enums.TermType;
7-
3+
import java.time.LocalDateTime;
84
import java.util.ArrayList;
95
import java.util.List;
106

7+
import jakarta.persistence.CascadeType;
8+
import jakarta.persistence.Column;
9+
import jakarta.persistence.Entity;
10+
import jakarta.persistence.EnumType;
11+
import jakarta.persistence.Enumerated;
12+
import jakarta.persistence.GeneratedValue;
13+
import jakarta.persistence.GenerationType;
14+
import jakarta.persistence.Id;
15+
import jakarta.persistence.OneToMany;
16+
import lombok.AccessLevel;
17+
import lombok.AllArgsConstructor;
18+
import lombok.Builder;
19+
import lombok.Getter;
20+
import lombok.NoArgsConstructor;
21+
import umc.GrowIT.Server.domain.common.BaseEntity;
22+
import umc.GrowIT.Server.domain.enums.TermType;
23+
1124
@Entity
1225
@Getter
1326
@Builder
@@ -32,6 +45,18 @@ public class Term extends BaseEntity {
3245
@Column(nullable = false)
3346
private TermType type;
3447

48+
// 약관 효력 발생일
49+
@Column(nullable = false)
50+
private LocalDateTime effectiveDate;
51+
52+
// 약관 종료일
53+
@Column(nullable = true)
54+
private LocalDateTime expirationDate;
55+
56+
// 버전
57+
@Column(nullable = false)
58+
private int version;
59+
3560
@OneToMany(mappedBy = "term", cascade = CascadeType.ALL)
3661
private List<UserTerm> userTerm = new ArrayList<>();
3762
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,17 @@
11
package umc.GrowIT.Server.repository;
22

3+
import java.time.LocalDateTime;
4+
import java.util.List;
5+
36
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Query;
8+
49
import umc.GrowIT.Server.domain.Term;
510

611
public interface TermRepository extends JpaRepository<Term, Long> {
12+
@Query("SELECT COUNT(t) FROM Term t WHERE t.effectiveDate <= :today AND (t.expirationDate IS NULL OR t.expirationDate >= :today)")
13+
int countByDate(LocalDateTime today);
14+
15+
@Query("SELECT t FROM Term t WHERE t.effectiveDate <= :today AND (t.expirationDate IS NULL OR t.expirationDate >= :today)")
16+
List<Term> findAllByDate(LocalDateTime today);
717
}

src/main/java/umc/GrowIT/Server/service/termService/TermCommandServiceImpl.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
import static umc.GrowIT.Server.apiPayload.code.status.ErrorStatus.TERM_NOT_FOUND;
1414

15-
1615
@Service
1716
@RequiredArgsConstructor
1817
@Transactional

src/main/java/umc/GrowIT/Server/service/termService/TermQueryServiceImpl.java

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,37 @@
11
package umc.GrowIT.Server.service.termService;
22

3-
import lombok.RequiredArgsConstructor;
3+
import java.time.LocalDateTime;
4+
import java.util.List;
5+
import java.util.stream.Collectors;
6+
7+
import lombok.extern.slf4j.Slf4j;
48
import org.springframework.stereotype.Service;
9+
10+
import lombok.RequiredArgsConstructor;
511
import umc.GrowIT.Server.apiPayload.code.status.ErrorStatus;
612
import umc.GrowIT.Server.apiPayload.exception.TermHandler;
713
import umc.GrowIT.Server.converter.TermConverter;
814
import umc.GrowIT.Server.domain.Term;
915
import umc.GrowIT.Server.domain.User;
1016
import umc.GrowIT.Server.domain.UserTerm;
1117
import umc.GrowIT.Server.domain.enums.TermType;
18+
import umc.GrowIT.Server.repository.TermRepository;
1219
import umc.GrowIT.Server.web.dto.TermDTO.TermRequestDTO;
1320
import umc.GrowIT.Server.web.dto.TermDTO.TermResponseDTO;
14-
import umc.GrowIT.Server.repository.TermRepository;
15-
16-
import java.util.List;
17-
import java.util.stream.Collectors;
1821

1922
@Service
2023
@RequiredArgsConstructor
24+
@Slf4j
2125
public class TermQueryServiceImpl implements TermQueryService{
2226

23-
public static final int TERM_COUNT = 6;
2427
private final TermRepository termRepository;
2528

2629
/**
27-
* 약관 목록 조회
30+
* 현행 약관 목록 조회
2831
*/
2932
public List<TermResponseDTO.TermDTO> getTerms(){
30-
List<Term> terms = termRepository.findAll();
33+
LocalDateTime today = LocalDateTime.now();
34+
List<Term> terms = termRepository.findAllByDate(today); // 현행 약관 조회
3135

3236
return terms.stream()
3337
.map(TermConverter::toTermDTO)
@@ -45,9 +49,13 @@ public List<TermResponseDTO.TermDTO> getTerms(){
4549
*/
4650
@Override
4751
public List<UserTerm> checkUserTerms(List<TermRequestDTO.UserTermDTO> requestedUserTerms, User newUser) {
48-
//전체 약관 정보가 주어지지 않았을 때 예외 처리
49-
if (requestedUserTerms.size() < TERM_COUNT) {
50-
throw new TermHandler(ErrorStatus.ALL_TERMS_REQUIRED);
52+
// 현행 약관 수 조회
53+
LocalDateTime today = LocalDateTime.now();
54+
int activeTermCount = termRepository.countByDate(today);
55+
56+
// 요청된 약관 개수와 현행 약관 개수가 다르면 예외 처리
57+
if (requestedUserTerms.size() != activeTermCount) {
58+
throw new TermHandler(ErrorStatus.INVALID_TERM);
5159
}
5260

5361
return requestedUserTerms.stream()
@@ -56,9 +64,16 @@ public List<UserTerm> checkUserTerms(List<TermRequestDTO.UserTermDTO> requestedU
5664
.orElse(null);
5765
// 존재하지 않는 약관을 요청하면 예외 처리
5866
if (term == null) {
59-
throw new TermHandler(ErrorStatus.TERM_NOT_FOUND);
60-
// 필수 약관에 동의하지 않으면 예외 처리
61-
} else if (term.getType() == TermType.MANDATORY && !userTerm.getAgreed()) {
67+
throw new TermHandler(ErrorStatus.INVALID_TERM);
68+
}
69+
// 현행 약관 여부 검증
70+
boolean isActive = (!term.getEffectiveDate().isAfter(today)) &&
71+
(term.getExpirationDate() == null || !term.getExpirationDate().isBefore(today));
72+
if (!isActive) {
73+
throw new TermHandler(ErrorStatus.INVALID_TERM);
74+
}
75+
// 필수 약관에 동의하지 않으면 예외 처리
76+
if (term.getType() == TermType.MANDATORY && !userTerm.getAgreed()) {
6277
throw new TermHandler(ErrorStatus.MANDATORY_TERMS_REQUIRED);
6378
}
6479
// UserTerm 엔티티 생성

src/main/java/umc/GrowIT/Server/web/controller/specification/AuthSpecification.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public interface AuthSpecification {
2525

2626
@PostMapping("/signup")
2727
@SecurityRequirement(name = "")
28-
@Operation(summary = "이메일 회원가입 API", description = "약관 목록 입력할 때 termId 1~6 입력해 주세요. (termId 1~4는 필수 동의 항목입니다.)", security = @SecurityRequirement(name = ""))
28+
@Operation(summary = "이메일 회원가입 API", description = "GET /terms 약관 목록 조회 API 에서 조회된 약관에 대한 동의 정보를 함께 주세요.", security = @SecurityRequirement(name = ""))
2929
@ApiResponses({
3030
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "COMMON200", description = "⭕ SUCCESS"),
3131
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "AUTH4001", description = "❌ 이메일 인증을 완료해주세요.", content = @Content(schema = @Schema(implementation = ApiResponse.class))),

0 commit comments

Comments
 (0)