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 }