68 lines
1.7 KiB
Go
68 lines
1.7 KiB
Go
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
|
||
}
|