Skip to content

Commit

Permalink
Merge: Main Merge 37차 (#172)
Browse files Browse the repository at this point in the history
* 🐛 Hotfix: 댓글 수정 request dto 추가 (#149)

* Hotfix : 댓글 삭제 시 게시물의 댓글 수 차감 로직 수정 (#151)

* 🐛 Hotfix: 댓글 수정 request dto 추가

* 🐛 Hotfix: 댓글 삭제 시 게시물의 댓글 수 차감 로직 수정

* Feat: 프로필 이모지 설정 로직 구현 (#153)

* 🗃️ profile 속성의 Enum value ProfileEmoji 생성

* 🗃️ profile 속성 ProfileEmoji 설정

* ✨ Feat: 회원 가입 및 정보 수정에 프로필 이모지 설정 로직 추가

* Refactor : 모델 삭제 시 soft delete 구현 (#155)

* 🗃️ versionStatus 속성의 Enum value VersionStatus 생성

* 🗃️ versionStatus 속성 추가

* 👔 모델 삭제 시 sofe delete 구현

* 👔 모델 삭제 시 sofe delete 구현

* Fix: 타 사용자 자소서 조회 시 포인트 사용 로직 수정 (#157)

* 🗃️ coverletter 외래키 추가

* 👔 자소서 조회 포인트 사용 시, point 데이터에 coverletter 삽입 로직 추가

* 👔 자소서 상세 조회 시 포인트를 사용한 자소서인지 나타내는 변수 추가

* Refactor: 댓글 대댓글 계층 구조 적용 (#158)

* 🗃️ 댓글 계층 구조 나타내는 속성 추가

* 🗃️ db 변경 사항에 따른 댓글 작성 로직 수정

* 👔 db 변경 사항에 따른 댓글 목록 조회 로직 수정

* 🔥 필요 없는 메소드 삭제

* 👔 비활성/탈퇴 회원 제거 로직 추가

* 🐛 게시물 작성자 프로필 추가

* 🐛 자기소개서 작성자 정보 추가

* 🐛 경험카드 작성자 정보 추가

* 🐛 게시물 작성자 프로필 추가

* 🐛 댓글 증가 중복 오류 수정

* 🔥 사용 안하는 import문 삭제

* 🐛 게시물 작성자 프로필 추가

* Feat: 타 사용자 조회 시, 공유한 사용자에게 포인트 전달 (#166)

* feat: 포인트 외래키 수정 및 PointType 추가

Related: #165

* feat: 타 사용자 포인트 조회 시, 공유한 사용자에게 포인트 증가 구현

Related: #165

* fix: 마이파에지 포인트 사용내역에서 충전 내역 보이는 오류 해결

Related: #165

* 🗃️ content 속성 자료형 text로 변경

* Refactor: Coverletter 테이블 속성 추가 및 로직 수정 (#170)

* 🗃️ 각 사용자의 자소서의 인덱스 index_member 속성 추가

* ♻️ Refactor: 테이블 구조 변경에 따른 자소서 작성 로직 수정

* ♻️ Refactor: 테이블 구조 변경에 따른 자소서 목록 조회 로직 수정

* Feat: 포인트 적립 내역 조회 API 구현 (#171)

* ✨ Feat: 포인트 적립 내역 조회 service 구현

* ✨ Feat: 포인트 적립 내역 조회 API 구현

* ♻️ 페이징 갯수 수정

---------

Co-authored-by: kylo <[email protected]>
  • Loading branch information
joowojr and kylo-dev authored May 25, 2024
1 parent 1028ad0 commit 14cc3a5
Show file tree
Hide file tree
Showing 13 changed files with 161 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ public PaymentResponse.PaymentResult getPaymentList(int page, int year, int mont
long totalSales = paymentRepository.queryGetTotalSalesByMonth(requestMonth);
String yearMonth = year + "년" + " " + month + "월";

PageRequest pageRequest = PageRequest.of(page, 10, Sort.by("id").descending());
PageRequest pageRequest = PageRequest.of(page, 9, Sort.by("id").descending());
Page<Payment> payments = paymentRepository.queryGetSalesByMonth(requestMonth, pageRequest);

List<PaymentResponse.PaymentItem> paymentList = payments.stream().map(payment -> {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/codez4/meetfolio/domain/board/Board.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public class Board extends BaseTimeEntity {
@Column(nullable = false)
private String title;

@Column(nullable = false)
@Column(columnDefinition = "TEXT", nullable = false)
private String content;

@Column(name = "like_count")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ public class CoverLetter extends BaseTimeEntity {
@Column(columnDefinition = "TEXT", nullable = false)
private String answer;

@Column(name = "index_member")
private Long index;

@Column(nullable = false)
@Enumerated(value = EnumType.STRING)
private ShareType shareType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,7 @@ public ApiResponse<CoverLetterResponse.OtherMemberCoverLetterListResult> getOthe
@RequestParam(value = "page", defaultValue = "0") int page) {
MemberInfo memberInfo = MemberResponse.toMemberInfo(member);
Member other = memberQueryService.findByMemberName(memberName);
return ApiResponse.onSuccess(toOtherMemberCoverLetterListResult(memberInfo,coverLetterQueryService.getOtherCoverLetters(other, page), other
));
return ApiResponse.onSuccess(toOtherMemberCoverLetterListResult(memberInfo, coverLetterQueryService.getOtherCoverLetters(other, page), other));
}

@Operation(summary = "만족도 저장", description = "쿼리 스트링으로 피드백 ID 또는 분석 ID를, request body로 만족도를 전송합니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,23 +50,24 @@ public static class Patch {
private String jobKeyword;
}

@Schema( description = "만족도 DTO")
@Schema(description = "만족도 DTO")
@Getter
public static class SatisfactionRequest{
@Schema(description = "만족도, 0부터 5까지의 정수만 입력 가능합니다." )
public static class SatisfactionRequest {
@Schema(description = "만족도, 0부터 5까지의 정수만 입력 가능합니다.")
@Max(value = 5)
@Min(value = 0)
private int satisfaction;
}

public static CoverLetter toEntity(Member member, CoverLetterRequest.Post request) {
public static CoverLetter toEntity(Member member, CoverLetterRequest.Post request, Long index) {

return CoverLetter.builder()
.question(request.getQuestion())
.answer(request.getAnswer())
.shareType(ShareType.convert(request.getShareType()))
.member(member)
.build();
.question(request.getQuestion())
.answer(request.getAnswer())
.shareType(ShareType.convert(request.getShareType()))
.member(member)
.index(index)
.build();
}

@Getter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,26 +133,24 @@ public static class CoverLetterResult {
private AnalysisInfo analysisInfo;
}

public static CoverLetterListResult toCoverLetterListResult(MemberInfo memberInfo, Page<CoverLetterItem> coverLetters) {
CoverLetterList coverLetterList = toCoverLetterList(coverLetters);
public static CoverLetterListResult toCoverLetterListResult(MemberInfo memberInfo, CoverLetterList coverLetters) {
return CoverLetterListResult.builder()
.memberInfo(memberInfo)
.coverLetterInfo(coverLetterList)
.coverLetterInfo(coverLetters)
.build();
}

public static OtherMemberCoverLetterListResult toOtherMemberCoverLetterListResult(MemberInfo memberInfo, Page<CoverLetterItem> coverLetters, Member other){
CoverLetterList coverLetterList = toCoverLetterList(coverLetters);
public static OtherMemberCoverLetterListResult toOtherMemberCoverLetterListResult(MemberInfo memberInfo, CoverLetterList coverLetters, Member other){
return OtherMemberCoverLetterListResult.builder()
.memberInfo(memberInfo)
.coverLetterInfo(coverLetterList)
.coverLetterInfo(coverLetters)
.memberName(other.getEmail().split("@")[0])
.profile(other.getProfile().name())
.build();
}

public static CoverLetterList toCoverLetterList(Page<CoverLetterItem> coverLetters) {
List<CoverLetterItem> coverLetterItems = coverLetters.stream().toList();
public static CoverLetterList toCoverLetterList(Page<CoverLetter> coverLetters) {
List<CoverLetterItem> coverLetterItems = coverLetters.stream().map(CoverLetterResponse::toCoverLetterItem).toList();
return CoverLetterList.builder()
.coverLetterInfo(coverLetterItems)
.listSize(coverLetterItems.size())
Expand Down Expand Up @@ -199,24 +197,17 @@ public static class CoverLetterItem {
private LocalDateTime createdAt;
}

public static CoverLetterItem toCoverLetterItem(CoverLetter coverLetter, long index) {
public static CoverLetterItem toCoverLetterItem(CoverLetter coverLetter) {
return CoverLetterItem.builder()
.coverLetterId(coverLetter.getId())
.index(index)
.index(coverLetter.getIndex())
.question(coverLetter.getQuestion())
.answer(coverLetter.getAnswer())
.createdAt(coverLetter.getCreatedAt())
.build();

}

public static Page<CoverLetterItem> toPageCoverLetterItem(Page<CoverLetter> coverLetters) {
return coverLetters.map(coverLetter -> {
long index = coverLetters.getNumberOfElements() - coverLetters.getContent().indexOf(coverLetter);
return toCoverLetterItem(coverLetter, index);
});
}

@Schema(description = "자기소개서 작성 & 수정 & 삭제 응답 DTO")
@Builder
@AllArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.data.jpa.repository.Query;

import java.util.List;
import java.util.Optional;

public interface CoverLetterRepository extends JpaRepository<CoverLetter, Long> {

Expand All @@ -18,4 +19,5 @@ public interface CoverLetterRepository extends JpaRepository<CoverLetter, Long>

@Query("SELECT c FROM CoverLetter c WHERE c.member = :member and c.shareType = 'PUBLIC' and c.status = 'ACTIVE'")
Page<CoverLetter> findPublicAndActiveCoverLetterByMember(Member member, Pageable pageable);
Optional<CoverLetter> findFirstByMemberOrderByIdDesc(Member member);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

@Service
@RequiredArgsConstructor
@Transactional
Expand All @@ -23,8 +25,9 @@ public class CoverLetterCommandService {
private final FeedbackCommandService feedbackCommandService;

public CoverLetterProc write(Member member, CoverLetterRequest.Post request) {

CoverLetter coverLetter = save(CoverLetterRequest.toEntity(member, request));
Optional<CoverLetter> lastCoverLetter = coverLetterRepository.findFirstByMemberOrderByIdDesc(member);
Long index = lastCoverLetter.isEmpty() ? 0L : lastCoverLetter.get().getIndex();
CoverLetter coverLetter = save(CoverLetterRequest.toEntity(member, request, index+1));

return CoverLetterResponse.toCoverLetterProc(coverLetter.getId());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import static com.codez4.meetfolio.domain.coverLetter.dto.CoverLetterResponse.toCoverLetterList;

@Slf4j
@Service
@RequiredArgsConstructor
Expand Down Expand Up @@ -44,21 +46,21 @@ public CoverLetter findById(Long coverLetterId) {
);
}

public Page<CoverLetterResponse.CoverLetterItem> getMyCoverLetters(Member member,
public CoverLetterResponse.CoverLetterList getMyCoverLetters(Member member,
int page) {
PageRequest pageRequest = PageRequest.of(page, 4, Sort.by("id").descending());
Page<CoverLetter> coverLetters = coverLetterRepository.findActiveByMember(member,
pageRequest);
return CoverLetterResponse.toPageCoverLetterItem(coverLetters);
return toCoverLetterList(coverLetters);
}

public Page<CoverLetterResponse.CoverLetterItem> getOtherCoverLetters(Member other,
int page) {
public CoverLetterResponse.CoverLetterList getOtherCoverLetters(Member other,
int page) {
PageRequest pageRequest = PageRequest.of(page, 4, Sort.by("id").descending());

Page<CoverLetter> otherCoverLetters = coverLetterRepository.findPublicAndActiveCoverLetterByMember(
other,
pageRequest);
return CoverLetterResponse.toPageCoverLetterItem(otherCoverLetters);
return toCoverLetterList(otherCoverLetters);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,17 @@ public ApiResponse<PointResponse.MemberPoint> getMyPoint(@AuthenticationMember M
}

@Operation(summary = "마이페이지 - 포인트 사용 내역 조회", description = "마이페이지의 포인트 사용 내역을 조회합니다.")
@GetMapping("/my-points")
@GetMapping("/my-points/usage")
public ApiResponse<PointResponse.PointResult> getMyPointList(@AuthenticationMember Member member, @RequestParam(value = "page", defaultValue = "0") int page) {
return ApiResponse.onSuccess(pointQueryService.getMyPointList(page, member));
}

@Operation(summary = "마이페이지 - 포인트 적립 내역 조회", description = "마이페이지의 포인트 적립 내역을 조회합니다.")
@GetMapping("/my-points/saving")
public ApiResponse<PointResponse.EarnedPointResult> getMyEarnedPointList(@AuthenticationMember Member member, @RequestParam(value = "page", defaultValue = "0") int page) {
return ApiResponse.onSuccess(pointQueryService.getMyEarnedPointList(page, member));
}

@Operation(summary = "포인트 사용", description = "자소서 조회 / AI 서비스 이용을 위해 포인트를 사용합니다.")
@Parameter(name = "memberId", description = "자소서 Id, Path Variable입니다.", required = true, example = "1", in = ParameterIn.PATH)
@PostMapping("/coverLetters/{coverLetterId}/points")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.codez4.meetfolio.domain.point.dto;

import com.codez4.meetfolio.domain.coverLetter.CoverLetter;
import com.codez4.meetfolio.domain.member.Member;
import com.codez4.meetfolio.domain.member.dto.MemberResponse;
import com.codez4.meetfolio.domain.point.Point;
Expand Down Expand Up @@ -28,11 +29,55 @@ public static class PointResult {
@Schema(description = "로그인 사용자 정보")
private MemberResponse.MemberInfo memberInfo;

@Schema(description = "결제 내역")
@Schema(description = "포인트 내역")
private PointResponse.PointInfo pointInfo;

}

@Schema(description = "포인트 적립 내역 목록 응답 DTO")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public static class EarnedPointResult {

@Schema(description = "로그인 사용자 정보")
private MemberResponse.MemberInfo memberInfo;

@Schema(description = "적립 내역")
private PointResponse.EarnedPointInfo pointInfo;

}

@Schema(description = "적립 내역 목록 DTO")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public static class EarnedPointInfo {

@Schema(description = "내 포인트")
private int myPoint;

@Schema(description = "적립 내역 목록")
private List<PointResponse.EarnedPointItem> pointList;

@Schema(description = "페이징된 리스트의 항목 개수")
private Integer listSize;

@Schema(description = "총 페이징 수 ")
private Integer totalPage;

@Schema(description = "전체 데이터의 개수")
private Long totalElements;

@Schema(description = "첫 페이지의 여부")
private Boolean isFirst;

@Schema(description = "마지막 페이지의 여부")
private Boolean isLast;
}

@Schema(description = "결제 내역 목록 DTO")
@Builder
@AllArgsConstructor
Expand Down Expand Up @@ -62,7 +107,7 @@ public static class PointInfo {
private Boolean isLast;
}

@Schema(description = "포인트 내역 목록 DTO")
@Schema(description = "포인트 내역 DTO")
@Builder
@AllArgsConstructor
@NoArgsConstructor
Expand All @@ -83,6 +128,27 @@ public static class PointItem {
private int totalPoint;
}

@Schema(description = "포인트 적립 DTO")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
public static class EarnedPointItem {

@Schema(description = "적립일시")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yy-MM-dd kk:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime createdAt;

@Schema(description = "적립 포인트")
private int point;

@Schema(description = "자소서 번호")
private long coverLetterId;

@Schema(description = "적립 후 포인트")
private int totalPoint;
}

@Schema(description = "포인트 응답 DTO")
@Builder
@AllArgsConstructor
Expand Down Expand Up @@ -120,6 +186,14 @@ public static PointResult toPointResult(Member member, Page<Point> points) {

}

public static EarnedPointResult toEarnedPointResult(Member member, Page<Point> points) {
return EarnedPointResult.builder()
.memberInfo(toMemberInfo(member))
.pointInfo(toEarnedPointInfo(member.getPoint(), points))
.build();

}

public static PointInfo toPointInfo(int myPoint, Page<Point> points) {
List<PointItem> pointList = points.stream().map(PointResponse::toPointItem).toList();
return PointInfo.builder()
Expand All @@ -133,6 +207,19 @@ public static PointInfo toPointInfo(int myPoint, Page<Point> points) {
.build();
}

public static EarnedPointInfo toEarnedPointInfo(int myPoint, Page<Point> points) {
List<EarnedPointItem> pointList = points.stream().map(PointResponse::toEarnedPointItem).toList();
return EarnedPointInfo.builder()
.myPoint(myPoint)
.pointList(pointList)
.listSize(pointList.size())
.totalPage(points.getTotalPages())
.totalElements(points.getTotalElements())
.isFirst(points.isFirst())
.isLast(points.isLast())
.build();
}

public static PointProc toPointProc(Point point) {
return PointProc.builder()
.pointId(point.getId())
Expand All @@ -149,6 +236,16 @@ public static PointItem toPointItem(Point point) {
.build();
}

public static EarnedPointItem toEarnedPointItem(Point point) {
CoverLetter coverLetter = point.getCoverLetter();
return EarnedPointItem.builder()
.createdAt(point.getCreatedAt())
.point(point.getPoint())
.coverLetterId(coverLetter.getIndex())
.totalPoint(point.getTotalPoint())
.build();
}

public static MemberPoint toMemberPoint(Member member) {
return MemberPoint.builder()
.memberName(member.getEmail().split("@")[0])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@ public interface PointRepository extends JpaRepository<Point, Long> {

Page<Point> findByMemberAndPointType(Member member, PointType pointType, Pageable pageable);

@Query("SELECT p FROM Point p WHERE p.member = :member AND p.pointType <> 'CHARGE'")
@Query("SELECT p FROM Point p WHERE p.member = :member AND p.pointType != 'CHARGE' AND p.pointType != 'SHARE_COVER_LETTER'")
Page<Point> getPointByMember(Member member, Pageable pageable);

@Query("SELECT p FROM Point p WHERE p.member = :member AND p.pointType = 'SHARE_COVER_LETTER'")
Page<Point> getEarnedPointByMember(Member member, Pageable pageable);

Optional<Point> getPointByPayment(Payment payment);

@Query("SELECT IFNULL(MAX(POINTSUM.POINT), 0) FROM (SELECT DATE_FORMAT(p.createdAt, '%Y-%c') AS MONTH, sum(p.point) AS POINT FROM Point p WHERE p.pointType = :type GROUP BY MONTH) AS POINTSUM WHERE POINTSUM.MONTH =:month")
Expand Down
Loading

0 comments on commit 14cc3a5

Please sign in to comment.