173 lines
5.0 KiB
Go
173 lines
5.0 KiB
Go
|
|
package models
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"time"
|
|||
|
|
|
|||
|
|
"git.apinb.com/bsm-apps/passport/internal/impl"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
var (
|
|||
|
|
// 默认缓存TTL
|
|||
|
|
DefaultTTL = 30 * time.Minute
|
|||
|
|
// 用户信息缓存TTL
|
|||
|
|
UserCacheTTL = 1 * time.Hour
|
|||
|
|
// Token缓存TTL
|
|||
|
|
TokenCacheTTL = 24 * time.Hour
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// GetAccountByCache 通过缓存获取账户信息
|
|||
|
|
func GetAccountByCache(ctx context.Context, field, value string) (*PassportAccount, error) {
|
|||
|
|
var account *PassportAccount
|
|||
|
|
|
|||
|
|
key := impl.RedisService.BuildKey("account", field, value)
|
|||
|
|
|
|||
|
|
// 尝试从缓存获取
|
|||
|
|
err := impl.RedisService.Get(key, &account)
|
|||
|
|
if err == nil && account != nil {
|
|||
|
|
return account, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 缓存未命中,从数据库获取
|
|||
|
|
account, err = GetPassportAccountByField(field, value)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 存入缓存
|
|||
|
|
err = impl.RedisService.Set(key, account, UserCacheTTL)
|
|||
|
|
return account, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetUserDataByCache 通过缓存获取用户扩展数据
|
|||
|
|
func GetUserDataByCache(ctx context.Context, passportID uint) (*PassportData, error) {
|
|||
|
|
var data *PassportData
|
|||
|
|
|
|||
|
|
key := impl.RedisService.BuildKey("userdata", passportID)
|
|||
|
|
|
|||
|
|
// 尝试从缓存获取
|
|||
|
|
err := impl.RedisService.Get(key, &data)
|
|||
|
|
if err == nil && data != nil {
|
|||
|
|
return data, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 缓存未命中,从数据库获取
|
|||
|
|
err = impl.DBService.Where("passport_id = ?", passportID).First(&data).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 存入缓存
|
|||
|
|
err = impl.RedisService.Set(key, data, UserCacheTTL)
|
|||
|
|
return data, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetUserTagsByCache 通过缓存获取用户标签
|
|||
|
|
func GetUserTagsByCache(ctx context.Context, passportID uint) ([]*PassportTags, error) {
|
|||
|
|
var tags []*PassportTags
|
|||
|
|
|
|||
|
|
key := impl.RedisService.BuildKey("usertags", passportID)
|
|||
|
|
|
|||
|
|
// 尝试从缓存获取
|
|||
|
|
err := impl.RedisService.Get(key, &tags)
|
|||
|
|
if err == nil && tags != nil {
|
|||
|
|
return tags, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 缓存未命中,从数据库获取
|
|||
|
|
err = impl.DBService.Where("passport_id = ?", passportID).Find(&tags).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 存入缓存
|
|||
|
|
err = impl.RedisService.Set(key, tags, DefaultTTL)
|
|||
|
|
return tags, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// InvalidateUserCache 清除用户相关缓存
|
|||
|
|
func InvalidateUserCache(ctx context.Context, passportID uint, identity string) error {
|
|||
|
|
keys := []string{
|
|||
|
|
impl.RedisService.BuildKey("account", "id", passportID),
|
|||
|
|
impl.RedisService.BuildKey("account", "identity", identity),
|
|||
|
|
impl.RedisService.BuildKey("userdata", passportID),
|
|||
|
|
impl.RedisService.BuildKey("usertags", passportID),
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, key := range keys {
|
|||
|
|
impl.RedisService.Client.Del(impl.RedisService.Ctx, key)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// SetTokenCache 设置Token缓存
|
|||
|
|
func SetTokenCache(ctx context.Context, identity, token string) error {
|
|||
|
|
key := impl.RedisService.BuildKey("token", identity)
|
|||
|
|
return impl.RedisService.Set(key, token, TokenCacheTTL)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetTokenCache 获取Token缓存
|
|||
|
|
func GetTokenCache(ctx context.Context, identity string) (string, error) {
|
|||
|
|
var token string
|
|||
|
|
key := impl.RedisService.BuildKey("token", identity)
|
|||
|
|
err := impl.RedisService.Get(key, &token)
|
|||
|
|
return token, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// InvalidateTokenCache 清除Token缓存
|
|||
|
|
func InvalidateTokenCache(ctx context.Context, identity string) error {
|
|||
|
|
key := impl.RedisService.BuildKey("token", identity)
|
|||
|
|
return impl.RedisService.Client.Del(impl.RedisService.Ctx, key).Err()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// SetVerificationCodeCache 设置验证码缓存
|
|||
|
|
func SetVerificationCodeCache(ctx context.Context, phone, code string, ttl time.Duration) error {
|
|||
|
|
key := impl.RedisService.BuildKey("verifycode", phone)
|
|||
|
|
return impl.RedisService.Set(key, code, ttl)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetVerificationCodeCache 获取验证码缓存
|
|||
|
|
func GetVerificationCodeCache(ctx context.Context, phone string) (string, error) {
|
|||
|
|
var code string
|
|||
|
|
key := impl.RedisService.BuildKey("verifycode", phone)
|
|||
|
|
err := impl.RedisService.Get(key, &code)
|
|||
|
|
return code, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// InvalidateVerificationCodeCache 清除验证码缓存
|
|||
|
|
func InvalidateVerificationCodeCache(ctx context.Context, phone string) error {
|
|||
|
|
key := impl.RedisService.BuildKey("verifycode", phone)
|
|||
|
|
return impl.RedisService.Client.Del(impl.RedisService.Ctx, key).Err()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// IncrementLoginAttempts 增加登录尝试次数
|
|||
|
|
func IncrementLoginAttempts(ctx context.Context, account string) (int64, error) {
|
|||
|
|
key := impl.RedisService.BuildKey("loginattempts", account)
|
|||
|
|
result := impl.RedisService.Client.Incr(impl.RedisService.Ctx, key)
|
|||
|
|
if result.Err() != nil {
|
|||
|
|
return 0, result.Err()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 设置过期时间(15分钟)
|
|||
|
|
impl.RedisService.Client.Expire(impl.RedisService.Ctx, key, 15*time.Minute)
|
|||
|
|
|
|||
|
|
return result.Val(), nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetLoginAttempts 获取登录尝试次数
|
|||
|
|
func GetLoginAttempts(ctx context.Context, account string) (int64, error) {
|
|||
|
|
key := impl.RedisService.BuildKey("loginattempts", account)
|
|||
|
|
result := impl.RedisService.Client.Get(impl.RedisService.Ctx, key)
|
|||
|
|
if result.Err() != nil {
|
|||
|
|
return 0, nil // 如果key不存在,返回0
|
|||
|
|
}
|
|||
|
|
return result.Int64()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ClearLoginAttempts 清除登录尝试次数
|
|||
|
|
func ClearLoginAttempts(ctx context.Context, account string) error {
|
|||
|
|
key := impl.RedisService.BuildKey("loginattempts", account)
|
|||
|
|
return impl.RedisService.Client.Del(impl.RedisService.Ctx, key).Err()
|
|||
|
|
}
|