Files
bdrp-server/app/main/api/internal/middleware/membershipinterceptormiddleware.go

68 lines
1.7 KiB
Go
Raw Normal View History

2026-04-29 11:38:59 +08:00
package middleware
import (
"net/http"
"time"
"bdrp-server/app/main/api/internal/service"
"bdrp-server/app/main/model"
jwtx "bdrp-server/common/jwt"
"github.com/zeromicro/go-zero/core/logx"
)
const (
HeaderMembershipExpired = "X-Membership-Expired"
)
// MembershipExpiredInterceptor 检测代理会员是否过期,过期则写入响应头
// 依赖 ctx 中的 claims由 AuthInterceptorMiddleware 注入)和 svcCtx 中的 AgentModel
type MembershipExpiredInterceptor struct {
AgentModel model.AgentModel
}
func NewMembershipExpiredInterceptor(agentModel model.AgentModel) *MembershipExpiredInterceptor {
return &MembershipExpiredInterceptor{
AgentModel: agentModel,
}
}
func (m *MembershipExpiredInterceptor) Handle(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// 先执行业务逻辑
next(w, r)
// 业务完成后,尝试检测会员过期状态
claims, err := getClaimsFromRequest(r)
if err != nil || claims == nil {
return
}
// 只检查正式用户
if claims.UserType != model.UserTypeNormal {
return
}
agent, err := m.AgentModel.FindOneByUserId(r.Context(), claims.UserId)
if err != nil {
return
}
if service.IsMembershipExpired(agent, time.Now()) {
w.Header().Set(HeaderMembershipExpired, "true")
logx.Infof("检测到代理会员已过期写入响应头代理ID: %d, 用户ID: %d", agent.Id, claims.UserId)
}
}
}
func getClaimsFromRequest(r *http.Request) (*jwtx.JwtClaims, error) {
value := r.Context().Value(jwtx.ExtraKey)
if value == nil {
return nil, nil
}
if claims, ok := value.(*jwtx.JwtClaims); ok {
return claims, nil
}
return nil, nil
}