From aede6a84ecc7299c517e9893832099bccdf406ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=92=80=EA=B7=B8/=EC=9D=B4=EC=A4=80=ED=91=9C?= <85255237+wnsvy607@users.noreply.github.com> Date: Sat, 31 Aug 2024 13:09:03 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Fix:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=8B=9C=20=ED=86=A0=ED=81=B0=20=EC=9D=B8=EC=A6=9D=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20true=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/join/core/auth/domain/AuthenticationToken.java | 1 + src/main/java/com/join/core/auth/domain/UserInfo.java | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/join/core/auth/domain/AuthenticationToken.java b/src/main/java/com/join/core/auth/domain/AuthenticationToken.java index de9fda1..f7620b0 100644 --- a/src/main/java/com/join/core/auth/domain/AuthenticationToken.java +++ b/src/main/java/com/join/core/auth/domain/AuthenticationToken.java @@ -11,6 +11,7 @@ public class AuthenticationToken extends AbstractAuthenticationToken { private AuthenticationToken(UserPrincipal principal, Collection authorities) { super(authorities); + super.setAuthenticated(true); this.principal = principal; } diff --git a/src/main/java/com/join/core/auth/domain/UserInfo.java b/src/main/java/com/join/core/auth/domain/UserInfo.java index d132374..949d015 100644 --- a/src/main/java/com/join/core/auth/domain/UserInfo.java +++ b/src/main/java/com/join/core/auth/domain/UserInfo.java @@ -5,7 +5,6 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import com.join.core.auth.constant.UserType; -import com.join.core.avatar.domain.Avatar; import lombok.Builder; import lombok.Getter; @@ -16,7 +15,6 @@ public class UserInfo { private UserInfo() { } - @Builder @Getter @ToString From 5cdd64bd9848c53e083ae3497c49e68589c22d9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=92=80=EA=B7=B8/=EC=9D=B4=EC=A4=80=ED=91=9C?= <85255237+wnsvy607@users.noreply.github.com> Date: Sat, 31 Aug 2024 13:09:56 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Feat:=20=EC=8B=9C=ED=96=89=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91,=20=EC=A2=85=EB=A3=8C=EC=9D=BC=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/join/core/auth/domain/Term.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/join/core/auth/domain/Term.java b/src/main/java/com/join/core/auth/domain/Term.java index 67ea357..d4e65ec 100644 --- a/src/main/java/com/join/core/auth/domain/Term.java +++ b/src/main/java/com/join/core/auth/domain/Term.java @@ -1,7 +1,7 @@ package com.join.core.auth.domain; import java.io.Serializable; -import java.time.LocalDateTime; +import java.time.LocalDate; import com.join.core.common.domain.BaseTimeEntity; @@ -23,7 +23,7 @@ public class Term extends BaseTimeEntity { @EmbeddedId - private Key id; + private Key key; @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -59,9 +59,9 @@ public enum Type { private String content; @NotNull - private LocalDateTime startDate; + private LocalDate startDate; @NotNull - private LocalDateTime endDate; + private LocalDate endDate; } From c1d0dbce5f57272860b9b956f7f667d01af55618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=92=80=EA=B7=B8/=EC=9D=B4=EC=A4=80=ED=91=9C?= <85255237+wnsvy607@users.noreply.github.com> Date: Sat, 31 Aug 2024 13:11:46 +0900 Subject: [PATCH 3/4] =?UTF-8?q?Feat:=20=EC=95=BD=EA=B4=80=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=20=EC=83=81=ED=83=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/join/core/auth/domain/Term.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/join/core/auth/domain/Term.java b/src/main/java/com/join/core/auth/domain/Term.java index d4e65ec..6364d6a 100644 --- a/src/main/java/com/join/core/auth/domain/Term.java +++ b/src/main/java/com/join/core/auth/domain/Term.java @@ -45,7 +45,7 @@ public static class Key implements Serializable { @Getter @RequiredArgsConstructor public enum Type { - REQUIRED("필수"), OPTIONAL("선택"), INACTIVE("종료"); + REQUIRED("필수"), OPTIONAL("선택"); private final String description; } From 0c64b27974cbf67f0c747c670c59966094b81d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=92=80=EA=B7=B8/=EC=9D=B4=EC=A4=80=ED=91=9C?= <85255237+wnsvy607@users.noreply.github.com> Date: Sat, 31 Aug 2024 13:23:17 +0900 Subject: [PATCH 4/4] =?UTF-8?q?Feat:=20=EC=95=BD=EA=B4=80=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/auth/controller/TermController.java | 38 +++++++++++++++++++ .../com/join/core/auth/domain/TermInfo.java | 21 ++++++++++ .../join/core/auth/domain/TermInfoMapper.java | 19 ++++++++++ .../core/auth/repository/TermReaderImpl.java | 28 ++++++++++++++ .../core/auth/repository/TermRepository.java | 18 +++++++++ .../join/core/auth/service/TermReader.java | 11 ++++++ .../join/core/auth/service/TermService.java | 23 +++++++++++ 7 files changed, 158 insertions(+) create mode 100644 src/main/java/com/join/core/auth/controller/TermController.java create mode 100644 src/main/java/com/join/core/auth/domain/TermInfo.java create mode 100644 src/main/java/com/join/core/auth/domain/TermInfoMapper.java create mode 100644 src/main/java/com/join/core/auth/repository/TermReaderImpl.java create mode 100644 src/main/java/com/join/core/auth/repository/TermRepository.java create mode 100644 src/main/java/com/join/core/auth/service/TermReader.java create mode 100644 src/main/java/com/join/core/auth/service/TermService.java diff --git a/src/main/java/com/join/core/auth/controller/TermController.java b/src/main/java/com/join/core/auth/controller/TermController.java new file mode 100644 index 0000000..240f4ca --- /dev/null +++ b/src/main/java/com/join/core/auth/controller/TermController.java @@ -0,0 +1,38 @@ +package com.join.core.auth.controller; + +import java.util.List; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.join.core.auth.domain.TermInfo; +import com.join.core.auth.domain.UserPrincipal; +import com.join.core.auth.service.TermService; +import com.join.core.common.response.ApiResponse; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@RestController +@RequestMapping("${api.prefix}") +public class TermController { + + private final TermService termService; + + @Tag(name = "${swagger.tag.sign-up}") + @Operation(summary = "약관 조회 API - 인증 필요", + description = "약관 조회 API - 현재 유저의 동의가 필요한 약관을 조회하는 API입니다.", + security = {@SecurityRequirement(name = "session-token")}) + @PreAuthorize("isAuthenticated()") + @GetMapping("/terms") + public ApiResponse> get(@AuthenticationPrincipal UserPrincipal principal) { + return ApiResponse.ok(termService.getRequiredConsentTerms(principal.getUserId())); + } + +} diff --git a/src/main/java/com/join/core/auth/domain/TermInfo.java b/src/main/java/com/join/core/auth/domain/TermInfo.java new file mode 100644 index 0000000..12e2b72 --- /dev/null +++ b/src/main/java/com/join/core/auth/domain/TermInfo.java @@ -0,0 +1,21 @@ +package com.join.core.auth.domain; + +import lombok.Builder; +import lombok.Getter; + +public class TermInfo { + + private TermInfo() { + } + + @Builder + @Getter + public static class Main { + private final Long id; + private final String version; + private final String title; + private final String content; + private final Term.Type type; + } + +} diff --git a/src/main/java/com/join/core/auth/domain/TermInfoMapper.java b/src/main/java/com/join/core/auth/domain/TermInfoMapper.java new file mode 100644 index 0000000..5b59296 --- /dev/null +++ b/src/main/java/com/join/core/auth/domain/TermInfoMapper.java @@ -0,0 +1,19 @@ +package com.join.core.auth.domain; + +import org.mapstruct.InjectionStrategy; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.ReportingPolicy; + +@Mapper( + componentModel = "spring", + injectionStrategy = InjectionStrategy.CONSTRUCTOR, + unmappedTargetPolicy = ReportingPolicy.ERROR +) +public interface TermInfoMapper { + + @Mapping(source = "term.key.id", target = "id") + @Mapping(source = "term.key.version", target = "version") + TermInfo.Main of(Term term); + +} diff --git a/src/main/java/com/join/core/auth/repository/TermReaderImpl.java b/src/main/java/com/join/core/auth/repository/TermReaderImpl.java new file mode 100644 index 0000000..4ebd8df --- /dev/null +++ b/src/main/java/com/join/core/auth/repository/TermReaderImpl.java @@ -0,0 +1,28 @@ +package com.join.core.auth.repository; + +import java.util.List; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import com.join.core.auth.domain.Term; +import com.join.core.auth.domain.TermInfo; +import com.join.core.auth.domain.TermInfoMapper; +import com.join.core.auth.service.TermReader; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Transactional(readOnly = true) +@Component +public class TermReaderImpl implements TermReader { + + private final TermRepository termRepository; + private final TermInfoMapper termInfoMapper; + + @Override + public List getRequiredConsentTerms(Long userId) { + List terms = termRepository.findRequiredConsentWith(userId); + return terms.stream().map(termInfoMapper::of).toList(); + } +} diff --git a/src/main/java/com/join/core/auth/repository/TermRepository.java b/src/main/java/com/join/core/auth/repository/TermRepository.java new file mode 100644 index 0000000..c4e6fa1 --- /dev/null +++ b/src/main/java/com/join/core/auth/repository/TermRepository.java @@ -0,0 +1,18 @@ +package com.join.core.auth.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import com.join.core.auth.domain.Term; + +public interface TermRepository extends JpaRepository { + @Query("select t from Term t" + + " left join TermAgreeHistory ta" + + " on t = ta.term and ta.user.id = :userId" + + " where CURRENT_DATE between t.startDate and t.endDate" + + " and ta is null") + List findRequiredConsentWith(@Param("userId") Long userId); +} diff --git a/src/main/java/com/join/core/auth/service/TermReader.java b/src/main/java/com/join/core/auth/service/TermReader.java new file mode 100644 index 0000000..7ed7646 --- /dev/null +++ b/src/main/java/com/join/core/auth/service/TermReader.java @@ -0,0 +1,11 @@ +package com.join.core.auth.service; + +import java.util.List; + +import com.join.core.auth.domain.TermInfo; + +public interface TermReader { + + List getRequiredConsentTerms(Long userId); + +} diff --git a/src/main/java/com/join/core/auth/service/TermService.java b/src/main/java/com/join/core/auth/service/TermService.java new file mode 100644 index 0000000..2fada2b --- /dev/null +++ b/src/main/java/com/join/core/auth/service/TermService.java @@ -0,0 +1,23 @@ +package com.join.core.auth.service; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.join.core.auth.domain.TermInfo; + +import lombok.RequiredArgsConstructor; + +@Transactional(readOnly = true) +@RequiredArgsConstructor +@Service +public class TermService { + + private final TermReader termReader; + + public List getRequiredConsentTerms(Long userId) { + return termReader.getRequiredConsentTerms(userId); + } + +}