package event import ( "context" "chainmaker.org/chainmaker/common/v2/json" _const "chainmaker.org/chainmaker/ida/contract-ida/const" "chainmaker.org/chainmaker/ida/contract-ida/types" "chainmaker.org/chainmaker/ida/registration-service/internal/model" "chainmaker.org/chainmaker/pb-go/v2/common" "gorm.io/gorm" ) // AssetUpdateEventHandler 资产更新事件处理器 type AssetUpdateEventHandler struct { db *gorm.DB } // consumer - func (h *AssetUpdateEventHandler) consumer() string { return _const.EventIDAUpdated } func (h *AssetUpdateEventHandler) handleEvent(e *common.ContractEventInfo) error { // 反解合约事件 assetNumber := e.EventData[0] ida := &types.IDAInfo{} if err := json.Unmarshal([]byte(e.EventData[2]), ida); err != nil { return err } // 初始化DB tx := h.db.WithContext(context.Background()).Begin() // 查询当前资产信息 currentAsset := &model.Asset{} if err := tx.Where("asset_number = ?", assetNumber).First(currentAsset).Error; err != nil { return err } // 保存更新资产 assetCreator := &AssetCreateEventHandler{} asset, err := assetCreator.prepareAssetInfo(tx, ida, int32(currentAsset.Id)) if err != nil { tx.Rollback() return err } asset.Id = currentAsset.Id if err = tx.Save(asset).Error; err != nil { tx.Rollback() return err } // 处理数据集 if asset.AssetType == model.AssetTypeDataSet { // 查询数据源连接 dbConn := &model.AssetDbConn{} if err = tx.Where("asset_id = ? ", currentAsset.Id).First(dbConn).Error; err != nil { return err } // 查询数据集 currentDataSet := &model.AssetDataSet{} if err = tx.Where("asset_id = ? ", currentAsset.Id).First(currentDataSet).Error; err != nil { return err } // 更新数据集 assetDataSet := assetCreator.prepareAssetDataSet(int32(asset.Id), ida, dbConn) assetDataSet.Id = currentAsset.Id if err = tx.Save(assetDataSet).Error; err != nil { tx.Rollback() return err } // 更新数据集字段信息 if err = tx.Where("asset_id = ?", currentAsset.Id).Delete(&model.AssetDataSetColumn{}).Error; err != nil { return err } assetDataSetColumns := assetCreator.prepareAssetDataSetColumns(int32(asset.Id), int32(assetDataSet.Id), ida) if len(assetDataSetColumns) > 0 { for _, assetDataSetColumn := range assetDataSetColumns { if err = tx.Create(assetDataSetColumn).Error; err != nil { tx.Rollback() return err } } } // 处理数据API } else if asset.AssetType == model.AssetTypeAPI { // 查询API currentAPI := &model.AssetApi{} if err = tx.Where("asset_id = ? ", currentAsset.Id).First(currentAPI).Error; err != nil { return err } // 更新API assetAPI := assetCreator.prepareAssetAPI(int32(asset.Id), ida) assetAPI.Id = currentAPI.Id if err = tx.Save(assetAPI).Error; err != nil { tx.Rollback() return err } } if err = tx.Commit().Error; err != nil { return err } return nil }