block_chain.go 2.9 KB
package service

import (
	"fmt"
	"github.com/linmadan/egglib-go/core/application"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/application/blockChain/command"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/application/factory"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/domain"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/infrastructure/blockchain"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-user/pkg/log"
	"time"
)

// 区块链服务
type BlockChainService struct {
}

// 数据上链
func (blockChainService *BlockChainService) UpChain(upChainCommand *command.UpChainCommand) (interface{}, error) {
	if err := upChainCommand.ValidateCommand(); err != nil {
		return nil, application.ThrowError(application.ARG_ERROR, err.Error())
	}
	transactionContext, err := factory.CreateTransactionContext(nil)
	if err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	if err := transactionContext.StartTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()

	upChain := &domain.UpChain{
		Source:        upChainCommand.Source,
		PrimaryId:     upChainCommand.PrimaryId,
		IssueId:       upChainCommand.IssueId,
		Data:          upChainCommand.Data,
		UpChainStatus: 2,
		CreatedAt:     time.Now(),
	}

	// 1. 查重
	upChainRepository, _, _ := factory.FastPgUpChain(transactionContext, 0)
	// 可溯源数据,可重复上传,可以追溯历史修改记录
	if len(upChain.IssueId) == 0 {
		if item, err := upChainRepository.FindOne(map[string]interface{}{"source": upChain.Source, "primaryId": upChain.PrimaryId}); err == nil && item != nil {
			return nil, fmt.Errorf("duplicate message %v %v", upChain.Source, upChain.PrimaryId)
		}
	}

	// 2.上链
	bc := &blockchain.BSNBlockChain{
		PublicPem:      []byte(blockchain.PubPem),
		Host:           blockchain.Host,
		PublicKey:      blockchain.PubKey,
		PrivatePem:     blockchain.PriK,
		EnableDebugLog: true,
	}
	options := blockchain.NewUpToChainOptions(upChain.Source, upChain.PrimaryId, upChain.Data).WithInnerPrimaryIssueId(upChain.IssueId)
	upToChainResponse, e := bc.UpToChain(options)
	if e != nil || upToChainResponse == nil {
		upChain.UpFail()
		if e != nil {
			log.Logger.Error("up chain err:" + e.Error())
		}
	} else {
		upChain.UpSuccess(string(*upToChainResponse))
	}

	// 3.保存记录
	if upChain, err = upChainRepository.Save(upChain); err != nil {
		return nil, err
	}

	if err := transactionContext.CommitTransaction(); err != nil {
		return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
	}
	return upChain, nil
}

func NewBlockChainService(options map[string]interface{}) *BlockChainService {
	newBlockChainService := &BlockChainService{}
	return newBlockChainService
}