diff --git a/backend/internal/features/backups/backups/service.go b/backend/internal/features/backups/backups/service.go index 101305a..4399404 100644 --- a/backend/internal/features/backups/backups/service.go +++ b/backend/internal/features/backups/backups/service.go @@ -181,11 +181,7 @@ func (s *BackupService) DeleteBackup( } s.auditLogService.WriteAuditLog( - fmt.Sprintf( - "Backup deleted for database: %s (ID: %s)", - database.Name, - backupID.String(), - ), + fmt.Sprintf("Backup deleted for database: %s", database.Name), &user.ID, database.WorkspaceID, ) @@ -232,11 +228,7 @@ func (s *BackupService) CancelBackup( } s.auditLogService.WriteAuditLog( - fmt.Sprintf( - "Backup cancelled for database: %s (ID: %s)", - database.Name, - backupID.String(), - ), + fmt.Sprintf("Backup cancelled for database: %s", database.Name), &user.ID, database.WorkspaceID, ) @@ -276,11 +268,7 @@ func (s *BackupService) GetBackupFile( } s.auditLogService.WriteAuditLog( - fmt.Sprintf( - "Backup file downloaded for database: %s (ID: %s)", - database.Name, - backupID.String(), - ), + fmt.Sprintf("Backup file downloaded for database: %s", database.Name), &user.ID, database.WorkspaceID, ) @@ -490,11 +478,7 @@ func (s *BackupService) WriteAuditLogForDownload( database *databases.Database, ) { s.auditLogService.WriteAuditLog( - fmt.Sprintf( - "Backup file downloaded for database: %s (ID: %s)", - database.Name, - backup.ID.String(), - ), + fmt.Sprintf("Backup file downloaded for database: %s", database.Name), &userID, database.WorkspaceID, ) diff --git a/backend/internal/features/databases/service.go b/backend/internal/features/databases/service.go index fc7ead4..9392bac 100644 --- a/backend/internal/features/databases/service.go +++ b/backend/internal/features/databases/service.go @@ -192,6 +192,8 @@ func (s *DatabaseService) UpdateDatabase( } } + oldName := existingDatabase.Name + if err := existingDatabase.EncryptSensitiveFields(s.fieldEncryptor); err != nil { return fmt.Errorf("failed to encrypt sensitive fields: %w", err) } @@ -201,11 +203,23 @@ func (s *DatabaseService) UpdateDatabase( return err } - s.auditLogService.WriteAuditLog( - fmt.Sprintf("Database updated: %s", existingDatabase.Name), - &user.ID, - existingDatabase.WorkspaceID, - ) + if oldName != existingDatabase.Name { + s.auditLogService.WriteAuditLog( + fmt.Sprintf( + "Database updated and renamed from '%s' to '%s'", + oldName, + existingDatabase.Name, + ), + &user.ID, + existingDatabase.WorkspaceID, + ) + } else { + s.auditLogService.WriteAuditLog( + fmt.Sprintf("Database updated: %s", existingDatabase.Name), + &user.ID, + existingDatabase.WorkspaceID, + ) + } return nil } @@ -571,9 +585,19 @@ func (s *DatabaseService) TransferDatabaseToWorkspace( return err } + sourceWorkspace, err := s.workspaceService.GetWorkspaceByID(*sourceWorkspaceID) + if err != nil { + return fmt.Errorf("failed to get source workspace: %w", err) + } + + targetWorkspace, err := s.workspaceService.GetWorkspaceByID(targetWorkspaceID) + if err != nil { + return fmt.Errorf("failed to get target workspace: %w", err) + } + s.auditLogService.WriteAuditLog( - fmt.Sprintf("Database transferred: %s from workspace %s to workspace %s", - database.Name, sourceWorkspaceID, targetWorkspaceID), + fmt.Sprintf("Database transferred: %s from workspace '%s' to workspace '%s'", + database.Name, sourceWorkspace.Name, targetWorkspace.Name), nil, &targetWorkspaceID, ) diff --git a/backend/internal/features/notifiers/service.go b/backend/internal/features/notifiers/service.go index 00f13dc..1b24d37 100644 --- a/backend/internal/features/notifiers/service.go +++ b/backend/internal/features/notifiers/service.go @@ -58,6 +58,8 @@ func (s *NotifierService) SaveNotifier( return err } + oldName := existingNotifier.Name + if err := existingNotifier.Validate(s.fieldEncryptor); err != nil { return err } @@ -67,11 +69,23 @@ func (s *NotifierService) SaveNotifier( return err } - s.auditLogService.WriteAuditLog( - fmt.Sprintf("Notifier updated: %s", existingNotifier.Name), - &user.ID, - &workspaceID, - ) + if oldName != existingNotifier.Name { + s.auditLogService.WriteAuditLog( + fmt.Sprintf( + "Notifier updated and renamed from '%s' to '%s'", + oldName, + existingNotifier.Name, + ), + &user.ID, + &workspaceID, + ) + } else { + s.auditLogService.WriteAuditLog( + fmt.Sprintf("Notifier updated: %s", existingNotifier.Name), + &user.ID, + &workspaceID, + ) + } } else { notifier.WorkspaceID = workspaceID @@ -343,9 +357,19 @@ func (s *NotifierService) TransferNotifierToWorkspace( return err } + sourceWorkspace, err := s.workspaceService.GetWorkspaceByID(sourceWorkspaceID) + if err != nil { + return fmt.Errorf("failed to get source workspace: %w", err) + } + + targetWorkspace, err := s.workspaceService.GetWorkspaceByID(targetWorkspaceID) + if err != nil { + return fmt.Errorf("failed to get target workspace: %w", err) + } + s.auditLogService.WriteAuditLog( - fmt.Sprintf("Notifier transferred: %s from workspace %s to workspace %s", - existingNotifier.Name, sourceWorkspaceID, targetWorkspaceID), + fmt.Sprintf("Notifier transferred: %s from workspace '%s' to workspace '%s'", + existingNotifier.Name, sourceWorkspace.Name, targetWorkspace.Name), &user.ID, &targetWorkspaceID, ) diff --git a/backend/internal/features/restores/controller_test.go b/backend/internal/features/restores/controller_test.go index 9fca033..7ccde4e 100644 --- a/backend/internal/features/restores/controller_test.go +++ b/backend/internal/features/restores/controller_test.go @@ -261,7 +261,7 @@ func Test_RestoreBackup_AuditLogWritten(t *testing.T) { found := false for _, log := range auditLogs.AuditLogs { - if strings.Contains(log.Message, "Database restored from backup") && + if strings.Contains(log.Message, "Database restored for database") && strings.Contains(log.Message, database.Name) { found = true break diff --git a/backend/internal/features/restores/service.go b/backend/internal/features/restores/service.go index 2bfbe1d..1b99233 100644 --- a/backend/internal/features/restores/service.go +++ b/backend/internal/features/restores/service.go @@ -190,11 +190,7 @@ func (s *RestoreService) RestoreBackupWithAuth( } s.auditLogService.WriteAuditLog( - fmt.Sprintf( - "Database restored from backup %s for database: %s", - backupID.String(), - database.Name, - ), + fmt.Sprintf("Database restored for database: %s", database.Name), &user.ID, database.WorkspaceID, ) @@ -412,11 +408,7 @@ func (s *RestoreService) CancelRestore( } s.auditLogService.WriteAuditLog( - fmt.Sprintf( - "Restore cancelled for database: %s (ID: %s)", - database.Name, - restoreID.String(), - ), + fmt.Sprintf("Restore cancelled for database: %s", database.Name), &user.ID, database.WorkspaceID, ) diff --git a/backend/internal/features/storages/service.go b/backend/internal/features/storages/service.go index 73d50d5..d918ded 100644 --- a/backend/internal/features/storages/service.go +++ b/backend/internal/features/storages/service.go @@ -92,6 +92,8 @@ func (s *StorageService) SaveStorage( existingStorage.Update(storage) + oldName := existingStorage.Name + if err := existingStorage.EncryptSensitiveData(s.fieldEncryptor); err != nil { return err } @@ -105,11 +107,19 @@ func (s *StorageService) SaveStorage( return err } - s.auditLogService.WriteAuditLog( - fmt.Sprintf("Storage updated: %s", existingStorage.Name), - &user.ID, - &workspaceID, - ) + if oldName != existingStorage.Name { + s.auditLogService.WriteAuditLog( + fmt.Sprintf("Storage renamed from '%s' to '%s'", oldName, existingStorage.Name), + &user.ID, + &workspaceID, + ) + } else { + s.auditLogService.WriteAuditLog( + fmt.Sprintf("Storage updated: %s", existingStorage.Name), + &user.ID, + &workspaceID, + ) + } } else { storage.WorkspaceID = workspaceID @@ -368,9 +378,26 @@ func (s *StorageService) TransferStorageToWorkspace( return err } + sourceWorkspace, err := s.workspaceService.GetWorkspaceByID(sourceWorkspaceID) + if err != nil { + return fmt.Errorf("failed to get source workspace: %w", err) + } + + targetWorkspace, err := s.workspaceService.GetWorkspaceByID(targetWorkspaceID) + if err != nil { + return fmt.Errorf("failed to get target workspace: %w", err) + } + s.auditLogService.WriteAuditLog( - fmt.Sprintf("Storage transferred: %s from workspace %s to workspace %s", - existingStorage.Name, sourceWorkspaceID, targetWorkspaceID), + fmt.Sprintf("Storage transferred out: %s to workspace '%s'", + existingStorage.Name, targetWorkspace.Name), + &user.ID, + &sourceWorkspaceID, + ) + + s.auditLogService.WriteAuditLog( + fmt.Sprintf("Storage transferred in: %s from workspace '%s'", + existingStorage.Name, sourceWorkspace.Name), &user.ID, &targetWorkspaceID, ) diff --git a/backend/internal/features/users/services/user_services.go b/backend/internal/features/users/services/user_services.go index a847598..2fbd12c 100644 --- a/backend/internal/features/users/services/user_services.go +++ b/backend/internal/features/users/services/user_services.go @@ -390,7 +390,7 @@ func (s *UserService) InviteUser( message := fmt.Sprintf("User invited: %s", request.Email) if request.IntendedWorkspaceID != nil { - message += fmt.Sprintf(" for workspace %s", request.IntendedWorkspaceID.String()) + message += " for workspace" } s.auditLogWriter.WriteAuditLog( message, @@ -437,6 +437,9 @@ func (s *UserService) UpdateUserInfo( return fmt.Errorf("failed to get user: %w", err) } + oldEmail := user.Email + oldName := user.Name + if user.Email == "admin" && request.Email != nil && *request.Email != user.Email { return errors.New("admin email cannot be changed") } @@ -455,7 +458,28 @@ func (s *UserService) UpdateUserInfo( return fmt.Errorf("failed to update user info: %w", err) } - s.auditLogWriter.WriteAuditLog("User info updated", &userID, nil) + var auditMessages []string + if request.Email != nil && *request.Email != oldEmail { + auditMessages = append( + auditMessages, + fmt.Sprintf("Email changed from '%s' to '%s'", oldEmail, *request.Email), + ) + } + if request.Name != nil && *request.Name != oldName { + auditMessages = append( + auditMessages, + fmt.Sprintf("Name changed from '%s' to '%s'", oldName, *request.Name), + ) + } + + if len(auditMessages) > 0 { + for _, message := range auditMessages { + s.auditLogWriter.WriteAuditLog(message, &userID, nil) + } + } else { + s.auditLogWriter.WriteAuditLog("User info updated", &userID, nil) + } + return nil } diff --git a/backend/internal/features/workspaces/services/workspace_service.go b/backend/internal/features/workspaces/services/workspace_service.go index 36205dc..2e7c16d 100644 --- a/backend/internal/features/workspaces/services/workspace_service.go +++ b/backend/internal/features/workspaces/services/workspace_service.go @@ -129,6 +129,8 @@ func (s *WorkspaceService) UpdateWorkspace( return nil, fmt.Errorf("failed to get workspace: %w", err) } + oldName := existingWorkspace.Name + updateDTO.ID = workspaceID updateDTO.CreatedAt = existingWorkspace.CreatedAt @@ -138,11 +140,19 @@ func (s *WorkspaceService) UpdateWorkspace( return nil, fmt.Errorf("failed to update workspace: %w", err) } - s.auditLogService.WriteAuditLog( - fmt.Sprintf("Workspace updated: %s", updateDTO.Name), - &user.ID, - &workspaceID, - ) + if oldName != updateDTO.Name { + s.auditLogService.WriteAuditLog( + fmt.Sprintf("Workspace updated and renamed from '%s' to '%s'", oldName, updateDTO.Name), + &user.ID, + &workspaceID, + ) + } else { + s.auditLogService.WriteAuditLog( + fmt.Sprintf("Workspace updated: %s", updateDTO.Name), + &user.ID, + &workspaceID, + ) + } return existingWorkspace, nil }