diff --git a/internal/api/proposal/helper.go b/internal/api/proposal/helper.go index 3839e204..09e45ae5 100644 --- a/internal/api/proposal/helper.go +++ b/internal/api/proposal/helper.go @@ -765,11 +765,11 @@ func SaveProposalToMetaforo(db *gorm.DB, dbProposalId uint, voteType int, metafo metaforoProposalResponse, err = metaforo.GetProposal(metaforoThreadId, metaforoGroupName, metaforoAccessToken, 0) if err != nil { log.Error().Msgf("get metaforoProposal %d error: %+v", metaforoThreadId, err) - _ = UpdateDbRecordsFromMetaforoProposalResponse(db, updatedProposalRecord.ID, metaforoProposalResponse, err) + _ = UpdateDbRecordsFromMetaforoProposalResponse(db, updatedProposalRecord.ID, updatedProposalRecord.IsInFinState(), metaforoProposalResponse, err) return err } - err = UpdateDbRecordsFromMetaforoProposalResponse(db, updatedProposalRecord.ID, metaforoProposalResponse, nil) + err = UpdateDbRecordsFromMetaforoProposalResponse(db, updatedProposalRecord.ID, updatedProposalRecord.IsInFinState(), metaforoProposalResponse, nil) if err != nil { log.Error().Msgf("update db records from metaforoProposalResponse error: %+v", err) } @@ -979,15 +979,25 @@ func IsUserMetVoteGate(userSeepassData *sdk.SeepassResponse, proposalVoteGate *m } } -func UpdateDbRecordsFromMetaforoProposalResponse(db *gorm.DB, dbProposalRcdId uint, metaforoProposal *metaforo.ProposalResponse, mfError error) error { +func UpdateDbRecordsFromMetaforoProposalResponse(db *gorm.DB, dbProposalRcdId uint, isProposalInFinState bool, metaforoProposal *metaforo.ProposalResponse, mfError error) error { // Check whether update form metaforo contains error, if yes, update state to metaforo error and return if mfError != nil { log.Error().Msgf("get metaforo proposal error: %+v", mfError) + + // This branch is processing mf error, set the default state to UncategorizedMetaforoError proposalStateForMetaforoError := model.ProposalStateUncategorizedMetaforoError if strings.Contains(mfError.Error(), "not found") { + // Proposal not found in metaforo, change the state to DeletedFromMetaforo proposalStateForMetaforoError = model.ProposalStateDeletedFromMetaforo + } else if isProposalInFinState { + // For mf error other than not found, only update proposal not in fin state + log.Debug().Msgf("proposal %d is in fin state, skip updating proposal state to mf error", dbProposalRcdId) + return nil + } else { + // Keep the new state to be UncategorizedMetaforoError } + // Update proposal state into mf_error if err = db.Model(&model.Proposal{}).Where("id = ?", dbProposalRcdId).Update("state", proposalStateForMetaforoError).Error; err != nil { log.Error().Msgf("update proposal %d state to deleted_by_metaforo error", dbProposalRcdId) return err diff --git a/internal/api/proposal/req_n_resp.go b/internal/api/proposal/req_n_resp.go index 10342a0d..1d4bbdd7 100644 --- a/internal/api/proposal/req_n_resp.go +++ b/internal/api/proposal/req_n_resp.go @@ -372,11 +372,11 @@ func ConvertProposalToFrontendDetailRecord(db *gorm.DB, proposalId uint, startPo metaforoProposal, err := metaforo.GetProposal(proposal.GetMetaforoThreadId(), metaforoGroupName, accessToken, startPostId) if err != nil { log.Error().Msgf("get metaforo proposal error: %+v", err) - _ = UpdateDbRecordsFromMetaforoProposalResponse(db, proposalId, metaforoProposal, err) + _ = UpdateDbRecordsFromMetaforoProposalResponse(db, proposalId, proposal.IsInFinState(), metaforoProposal, err) return nil, err } - err = UpdateDbRecordsFromMetaforoProposalResponse(db, proposalId, metaforoProposal, nil) + err = UpdateDbRecordsFromMetaforoProposalResponse(db, proposalId, proposal.IsInFinState(), metaforoProposal, nil) if err != nil { log.Error().Msgf("update proposal %d from metaforo error: %+v", proposalId, err) return nil, err diff --git a/internal/api/proposal/utils.go b/internal/api/proposal/utils.go index ff82c7a6..a8f16092 100644 --- a/internal/api/proposal/utils.go +++ b/internal/api/proposal/utils.go @@ -100,11 +100,11 @@ func GetMetaforoProposalByInternalId(db *gorm.DB, proposalIdStr string, metaforo metaforoProposalResponse, err := metaforo.GetProposal(osProposalRcd.GetMetaforoThreadId(), metaforoGroupName, mfAccessToken, 0) if err != nil { log.Error().Msgf("get metaforo proposal error: %+v", err) - _ = UpdateDbRecordsFromMetaforoProposalResponse(db, osProposalRcd.ID, metaforoProposalResponse, err) + _ = UpdateDbRecordsFromMetaforoProposalResponse(db, osProposalRcd.ID, osProposalRcd.IsInFinState(), metaforoProposalResponse, err) return nil, nil, err } - err = UpdateDbRecordsFromMetaforoProposalResponse(db, osProposalRcd.ID, metaforoProposalResponse, nil) + err = UpdateDbRecordsFromMetaforoProposalResponse(db, osProposalRcd.ID, osProposalRcd.IsInFinState(), metaforoProposalResponse, nil) if err != nil { log.Error().Msgf("update db records from metaforoProposalResponse error: %+v", err) } diff --git a/internal/common/wallet_utils.go b/internal/common/wallet_utils.go index b876fc7b..710c0855 100644 --- a/internal/common/wallet_utils.go +++ b/internal/common/wallet_utils.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/ethereum/go-ethereum/common" + "github.com/theseed-labs/os-backend/internal" "golang.org/x/crypto/sha3" ) @@ -59,7 +60,8 @@ func FormatUserWallet(wallet string) string { } func ValidateUserWallet(wallet string) bool { - return common.IsHexAddress(wallet) + return common.IsHexAddress(wallet) && common.HexToAddress(wallet) != internal.BurnAddress + } // ToFrontendWallet convert wallet address to frontend required format, currently the requirement is lowercased diff --git a/internal/const.go b/internal/const.go index e01f625e..08c19ffb 100644 --- a/internal/const.go +++ b/internal/const.go @@ -3,6 +3,7 @@ package internal import ( "time" + "github.com/ethereum/go-ethereum/common" "github.com/samber/lo" ) @@ -35,6 +36,8 @@ const SeedContractAddr = "0x30093266E34a816a53e302bE3e59a93B52792FD4" const EnsoulSbtContractType = "erc1155" const EnsoulSbtContractAddr = "0x9d34D407D8586478b3e4c39BE633ED3D7be1c80C" +var BurnAddress = common.HexToAddress("0x0000000000000000000000000000000000000000") + const CityHallTokenId = "70" var CityhallGroupNames = map[string]bool{"G_GOVERNANCE": true, "G_BRANDING": true, "G_TECH": true} diff --git a/internal/task_manager/metaforo_task.go b/internal/task_manager/metaforo_task.go index 24588851..5c5983e6 100644 --- a/internal/task_manager/metaforo_task.go +++ b/internal/task_manager/metaforo_task.go @@ -69,14 +69,14 @@ func RefreshVotingProposalInfoJob(db *gorm.DB, job *model.CronJob, jobParams str metaforoProposalData, err := metaforo.GetProposal(metaforoThreadId, params.GroupName, cfg.MetaforoData.AccessToken, 0) if err != nil { - _ = proposal.UpdateDbRecordsFromMetaforoProposalResponse(db, dbRcd.ID, metaforoProposalData, err) + _ = proposal.UpdateDbRecordsFromMetaforoProposalResponse(db, dbRcd.ID, dbRcd.IsInFinState(), metaforoProposalData, err) log.Warn().Msgf("get metaforo proposal error: %+v", err) continue } // Start transaction to update db records if err = db.Transaction(func(tx *gorm.DB) error { - err = proposal.UpdateDbRecordsFromMetaforoProposalResponse(tx, dbRcd.ID, metaforoProposalData, nil) + err = proposal.UpdateDbRecordsFromMetaforoProposalResponse(tx, dbRcd.ID, dbRcd.IsInFinState(), metaforoProposalData, nil) if err != nil { log.Warn().Msgf("update propsal with metaforo response error: %+v", err) return err