Files
bdrp-server/app/main/api/internal/middleware/membershipinterceptormiddleware.go
2026-04-29 11:38:59 +08:00

68 lines
1.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}