Skip to content

Commit

Permalink
feat: nft 생성 로직 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
junseokkim committed Nov 16, 2023
1 parent 8c6d6d2 commit da075ee
Show file tree
Hide file tree
Showing 10 changed files with 68 additions and 86 deletions.
15 changes: 0 additions & 15 deletions src/main/java/zerobibim/flory/domain/Image/entity/Image.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,23 +21,8 @@ public class Image extends BaseTime {

private String ipfsUrl;

private Long senderId;

private Long receiverId;

private Boolean isNFT;

@Builder
public Image(String url) {
this.url = url;
this.senderId = null;
this.receiverId = null;
this.isNFT = Boolean.FALSE;
}

public void updateImage(Long senderId, Long receiverId) {
this.senderId = senderId;
this.receiverId = receiverId;
this.isNFT = Boolean.TRUE;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,6 @@ private String uploadImage(final MultipartFile flowerImage) {
return s3ImageComponent.uploadImage("flower-image", flowerImage);
}

@Transactional
public void makeNft(Long imageId, Long senderId, Long receiverId) {
Image image = loadEntity(imageId);
image.updateImage(senderId, receiverId);
}

@Override
public Image loadEntity(Long id) {
Optional<Image> image = imageRepository.findImageById(id);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,25 +1,16 @@
package zerobibim.flory.domain.contract.service;

import org.springframework.beans.factory.annotation.Value;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.web3j.abi.EventEncoder;
import org.web3j.abi.datatypes.generated.Uint256;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameter;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.response.*;
import zerobibim.flory.domain.contract.NFT;
import zerobibim.flory.domain.contract.dto.NFTRequestDto;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;

@Slf4j
@RequiredArgsConstructor
@Service("web3jService")
@Service
public class Web3jService {

private final NFT nft;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import zerobibim.flory.domain.purchase.dto.response.NftImageResponse;
import zerobibim.flory.domain.purchase.dto.request.PurchaseCreateRequest;
import zerobibim.flory.domain.purchase.dto.response.PurchaseIdResponse;
import zerobibim.flory.domain.purchase.service.PurchaseService;
import zerobibim.flory.global.common.ApiPayload.ApiResponse;

import java.util.List;

@Tag(name = "Purchase API" , description = "구매 관련 API")
@RestController
@RequiredArgsConstructor
Expand All @@ -29,4 +29,10 @@ public class PurchaseController {
public ApiResponse<PurchaseIdResponse> createPurchase(@RequestBody PurchaseCreateRequest request) {
return ApiResponse.onSuccess(purchaseService.createPurchase(request));
}

@GetMapping("/nft")
@Operation(summary = "받은 nft 이미지 조회 API")
public ApiResponse<List<NftImageResponse>> getNftImages(@RequestParam Long memberId) {
return ApiResponse.onSuccess(purchaseService.getNftImages(memberId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package zerobibim.flory.domain.purchase.dto.response;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDate;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class NftImageResponse {
private String url;
private String senderNickname;
private LocalDate receiveDate;
}
23 changes: 8 additions & 15 deletions src/main/java/zerobibim/flory/domain/purchase/entity/Purchase.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

@Entity
@Getter
@Builder
@Where(clause = "deleted_at is null")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
Expand Down Expand Up @@ -43,22 +44,14 @@ public class Purchase extends BaseTime {

private int totalPrice;

private Boolean isDelivered;
private Boolean isNft;

@Builder
public Purchase(Member sender, Member receiver, LocalDate receiveDate,
Flower flower, String receiverName, String receiverAddress,
int flowerCnt, int deliveryTip, int totalPrice) {
this.sender = sender;
this.receiver = receiver;
this.receiveDate = receiveDate;
this.receiverName = receiverName;
this.receiverAddress = receiverAddress;
this.flower = flower;
this.flowerCnt = flowerCnt;
this.deliveryTip = deliveryTip;
this.totalPrice = totalPrice;
this.isDelivered = Boolean.FALSE;
public void setIsNft(LocalDate nowDate) {
if(receiveDate.isAfter(nowDate)) {
this.isNft = Boolean.FALSE;
return;
}
this.isNft = Boolean.TRUE;

}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package zerobibim.flory.domain.purchase.mapper;

import org.springframework.stereotype.Component;
import zerobibim.flory.domain.Image.entity.Image;
import zerobibim.flory.domain.contract.NFT;
import zerobibim.flory.domain.flower.entity.Flower;
import zerobibim.flory.domain.member.entity.Member;
import zerobibim.flory.domain.purchase.dto.response.NftImageResponse;
import zerobibim.flory.domain.purchase.entity.Purchase;

import java.time.LocalDate;
Expand All @@ -16,6 +19,13 @@ public Purchase toEntity(Member sender, Member receiver, LocalDate receiveDate,
.receiveDate(receiveDate)
.flower(flower)
.build();
}

public NftImageResponse toNftImageResponse(Purchase purchase, Image nftImage) {
return NftImageResponse.builder()
.url(nftImage.getUrl())
.senderNickname(purchase.getSender().getNickname())
.receiveDate(purchase.getReceiveDate())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package zerobibim.flory.domain.purchase.repository;

import zerobibim.flory.domain.member.entity.Member;
import zerobibim.flory.domain.purchase.entity.Purchase;

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

public interface PurchaseRepository {

Purchase save(Purchase purchase);
Optional<Purchase> findPurchaseById(Long id);
List<Purchase> findAllByReceiverAndAndIsNftTrue(Member receiver);

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import zerobibim.flory.domain.Image.service.ImageService;
import zerobibim.flory.domain.contract.dto.NFTRequestDto;
import zerobibim.flory.domain.contract.service.Web3jService;
import zerobibim.flory.domain.flower.entity.Flower;
import zerobibim.flory.domain.flower.service.FlowerService;
import zerobibim.flory.domain.member.entity.Member;
import zerobibim.flory.domain.member.service.MemberService;
import zerobibim.flory.domain.purchase.dto.request.PurchaseCreateRequest;
import zerobibim.flory.domain.purchase.dto.response.NftImageResponse;
import zerobibim.flory.domain.purchase.dto.response.PurchaseIdResponse;
import zerobibim.flory.domain.purchase.entity.Purchase;
import zerobibim.flory.domain.purchase.mapper.PurchaseMapper;
Expand All @@ -19,6 +20,8 @@
import zerobibim.flory.global.common.EntityLoader;
import zerobibim.flory.global.common.ExceptionHandler;

import java.time.LocalDate;
import java.util.List;
import java.util.Optional;

@Service
Expand All @@ -28,22 +31,22 @@ public class PurchaseService implements EntityLoader<Purchase, Long> {
private final PurchaseMapper purchaseMapper;
private final MemberService memberService;
private final FlowerService flowerService;
private final ImageService imageService;
private final Web3jService web3jService;

@Transactional
public PurchaseIdResponse createPurchase(PurchaseCreateRequest request) {
Member sender = memberService.loadEntity(request.getMemberId());
Member receiver = memberService.findMemberByNickname(request.getReceiverNickname());
Flower flower = flowerService.loadEntity(request.getFlowerId());
if(flower.getImage() == null) throw new ExceptionHandler(ErrorStatus.NO_IMAGE_IN_FLOWER);

imageService.makeNft(flower.getImage().getId(), sender.getId(), receiver.getId());

Purchase newPurchase = purchaseRepository.save(
purchaseMapper.toEntity(
sender, receiver, request.getReceiveDate(), flower
));

newPurchase.setIsNft(LocalDate.now());

NFTRequestDto.MemberNFTInfo nftInfo = new NFTRequestDto.MemberNFTInfo(receiver.getWalletAddress(), "ipfs://QmZUS5QQK4nSKLFWui54vVp4CJTEBaqfcfBJCry7vjRVCc");
try {
TransactionReceipt transactionReceipt = web3jService.nftCreate(nftInfo);
Expand All @@ -53,6 +56,16 @@ public PurchaseIdResponse createPurchase(PurchaseCreateRequest request) {
return new PurchaseIdResponse(newPurchase.getId());
}

public List<NftImageResponse> getNftImages(Long receiverId) {
Member receiver = memberService.loadEntity(receiverId);
List<Purchase> purchaseList = purchaseRepository.findAllByReceiverAndAndIsNftTrue(receiver);

return purchaseList.stream()
.map(
purchase -> purchaseMapper.toNftImageResponse(purchase, purchase.getFlower().getImage()))
.toList();
}

@Override
public Purchase loadEntity(Long purchaseId) {
Optional<Purchase> purchase = purchaseRepository.findPurchaseById(purchaseId);
Expand Down

0 comments on commit da075ee

Please sign in to comment.