package model import ( "context" "errors" "fmt" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" ) var _ NhTaskNftStakeModel = (*customNhTaskNftStakeModel)(nil) type ( // NhTaskNftStakeModel is an interface to be customized, add more methods here, // and implement the added methods in customNhTaskNftStakeModel. NhTaskNftStakeModel interface { nhTaskNftStakeModel withSession(session sqlx.Session) NhTaskNftStakeModel StakeNft(ctx context.Context, uid uint, roleId uint64, tokenId string) error UnStakeNft(ctx context.Context, uid uint, token string, isTransferOut bool) error FindByUid(ctx context.Context, uid uint) ([]NhTaskNftStake, error) AllStakeNft(ctx context.Context) ([]NhTaskNftStake, error) } customNhTaskNftStakeModel struct { *defaultNhTaskNftStakeModel log NhTaskNftStakeLogModel } ) func (m *customNhTaskNftStakeModel) AllStakeNft(ctx context.Context) ([]NhTaskNftStake, error) { query := fmt.Sprintf("SELECT %s FROM %s WHERE `state` = 1", nhTaskNftStakeRows, m.table) var result []NhTaskNftStake err := m.conn.QueryRowsCtx(ctx, &result, query) if err != nil && !errors.Is(err, sqlx.ErrNotFound) { return nil, err } return result, nil } func (m *customNhTaskNftStakeModel) FindByUid(ctx context.Context, uid uint) ([]NhTaskNftStake, error) { query := fmt.Sprintf("SELECT %s FROM %s WHERE `uid` = ?", nhTaskNftStakeRows, m.table) var list []NhTaskNftStake err := m.conn.QueryRowsCtx(ctx, &list, query, uid) if err != nil && !errors.Is(err, sqlx.ErrNotFound) { return nil, err } return list, nil } func (m *customNhTaskNftStakeModel) UnStakeNft(ctx context.Context, uid uint, token string, isTransferOut bool) error { update := fmt.Sprintf("UPDATE %s SET `state` = 0 WHERE `uid` = ? AND `token_id` = ?", m.table) result, err := m.conn.ExecCtx(ctx, update, uid, token) if err != nil { return err } row, err := result.RowsAffected() if err != nil { return err } if row > 0 { var operate int8 if isTransferOut { operate = 3 } else { operate = 2 } _, err = m.log.Insert(ctx, &NhTaskNftStakeLog{ Uid: uid, TokenId: token, Operate: operate, }) } return err } func (m *customNhTaskNftStakeModel) StakeNft(ctx context.Context, uid uint, roleId uint64, tokenId string) error { insertOrUpdate := fmt.Sprintf("INSERT INTO %s (`uid`, `token_id`, `role_id`, `state`) VALUES (?, ?, ?, 1) ON DUPLICATE KEY UPDATE `role_id` = ?, `state` = 1", m.table) _, err := m.conn.ExecCtx(ctx, insertOrUpdate, uid, tokenId, roleId, roleId) if err != nil { return err } _, err = m.log.Insert(ctx, &NhTaskNftStakeLog{ Uid: uid, RoleId: roleId, TokenId: tokenId, Operate: 1, }) if err != nil { logx.Errorw("insert stake log failed", logx.Field("err", err), logx.Field("uid", uid), logx.Field("tokenId", token), logx.Field("role", roleId)) } return nil } // NewNhTaskNftStakeModel returns a model for the database table. func NewNhTaskNftStakeModel(conn sqlx.SqlConn) NhTaskNftStakeModel { return &customNhTaskNftStakeModel{ defaultNhTaskNftStakeModel: newNhTaskNftStakeModel(conn), log: NewNhTaskNftStakeLogModel(conn), } } func (m *customNhTaskNftStakeModel) withSession(session sqlx.Session) NhTaskNftStakeModel { return NewNhTaskNftStakeModel(sqlx.NewSqlConnFromSession(session)) }