From da075ee5d3df220d67a0c78874942c54b172dbc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A4=80=EC=8D=A8=ED=81=AC?= Date: Thu, 16 Nov 2023 18:51:04 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20nft=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flory/domain/Image/entity/Image.java | 15 --------- .../domain/Image/service/ImageService.java | 6 ---- .../contract/controller/NftController.java | 32 ------------------- .../domain/contract/service/Web3jService.java | 11 +------ .../controller/PurchaseController.java | 14 +++++--- .../dto/response/NftImageResponse.java | 18 +++++++++++ .../domain/purchase/entity/Purchase.java | 23 +++++-------- .../purchase/mapper/PurchaseMapper.java | 10 ++++++ .../repository/PurchaseRepository.java | 4 +++ .../purchase/service/PurchaseService.java | 21 +++++++++--- 10 files changed, 68 insertions(+), 86 deletions(-) delete mode 100644 src/main/java/zerobibim/flory/domain/contract/controller/NftController.java create mode 100644 src/main/java/zerobibim/flory/domain/purchase/dto/response/NftImageResponse.java diff --git a/src/main/java/zerobibim/flory/domain/Image/entity/Image.java b/src/main/java/zerobibim/flory/domain/Image/entity/Image.java index 662018c..8ad4d91 100644 --- a/src/main/java/zerobibim/flory/domain/Image/entity/Image.java +++ b/src/main/java/zerobibim/flory/domain/Image/entity/Image.java @@ -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; } } diff --git a/src/main/java/zerobibim/flory/domain/Image/service/ImageService.java b/src/main/java/zerobibim/flory/domain/Image/service/ImageService.java index e645fc4..db06bc0 100644 --- a/src/main/java/zerobibim/flory/domain/Image/service/ImageService.java +++ b/src/main/java/zerobibim/flory/domain/Image/service/ImageService.java @@ -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 = imageRepository.findImageById(id); diff --git a/src/main/java/zerobibim/flory/domain/contract/controller/NftController.java b/src/main/java/zerobibim/flory/domain/contract/controller/NftController.java deleted file mode 100644 index 70a11e9..0000000 --- a/src/main/java/zerobibim/flory/domain/contract/controller/NftController.java +++ /dev/null @@ -1,32 +0,0 @@ -package zerobibim.flory.domain.contract.controller; - -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import zerobibim.flory.domain.contract.NFT; -import zerobibim.flory.domain.contract.NFT.*; - -import java.math.BigInteger; - -@RestController -@RequestMapping("/api/nft") -public class NftController { - private final NFT nft; - - @Autowired - public NftController(NFT nft) { - this.nft = nft; - } - - // Define your API endpoints here - @PostMapping("/mint") - public String mintToken(@RequestParam String to, @RequestParam BigInteger tokenId, @RequestParam String uri) { - try { - // Mint a new token - return "Token minted successfully"; - } catch (Exception e) { - // Handle exceptions appropriately (e.g., log the error) - return "Error minting token: " + e.getMessage(); - } - } -} diff --git a/src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java b/src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java index 87543e7..c35015b 100644 --- a/src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java +++ b/src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java @@ -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; diff --git a/src/main/java/zerobibim/flory/domain/purchase/controller/PurchaseController.java b/src/main/java/zerobibim/flory/domain/purchase/controller/PurchaseController.java index 54e36b0..8304024 100644 --- a/src/main/java/zerobibim/flory/domain/purchase/controller/PurchaseController.java +++ b/src/main/java/zerobibim/flory/domain/purchase/controller/PurchaseController.java @@ -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 @@ -29,4 +29,10 @@ public class PurchaseController { public ApiResponse createPurchase(@RequestBody PurchaseCreateRequest request) { return ApiResponse.onSuccess(purchaseService.createPurchase(request)); } + + @GetMapping("/nft") + @Operation(summary = "받은 nft 이미지 조회 API") + public ApiResponse> getNftImages(@RequestParam Long memberId) { + return ApiResponse.onSuccess(purchaseService.getNftImages(memberId)); + } } diff --git a/src/main/java/zerobibim/flory/domain/purchase/dto/response/NftImageResponse.java b/src/main/java/zerobibim/flory/domain/purchase/dto/response/NftImageResponse.java new file mode 100644 index 0000000..1a40f80 --- /dev/null +++ b/src/main/java/zerobibim/flory/domain/purchase/dto/response/NftImageResponse.java @@ -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; +} diff --git a/src/main/java/zerobibim/flory/domain/purchase/entity/Purchase.java b/src/main/java/zerobibim/flory/domain/purchase/entity/Purchase.java index 94888da..421495e 100644 --- a/src/main/java/zerobibim/flory/domain/purchase/entity/Purchase.java +++ b/src/main/java/zerobibim/flory/domain/purchase/entity/Purchase.java @@ -11,6 +11,7 @@ @Entity @Getter +@Builder @Where(clause = "deleted_at is null") @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @@ -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; } } diff --git a/src/main/java/zerobibim/flory/domain/purchase/mapper/PurchaseMapper.java b/src/main/java/zerobibim/flory/domain/purchase/mapper/PurchaseMapper.java index a48438d..7977d15 100644 --- a/src/main/java/zerobibim/flory/domain/purchase/mapper/PurchaseMapper.java +++ b/src/main/java/zerobibim/flory/domain/purchase/mapper/PurchaseMapper.java @@ -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; @@ -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(); } } diff --git a/src/main/java/zerobibim/flory/domain/purchase/repository/PurchaseRepository.java b/src/main/java/zerobibim/flory/domain/purchase/repository/PurchaseRepository.java index fa44d89..b72b610 100644 --- a/src/main/java/zerobibim/flory/domain/purchase/repository/PurchaseRepository.java +++ b/src/main/java/zerobibim/flory/domain/purchase/repository/PurchaseRepository.java @@ -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 findPurchaseById(Long id); + List findAllByReceiverAndAndIsNftTrue(Member receiver); + } diff --git a/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java b/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java index b201a6c..63a60f0 100644 --- a/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java +++ b/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java @@ -2,8 +2,8 @@ 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; @@ -11,6 +11,7 @@ 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; @@ -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 @@ -28,22 +31,22 @@ public class PurchaseService implements EntityLoader { 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); @@ -53,6 +56,16 @@ public PurchaseIdResponse createPurchase(PurchaseCreateRequest request) { return new PurchaseIdResponse(newPurchase.getId()); } + public List getNftImages(Long receiverId) { + Member receiver = memberService.loadEntity(receiverId); + List purchaseList = purchaseRepository.findAllByReceiverAndAndIsNftTrue(receiver); + + return purchaseList.stream() + .map( + purchase -> purchaseMapper.toNftImageResponse(purchase, purchase.getFlower().getImage())) + .toList(); + } + @Override public Purchase loadEntity(Long purchaseId) { Optional purchase = purchaseRepository.findPurchaseById(purchaseId); From af0cec5fd61828153cad68ab8d012fc70bbda890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A4=80=EC=8D=A8=ED=81=AC?= Date: Fri, 17 Nov 2023 17:31:21 +0900 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20nft=20=EC=A3=BC=EC=84=9D=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/contract/service/Web3jService.java | 50 +++++++++---------- .../purchase/service/PurchaseService.java | 16 +++--- .../flory/global/config/SwaggerConfig.java | 48 +++++++++--------- 3 files changed, 57 insertions(+), 57 deletions(-) diff --git a/src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java b/src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java index c35015b..fac5d2f 100644 --- a/src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java +++ b/src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java @@ -1,25 +1,25 @@ -package zerobibim.flory.domain.contract.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.web3j.protocol.core.methods.response.*; -import zerobibim.flory.domain.contract.NFT; -import zerobibim.flory.domain.contract.dto.NFTRequestDto; - - -@Slf4j -@RequiredArgsConstructor -@Service -public class Web3jService { - - private final NFT nft; - - public TransactionReceipt nftCreate(NFTRequestDto.MemberNFTInfo memberNFTInfo) throws Exception { - - return nft.create(memberNFTInfo.getWalletAddress(), memberNFTInfo.getIpfsUrl()) - .sendAsync() - .get(); - } - -} \ No newline at end of file +//package zerobibim.flory.domain.contract.service; +// +//import lombok.RequiredArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.stereotype.Service; +//import org.web3j.protocol.core.methods.response.*; +//import zerobibim.flory.domain.contract.NFT; +//import zerobibim.flory.domain.contract.dto.NFTRequestDto; +// +// +//@Slf4j +//@RequiredArgsConstructor +//@Service +//public class Web3jService { +// +// private final NFT nft; +// +// public TransactionReceipt nftCreate(NFTRequestDto.MemberNFTInfo memberNFTInfo) throws Exception { +// +// return nft.create(memberNFTInfo.getWalletAddress(), memberNFTInfo.getIpfsUrl()) +// .sendAsync() +// .get(); +// } +// +//} \ No newline at end of file diff --git a/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java b/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java index 63a60f0..c52748a 100644 --- a/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java +++ b/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java @@ -5,7 +5,7 @@ import org.springframework.transaction.annotation.Transactional; import org.web3j.protocol.core.methods.response.TransactionReceipt; import zerobibim.flory.domain.contract.dto.NFTRequestDto; -import zerobibim.flory.domain.contract.service.Web3jService; +//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; @@ -31,7 +31,7 @@ public class PurchaseService implements EntityLoader { private final PurchaseMapper purchaseMapper; private final MemberService memberService; private final FlowerService flowerService; - private final Web3jService web3jService; +// private final Web3jService web3jService; @Transactional public PurchaseIdResponse createPurchase(PurchaseCreateRequest request) { @@ -47,12 +47,12 @@ public PurchaseIdResponse createPurchase(PurchaseCreateRequest request) { newPurchase.setIsNft(LocalDate.now()); - NFTRequestDto.MemberNFTInfo nftInfo = new NFTRequestDto.MemberNFTInfo(receiver.getWalletAddress(), "ipfs://QmZUS5QQK4nSKLFWui54vVp4CJTEBaqfcfBJCry7vjRVCc"); - try { - TransactionReceipt transactionReceipt = web3jService.nftCreate(nftInfo); - } catch (Exception e) { - throw new RuntimeException(e); - } +// NFTRequestDto.MemberNFTInfo nftInfo = new NFTRequestDto.MemberNFTInfo(receiver.getWalletAddress(), "ipfs://QmZUS5QQK4nSKLFWui54vVp4CJTEBaqfcfBJCry7vjRVCc"); +// try { +// TransactionReceipt transactionReceipt = web3jService.nftCreate(nftInfo); +// } catch (Exception e) { +// throw new RuntimeException(e); +// } return new PurchaseIdResponse(newPurchase.getId()); } diff --git a/src/main/java/zerobibim/flory/global/config/SwaggerConfig.java b/src/main/java/zerobibim/flory/global/config/SwaggerConfig.java index e1f73d6..b3b5dbb 100644 --- a/src/main/java/zerobibim/flory/global/config/SwaggerConfig.java +++ b/src/main/java/zerobibim/flory/global/config/SwaggerConfig.java @@ -1,24 +1,24 @@ -package zerobibim.flory.global.config; - -import io.swagger.v3.oas.models.Components; -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Info; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class SwaggerConfig { - @Bean - public OpenAPI openAPI() { - return new OpenAPI() - .components(new Components()) - .info(apiInfo()); - } - - private Info apiInfo() { - return new Info() - .title("Swagger for flory") - .description("Springdoc을 사용한 Swagger UI for flory") - .version("1.0.0"); - } -} \ No newline at end of file +//package zerobibim.flory.global.config; +// +//import io.swagger.v3.oas.models.Components; +//import io.swagger.v3.oas.models.OpenAPI; +//import io.swagger.v3.oas.models.info.Info; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +// +//@Configuration +//public class SwaggerConfig { +// @Bean +// public OpenAPI openAPI() { +// return new OpenAPI() +// .components(new Components()) +// .info(apiInfo()); +// } +// +// private Info apiInfo() { +// return new Info() +// .title("Swagger for flory") +// .description("Springdoc을 사용한 Swagger UI for flory") +// .version("1.0.0"); +// } +//} \ No newline at end of file From a8bfcd3b346f118f8b5aad55a80b250dbb4f78ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A4=80=EC=8D=A8=ED=81=AC?= Date: Fri, 17 Nov 2023 17:34:46 +0900 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20nft=20=EC=A3=BC=EC=84=9D=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flory/global/config/SwaggerConfig.java | 48 +++++----- .../flory/global/config/Web3jConfig.java | 94 +++++++++---------- 2 files changed, 71 insertions(+), 71 deletions(-) diff --git a/src/main/java/zerobibim/flory/global/config/SwaggerConfig.java b/src/main/java/zerobibim/flory/global/config/SwaggerConfig.java index b3b5dbb..e1f73d6 100644 --- a/src/main/java/zerobibim/flory/global/config/SwaggerConfig.java +++ b/src/main/java/zerobibim/flory/global/config/SwaggerConfig.java @@ -1,24 +1,24 @@ -//package zerobibim.flory.global.config; -// -//import io.swagger.v3.oas.models.Components; -//import io.swagger.v3.oas.models.OpenAPI; -//import io.swagger.v3.oas.models.info.Info; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -// -//@Configuration -//public class SwaggerConfig { -// @Bean -// public OpenAPI openAPI() { -// return new OpenAPI() -// .components(new Components()) -// .info(apiInfo()); -// } -// -// private Info apiInfo() { -// return new Info() -// .title("Swagger for flory") -// .description("Springdoc을 사용한 Swagger UI for flory") -// .version("1.0.0"); -// } -//} \ No newline at end of file +package zerobibim.flory.global.config; + +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SwaggerConfig { + @Bean + public OpenAPI openAPI() { + return new OpenAPI() + .components(new Components()) + .info(apiInfo()); + } + + private Info apiInfo() { + return new Info() + .title("Swagger for flory") + .description("Springdoc을 사용한 Swagger UI for flory") + .version("1.0.0"); + } +} \ No newline at end of file diff --git a/src/main/java/zerobibim/flory/global/config/Web3jConfig.java b/src/main/java/zerobibim/flory/global/config/Web3jConfig.java index c107af1..8434063 100644 --- a/src/main/java/zerobibim/flory/global/config/Web3jConfig.java +++ b/src/main/java/zerobibim/flory/global/config/Web3jConfig.java @@ -1,47 +1,47 @@ -package zerobibim.flory.global.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.web3j.crypto.Credentials; -import org.web3j.crypto.ECKeyPair; -import org.web3j.protocol.Web3j; -import org.web3j.protocol.http.HttpService; -import org.web3j.tx.Contract; -import org.web3j.tx.gas.StaticGasProvider; -import zerobibim.flory.domain.contract.NFT; - -import java.math.BigInteger; - -@Configuration -public class Web3jConfig { - - @Value("${infura.API_URL}") - private String INFURA_API_URL; - - @Value("${metamask.PRIVATE_KEY}") - private String PRIVATE_KEY; - - @Value("${metamask.CONTRACT_ADDRESS}") - private String CONTRACT_ADDRESS; - - @Bean - public Web3j web3j() { - return Web3j.build(new HttpService(INFURA_API_URL)); - } - - @Bean - public Credentials credentials() { - BigInteger privateKeyInBT = new BigInteger(PRIVATE_KEY, 16); - return Credentials.create(ECKeyPair.create(privateKeyInBT)); - } - - @Bean - public NFT nft() { - BigInteger gasPrice = Contract.GAS_PRICE; - BigInteger gasLimit = Contract.GAS_LIMIT; - //StaticGasProvider gasProvider = new StaticGasProvider(gasPrice, gasLimit); - - return NFT.load(CONTRACT_ADDRESS, web3j(), credentials(), gasPrice, gasLimit); - } -} \ No newline at end of file +//package zerobibim.flory.global.config; +// +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.web3j.crypto.Credentials; +//import org.web3j.crypto.ECKeyPair; +//import org.web3j.protocol.Web3j; +//import org.web3j.protocol.http.HttpService; +//import org.web3j.tx.Contract; +//import org.web3j.tx.gas.StaticGasProvider; +//import zerobibim.flory.domain.contract.NFT; +// +//import java.math.BigInteger; +// +//@Configuration +//public class Web3jConfig { +// +// @Value("${infura.API_URL}") +// private String INFURA_API_URL; +// +// @Value("${metamask.PRIVATE_KEY}") +// private String PRIVATE_KEY; +// +// @Value("${metamask.CONTRACT_ADDRESS}") +// private String CONTRACT_ADDRESS; +// +// @Bean +// public Web3j web3j() { +// return Web3j.build(new HttpService(INFURA_API_URL)); +// } +// +// @Bean +// public Credentials credentials() { +// BigInteger privateKeyInBT = new BigInteger(PRIVATE_KEY, 16); +// return Credentials.create(ECKeyPair.create(privateKeyInBT)); +// } +// +// @Bean +// public NFT nft() { +// BigInteger gasPrice = Contract.GAS_PRICE; +// BigInteger gasLimit = Contract.GAS_LIMIT; +// //StaticGasProvider gasProvider = new StaticGasProvider(gasPrice, gasLimit); +// +// return NFT.load(CONTRACT_ADDRESS, web3j(), credentials(), gasPrice, gasLimit); +// } +//} \ No newline at end of file From e7fee8ba51afafd0098879bccb1c22a4d523fc7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A4=80=EC=8D=A8=ED=81=AC?= Date: Wed, 22 Nov 2023 20:39:33 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20nft=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/contract/service/Web3jService.java | 25 ----- .../purchase/controller/NftController.java | 21 +++++ .../dto/request}/NFTRequestDto.java | 2 +- .../purchase/service/PurchaseService.java | 17 ++-- .../domain/purchase/service/Web3jService.java | 25 +++++ .../flory/global/config/Web3jConfig.java | 94 +++++++++---------- 6 files changed, 102 insertions(+), 82 deletions(-) delete mode 100644 src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java create mode 100644 src/main/java/zerobibim/flory/domain/purchase/controller/NftController.java rename src/main/java/zerobibim/flory/domain/{contract/dto => purchase/dto/request}/NFTRequestDto.java (84%) create mode 100644 src/main/java/zerobibim/flory/domain/purchase/service/Web3jService.java diff --git a/src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java b/src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java deleted file mode 100644 index fac5d2f..0000000 --- a/src/main/java/zerobibim/flory/domain/contract/service/Web3jService.java +++ /dev/null @@ -1,25 +0,0 @@ -//package zerobibim.flory.domain.contract.service; -// -//import lombok.RequiredArgsConstructor; -//import lombok.extern.slf4j.Slf4j; -//import org.springframework.stereotype.Service; -//import org.web3j.protocol.core.methods.response.*; -//import zerobibim.flory.domain.contract.NFT; -//import zerobibim.flory.domain.contract.dto.NFTRequestDto; -// -// -//@Slf4j -//@RequiredArgsConstructor -//@Service -//public class Web3jService { -// -// private final NFT nft; -// -// public TransactionReceipt nftCreate(NFTRequestDto.MemberNFTInfo memberNFTInfo) throws Exception { -// -// return nft.create(memberNFTInfo.getWalletAddress(), memberNFTInfo.getIpfsUrl()) -// .sendAsync() -// .get(); -// } -// -//} \ No newline at end of file diff --git a/src/main/java/zerobibim/flory/domain/purchase/controller/NftController.java b/src/main/java/zerobibim/flory/domain/purchase/controller/NftController.java new file mode 100644 index 0000000..9879c5a --- /dev/null +++ b/src/main/java/zerobibim/flory/domain/purchase/controller/NftController.java @@ -0,0 +1,21 @@ +package zerobibim.flory.domain.purchase.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.web3j.protocol.core.methods.response.TransactionReceipt; +import zerobibim.flory.domain.purchase.dto.request.NFTRequestDto; +import zerobibim.flory.domain.purchase.service.Web3jService; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/nft") +public class NftController { + private final Web3jService web3jService; + // Define your API endpoints here + @PostMapping("/mint") + public TransactionReceipt mintToken() throws Exception { + return web3jService.nftCreate(new NFTRequestDto.MemberNFTInfo("0x06f5ad6ca1fdbba1ac90b64472a36ca58a83b8af", "ipfs://QmVumYTYwP4F1DVLmaE527g7JDfB6Z1tzYFm8VE3zGPo1M")); + } +} diff --git a/src/main/java/zerobibim/flory/domain/contract/dto/NFTRequestDto.java b/src/main/java/zerobibim/flory/domain/purchase/dto/request/NFTRequestDto.java similarity index 84% rename from src/main/java/zerobibim/flory/domain/contract/dto/NFTRequestDto.java rename to src/main/java/zerobibim/flory/domain/purchase/dto/request/NFTRequestDto.java index f9e1aa2..01144c7 100644 --- a/src/main/java/zerobibim/flory/domain/contract/dto/NFTRequestDto.java +++ b/src/main/java/zerobibim/flory/domain/purchase/dto/request/NFTRequestDto.java @@ -1,4 +1,4 @@ -package zerobibim.flory.domain.contract.dto; +package zerobibim.flory.domain.purchase.dto.request; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java b/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java index c52748a..7c96c86 100644 --- a/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java +++ b/src/main/java/zerobibim/flory/domain/purchase/service/PurchaseService.java @@ -4,8 +4,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.web3j.protocol.core.methods.response.TransactionReceipt; -import zerobibim.flory.domain.contract.dto.NFTRequestDto; -//import zerobibim.flory.domain.contract.service.Web3jService; +import zerobibim.flory.domain.purchase.dto.request.NFTRequestDto; import zerobibim.flory.domain.flower.entity.Flower; import zerobibim.flory.domain.flower.service.FlowerService; import zerobibim.flory.domain.member.entity.Member; @@ -31,7 +30,7 @@ public class PurchaseService implements EntityLoader { private final PurchaseMapper purchaseMapper; private final MemberService memberService; private final FlowerService flowerService; -// private final Web3jService web3jService; + private final Web3jService web3jService; @Transactional public PurchaseIdResponse createPurchase(PurchaseCreateRequest request) { @@ -47,12 +46,12 @@ public PurchaseIdResponse createPurchase(PurchaseCreateRequest request) { newPurchase.setIsNft(LocalDate.now()); -// NFTRequestDto.MemberNFTInfo nftInfo = new NFTRequestDto.MemberNFTInfo(receiver.getWalletAddress(), "ipfs://QmZUS5QQK4nSKLFWui54vVp4CJTEBaqfcfBJCry7vjRVCc"); -// try { -// TransactionReceipt transactionReceipt = web3jService.nftCreate(nftInfo); -// } catch (Exception e) { -// throw new RuntimeException(e); -// } + NFTRequestDto.MemberNFTInfo nftInfo = new NFTRequestDto.MemberNFTInfo(receiver.getWalletAddress(), flower.getImage().getIpfsUrl()); + try { + TransactionReceipt transactionReceipt = web3jService.nftCreate(nftInfo); + } catch (Exception e) { + throw new RuntimeException(e); + } return new PurchaseIdResponse(newPurchase.getId()); } diff --git a/src/main/java/zerobibim/flory/domain/purchase/service/Web3jService.java b/src/main/java/zerobibim/flory/domain/purchase/service/Web3jService.java new file mode 100644 index 0000000..47cf42a --- /dev/null +++ b/src/main/java/zerobibim/flory/domain/purchase/service/Web3jService.java @@ -0,0 +1,25 @@ +package zerobibim.flory.domain.purchase.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.web3j.protocol.core.methods.response.*; +import zerobibim.flory.domain.contract.NFT; +import zerobibim.flory.domain.purchase.dto.request.NFTRequestDto; + + +@Slf4j +@RequiredArgsConstructor +@Service +public class Web3jService { + + private final NFT nft; + + public TransactionReceipt nftCreate(NFTRequestDto.MemberNFTInfo memberNFTInfo) throws Exception { + + return nft.create(memberNFTInfo.getWalletAddress(), memberNFTInfo.getIpfsUrl()) + .sendAsync() + .get(); + } + +} \ No newline at end of file diff --git a/src/main/java/zerobibim/flory/global/config/Web3jConfig.java b/src/main/java/zerobibim/flory/global/config/Web3jConfig.java index 8434063..c107af1 100644 --- a/src/main/java/zerobibim/flory/global/config/Web3jConfig.java +++ b/src/main/java/zerobibim/flory/global/config/Web3jConfig.java @@ -1,47 +1,47 @@ -//package zerobibim.flory.global.config; -// -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.web3j.crypto.Credentials; -//import org.web3j.crypto.ECKeyPair; -//import org.web3j.protocol.Web3j; -//import org.web3j.protocol.http.HttpService; -//import org.web3j.tx.Contract; -//import org.web3j.tx.gas.StaticGasProvider; -//import zerobibim.flory.domain.contract.NFT; -// -//import java.math.BigInteger; -// -//@Configuration -//public class Web3jConfig { -// -// @Value("${infura.API_URL}") -// private String INFURA_API_URL; -// -// @Value("${metamask.PRIVATE_KEY}") -// private String PRIVATE_KEY; -// -// @Value("${metamask.CONTRACT_ADDRESS}") -// private String CONTRACT_ADDRESS; -// -// @Bean -// public Web3j web3j() { -// return Web3j.build(new HttpService(INFURA_API_URL)); -// } -// -// @Bean -// public Credentials credentials() { -// BigInteger privateKeyInBT = new BigInteger(PRIVATE_KEY, 16); -// return Credentials.create(ECKeyPair.create(privateKeyInBT)); -// } -// -// @Bean -// public NFT nft() { -// BigInteger gasPrice = Contract.GAS_PRICE; -// BigInteger gasLimit = Contract.GAS_LIMIT; -// //StaticGasProvider gasProvider = new StaticGasProvider(gasPrice, gasLimit); -// -// return NFT.load(CONTRACT_ADDRESS, web3j(), credentials(), gasPrice, gasLimit); -// } -//} \ No newline at end of file +package zerobibim.flory.global.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.web3j.crypto.Credentials; +import org.web3j.crypto.ECKeyPair; +import org.web3j.protocol.Web3j; +import org.web3j.protocol.http.HttpService; +import org.web3j.tx.Contract; +import org.web3j.tx.gas.StaticGasProvider; +import zerobibim.flory.domain.contract.NFT; + +import java.math.BigInteger; + +@Configuration +public class Web3jConfig { + + @Value("${infura.API_URL}") + private String INFURA_API_URL; + + @Value("${metamask.PRIVATE_KEY}") + private String PRIVATE_KEY; + + @Value("${metamask.CONTRACT_ADDRESS}") + private String CONTRACT_ADDRESS; + + @Bean + public Web3j web3j() { + return Web3j.build(new HttpService(INFURA_API_URL)); + } + + @Bean + public Credentials credentials() { + BigInteger privateKeyInBT = new BigInteger(PRIVATE_KEY, 16); + return Credentials.create(ECKeyPair.create(privateKeyInBT)); + } + + @Bean + public NFT nft() { + BigInteger gasPrice = Contract.GAS_PRICE; + BigInteger gasLimit = Contract.GAS_LIMIT; + //StaticGasProvider gasProvider = new StaticGasProvider(gasPrice, gasLimit); + + return NFT.load(CONTRACT_ADDRESS, web3j(), credentials(), gasPrice, gasLimit); + } +} \ No newline at end of file