Skip to content

Commit

Permalink
Merge pull request #22 from ecolink-JOIN/feature/term
Browse files Browse the repository at this point in the history
[Feat] 약관 조회 API 추가
  • Loading branch information
uuujini authored Aug 31, 2024
2 parents 614d294 + 0c64b27 commit d3bf72c
Show file tree
Hide file tree
Showing 10 changed files with 164 additions and 7 deletions.
38 changes: 38 additions & 0 deletions src/main/java/com/join/core/auth/controller/TermController.java
Original file line number Diff line number Diff line change
@@ -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<List<TermInfo.Main>> get(@AuthenticationPrincipal UserPrincipal principal) {
return ApiResponse.ok(termService.getRequiredConsentTerms(principal.getUserId()));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public class AuthenticationToken extends AbstractAuthenticationToken {

private AuthenticationToken(UserPrincipal principal, Collection<? extends GrantedAuthority> authorities) {
super(authorities);
super.setAuthenticated(true);
this.principal = principal;
}

Expand Down
10 changes: 5 additions & 5 deletions src/main/java/com/join/core/auth/domain/Term.java
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -23,7 +23,7 @@
public class Term extends BaseTimeEntity {

@EmbeddedId
private Key id;
private Key key;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
Expand All @@ -45,7 +45,7 @@ public static class Key implements Serializable {
@Getter
@RequiredArgsConstructor
public enum Type {
REQUIRED("필수"), OPTIONAL("선택"), INACTIVE("종료");
REQUIRED("필수"), OPTIONAL("선택");

private final String description;
}
Expand All @@ -59,9 +59,9 @@ public enum Type {
private String content;

@NotNull
private LocalDateTime startDate;
private LocalDate startDate;

@NotNull
private LocalDateTime endDate;
private LocalDate endDate;

}
21 changes: 21 additions & 0 deletions src/main/java/com/join/core/auth/domain/TermInfo.java
Original file line number Diff line number Diff line change
@@ -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;
}

}
19 changes: 19 additions & 0 deletions src/main/java/com/join/core/auth/domain/TermInfoMapper.java
Original file line number Diff line number Diff line change
@@ -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);

}
2 changes: 0 additions & 2 deletions src/main/java/com/join/core/auth/domain/UserInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -16,7 +15,6 @@ public class UserInfo {
private UserInfo() {
}


@Builder
@Getter
@ToString
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/com/join/core/auth/repository/TermReaderImpl.java
Original file line number Diff line number Diff line change
@@ -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<TermInfo.Main> getRequiredConsentTerms(Long userId) {
List<Term> terms = termRepository.findRequiredConsentWith(userId);
return terms.stream().map(termInfoMapper::of).toList();
}
}
18 changes: 18 additions & 0 deletions src/main/java/com/join/core/auth/repository/TermRepository.java
Original file line number Diff line number Diff line change
@@ -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<Term, Term.Key> {
@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<Term> findRequiredConsentWith(@Param("userId") Long userId);
}
11 changes: 11 additions & 0 deletions src/main/java/com/join/core/auth/service/TermReader.java
Original file line number Diff line number Diff line change
@@ -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<TermInfo.Main> getRequiredConsentTerms(Long userId);

}
23 changes: 23 additions & 0 deletions src/main/java/com/join/core/auth/service/TermService.java
Original file line number Diff line number Diff line change
@@ -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<TermInfo.Main> getRequiredConsentTerms(Long userId) {
return termReader.getRequiredConsentTerms(userId);
}

}

0 comments on commit d3bf72c

Please sign in to comment.