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