Skip to content

Commit

Permalink
Feat: 약관 조회 API 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
wnsvy607 committed Aug 31, 2024
1 parent c1d0dbc commit 0c64b27
Show file tree
Hide file tree
Showing 7 changed files with 158 additions and 0 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()));
}

}
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);

}
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 0c64b27

Please sign in to comment.