Export de donnees

AuditChain fournit deux methodes pour exporter les donnees personnelles de vos models : exportPersonalData() pour un extrait simple des donnees, et exportFullSubjectData() pour une reponse complete incluant le journal d'audit integral. Ces methodes facilitent le traitement des demandes des personnes concernees, comme celles prevues par l'article 15 du RGPD (droit d'acces).

Export simple

exportPersonalData() retourne les valeurs actuelles de tous les champs annotes comme donnees personnelles :

$data = $user->exportPersonalData();
// [
//     'email' => 'john@example.com',
//     'name' => 'John Doe',
//     'phone' => '+1-555-0123',
// ]

Ceci est utile lorsque vous avez besoin d'un apercu rapide des donnees personnelles detenues pour une personne concernee.

Acces complet du sujet

exportFullSubjectData() retourne a la fois les donnees personnelles et le journal d'audit complet du model. Cela fournit tout le necessaire pour repondre a une demande d'acces complete au titre de l'article 15 :

$export = $user->exportFullSubjectData();
// [
//     'personal_data' => [
//         'email' => 'john@example.com',
//         'name' => 'John Doe',
//     ],
//     'audit_trail' => [
//         [
//             'id' => '01hy3x...',
//             'event' => 'created',
//             'old_values' => null,
//             'new_values' => ['email' => 'john@example.com', 'name' => 'John Doe'],
//             'personal_data_accessed' => ['email', 'name'],
//             'ip_address' => '192.168.1.1',
//             'user_agent' => 'Mozilla/5.0...',
//             'batch_uuid' => null,
//             'context' => null,
//             'created_at' => '2026-01-15T10:30:00+00:00',
//         ],
//         [
//             'id' => '01hy4a...',
//             'event' => 'updated',
//             'old_values' => ['email' => 'john@example.com'],
//             'new_values' => ['email' => 'john.doe@example.com'],
//             'personal_data_accessed' => ['email'],
//             'ip_address' => '192.168.1.1',
//             'user_agent' => 'Mozilla/5.0...',
//             'batch_uuid' => null,
//             'context' => null,
//             'created_at' => '2026-02-01T14:22:00+00:00',
//         ],
//     ],
// ]

Ce qui est inclus

Les entrees du journal d'audit contiennent toutes les informations dont une personne concernee pourrait avoir besoin pour comprendre comment ses donnees ont ete traitees :

  • event — ce qui s'est passe (created, updated, deleted, etc.)
  • old_values / new_values — ce qui a change
  • personal_data_accessed — quels champs de donnees personnelles etaient concernes
  • ip_address / user_agent — d'ou provenait l'action
  • batch_uuid / context — metadonnees operationnelles de l'action
  • created_at — quand cela s'est produit (format ISO 8601)

Ce qui est exclu

Les champs hash et prev_hash sont intentionnellement exclus de l'export. Ce sont des champs internes de la chaine cryptographique utilises pour la detection de falsification et ne sont pas pertinents dans le cadre d'une demande d'acces d'une personne concernee.

Construction d'un endpoint de reponse

Voici un exemple pratique d'endpoint API repondant aux demandes d'acces :

use Illuminate\Http\JsonResponse;

class SubjectAccessController extends Controller
{
    public function show(User $user): JsonResponse
    {
        $this->authorize('viewPersonalData', $user);

        return response()->json([
            'subject' => $user->exportFullSubjectData(),
            'exported_at' => now()->toIso8601String(),
        ]);
    }
}

Conseil : L'article 12(3) du RGPD exige que vous repondiez aux demandes d'acces dans un delai d'un mois. Envisagez de creer une interface d'administration ou un workflow automatise pour que ces demandes puissent etre traitees rapidement.

Export a travers plusieurs models

Si les donnees personnelles d'une personne concernee sont reparties sur plusieurs models, aggregez les exports :

$user = User::find($id);

$export = [
    'user' => $user->exportFullSubjectData(),
    'orders' => $user->orders->map->exportFullSubjectData()->all(),
    'subscriptions' => $user->subscriptions->map->exportFullSubjectData()->all(),
];

Chaque model doit implementer l'interface Auditable et utiliser HasActivityLog ou HasAuditTrail pour que cela fonctionne.