# TRAIL DPS 4.2 - LOT 5 - Page coureur one-shot

## Objectif

Ce lot ajoute la page publique permettant a un coureur de transmettre ponctuellement sa position GPS apres reception du lien SMS cree au LOT 4.

Le flux reste strictement non medical : aucune saisie de symptome, bilan, diagnostic ou donnee de sante.

## Fichiers crees

- `ovh/SRC/Tracking/RunnerLocationController.php`
- `ovh/public/api/tracking/submit_runner_location.php`
- `ovh/public/runner/location.php`
- `ovh/docs/TRAIL_DPS_4_2_LOT_5_PAGE_COUREUR.md`

## Fichiers modifies

- `ovh/SRC/Tracking/RunnerLocationRepository.php`
- `ovh/tracking_config/env.example.php`

## Integration

Decompresser le ZIP incrementiel a la racine qui contient le dossier `ovh`.

Aucune migration SQL n'est necessaire. Le lot utilise la table `runner_location_requests` deja creee au LOT 2.

## Configuration

Verifier dans `ovh/tracking_config/env.php` :

```php
'runner_location' => [
    'public_base_url' => 'https://tracking.synoluvia.fr',
    'runner_page_path' => '/runner/location.php',
    'default_expiration_minutes' => 45,
],
```

Si le SMS reel OVH est active, verifier le bloc `sms` du LOT 4.

## Test 1 - Acces direct sans token

Ouvrir :

```text
https://tracking.synoluvia.fr/runner/location.php
```

Resultat attendu : page affichant que le lien est invalide.

## Test 2 - Creation d'une demande coureur

```powershell
$headers = @{
  "Content-Type" = "application/json"
  "X-Api-Key" = "TA_CLE_API"
}

$body = @{
  phone = "06XXXXXXXX"
  place_instance_id = "PLACE-TEST-001"
  event_local_id = 1
  run_id = 1
  event_name = "TEST TRAIL"
} | ConvertTo-Json

$response = Invoke-RestMethod `
  -Uri "https://tracking.synoluvia.fr/api/tracking/create_runner_location_request.php" `
  -Method POST `
  -Headers $headers `
  -Body $body

$response | ConvertTo-Json -Depth 10
```

Recuperer `location_url` dans la reponse.

## Test 3 - Page mobile coureur

Ouvrir `location_url` sur un telephone mobile.

Resultats attendus :

- affichage du nom d'evenement ;
- bouton `Partager ma position` ;
- demande d'autorisation GPS par le navigateur ;
- message de succes apres envoi.

## Test 4 - Verification SQL

```sql
SELECT id, event_name, phone, status, opened_at, location_received_at, latitude, longitude, accuracy
FROM runner_location_requests
ORDER BY id DESC
LIMIT 5;
```

Resultat attendu apres partage :

- `status = LOCATION_RECEIVED`
- `opened_at` renseigne
- `location_received_at` renseigne
- `latitude` et `longitude` renseignees

## Test 5 - Soumission API directe

Si besoin, soumettre une position manuelle avec le token :

```powershell
$body = @{
  token = "TOKEN_RECU"
  latitude = 44.1000000
  longitude = 3.0800000
  accuracy = 12
} | ConvertTo-Json

$response = Invoke-RestMethod `
  -Uri "https://tracking.synoluvia.fr/api/tracking/submit_runner_location.php" `
  -Method POST `
  -Headers @{ "Content-Type" = "application/json" } `
  -Body $body

$response | ConvertTo-Json -Depth 10
```

## Regles de securite

- Token obligatoire.
- Token stocke hashe en base.
- Expiration controlee cote serveur.
- Une position maximum par demande.
- Aucun bilan medical.
- Aucun compte coureur.

## Points de vigilance

- HTTPS obligatoire pour la geolocalisation navigateur.
- iOS exige une action utilisateur : le bouton est donc obligatoire.
- Si le coureur refuse la geolocalisation, aucune position n'est stockee.
- Une demande expiree est marquee `EXPIRED`.
- Une demande annulee reste bloquee.
