# TRAIL DPS 4.2.3 - OVH device_status, purge et assouplissement lecture PLACE

## Objet du lot

Ce lot poursuit le durcissement OVH apres validation du lot 4.2.2.

Il ne touche pas aux applications Android/iOS.

Il ajoute :

1. un endpoint de diagnostic `device_status.php`,
2. un endpoint de purge batch securisee `purge.php`,
3. une verification `status.php` etendue aux tables latest/trace,
4. un assouplissement des endpoints `latest_positions.php` et `trace.php` : `event_local_id` devient facultatif.

## Fichiers crees

- `public/api/tracking/device_status.php`
- `public/api/tracking/purge.php`
- `docs/TRAIL_DPS_4_2_3_OVH_DEVICE_STATUS_PURGE.md`
- `sql/lot_4_2_3_validation_after_ftp.sql`
- `sql/lot_4_2_3_manual_purge_reference.sql`

## Fichiers modifies

- `public/api/tracking/latest_positions.php`
- `public/api/tracking/trace.php`
- `public/api/tracking/status.php`

## Pourquoi event_local_id devient facultatif

La vraie isolation serveur repose deja sur :

- `event_remote_id`,
- `place_instance_id`.

`event_local_id` reste supporte et recommande lorsque PLACE le connait, mais il ne bloque plus les tests ou les appels de lecture.

## Endpoint device_status.php

### Role

Retourner un etat synthetique par device/binding pour le PC course et les tests serveur.

Source :

- `tracking_bindings`,
- `tracking_devices`,
- `tracking_positions_latest`.

### Parametres GET

Obligatoires :

- `event_remote_id`
- `place_instance_id`

Optionnels :

- `event_local_id`
- `run_id`
- `actor_types` : exemple `RESCUE,OPENER,CLOSER`
- `include_inactive` : `1` pour inclure inactive/revoked/disabled
- `limit` : defaut 200, maximum 500

### Exemple PowerShell

```powershell
$ApiKey = "REMPLACER_PAR_LA_VALEUR_DE_public_api_key"

Invoke-RestMethod `
  -Uri "https://tracking.synoluvia.fr/api/tracking/device_status.php?event_remote_id=EVT-TEST-002&place_instance_id=PLACE-TEST-IOS" `
  -Method GET `
  -Headers @{ "X-Api-Key" = $ApiKey } |
  ConvertTo-Json -Depth 10
```

## Endpoint purge.php

### Role

Effectuer une purge batch non bloquante.

Politiques par defaut :

- `tracking_positions` : donnees brutes > 8 heures,
- `tracking_positions_trace` : traces > 7 jours,
- `tracking_api_logs` et `tracking_error_logs` : logs > 30 jours.

### Securite

- methode POST obligatoire,
- `X-Api-Key` obligatoire,
- mode dry-run actif par defaut.

### Parametres POST JSON ou formulaire

- `dry_run` : `1` par defaut, `0` pour supprimer reellement,
- `batch_limit` : defaut 1000, maximum 5000,
- `raw_hours` : defaut 8,
- `trace_days` : defaut 7,
- `log_days` : defaut 30.

### Test dry-run PowerShell

```powershell
$ApiKey = "REMPLACER_PAR_LA_VALEUR_DE_public_api_key"

Invoke-RestMethod `
  -Uri "https://tracking.synoluvia.fr/api/tracking/purge.php" `
  -Method POST `
  -Headers @{ "X-Api-Key" = $ApiKey; "Content-Type" = "application/json" } `
  -Body '{"dry_run":1,"batch_limit":1000}' |
  ConvertTo-Json -Depth 10
```

### Purge reelle batch PowerShell

A executer seulement apres validation du dry-run.

```powershell
$ApiKey = "REMPLACER_PAR_LA_VALEUR_DE_public_api_key"

Invoke-RestMethod `
  -Uri "https://tracking.synoluvia.fr/api/tracking/purge.php" `
  -Method POST `
  -Headers @{ "X-Api-Key" = $ApiKey; "Content-Type" = "application/json" } `
  -Body '{"dry_run":0,"batch_limit":1000}' |
  ConvertTo-Json -Depth 10
```

## Validation phpMyAdmin

Apres depot FTP, executer :

- base : `synoluidpstrack`
- onglet : `SQL`
- fichier : `sql/lot_4_2_3_validation_after_ftp.sql`

Le fichier ne modifie aucune donnee.

## Requetes manuelles de reference

Le fichier `sql/lot_4_2_3_manual_purge_reference.sql` contient les requetes SQL manuelles equivalentes.

Ne pas l'executer integralement sans lecture : il contient des DELETE batch.

## Procedure FTP

Deposer le contenu du ZIP a la racine OVH en respectant l'arborescence.

Remplacer :

- `public/api/tracking/latest_positions.php`
- `public/api/tracking/trace.php`
- `public/api/tracking/status.php`

Ajouter :

- `public/api/tracking/device_status.php`
- `public/api/tracking/purge.php`
- `docs/TRAIL_DPS_4_2_3_OVH_DEVICE_STATUS_PURGE.md`
- `sql/lot_4_2_3_validation_after_ftp.sql`
- `sql/lot_4_2_3_manual_purge_reference.sql`

Ne pas modifier :

- `tracking_config/env.php`
- les fichiers licence,
- les fichiers SMS,
- les applications Android/iOS.

## Criteres de recette

- `status.php` liste les tables `tracking_positions_latest` et `tracking_positions_trace`.
- `latest_positions.php` fonctionne avec ou sans `event_local_id`.
- `trace.php` fonctionne avec ou sans `event_local_id`.
- `device_status.php` retourne un etat par binding/device.
- `purge.php` en dry-run retourne les candidats sans suppression.
- `purge.php` en mode reel supprime au maximum `batch_limit` lignes par table cible.
- Aucune regression mobile.

## Point de vigilance

Le endpoint `purge.php` est volontairement batché. Il ne doit pas chercher a vider des millions de lignes en un seul appel.

En production, preferer :

- cron frequent,
- batch limite,
- controle regulier du nombre de lignes candidates.
