AssetMintService.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package com.izouma.nineth.service;
  2. import com.github.kevinsawicki.http.HttpRequest;
  3. import com.izouma.nineth.domain.Asset;
  4. import com.izouma.nineth.domain.User;
  5. import com.izouma.nineth.dto.NFT;
  6. import com.izouma.nineth.dto.NFTAccount;
  7. import com.izouma.nineth.event.CreateAssetEvent;
  8. import com.izouma.nineth.exception.BusinessException;
  9. import com.izouma.nineth.repo.AssetRepo;
  10. import com.izouma.nineth.repo.TokenHistoryRepo;
  11. import com.izouma.nineth.repo.UserRepo;
  12. import com.izouma.nineth.utils.SnowflakeIdWorker;
  13. import io.ipfs.api.IPFS;
  14. import io.ipfs.api.MerkleNode;
  15. import io.ipfs.api.NamedStreamable;
  16. import io.ipfs.multihash.Multihash;
  17. import lombok.AllArgsConstructor;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.apache.commons.lang3.StringUtils;
  20. import org.springframework.context.ApplicationContext;
  21. import org.springframework.core.env.Environment;
  22. import org.springframework.stereotype.Service;
  23. import java.io.File;
  24. import java.math.BigInteger;
  25. import java.util.Arrays;
  26. @Service
  27. @Slf4j
  28. @AllArgsConstructor
  29. public class AssetMintService {
  30. private AssetRepo assetRepo;
  31. private UserRepo userRepo;
  32. private NFTService nftService;
  33. private ApplicationContext applicationContext;
  34. private TokenHistoryRepo tokenHistoryRepo;
  35. private Environment env;
  36. public void mint(Asset asset, Long historyId) {
  37. if (Arrays.stream(env.getActiveProfiles()).anyMatch(s -> s.equals("dev"))) {
  38. asset.setTokenId(new SnowflakeIdWorker(0, 1).nextId() + "");
  39. asset.setBlockNumber(new BigInteger("1"));
  40. asset.setTxHash("1");
  41. asset.setGasUsed(new BigInteger("1"));
  42. if (asset.getIpfsUrl() == null) {
  43. asset.setIpfsUrl(ipfsUpload(asset.getPic().get(0).getUrl()));
  44. }
  45. assetRepo.save(asset);
  46. applicationContext.publishEvent(new CreateAssetEvent(this, true, asset));
  47. return;
  48. }
  49. User user = userRepo.findById(asset.getUserId()).orElseThrow(new BusinessException("用户不存在"));
  50. if (StringUtils.isEmpty(user.getPublicKey())) {
  51. NFTAccount account = nftService.createAccount(user.getUsername() + "_");
  52. user.setNftAccount(account.getAccountId());
  53. user.setKmsId(account.getAccountKmsId());
  54. user.setPublicKey(account.getPublicKey());
  55. userRepo.save(user);
  56. }
  57. try {
  58. NFT nft = nftService.createToken(user.getNftAccount());
  59. if (nft != null) {
  60. asset.setTokenId(nft.getTokenId());
  61. asset.setBlockNumber(nft.getBlockNumber());
  62. asset.setTxHash(nft.getTxHash());
  63. asset.setGasUsed(nft.getGasUsed());
  64. if (asset.getIpfsUrl() == null) {
  65. asset.setIpfsUrl(ipfsUpload(asset.getPic().get(0).getUrl()));
  66. }
  67. assetRepo.save(asset);
  68. tokenHistoryRepo.findById(historyId).ifPresent(tokenHistory -> {
  69. tokenHistory.setTokenId(nft.getTokenId());
  70. tokenHistoryRepo.save(tokenHistory);
  71. });
  72. }
  73. } catch (Exception e) {
  74. e.printStackTrace();
  75. }
  76. applicationContext.publishEvent(new CreateAssetEvent(this, true, asset));
  77. }
  78. public String ipfsUpload(String url) {
  79. try {
  80. IPFS ipfs = new IPFS("112.74.34.84", 5001);
  81. HttpRequest request = HttpRequest.get(url);
  82. File file = File.createTempFile("ipfs", ".tmp");
  83. request.receive(file);
  84. NamedStreamable.FileWrapper file1 = new NamedStreamable.FileWrapper(file);
  85. MerkleNode put = ipfs.add(file1).get(0);
  86. Multihash multihash = ipfs.pin.add(put.hash).get(0);
  87. log.info("上传ipfs成功 {}", multihash.toBase58());
  88. return multihash.toBase58();
  89. } catch (Exception e) {
  90. }
  91. return null;
  92. }
  93. }