167 lines
5.0 KiB
Go
167 lines
5.0 KiB
Go
|
|
package repository
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"time"
|
|||
|
|
|
|||
|
|
"carrot_bbs/internal/model"
|
|||
|
|
|
|||
|
|
"gorm.io/gorm"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// DeviceTokenRepository 设备Token仓储
|
|||
|
|
type DeviceTokenRepository struct {
|
|||
|
|
db *gorm.DB
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewDeviceTokenRepository 创建设备Token仓储
|
|||
|
|
func NewDeviceTokenRepository(db *gorm.DB) *DeviceTokenRepository {
|
|||
|
|
return &DeviceTokenRepository{db: db}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Create 创建设备Token
|
|||
|
|
func (r *DeviceTokenRepository) Create(token *model.DeviceToken) error {
|
|||
|
|
return r.db.Create(token).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetByID 根据ID获取设备Token
|
|||
|
|
func (r *DeviceTokenRepository) GetByID(id int64) (*model.DeviceToken, error) {
|
|||
|
|
var token model.DeviceToken
|
|||
|
|
err := r.db.First(&token, "id = ?", id).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
return &token, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Update 更新设备Token
|
|||
|
|
func (r *DeviceTokenRepository) Update(token *model.DeviceToken) error {
|
|||
|
|
return r.db.Save(token).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Delete 删除设备Token(软删除)
|
|||
|
|
func (r *DeviceTokenRepository) Delete(id int64) error {
|
|||
|
|
return r.db.Delete(&model.DeviceToken{}, id).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetByUserID 获取用户所有设备
|
|||
|
|
// userID 参数为 string 类型(UUID格式),与JWT中user_id保持一致
|
|||
|
|
func (r *DeviceTokenRepository) GetByUserID(userID string) ([]*model.DeviceToken, error) {
|
|||
|
|
var tokens []*model.DeviceToken
|
|||
|
|
err := r.db.Where("user_id = ?", userID).
|
|||
|
|
Order("created_at DESC").
|
|||
|
|
Find(&tokens).Error
|
|||
|
|
return tokens, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetActiveByUserID 获取用户活跃设备
|
|||
|
|
// userID 参数为 string 类型(UUID格式),与JWT中user_id保持一致
|
|||
|
|
func (r *DeviceTokenRepository) GetActiveByUserID(userID string) ([]*model.DeviceToken, error) {
|
|||
|
|
var tokens []*model.DeviceToken
|
|||
|
|
err := r.db.Where("user_id = ? AND is_active = ?", userID, true).
|
|||
|
|
Order("last_used_at DESC").
|
|||
|
|
Find(&tokens).Error
|
|||
|
|
return tokens, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetByDeviceID 根据设备ID获取设备Token
|
|||
|
|
func (r *DeviceTokenRepository) GetByDeviceID(deviceID string) (*model.DeviceToken, error) {
|
|||
|
|
var token model.DeviceToken
|
|||
|
|
err := r.db.Where("device_id = ?", deviceID).First(&token).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
return &token, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetByPushToken 根据推送Token获取设备信息
|
|||
|
|
func (r *DeviceTokenRepository) GetByPushToken(pushToken string) (*model.DeviceToken, error) {
|
|||
|
|
var token model.DeviceToken
|
|||
|
|
err := r.db.Where("push_token = ?", pushToken).First(&token).Error
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, err
|
|||
|
|
}
|
|||
|
|
return &token, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// DeactivateAllExcept 登出其他设备(停用除指定设备外的所有设备)
|
|||
|
|
func (r *DeviceTokenRepository) DeactivateAllExcept(userID int64, deviceID string) error {
|
|||
|
|
return r.db.Model(&model.DeviceToken{}).
|
|||
|
|
Where("user_id = ? AND device_id != ?", userID, deviceID).
|
|||
|
|
Update("is_active", false).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Upsert 创建或更新设备Token
|
|||
|
|
// 如果设备ID已存在,则更新Token和激活状态;否则创建新记录
|
|||
|
|
func (r *DeviceTokenRepository) Upsert(token *model.DeviceToken) error {
|
|||
|
|
var existing model.DeviceToken
|
|||
|
|
err := r.db.Where("device_id = ?", token.DeviceID).First(&existing).Error
|
|||
|
|
|
|||
|
|
if err == gorm.ErrRecordNotFound {
|
|||
|
|
// 创建新记录
|
|||
|
|
return r.db.Create(token).Error
|
|||
|
|
} else if err != nil {
|
|||
|
|
return err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 更新现有记录
|
|||
|
|
return r.db.Model(&existing).Updates(map[string]interface{}{
|
|||
|
|
"push_token": token.PushToken,
|
|||
|
|
"is_active": true,
|
|||
|
|
"device_name": token.DeviceName,
|
|||
|
|
"last_used_at": time.Now(),
|
|||
|
|
}).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// UpdateLastUsed 更新最后使用时间
|
|||
|
|
func (r *DeviceTokenRepository) UpdateLastUsed(deviceID string) error {
|
|||
|
|
return r.db.Model(&model.DeviceToken{}).
|
|||
|
|
Where("device_id = ?", deviceID).
|
|||
|
|
Update("last_used_at", time.Now()).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Deactivate 停用设备
|
|||
|
|
func (r *DeviceTokenRepository) Deactivate(deviceID string) error {
|
|||
|
|
return r.db.Model(&model.DeviceToken{}).
|
|||
|
|
Where("device_id = ?", deviceID).
|
|||
|
|
Update("is_active", false).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Activate 激活设备
|
|||
|
|
func (r *DeviceTokenRepository) Activate(deviceID string) error {
|
|||
|
|
return r.db.Model(&model.DeviceToken{}).
|
|||
|
|
Where("device_id = ?", deviceID).
|
|||
|
|
Updates(map[string]interface{}{
|
|||
|
|
"is_active": true,
|
|||
|
|
"last_used_at": time.Now(),
|
|||
|
|
}).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// DeleteByUserID 删除用户所有设备Token
|
|||
|
|
func (r *DeviceTokenRepository) DeleteByUserID(userID int64) error {
|
|||
|
|
return r.db.Where("user_id = ?", userID).Delete(&model.DeviceToken{}).Error
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetDeviceCountByUserID 获取用户设备数量
|
|||
|
|
func (r *DeviceTokenRepository) GetDeviceCountByUserID(userID int64) (int64, error) {
|
|||
|
|
var count int64
|
|||
|
|
err := r.db.Model(&model.DeviceToken{}).
|
|||
|
|
Where("user_id = ?", userID).
|
|||
|
|
Count(&count).Error
|
|||
|
|
return count, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetActiveDeviceCountByUserID 获取用户活跃设备数量
|
|||
|
|
func (r *DeviceTokenRepository) GetActiveDeviceCountByUserID(userID int64) (int64, error) {
|
|||
|
|
var count int64
|
|||
|
|
err := r.db.Model(&model.DeviceToken{}).
|
|||
|
|
Where("user_id = ? AND is_active = ?", userID, true).
|
|||
|
|
Count(&count).Error
|
|||
|
|
return count, err
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// DeleteInactiveDevices 删除长时间未使用的设备
|
|||
|
|
func (r *DeviceTokenRepository) DeleteInactiveDevices(before time.Time) error {
|
|||
|
|
return r.db.Where("is_active = ? AND last_used_at < ?", false, before).
|
|||
|
|
Delete(&model.DeviceToken{}).Error
|
|||
|
|
}
|