Files

59 lines
1.7 KiB
Go
Raw Permalink Normal View History

package repository
import (
"context"
"gorm.io/gorm"
"github.com/user-management-system/internal/domain"
)
// PasswordHistoryRepository 密码历史记录数据访问层
type PasswordHistoryRepository struct {
db *gorm.DB
}
// NewPasswordHistoryRepository 创建密码历史记录数据访问层
func NewPasswordHistoryRepository(db *gorm.DB) *PasswordHistoryRepository {
return &PasswordHistoryRepository{db: db}
}
// Create 创建密码历史记录
func (r *PasswordHistoryRepository) Create(ctx context.Context, history *domain.PasswordHistory) error {
return r.db.WithContext(ctx).Create(history).Error
}
// GetByUserID 获取用户的密码历史记录(最近 N 条,按时间倒序)
func (r *PasswordHistoryRepository) GetByUserID(ctx context.Context, userID int64, limit int) ([]*domain.PasswordHistory, error) {
var histories []*domain.PasswordHistory
err := r.db.WithContext(ctx).
Where("user_id = ?", userID).
Order("created_at DESC").
Limit(limit).
Find(&histories).Error
return histories, err
}
// DeleteOldRecords 删除超过 keepCount 条的旧记录(保留最新的 keepCount 条)
func (r *PasswordHistoryRepository) DeleteOldRecords(ctx context.Context, userID int64, keepCount int) error {
// 找出要保留的最后一条记录的 ID
var ids []int64
err := r.db.WithContext(ctx).
Model(&domain.PasswordHistory{}).
Where("user_id = ?", userID).
Order("created_at DESC").
Limit(keepCount).
Pluck("id", &ids).Error
if err != nil {
return err
}
if len(ids) == 0 {
return nil
}
// 删除不在保留列表中的记录
return r.db.WithContext(ctx).
Where("user_id = ? AND id NOT IN ?", userID, ids).
Delete(&domain.PasswordHistory{}).Error
}