Skip to content

Commit

Permalink
#93/회원 및 게시판 기능 nickname 기준 조회로 수정
Browse files Browse the repository at this point in the history
  • Loading branch information
ilgolf committed Nov 11, 2022
1 parent c6e5174 commit bd7dbe6
Show file tree
Hide file tree
Showing 16 changed files with 106 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import me.golf.blog.domain.board.domain.persist.SearchKeywordRequest;
import me.golf.blog.domain.board.dto.*;
import me.golf.blog.domain.member.domain.vo.Email;
import me.golf.blog.domain.member.domain.vo.Nickname;
import me.golf.blog.global.common.PageCustomResponse;
import me.golf.blog.global.security.principal.CustomUserDetails;
import org.springframework.data.domain.Pageable;
Expand Down Expand Up @@ -45,11 +46,11 @@ public ResponseEntity<PageCustomResponse<BoardAllResponse>> findAll(
return ResponseEntity.ok(boardReadService.findAll(keyword, pageable));
}

@GetMapping("/public/boards/{email}")
@GetMapping("/public/boards/{nickname}")
public ResponseEntity<PageCustomResponse<BoardAllResponse>> findByEmail(
@PathVariable String email,
@PathVariable String nickname,
@PageableDefault(sort = "id", direction = Sort.Direction.DESC) Pageable pageable) {
return ResponseEntity.ok().body(boardReadService.findByEmail(Email.from(email), pageable));
return ResponseEntity.ok().body(boardReadService.getByNickname(Nickname.from(nickname), pageable));
}

@PatchMapping("/boards/{boardId}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import me.golf.blog.domain.board.domain.vo.BoardStatus;
import me.golf.blog.domain.board.dto.*;
import me.golf.blog.domain.board.error.BoardNotFoundException;
import me.golf.blog.domain.member.domain.vo.Email;
import me.golf.blog.domain.member.domain.vo.Nickname;
import me.golf.blog.global.common.PageCustomResponse;
import me.golf.blog.global.config.RedisPolicy;
import me.golf.blog.global.error.exception.ErrorCode;
Expand Down Expand Up @@ -38,9 +38,9 @@ public PageCustomResponse<BoardAllResponse> findAll(final SearchKeywordRequest s
}

@Transactional(readOnly = true)
public PageCustomResponse<BoardAllResponse> findByEmail(final Email email, final Pageable pageable) {
public PageCustomResponse<BoardAllResponse> getByNickname(final Nickname nickname, final Pageable pageable) {

return boardRepository.findByEmail(email, pageable);
return boardRepository.findByNickname(nickname, pageable);
}

@Transactional(readOnly = true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
import me.golf.blog.domain.board.dto.BoardResponse;
import me.golf.blog.domain.board.dto.TempBoardListResponse;
import me.golf.blog.domain.member.domain.vo.Email;
import me.golf.blog.domain.member.domain.vo.Nickname;
import me.golf.blog.global.common.PageCustomResponse;
import org.springframework.data.domain.Pageable;

import java.util.Optional;

public interface BoardCustomRepository {
PageCustomResponse<BoardAllResponse> findAllWithQuery(final SearchKeywordRequest searchKeyword, final Pageable pageable);
PageCustomResponse<BoardAllResponse> findByEmail(final Email email, final Pageable pageable);
PageCustomResponse<BoardAllResponse> findByNickname(final Nickname nickname, final Pageable pageable);
PageCustomResponse<TempBoardListResponse> findAllTempBoard(final Long memberId, final Pageable pageable);
Optional<BoardResponse> getBoardDetail(final Long boardId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import me.golf.blog.domain.board.dto.BoardResponse;
import me.golf.blog.domain.board.dto.TempBoardListResponse;
import me.golf.blog.domain.member.domain.vo.Email;
import me.golf.blog.domain.member.domain.vo.Nickname;
import me.golf.blog.global.common.PageCustomResponse;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
Expand Down Expand Up @@ -52,7 +53,7 @@ public PageCustomResponse<BoardAllResponse> findAllWithQuery(final SearchKeyword
return getPageResponse(pageable, boards);
}

public PageCustomResponse<BoardAllResponse> findByEmail(Email email, Pageable pageable) {
public PageCustomResponse<BoardAllResponse> findByNickname(Nickname nickname, Pageable pageable) {
List<BoardAllResponse> boards = query.select(Projections.constructor(BoardAllResponse.class,
board.id,
board.title,
Expand All @@ -61,7 +62,7 @@ public PageCustomResponse<BoardAllResponse> findByEmail(Email email, Pageable pa
board.createTime.as("createdAt"))
)
.from(board)
.innerJoin(member).on(member.id.eq(board.memberId))
.innerJoin(member).on(member.nickname.eq(nickname))
.where(board.status.eq(BoardStatus.SAVE))
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ public ResponseEntity<MemberResponse> getDetailById() {
return ResponseEntity.ok().body(memberReadService.getDetailBy(this.getPrincipal()));
}

@GetMapping("/public/members/{nickname}")
public ResponseEntity<MemberResponse> getDetailByNickname(@PathVariable String nickname) {
return ResponseEntity.ok(memberReadService.getDetailByNickname(nickname));
}

// findAll
@GetMapping("/public/members")
public ResponseEntity<PageCustomResponse<MemberAllResponse>> getMembers(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import lombok.RequiredArgsConstructor;
import me.golf.blog.domain.member.domain.persist.Member;
import me.golf.blog.domain.member.domain.persist.MemberRepository;
import me.golf.blog.domain.member.domain.vo.Nickname;
import me.golf.blog.domain.member.dto.MemberAllResponse;
import me.golf.blog.domain.member.dto.MemberResponse;
import me.golf.blog.domain.member.dto.MemberSearch;
Expand All @@ -22,18 +23,32 @@ public class MemberReadService {
private final MemberRepository memberRepository;

@Transactional(readOnly = true)
@Cacheable(key = "#userDetails.getId()", value = RedisPolicy.MEMBER_KEY)
public MemberResponse getDetailBy(final CustomUserDetails userDetails) {

Member member = memberRepository.findById(userDetails.getId()).orElseThrow(
() -> new MemberNotFoundException(ErrorCode.USER_NOT_FOUND));
MemberResponse memberResponse = memberRepository.findById(userDetails.getId())
.map(MemberResponse::of)
.orElseThrow(() -> new MemberNotFoundException(ErrorCode.USER_NOT_FOUND));

return MemberResponse.of(member);
return saveCache(memberResponse);
}

@Transactional(readOnly = true)
public PageCustomResponse<MemberAllResponse> getMembers(final MemberSearch memberSearch, final Pageable pageable) {

return memberRepository.findAllWithSearch(memberSearch, pageable);
}

@Transactional(readOnly = true)
public MemberResponse getDetailByNickname(final String nickname) {

MemberResponse memberResponse = memberRepository.findByNickname(Nickname.from(nickname))
.map(MemberResponse::of)
.orElseThrow(() -> new MemberNotFoundException(ErrorCode.USER_NOT_FOUND));

return saveCache(memberResponse);
}

@Cacheable(key = "#member.memberId", value = RedisPolicy.MEMBER_KEY)
public MemberResponse saveCache(final MemberResponse member) {
return member;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,14 @@

import me.golf.blog.domain.member.domain.vo.Email;
import me.golf.blog.domain.member.domain.vo.Nickname;
import me.golf.blog.domain.member.dto.MemberResponse;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface MemberRepository extends JpaRepository<Member, Long>, MemberCustomRepository {

boolean existsByEmail(final Email email);
boolean existsByNickname(final Nickname nickname);
Optional<Member> findByNickname(final Nickname nickname);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class MemberResponse implements Serializable {

private Long memberId;
private Email email;
private Name name;
private Nickname nickname;
Expand All @@ -29,7 +31,9 @@ public static MemberResponse of(final Member member) {
int now = LocalDate.now().getYear();
int age = now - memberYear;

return new MemberResponse(member.getEmail(),
return new MemberResponse(
member.getId(),
member.getEmail(),
member.getName(),
member.getNickname(),
age,
Expand Down
4 changes: 2 additions & 2 deletions src/main/resources/static/docs/FollowTotal.html
Original file line number Diff line number Diff line change
Expand Up @@ -599,7 +599,7 @@ <h1>Follower</h1>
&quot;followerId&quot; : 1,
&quot;memberId&quot; : 1,
&quot;nickname&quot; : &quot;ssar&quot;,
&quot;createAt&quot; : &quot;2022-10-21&quot;
&quot;createAt&quot; : &quot;2022-11-11&quot;
} ],
&quot;pageSize&quot; : 10,
&quot;number&quot; : 0
Expand All @@ -616,7 +616,7 @@ <h1>Follower</h1>
&quot;followerId&quot; : 1,
&quot;memberId&quot; : 1,
&quot;nickname&quot; : &quot;ssar&quot;,
&quot;createAt&quot; : &quot;2022-10-21&quot;
&quot;createAt&quot; : &quot;2022-11-11&quot;
} ],
&quot;pageSize&quot; : 10,
&quot;number&quot; : 0
Expand Down
14 changes: 7 additions & 7 deletions src/main/resources/static/docs/authTotal.html
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ <h1>Auth</h1>
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Set-Cookie: refreshToken=eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiUk9MRV9VU0VSIiwiaWQiOiIyIiwiZXhwIjoxNjY2MzUzMTk5fQ.kROhg2Oaj4Pm2MSZOCR0xR8Tt9-O8sCHnulUiE6tIIC8zoxM8LQ_auoD7wJzg4OWiyhqno1E-AuNQjJe8vWqHQ; Path=/; Max-Age=18000; Expires=Fri, 21 Oct 2022 11:53:19 GMT; Secure; HttpOnly
Set-Cookie: refreshToken=eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiUk9MRV9VU0VSIiwiaWQiOiIyIiwiZXhwIjoxNjY4MTk0NjU1fQ.CIt5365s4UhOXbW11AAecosJP8PgxmxD-WiZxbHhcA8IT488_xwgQ3W3QT0oTFb3bwakQMt4bYfn0M4aXIssNA; Path=/; Max-Age=18000; Expires=Fri, 11 Nov 2022 19:24:15 GMT; Secure; HttpOnly
Content-Type: application/json
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Expand All @@ -521,7 +521,7 @@ <h1>Auth</h1>
Content-Length: 213

{
&quot;accessToken&quot; : &quot;eyJhbGciOiJIUzUxMiJ9.eyJpZCI6IjIiLCJyb2xlIjoiUk9MRV9VU0VSIiwiZXhwIjoxNjY2MzM4Nzk5fQ.Ldk7b-QpfQmzHj83VsjDdrPHAX1c_BSKhvLdAB-Bq6QNVoaOoFkk-pQmMvOdUpmV8-Z0Xunc_rETXDw4TA-qUw&quot;,
&quot;accessToken&quot; : &quot;eyJhbGciOiJIUzUxMiJ9.eyJpZCI6IjIiLCJyb2xlIjoiUk9MRV9VU0VSIiwiZXhwIjoxNjY4MTgwMjU1fQ.VMQWH9A0glC6rkaSRunUkCXuiYImurt5bnah1is8jPsHz8i08pEQh6hkSG2JkXF0Se8-61Y8VgIP2IywapkmTQ&quot;,
&quot;result&quot; : true
}</code></pre>
</div>
Expand All @@ -543,7 +543,7 @@ <h1>Auth</h1>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight nowrap"><code>{
&quot;accessToken&quot; : &quot;eyJhbGciOiJIUzUxMiJ9.eyJpZCI6IjIiLCJyb2xlIjoiUk9MRV9VU0VSIiwiZXhwIjoxNjY2MzM4Nzk5fQ.Ldk7b-QpfQmzHj83VsjDdrPHAX1c_BSKhvLdAB-Bq6QNVoaOoFkk-pQmMvOdUpmV8-Z0Xunc_rETXDw4TA-qUw&quot;,
&quot;accessToken&quot; : &quot;eyJhbGciOiJIUzUxMiJ9.eyJpZCI6IjIiLCJyb2xlIjoiUk9MRV9VU0VSIiwiZXhwIjoxNjY4MTgwMjU1fQ.VMQWH9A0glC6rkaSRunUkCXuiYImurt5bnah1is8jPsHz8i08pEQh6hkSG2JkXF0Se8-61Y8VgIP2IywapkmTQ&quot;,
&quot;result&quot; : true
}</code></pre>
</div>
Expand Down Expand Up @@ -620,7 +620,7 @@ <h1>Auth</h1>
<div class="content">
<pre class="CodeRay highlight nowrap"><code data-lang="http">DELETE /api/v1/auth/logout HTTP/1.1
Host: localhost:8080
Cookie: refreshToken=eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiUk9MRV9VU0VSIiwiaWQiOiIxIiwiZXhwIjoxNjY2MzUzMTk5fQ.6l2VkUcFmXi-NtjXSXKY83mI7rrLbMFvKpNBjDY5Tf1r05xv8TzU6jwCGrQ02dyhlfU8S_tbphvAPuaYS3z0Zg</code></pre>
Cookie: refreshToken=eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiUk9MRV9VU0VSIiwiaWQiOiIxIiwiZXhwIjoxNjY4MTk0NjU1fQ.y9le7p82iAZz1pJo9KluL0VWZ8zVNtzILzY4E-SwMs4H39lPPzemdpWDeVQbZIOvTTEn6jH9PLIM32-HrM2i7A</code></pre>
</div>
</div>
<div class="paragraph">
Expand Down Expand Up @@ -655,7 +655,7 @@ <h1>Auth</h1>
<div class="content">
<pre class="CodeRay highlight nowrap"><code data-lang="http">POST /api/v1/public/auth/reissue HTTP/1.1
Host: localhost:8080
Cookie: refreshToken=eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiUk9MRV9VU0VSIiwiaWQiOiIzIiwiZXhwIjoxNjY2MzUzMTk5fQ.ZuEkudrOXH-bmIAZAuctaXcLzmYK2me_MeDYiGVM0Xyta9FTkf0xvTcoU9eZL2bYTzoMeZA_wnwUe-Ft36zyIw</code></pre>
Cookie: refreshToken=eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiUk9MRV9VU0VSIiwiaWQiOiIzIiwiZXhwIjoxNjY4MTk0NjU1fQ.TASbIijVOr4wH0NrwItXd1yGDPY26R12cg-sgs-_Ctu6Xd5dzMwnpZzZrUDwHj9AwdHhDCSETyxbz64G8DMlQQ</code></pre>
</div>
</div>
<div class="paragraph">
Expand All @@ -677,7 +677,7 @@ <h1>Auth</h1>
Content-Length: 213

{
&quot;accessToken&quot; : &quot;eyJhbGciOiJIUzUxMiJ9.eyJpZCI6IjMiLCJyb2xlIjoiUk9MRV9VU0VSIiwiZXhwIjoxNjY2MzM4Nzk5fQ.ZuwzCCAdBrqPnjQiq9i7uuDUN35f0MXDtKng_qax0W584tZnyywuUVJV3f0s1Qlfrr5bQHdlar3-hHMHM54iEQ&quot;,
&quot;accessToken&quot; : &quot;eyJhbGciOiJIUzUxMiJ9.eyJpZCI6IjMiLCJyb2xlIjoiUk9MRV9VU0VSIiwiZXhwIjoxNjY4MTgwMjU1fQ.03-m_ob-spf71kmksDRizbCAYK-_zxUvj84E8GgAiN6bucilEWHHqMf76zFOkEb5ughtQQ54K14X7V1tFd6BIA&quot;,
&quot;result&quot; : true
}</code></pre>
</div>
Expand All @@ -688,7 +688,7 @@ <h1>Auth</h1>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight nowrap"><code>{
&quot;accessToken&quot; : &quot;eyJhbGciOiJIUzUxMiJ9.eyJpZCI6IjMiLCJyb2xlIjoiUk9MRV9VU0VSIiwiZXhwIjoxNjY2MzM4Nzk5fQ.ZuwzCCAdBrqPnjQiq9i7uuDUN35f0MXDtKng_qax0W584tZnyywuUVJV3f0s1Qlfrr5bQHdlar3-hHMHM54iEQ&quot;,
&quot;accessToken&quot; : &quot;eyJhbGciOiJIUzUxMiJ9.eyJpZCI6IjMiLCJyb2xlIjoiUk9MRV9VU0VSIiwiZXhwIjoxNjY4MTgwMjU1fQ.03-m_ob-spf71kmksDRizbCAYK-_zxUvj84E8GgAiN6bucilEWHHqMf76zFOkEb5ughtQQ54K14X7V1tFd6BIA&quot;,
&quot;result&quot; : true
}</code></pre>
</div>
Expand Down
9 changes: 8 additions & 1 deletion src/main/resources/static/docs/memberTotal.html
Original file line number Diff line number Diff line change
Expand Up @@ -666,9 +666,10 @@ <h1>Member</h1>
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Length: 157
Content-Length: 175

{
&quot;memberId&quot; : 1,
&quot;email&quot; : &quot;[email protected]&quot;,
&quot;name&quot; : &quot;kim3&quot;,
&quot;nickname&quot; : &quot;ssar&quot;,
Expand All @@ -685,6 +686,7 @@ <h1>Member</h1>
<div class="listingblock">
<div class="content">
<pre class="CodeRay highlight nowrap"><code>{
&quot;memberId&quot; : 1,
&quot;email&quot; : &quot;[email protected]&quot;,
&quot;name&quot; : &quot;kim3&quot;,
&quot;nickname&quot; : &quot;ssar&quot;,
Expand Down Expand Up @@ -713,6 +715,11 @@ <h1>Member</h1>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>memberId</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>Number</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">회원 식별자</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>email</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">이메일</p></td>
Expand Down
4 changes: 2 additions & 2 deletions src/main/resources/static/docs/replyTotal.html
Original file line number Diff line number Diff line change
Expand Up @@ -601,7 +601,7 @@ <h1>Reply</h1>
{
&quot;data&quot; : [ {
&quot;comment&quot; : &quot;안녕하세요, 테스트 입니다.&quot;,
&quot;createDate&quot; : &quot;2022-10-21T15:53:10.671525&quot;,
&quot;createDate&quot; : &quot;2022-11-11T23:24:06.334438&quot;,
&quot;createdBy&quot; : &quot;[email protected]&quot;
} ],
&quot;totalPage&quot; : 1,
Expand All @@ -619,7 +619,7 @@ <h1>Reply</h1>
<pre class="CodeRay highlight nowrap"><code>{
&quot;data&quot; : [ {
&quot;comment&quot; : &quot;안녕하세요, 테스트 입니다.&quot;,
&quot;createDate&quot; : &quot;2022-10-21T15:53:10.671525&quot;,
&quot;createDate&quot; : &quot;2022-11-11T23:24:06.334438&quot;,
&quot;createdBy&quot; : &quot;[email protected]&quot;
} ],
&quot;totalPage&quot; : 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ void findByEmail() throws Exception {
PageCustomResponse<BoardAllResponse> response = PageCustomResponse.of(new PageImpl<>(boards, pageable, 1));


when(boardReadService.findByEmail(any(), any())).thenReturn(response);
when(boardReadService.getByNickname(any(), any())).thenReturn(response);

mockMvc.perform(get("/api/v1/public/boards/[email protected]")
.accept(MediaType.APPLICATION_JSON))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ void findByEmail() {
Pageable pageable = PageRequest.of(0, 10);

// when
List<BoardAllResponse> responses = boardReadService.findByEmail(GivenMember.GIVEN_EMAIL, pageable).getData();
List<BoardAllResponse> responses = boardReadService.getByNickname(GivenMember.GIVEN_NICKNAME, pageable).getData();

// then
assertThat(responses.get(0).getTitle()).isEqualTo(GIVEN_TITLE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,9 @@
class MemberControllerTest extends AbstractContainerBaseTest {
@Autowired MockMvc mockMvc;
@MockBean MemberService memberService;
ObjectMapper objectMapper;
@Autowired ObjectMapper objectMapper;
@MockBean MemberReadService memberReadService;

@BeforeEach
public void init() {
objectMapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
objectMapper.registerModule(new JavaTimeModule());
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
}

@Test
@DisplayName("요청을 받아 정상적으로 생성 컨트롤러가 동작한다.")
void createTest() throws Exception {
Expand Down Expand Up @@ -121,6 +114,7 @@ void findMemberTest() throws Exception {
.andExpect(status().isOk())
.andDo(document("member/findById",
responseFields(
fieldWithPath("memberId").description("회원 식별자"),
fieldWithPath("email").description("이메일"),
fieldWithPath("name").description("이름"),
fieldWithPath("nickname").description("닉네임"),
Expand Down Expand Up @@ -222,6 +216,18 @@ void deleteTest() throws Exception {
.andDo(print());
}

@Test
@DisplayName("회원 조회 시 200 ok 상태코드 반환")
void getMemberTest() {
// given
String nickname = GIVEN_NICKNAME.nickname();

// when

// then

}

private ResultActions getCreate(String body) throws Exception {
return mockMvc.perform(post("/api/v1/public/members").content(body)
.contentType(MediaType.APPLICATION_JSON));
Expand Down
Loading

0 comments on commit bd7dbe6

Please sign in to comment.