Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ private void consumePurchasedPencils(Member buyer, long unpaidPencil) {
long available = purchasedPencil.getRemainQuantity();
long toConsume = Math.min(available, remainingToConsume);

purchasedPencil.decreaseRemainQuantity(toConsume); // remainQuantity -= toConsume
purchasedPencil.decreaseUsedQuantity(toConsume); // remainQuantity -= toConsume
remainingToConsume -= toConsume;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,13 @@ public void handleSuccessfulApplePurchase(AppleIAPPurchaseRequest request, Membe
Long pencilAmount = request.getPencilQuantity();

String title = createTitle(pencilAmount);
purchasedPencilUpdater.save(PurchasedPencil.successOf(member, title, pencilAmount, request.getPrice(),
request.getPlayTime(), transactionId, request.getAppAccountToken(), now));
PencilAccount buyer = pencilAccountFinder.findByMemberWithLock(member);
buyer.increasePurchasedBalance(pencilAmount);

purchasedPencilUpdater.save(
PurchasedPencil.successOf(member, title, pencilAmount, buyer.getTotalBalance(), request.getPrice(),
request.getPlayTime(), transactionId, request.getAppAccountToken(), now));

pencilAccountFinder.findByMemberWithLock(member).increasePurchasedBalance(pencilAmount);
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
@Getter
public class AcquiredPencilResponse {

private Long acquiredPencilId;
private String content;
private Long sharedNoteId;
private Long acquiredQuantity;
private boolean isRead;
private String type;
private LocalDateTime createdAt;
private final Long acquiredPencilId;
private final String content;
private final Long sharedNoteId;
private final Long acquiredQuantity;
private final boolean isRead;
private final String type;
private final LocalDateTime createdAt;

@Builder
public AcquiredPencilResponse(Long acquiredPencilId, String content, Long sharedNoteId, Long acquiredQuantity,
Expand All @@ -31,7 +31,7 @@ public AcquiredPencilResponse(Long acquiredPencilId, String content, Long shared

public static AcquiredPencilResponse from(AcquiredPencil acquiredPencil) {
return AcquiredPencilResponse.builder()
.acquiredPencilId(acquiredPencil.getAcquiredPencilId())
.acquiredPencilId(acquiredPencil.getId())
.content(acquiredPencil.getContent())
.sharedNoteId(acquiredPencil.getSharedNoteId())
.acquiredQuantity(acquiredPencil.getAcquiredQuantity())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@

@Getter
public class PurchasedPencilResponse {
private Long purchasePencilId;
private Long purchaseQuantity;
private Long remainQuantity;
private String title;
private Long price;
private LocalDateTime purchasedAt;
private final Long purchasePencilId;
private final Long purchaseQuantity;
private final Long remainQuantity;
private final String title;
private final Long price;
private final LocalDateTime purchasedAt;

@Builder
public PurchasedPencilResponse(Long purchasePencilId, Long purchaseQuantity, Long remainQuantity,
Expand All @@ -28,7 +28,7 @@ public PurchasedPencilResponse(Long purchasePencilId, Long purchaseQuantity, Lon

public static PurchasedPencilResponse from(PurchasedPencil purchasedPencil) {
return PurchasedPencilResponse.builder()
.purchasePencilId(purchasedPencil.getPurchasedPencilId())
.purchasePencilId(purchasedPencil.getId())
.purchaseQuantity(purchasedPencil.getPurchaseQuantity())
.remainQuantity(purchasedPencil.getRemainQuantity())
.title(purchasedPencil.getTitle())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
import org.springframework.transaction.annotation.Transactional;

import lombok.RequiredArgsConstructor;
import umc.th.juinjang.domain.note.shared.model.ViewCountPolicy;
import umc.th.juinjang.api.pencil.service.AcquiredPencilUpdater;
import umc.th.juinjang.api.pencilAccount.service.PencilAccountFinder;
import umc.th.juinjang.domain.member.model.Member;
import umc.th.juinjang.domain.note.shared.model.ViewCountPolicy;
import umc.th.juinjang.domain.pencil.acquired.model.AcquiredPencil;
import umc.th.juinjang.domain.pencil.acquired.model.AcquiredType;
import umc.th.juinjang.domain.pencilaccount.model.PencilAccount;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.time.LocalDateTime;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
Expand All @@ -24,7 +25,8 @@ public class AcquiredPencil extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long acquiredPencilId;
@Column(name = "acquired_pencil_id")
private Long id;

@ManyToOne
@JoinColumn(name = "member_id", nullable = false)
Expand All @@ -42,8 +44,8 @@ public class AcquiredPencil extends BaseEntity {
private AcquiredType type; // Note, Add, Sold

@Builder
private AcquiredPencil(Member member, String content, Long sharedNoteId, Long acquiredQuantity, boolean isRead,
AcquiredType type, LocalDateTime createdAt) {
private AcquiredPencil(Member member, String content, Long sharedNoteId, Long acquiredQuantity, Long remainQuantity,
boolean isRead, AcquiredType type, LocalDateTime createdAt) {
this.member = member;
this.content = content;
this.sharedNoteId = sharedNoteId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,19 @@ public class PurchasedPencil {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long purchasedPencilId;
@Column(name = "purchased_pencil_id")
private Long id;

@ManyToOne
@JoinColumn(name = "member_id", nullable = false)
private Member member;

private String title;
private Long purchaseQuantity;
@Comment("구매 후 사용자에게 남은 연필의 개수")
private Long remainQuantity;
@Comment("구매 후 사용하고 남은 연필의 개수")
private Long usedQuantity;
private Long price;

@Comment("애플 인앱 결제에서, 프론트에서 전달해주는 트랜잭션 아이디")
Expand All @@ -48,9 +52,11 @@ public class PurchasedPencil {
@Comment("애플 인앱 결제에서, 프론트에서 전달해주는 애플 앱 토큰")
private UUID appAccountToken;

@Comment("해당 결제한 연필이 정상적으로 고객에게 전달됐는 지 여부")
@Convert(converter = DeliveryStatusConverter.class)
private DeliveryStatus deliveryStatus;

@Comment("트랜잭션이 정상적으로 진행됐는 가 여부")
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private TransactionStatus transactionStatus;
Expand All @@ -65,14 +71,15 @@ public class PurchasedPencil {
private LocalDateTime updatedAt;

@Builder
public PurchasedPencil(Member member, String title, Long purchaseQuantity,
public PurchasedPencil(Member member, String title, Long purchaseQuantity, Long usedQuantity,
Long remainQuantity, TransactionStatus transactionStatus, Integer playTime,
Long price, String transactionId, UUID appAccountToken, DeliveryStatus deliveryStatus,
LocalDateTime purchasedAt) {
this.member = member;
this.title = title;
this.purchaseQuantity = purchaseQuantity;
this.remainQuantity = remainQuantity;
this.usedQuantity = usedQuantity;
this.price = price;
this.playTime = playTime;
this.transactionId = transactionId;
Expand All @@ -82,23 +89,6 @@ public PurchasedPencil(Member member, String title, Long purchaseQuantity,
this.purchasedAt = purchasedAt;
}

public void decreaseRemainQuantity(long quantity) {
this.remainQuantity -= quantity;
}

public void markAsSuccess(){
this.transactionStatus = TransactionStatus.SUCCESS;
this.deliveryStatus = DeliveryStatus.DELIVERY_SUCCESS;
}

public void markAsRefund(){
this.transactionStatus = TransactionStatus.REFUNDED;
}

public void updateRetryCount(Long retryCount) {
this.retryCount = retryCount;
}

private static PurchasedPencilBuilder baseBuilder(
Member member, String title, Long quantity, Long price,
Integer playTime, String transactionId, UUID token, LocalDateTime purchasedAt
Expand All @@ -107,7 +97,7 @@ private static PurchasedPencilBuilder baseBuilder(
.member(member)
.title(title)
.purchaseQuantity(quantity)
.remainQuantity(quantity)
.usedQuantity(quantity)
.price(price)
.playTime(playTime)
.transactionId(transactionId)
Expand All @@ -116,12 +106,13 @@ private static PurchasedPencilBuilder baseBuilder(
}

// ✅ 결제 성공
public static PurchasedPencil successOf(Member member, String title, Long quantity,
public static PurchasedPencil successOf(Member member, String title, Long quantity, Long remainQuantity,
Long price, Integer playTime, String transactionId,
UUID token, LocalDateTime purchasedAt) {
return baseBuilder(member, title, quantity, price, playTime, transactionId, token, purchasedAt)
.transactionStatus(TransactionStatus.SUCCESS)
.deliveryStatus(DeliveryStatus.DELIVERY_SUCCESS)
.remainQuantity(remainQuantity)
.build();
}

Expand All @@ -131,6 +122,7 @@ public static PurchasedPencil failedDueToServerError(Member member, String title
return baseBuilder(member, title, quantity, price, playTime, transactionId, token, purchasedAt)
.transactionStatus(TransactionStatus.DB_FAILED)
.deliveryStatus(DeliveryStatus.SERVER_ERROR)
.remainQuantity(0L)
.build();
}

Expand All @@ -140,8 +132,26 @@ public static PurchasedPencil failedDueToValidation(Member member, String title,
return baseBuilder(member, title, quantity, price, playTime, transactionId, token, purchasedAt)
.transactionStatus(TransactionStatus.VALIDATION_FAILED)
.deliveryStatus(DeliveryStatus.OTHER_REASONS)
.remainQuantity(0L)
.build();
}

public void decreaseUsedQuantity(long quantity) {
this.usedQuantity -= quantity;
}

public void markAsSuccess() {
this.transactionStatus = TransactionStatus.SUCCESS;
this.deliveryStatus = DeliveryStatus.DELIVERY_SUCCESS;
}

public void markAsRefund() {
this.transactionStatus = TransactionStatus.REFUNDED;
}

public void updateRetryCount(Long retryCount) {
this.retryCount = retryCount;
}
}


Loading