feat: backend core - auth, user, role, permission, device, webhook, monitoring, cache, repository, service, middleware, API handlers
This commit is contained in:
58
internal/repository/password_history.go
Normal file
58
internal/repository/password_history.go
Normal file
@@ -0,0 +1,58 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user