105 lines
2.7 KiB
Go
105 lines
2.7 KiB
Go
// internal/repositories/audit_log_repo.go
|
|
package repositories
|
|
|
|
import (
|
|
"errors"
|
|
"lost-and-found/internal/models"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type AuditLogRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewAuditLogRepository(db *gorm.DB) *AuditLogRepository {
|
|
return &AuditLogRepository{db: db}
|
|
}
|
|
|
|
// Create creates a new audit log
|
|
func (r *AuditLogRepository) Create(log *models.AuditLog) error {
|
|
return r.db.Create(log).Error
|
|
}
|
|
|
|
// FindByID finds audit log by ID
|
|
func (r *AuditLogRepository) FindByID(id uint) (*models.AuditLog, error) {
|
|
var log models.AuditLog
|
|
err := r.db.Preload("User").Preload("User.Role").First(&log, id).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.New("audit log not found")
|
|
}
|
|
return nil, err
|
|
}
|
|
return &log, nil
|
|
}
|
|
|
|
// FindAll returns all audit logs with filters
|
|
func (r *AuditLogRepository) FindAll(page, limit int, action, entityType string, userID *uint) ([]models.AuditLog, int64, error) {
|
|
var logs []models.AuditLog
|
|
var total int64
|
|
|
|
query := r.db.Model(&models.AuditLog{})
|
|
|
|
// Apply filters
|
|
if action != "" {
|
|
query = query.Where("action = ?", action)
|
|
}
|
|
if entityType != "" {
|
|
query = query.Where("entity_type = ?", entityType)
|
|
}
|
|
if userID != nil {
|
|
query = query.Where("user_id = ?", *userID)
|
|
}
|
|
|
|
// Count total
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
// Get paginated results
|
|
offset := (page - 1) * limit
|
|
err := query.Preload("User").Preload("User.Role").
|
|
Order("created_at DESC").
|
|
Offset(offset).Limit(limit).Find(&logs).Error
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return logs, total, nil
|
|
}
|
|
|
|
// FindByUser finds audit logs by user
|
|
func (r *AuditLogRepository) FindByUser(userID uint, page, limit int) ([]models.AuditLog, int64, error) {
|
|
return r.FindAll(page, limit, "", "", &userID)
|
|
}
|
|
|
|
// FindByEntity finds audit logs by entity
|
|
func (r *AuditLogRepository) FindByEntity(entityType string, entityID uint, page, limit int) ([]models.AuditLog, int64, error) {
|
|
var logs []models.AuditLog
|
|
var total int64
|
|
|
|
query := r.db.Model(&models.AuditLog{}).
|
|
Where("entity_type = ? AND entity_id = ?", entityType, entityID)
|
|
|
|
// Count total
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
// Get paginated results
|
|
offset := (page - 1) * limit
|
|
err := query.Preload("User").Preload("User.Role").
|
|
Order("created_at DESC").
|
|
Offset(offset).Limit(limit).Find(&logs).Error
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return logs, total, nil
|
|
}
|
|
|
|
// Log creates a new audit log entry (helper method)
|
|
func (r *AuditLogRepository) Log(userID *uint, action, entityType string, entityID *uint, details, ipAddress, userAgent string) error {
|
|
return models.CreateAuditLog(r.db, userID, action, entityType, entityID, details, ipAddress, userAgent)
|
|
} |