// 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) }