# TRAIL DPS 4.2 - LOT 6 - Activation mobile Option B

## 1. Objectif du lot

Mettre en place une activation mobile exploitable en production :

- PLACE genere un token d'activation temporaire cote OVH ;
- le QR code ou le SMS contient uniquement ce token temporaire ;
- l'application mobile scanne le QR ou ouvre le lien ;
- l'application appelle OVH pour recuperer la configuration complete ;
- le device_token est stocke localement dans le telephone via SecureStore ;
- les positions sont ensuite envoyees a `/api/tracking/position.php` avec `event_remote_id` obligatoire.

Cette version remplace volontairement l'increment precedent qui pouvait transporter directement le `device_token` dans le QR code.

## 2. Fichiers crees

### WEB OVH

- `ovh/sql/lot6_device_activation_tokens.sql`
- `ovh/SRC/Tracking/DeviceActivationRepository.php`
- `ovh/public/api/tracking/create_device_activation.php`
- `ovh/public/api/tracking/activate_device.php`

### Mobile

- `src/lib/activation.ts`
- `src/lib/configurationStorage.ts`

## 3. Fichiers modifies

### WEB OVH

- `ovh/SRC/Tracking/TrackingRepository.php`
- `ovh/public/api/tracking/position.php`

### Mobile

- `src/app/(tabs)/index.tsx`
- `src/lib/trackingApi.ts`
- `src/types/tracking.ts`

## 4. Contenu exact du ZIP incremental

```text
ovh/
  sql/
    lot6_device_activation_tokens.sql
  SRC/
    Tracking/
      DeviceActivationRepository.php
      TrackingRepository.php
  public/
    api/
      tracking/
        create_device_activation.php
        activate_device.php
        position.php
src/
  app/
    (tabs)/
      index.tsx
  lib/
    activation.ts
    configurationStorage.ts
    trackingApi.ts
  types/
    tracking.ts
docs/
  LOT_6_APPLICATION_MOBILE_ACTIVATION_OPTION_B.md
```

## 5. Principe de securite

Le QR code et le SMS ne contiennent pas le `device_token` reel.

Ils contiennent uniquement :

```text
https://tracking.synoluvia.fr/device/activate?token=ACTIVATION_TOKEN_TEMPORAIRE
```

Le token temporaire :

- est long et non predictible ;
- est stocke uniquement sous forme de hash SHA-256 ;
- expire par defaut au bout de 120 minutes ;
- est a usage unique ;
- permet de recuperer une seule fois la configuration mobile complete.

## 6. Configuration OVH requise

Ajouter dans `tracking_config/env.php` :

```php
'security' => [
    'public_api_key' => '...',
    'require_public_api_key' => true,
    'allowed_origin' => '',
    'activation_secret' => 'GENERER_UN_SECRET_LONG_ALEATOIRE_DE_64_CARACTERES_MINIMUM',
],

'tracking' => [
    'server_url' => 'https://tracking.synoluvia.fr',
],
```

`activation_secret` sert a chiffrer temporairement le `device_token` dans la table d'activation.

## 7. Migration SQL

Executer une sauvegarde de la base `trail_dps_tracking`, puis importer :

```sql
ovh/sql/lot6_device_activation_tokens.sql
```

Verification :

```sql
SHOW TABLES LIKE 'tracking_device_activation_tokens';
DESCRIBE tracking_device_activation_tokens;
```

## 8. Procedure de test API OVH

### 8.1 Creation activation depuis PLACE futur ou PowerShell

Exemple PowerShell :

```powershell
$body = @{
  server_url = "https://tracking.synoluvia.fr"
  device_uid = "TEL-SECOURS-001"
  device_label = "Equipe secours 01"
  place_instance_id = "PLACE-TEST-001"
  event_remote_id = "EVT-TEST-001"
  event_local_id = 1
  run_id = 1
  actor_type = "RESCUE"
  local_team_id = 1
  event_name = "Trail test"
  actor_label = "Secours 01"
  expires_in_minutes = 120
} | ConvertTo-Json

Invoke-RestMethod `
  -Uri "https://tracking.synoluvia.fr/api/tracking/create_device_activation.php" `
  -Method Post `
  -Headers @{ "X-Api-Key" = "CLE_API_PUBLIQUE" } `
  -ContentType "application/json" `
  -Body $body
```

Reponse attendue :

```json
{
  "ok": true,
  "activation": {
    "activation_token": "...",
    "activation_url": "https://tracking.synoluvia.fr/device/activate?token=...",
    "deep_link": "traildps://activate?server_url=...&token=...",
    "expires_at": "...",
    "device_uid": "TEL-SECOURS-001",
    "binding_id": 123
  }
}
```

### 8.2 Activation depuis mobile ou test PowerShell

```powershell
Invoke-RestMethod `
  -Uri "https://tracking.synoluvia.fr/api/tracking/activate_device.php?token=TOKEN_RECU" `
  -Method Get
```

Reponse attendue :

```json
{
  "ok": true,
  "configuration": {
    "server_url": "https://tracking.synoluvia.fr",
    "device_uid": "TEL-SECOURS-001",
    "device_token": "...",
    "place_instance_id": "PLACE-TEST-001",
    "event_remote_id": "EVT-TEST-001",
    "event_local_id": 1,
    "run_id": 1,
    "actor_type": "RESCUE"
  }
}
```

Un deuxieme appel avec le meme token doit echouer avec `activation_token_not_pending`.

## 9. Procedure d'integration mobile

Avant integration :

```powershell
cd C:\TRAIL_DPS_MOBILE\TrailDpsTracker
npx expo install expo-camera expo-secure-store expo-location
```

Decompresser le ZIP a la racine :

```text
C:\TRAIL_DPS_MOBILE\TrailDpsTracker
```

Lancer :

```powershell
npx expo start
```

Dans Expo Go :

1. scanner le QR code ou coller le lien/token ;
2. verifier que les informations evenement/equipe sont pre-remplies ;
3. cliquer sur `Envoyer ma position GPS` ;
4. verifier l'arrivee dans `tracking_positions`.

## 10. Procedure d'integration WEB

Decompresser uniquement la partie `ovh/` dans l'arborescence OVH.

Ordre :

1. sauvegarder base MySQL ;
2. executer `ovh/sql/lot6_device_activation_tokens.sql` ;
3. ajouter `activation_secret` dans `tracking_config/env.php` ;
4. deployer les fichiers PHP ;
5. tester `create_device_activation.php` ;
6. tester `activate_device.php` ;
7. tester `position.php` avec configuration mobile active.

## 11. Procedure de deploiement production future

Cote PLACE, la future interface devra proposer sur chaque ligne equipe/staff :

- `Generer activation mobile` ;
- affichage QR code ;
- bouton `Envoyer par SMS` ;
- statut activation : en attente / utilise / expire.

Le SMS pourra reutiliser l'abstraction SMS existante, mais avec un message distinct du flux coureur :

```text
TRAIL DPS - {event_name} : cliquez pour configurer votre telephone de tracking {activation_url}
```

## 12. Criteres de recette

- le QR/lien ne contient pas de `device_token` ;
- l'activation renvoie une configuration complete ;
- le token est a usage unique ;
- le token expire ;
- le mobile stocke la configuration ;
- `event_remote_id` est obligatoire sur `position.php` ;
- la position est stockee uniquement si le binding actif correspond a `event_remote_id + place_instance_id + event_local_id + run_id`.

## 13. Points de vigilance / non-regression

- ne pas deployer le precedent ZIP `TRAIL_DPS_4_2_LOT_6_APPLICATION_MOBILE_ACTIVATION_QR.zip` ;
- ne pas mettre de secret OVH dans l'application mobile ;
- ne pas mettre le `device_token` dans un QR code ;
- ne pas utiliser `event_local_id` seul ;
- ne pas casser les endpoints LOT 2 a LOT 5 ;
- `activate_device.php` est public volontairement, mais limite par token long, expire et usage unique ;
- `create_device_activation.php` reste protege par `X-Api-Key`.
