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
|
|||
|
|
}
|