f
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user