Skip to content

Commit 228e6d3

Browse files
authored
Epic/mypage (#124)
* feat: 내 정보 조회 * feat: 회원 정보 수정 및 삭제 * feat: 회원 정보 수정 및 삭제 * fix: 테스트 코드 추가 * feat: 회원 정보 수정 및 탈퇴 테스트코드 추가 * fix: 코드 리뷰 반영 * feat: 내 정보 조회, 내가 쓴 게시글, 내가 쓴 문의내역 조회 * feat: 테스트코드 추가 * fix: 가독성 좋은 test코드로 수정
1 parent 8324f7a commit 228e6d3

File tree

19 files changed

+549
-50
lines changed

19 files changed

+549
-50
lines changed

src/main/java/org/myteam/server/board/dto/reponse/BoardDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import java.time.LocalDateTime;
44
import java.util.UUID;
5+
6+
import lombok.AllArgsConstructor;
57
import lombok.Getter;
68
import lombok.NoArgsConstructor;
79
import org.myteam.server.board.domain.BoardType;

src/main/java/org/myteam/server/board/dto/request/BoardSaveRequest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
import jakarta.validation.constraints.NotBlank;
44
import jakarta.validation.constraints.NotNull;
5+
import lombok.AllArgsConstructor;
56
import lombok.Getter;
67
import lombok.NoArgsConstructor;
78
import org.myteam.server.board.domain.BoardType;
89
import org.myteam.server.board.domain.CategoryType;
910

1011
@Getter
1112
@NoArgsConstructor
13+
@AllArgsConstructor // TODO: 테스트용 이후에 삭제
1214
public class BoardSaveRequest {
1315
/**
1416
* 게시판 타입

src/main/java/org/myteam/server/board/repository/BoardQueryRepository.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,15 @@
1313
import java.util.Optional;
1414
import java.util.UUID;
1515
import lombok.RequiredArgsConstructor;
16-
import org.myteam.server.board.domain.BoardOrderType;
17-
import org.myteam.server.board.domain.BoardSearchType;
18-
import org.myteam.server.board.domain.BoardType;
19-
import org.myteam.server.board.domain.CategoryType;
16+
import lombok.extern.slf4j.Slf4j;
17+
import org.myteam.server.board.domain.*;
2018
import org.myteam.server.board.dto.reponse.BoardDto;
2119
import org.springframework.data.domain.Page;
2220
import org.springframework.data.domain.PageImpl;
2321
import org.springframework.data.domain.Pageable;
2422
import org.springframework.stereotype.Repository;
2523

24+
@Slf4j
2625
@Repository
2726
@RequiredArgsConstructor
2827
public class BoardQueryRepository {
@@ -144,9 +143,20 @@ public Page<BoardDto> getMyBoardList(BoardOrderType orderType, BoardSearchType s
144143

145144
long total = getTotalMyBoardCount(searchType, search, publicId);
146145

146+
log.info("검색 완료 total: {}", total);
147+
147148
return new PageImpl<>(content, pageable, total);
148149
}
149150

151+
public int getMyBoard(UUID memberPublicId) {
152+
return queryFactory
153+
.select(board.count())
154+
.from(board)
155+
.where(board.member.publicId.eq(memberPublicId))
156+
.fetchOne()
157+
.intValue();
158+
}
159+
150160
/**
151161
* 내가 쓴 게시글 총 개수
152162
* TODO :: 검색에서 댓글 검색 댓글 작업 후 추가 예정

src/main/java/org/myteam/server/board/service/BoardReadService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.UUID;
44
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
56
import org.myteam.server.board.domain.Board;
67
import org.myteam.server.board.dto.reponse.BoardDto;
78
import org.myteam.server.board.dto.reponse.BoardListResponse;
@@ -15,6 +16,7 @@
1516
import org.springframework.stereotype.Service;
1617
import org.springframework.transaction.annotation.Transactional;
1718

19+
@Slf4j
1820
@Service
1921
@RequiredArgsConstructor
2022
@Transactional(readOnly = true)
@@ -41,6 +43,12 @@ public BoardListResponse getBoardList(BoardServiceRequest boardServiceRequest) {
4143
}
4244

4345
public BoardListResponse getMyBoardList(BoardServiceRequest boardServiceRequest, UUID publicId) {
46+
log.info("내 게시글 조회: {} orderType: {} searchType: {}, search: {}",
47+
publicId,
48+
boardServiceRequest.getOrderType(),
49+
boardServiceRequest.getSearchType(),
50+
boardServiceRequest.getSearch());
51+
4452

4553
Page<BoardDto> myBoardList = boardQueryRepository.getMyBoardList(
4654
boardServiceRequest.getOrderType(),
@@ -51,4 +59,8 @@ public BoardListResponse getMyBoardList(BoardServiceRequest boardServiceRequest,
5159
);
5260
return BoardListResponse.createResponse(PageCustomResponse.of(myBoardList));
5361
}
62+
63+
public int getMyBoardListCount(UUID memberPublicId) {
64+
return boardQueryRepository.getMyBoard(memberPublicId);
65+
}
5466
}

src/main/java/org/myteam/server/inquiry/controller/InquiryController.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
import lombok.extern.slf4j.Slf4j;
77
import org.myteam.server.global.page.response.PageCustomResponse;
88
import org.myteam.server.global.web.response.ResponseDto;
9-
import org.myteam.server.inquiry.dto.request.InquiryFindRequest;
10-
import org.myteam.server.inquiry.dto.request.InquiryRequest;
119
import org.myteam.server.inquiry.dto.request.InquirySearchRequest;
10+
import org.myteam.server.inquiry.dto.request.InquiryRequest;
11+
import org.myteam.server.inquiry.dto.response.InquiriesListResponse;
1212
import org.myteam.server.inquiry.dto.response.InquiryResponse;
1313
import org.myteam.server.inquiry.service.InquiryReadService;
14-
import org.myteam.server.inquiry.service.InquiryWriteService;
14+
import org.myteam.server.inquiry.service.InquiryService;
1515
import org.myteam.server.util.ClientUtils;
1616
import org.springframework.http.ResponseEntity;
1717
import org.springframework.web.bind.annotation.*;
@@ -24,13 +24,13 @@
2424
@RequestMapping("/api/inquiries")
2525
public class InquiryController {
2626
private final InquiryReadService inquiryReadService;
27-
private final InquiryWriteService inquiryWriteService;
27+
private final InquiryService inquiryService;
2828

2929
@PostMapping
3030
public ResponseEntity<ResponseDto<String>> createInquiry(@Valid @RequestBody InquiryRequest inquiryRequest,
31-
HttpServletRequest request) {
31+
HttpServletRequest request) {
3232
String clientIp = ClientUtils.getRemoteIP(request);
33-
String content = inquiryWriteService.createInquiry(inquiryRequest.getContent(), inquiryRequest.getMemberPublicId(), clientIp);
33+
String content = inquiryService.createInquiry(inquiryRequest.getContent(), inquiryRequest.getMemberPublicId(), clientIp);
3434

3535
return ResponseEntity.ok(new ResponseDto<>(
3636
SUCCESS.name(),
@@ -39,12 +39,9 @@ public ResponseEntity<ResponseDto<String>> createInquiry(@Valid @RequestBody Inq
3939
));
4040
}
4141

42-
/**
43-
* TODO: 차후 API로 사용하지 않고 마이 페이지에서 InquiryReadService를 호출하는 식으로 진행
44-
*/
4542
@GetMapping("/my")
46-
public ResponseEntity<ResponseDto<PageCustomResponse<InquiryResponse>>> getMyInquiries(@ModelAttribute @Valid InquirySearchRequest inquirySearchRequest) {
47-
PageCustomResponse<InquiryResponse> content = inquiryReadService.getInquiriesByMember(inquirySearchRequest);
43+
public ResponseEntity<ResponseDto<InquiriesListResponse>> getMyInquiries(@ModelAttribute @Valid InquirySearchRequest request) {
44+
InquiriesListResponse content = inquiryReadService.getInquiriesByMember(request);
4845

4946
return ResponseEntity.ok(new ResponseDto<>(
5047
SUCCESS.name(),
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.myteam.server.inquiry.dto.response;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
import org.myteam.server.global.page.response.PageCustomResponse;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
public class InquiriesListResponse {
11+
private PageCustomResponse<InquiryResponse> list;
12+
13+
@Builder
14+
public InquiriesListResponse(PageCustomResponse<InquiryResponse> list) {
15+
this.list = list;
16+
}
17+
18+
public static InquiriesListResponse createResponse(PageCustomResponse<InquiryResponse> list) {
19+
return InquiriesListResponse.builder()
20+
.list(list)
21+
.build();
22+
}
23+
}

src/main/java/org/myteam/server/inquiry/repository/InquiryQueryRepository.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ public Page<InquiryResponse> getInquiryList(UUID memberPublicId,
3838
Pageable pageable) {
3939
// 정렬 조건 설정
4040
OrderSpecifier<?> orderSpecifier = getOrderSpecifier(orderType, inquiry, inquiryAnswer);
41-
41+
log.info("정렬 조건: {}", orderSpecifier);
42+
43+
// 검색 조건
44+
log.info("검색조건: {}&&{}", isMemberEqualTo(memberPublicId), getSearchCondition(searchType, keyword));
45+
4246
// 문의 리스트 조회
4347
List<InquiryResponse> inquiries = queryFactory
4448
.select(Projections.constructor(InquiryResponse.class,
@@ -67,6 +71,15 @@ public Page<InquiryResponse> getInquiryList(UUID memberPublicId,
6771
return new PageImpl<>(inquiries, pageable, total);
6872
}
6973

74+
public int getMyInquires(UUID memberPublicId) {
75+
return queryFactory
76+
.select(inquiry.count())
77+
.from(inquiry)
78+
.where(inquiry.member.publicId.eq(memberPublicId))
79+
.fetchOne()
80+
.intValue();
81+
}
82+
7083
private long getInquiryCount(UUID memberPublicId,
7184
InquirySearchType searchType,
7285
String keyword) {
@@ -85,7 +98,7 @@ private OrderSpecifier<?> getOrderSpecifier(InquiryOrderType orderType, QInquiry
8598
if (orderType == InquiryOrderType.ANSWERED) {
8699
return inquiryAnswer.answeredAt.desc().nullsLast();
87100
}
88-
return inquiry.createdAt.asc();
101+
return inquiry.createdAt.desc();
89102
}
90103

91104
private BooleanExpression isMemberEqualTo(UUID memberPublicId) {

src/main/java/org/myteam/server/inquiry/service/InquiryReadService.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import lombok.extern.slf4j.Slf4j;
55
import org.myteam.server.global.page.response.PageCustomResponse;
66
import org.myteam.server.inquiry.dto.request.InquirySearchRequest;
7+
import org.myteam.server.inquiry.dto.response.InquiriesListResponse;
78
import org.myteam.server.inquiry.dto.response.InquiryResponse;
89
import org.myteam.server.inquiry.repository.InquiryQueryRepository;
910
import org.myteam.server.global.page.request.PageInfoRequest;
@@ -19,6 +20,8 @@
1920
import org.springframework.stereotype.Service;
2021
import org.springframework.transaction.annotation.Transactional;
2122

23+
import java.util.UUID;
24+
2225
@Slf4j
2326
@RequiredArgsConstructor
2427
@Service
@@ -31,7 +34,9 @@ public class InquiryReadService {
3134
* @param inquirySearchRequest
3235
* @return
3336
*/
34-
public PageCustomResponse<InquiryResponse> getInquiriesByMember(InquirySearchRequest inquirySearchRequest) {
37+
public InquiriesListResponse getInquiriesByMember(InquirySearchRequest inquirySearchRequest) {
38+
log.info("내 문의내역 조회: {}", inquirySearchRequest.getMemberPublicId());
39+
3540
Page<InquiryResponse> inquiryResponses = inquiryQueryRepository.getInquiryList(
3641
inquirySearchRequest.getMemberPublicId(),
3742
inquirySearchRequest.getOrderType(),
@@ -40,6 +45,15 @@ public PageCustomResponse<InquiryResponse> getInquiriesByMember(InquirySearchReq
4045
inquirySearchRequest.toPageable()
4146
);
4247

43-
return PageCustomResponse.of(inquiryResponses);
48+
return InquiriesListResponse.createResponse(PageCustomResponse.of(inquiryResponses));
49+
}
50+
51+
/**
52+
* 내 문의하기 수
53+
* @param memberPublicId
54+
* @return
55+
*/
56+
public int getInquiriesCountByMember(UUID memberPublicId) {
57+
return inquiryQueryRepository.getMyInquires(memberPublicId);
4458
}
4559
}

src/main/java/org/myteam/server/inquiry/service/InquiryWriteService.java renamed to src/main/java/org/myteam/server/inquiry/service/InquiryService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
@RequiredArgsConstructor
2020
@Service
2121
@Transactional
22-
public class InquiryWriteService {
22+
public class InquiryService {
2323

2424
private final MemberRepository memberRepository;
2525
private final InquiryRepository inquiryRepository;
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.myteam.server.mypage.controller;
2+
3+
import jakarta.validation.Valid;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.myteam.server.board.dto.reponse.BoardListResponse;
7+
import org.myteam.server.board.dto.request.BoardServiceRequest;
8+
import org.myteam.server.global.web.response.ResponseDto;
9+
import org.myteam.server.inquiry.dto.request.InquirySearchRequest;
10+
import org.myteam.server.inquiry.dto.response.InquiriesListResponse;
11+
import org.myteam.server.inquiry.service.InquiryReadService;
12+
import org.myteam.server.mypage.dto.request.MyPageRequest.BoardRequest;
13+
import org.myteam.server.mypage.dto.response.MyPageResponse.MemberStatsResponse;
14+
import org.myteam.server.mypage.service.MyPageReadService;
15+
import org.springframework.http.ResponseEntity;
16+
import org.springframework.web.bind.annotation.GetMapping;
17+
import org.springframework.web.bind.annotation.ModelAttribute;
18+
import org.springframework.web.bind.annotation.RequestMapping;
19+
import org.springframework.web.bind.annotation.RestController;
20+
21+
import static org.myteam.server.global.web.response.ResponseStatus.SUCCESS;
22+
23+
@Slf4j
24+
@RestController
25+
@RequiredArgsConstructor
26+
@RequestMapping("/api/my-page")
27+
public class MyPageController {
28+
29+
private MyPageReadService myPageReadService;
30+
private InquiryReadService inquiryReadService;
31+
32+
@GetMapping
33+
public ResponseEntity<ResponseDto<MemberStatsResponse>> getMyPage() {
34+
MemberStatsResponse response = myPageReadService.getMemberInfo();
35+
36+
return ResponseEntity.ok(new ResponseDto<>(
37+
SUCCESS.name(),
38+
"회원 정보가 조회되었습니다.",
39+
response
40+
));
41+
}
42+
43+
@GetMapping("/board")
44+
public ResponseEntity<ResponseDto<BoardListResponse>> getMyBoard(@ModelAttribute BoardServiceRequest boardRequest) {
45+
BoardListResponse memberPosts = myPageReadService.getMemberPosts(boardRequest);
46+
47+
return ResponseEntity.ok(new ResponseDto<>(
48+
SUCCESS.name(),
49+
"내가 쓴 게시물이 조회되었습니다.",
50+
memberPosts
51+
));
52+
}
53+
54+
@GetMapping("/inquiry")
55+
public ResponseEntity<ResponseDto<InquiriesListResponse>> getMyInquiry(@ModelAttribute @Valid InquirySearchRequest request) {
56+
InquiriesListResponse inquiriesListResponse = inquiryReadService.getInquiriesByMember(request);
57+
58+
return ResponseEntity.ok(new ResponseDto<>(
59+
SUCCESS.name(),
60+
"내가 쓴 문의내역이 조회되었습니다.",
61+
inquiriesListResponse
62+
));
63+
}
64+
65+
66+
}

0 commit comments

Comments
 (0)