diff --git a/doc/api/admin.api b/doc/api/admin.api index 916cad4..8d03ddc 100644 --- a/doc/api/admin.api +++ b/doc/api/admin.api @@ -21,6 +21,10 @@ service novatask { @doc "NFT持有者更新" @handler NftHolderUpdate get /nft_holder_update + + @doc "修正 NFT 质押者" + @handler FixNftStaker + get /fix_nft_staker } type EmailReward { diff --git a/doc/swagger/nova.json b/doc/swagger/nova.json index 4edad85..628dcbf 100644 --- a/doc/swagger/nova.json +++ b/doc/swagger/nova.json @@ -54,6 +54,21 @@ ] } }, + "/gapi/admin/fix_nft_staker": { + "get": { + "summary": "修正 NFT 质押者", + "operationId": "FixNftStaker", + "responses": { + "200": { + "description": "A successful response.", + "schema": {} + } + }, + "tags": [ + "admin" + ] + } + }, "/gapi/admin/nft_holder_update": { "get": { "summary": "NFT持有者更新", diff --git a/internal/handler/admin/fix_nft_staker_handler.go b/internal/handler/admin/fix_nft_staker_handler.go new file mode 100644 index 0000000..a253b8a --- /dev/null +++ b/internal/handler/admin/fix_nft_staker_handler.go @@ -0,0 +1,22 @@ +package admin + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "nova_task/internal/logic/admin" + "nova_task/internal/svc" +) + +// 修正 NFT 质押者 +func FixNftStakerHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + l := admin.NewFixNftStakerLogic(r.Context(), svcCtx) + err := l.FixNftStaker() + if err != nil { + httpx.ErrorCtx(r.Context(), w, err) + } else { + httpx.Ok(w) + } + } +} diff --git a/internal/handler/routes.go b/internal/handler/routes.go index 29d1c30..3e9f55d 100644 --- a/internal/handler/routes.go +++ b/internal/handler/routes.go @@ -32,6 +32,12 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { Path: "/email_reward", Handler: admin.SendEmailRewardHandler(serverCtx), }, + { + // 修正 NFT 质押者 + Method: http.MethodGet, + Path: "/fix_nft_staker", + Handler: admin.FixNftStakerHandler(serverCtx), + }, { // NFT持有者更新 Method: http.MethodGet, diff --git a/internal/logic/admin/fix_nft_staker_logic.go b/internal/logic/admin/fix_nft_staker_logic.go new file mode 100644 index 0000000..6964ccd --- /dev/null +++ b/internal/logic/admin/fix_nft_staker_logic.go @@ -0,0 +1,54 @@ +package admin + +import ( + "context" + "nova_task/internal/pkg/errs" + + "github.com/zeromicro/go-zero/core/logx" + "nova_task/internal/svc" +) + +type FixNftStakerLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +// 修正 NFT 质押者 +func NewFixNftStakerLogic(ctx context.Context, svcCtx *svc.ServiceContext) *FixNftStakerLogic { + return &FixNftStakerLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *FixNftStakerLogic) FixNftStaker() error { + nfts, err := l.svcCtx.StakeNftModel.AllStakeNft(l.ctx) + if err != nil { + l.Errorw("get AllStakeNft failed", logx.Field("err", err)) + return errs.New(errs.ErrDatabaseOperate, err) + } + for _, n := range nfts { + nft, err := l.svcCtx.NftHolderModel.FindOneByTokenId(l.ctx, n.TokenId) + if err != nil { + l.Errorw("Find Nft by tokenId failed", logx.Field("err", err)) + continue + } + wUid, err := l.svcCtx.WalletModel.FindUidByAddress(l.ctx, nft.Address) + if err != nil { + l.Errorw("Find Wallet by address failed", logx.Field("err", err)) + continue + } + if n.Uid != wUid { + n.Uid = wUid + err = l.svcCtx.StakeNftModel.Update(l.ctx, &n) + if err != nil { + l.Errorw("Update Nft failed", logx.Field("err", err)) + } + } + + } + + return errs.Success() +} diff --git a/internal/logic/nft/holder_update_logic.go b/internal/logic/nft/holder_update_logic.go index 52bdca3..2f44f57 100644 --- a/internal/logic/nft/holder_update_logic.go +++ b/internal/logic/nft/holder_update_logic.go @@ -113,6 +113,16 @@ func (l *HolderUpdateLogic) HolderUpdate() { if err != nil { logx.Errorw("insert nft holder change log error", logx.Field("error", err), logx.Field("address", o.OwnerAddress), logx.Field("token", tk.TokenID)) } + + uid, err := l.svcCtx.WalletModel.FindUidByAddress(l.ctx, nft.Address) + if err != nil { + logx.Errorw("find uid by address error", logx.Field("error", err), logx.Field("address", nft.Address)) + continue + } + err = l.svcCtx.StakeNftModel.UnStakeNft(l.ctx, uid, nft.TokenId, true) + if err != nil { + logx.Errorw("un stake nft error", logx.Field("error", err), logx.Field("address", nft.Address), logx.Field("token", nft.TokenId)) + } } } }