# Doctavis Backend API

API backend pour la plateforme Doctavis - Application de télémédecine et de gestion de consultations médicales.

## 📋 Table des matières

- [Fonctionnalités](#fonctionnalités)
- [Stack Technique](#stack-technique)
- [Prérequis](#prérequis)
- [Installation](#installation)
- [Configuration](#configuration)
- [Lancement](#lancement)
- [Structure du Projet](#structure-du-projet)
- [API Endpoints](#api-endpoints)
- [Cron Jobs](#cron-jobs)
- [Déploiement](#déploiement)
- [Tests](#tests)
- [Contribution](#contribution)

## 🚀 Fonctionnalités

- **Gestion des utilisateurs** : Inscription, authentification JWT, gestion des rôles (patient, doctor, admin)
- **Demandes médicales** : Création, suivi et gestion des consultations médicales
- **Paiements Tranzak** : Intégration complète avec Tranzak pour les paiements mobiles
- **Notifications WhatsApp** : Envoi automatique via Twilio
- **Upload de documents** : Gestion sécurisée des documents médicaux
- **Templates de messages** : Système de templates pour notifications
- **Cron Jobs** : Traitement automatique des paiements en attente
- **Documentation API** : Swagger/OpenAPI intégré

## 🛠 Stack Technique

- **Framework** : [Sails.js](https://sailsjs.com/) v1.5.14 (Node.js MVC)
- **Base de données** : MySQL avec [sails-mysql](https://github.com/balderdashy/sails-mysql)
- **Authentification** : JWT (jsonwebtoken)
- **Validation** : Joi
- **Paiements** : Tranzak API
- **Messaging** : Twilio (WhatsApp)
- **Cron** : node-cron
- **Documentation** : Swagger (swagger-jsdoc + swagger-ui-express)

## ✅ Prérequis

- **Node.js** : v18.20 ou supérieur
- **npm** : v9 ou supérieur
- **MySQL** : v8.0 ou supérieur
- **Git**

## 📦 Installation

### 1. Cloner le repository

```bash
git clone https://github.com/kevin/doctavis-backend.git
cd doctavis-backend
```

### 2. Installer les dépendances

```bash
npm install
```

### 3. Configurer la base de données

Créer une base de données MySQL :

```sql
CREATE DATABASE doctavis_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```

### 4. Configurer les variables d'environnement

Copier le fichier d'exemple :

```bash
cp .env.example .env
```

Éditer `.env` avec vos valeurs :

```env
# JWT
JWT_SECRET=your_super_secret_jwt_key_change_this_in_production

# Twilio
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=your_twilio_auth_token
TWILIO_PHONE_NUMBER=+1234567890

# Tranzak
TRANZAK_API_KEY=your_tranzak_api_key
TRANZAK_APP_ID=your_tranzak_app_id
TRANZAK_BASE_URL=https://sandbox.dsapi.tranzak.me

# Base de données
DATABASE_URL=mysql://username:password@localhost:3306/doctavis_db

# Encryption (générer une nouvelle clé avec: openssl rand -base64 32)
DATA_ENCRYPTION_KEY=your_generated_encryption_key_here

# Autres
PORT=1337
NODE_ENV=development
APP_BASE_URL=http://localhost:1337
FRONTEND_BASE_URL=http://localhost:5173
```

### 5. Créer les répertoires nécessaires

```bash
mkdir -p protected-files/medical-documents
mkdir -p assets/uploads
```

## ⚙️ Configuration

### Base de données

Les modèles Sails.js gèrent automatiquement la création des tables. Au premier lancement, les tables seront créées selon les modèles définis dans `api/models/`.

Migration mode :
- **Development** : `alter` (auto-migration)
- **Production** : `safe` (manuel)

### Templates Twilio

Configurer les templates WhatsApp dans la console Twilio et ajouter les SIDs dans :
- Base de données via l'endpoint `/message-template/create-message-template`
- Ou directement dans `config/custom.js` pour les templates de paiement

## 🚀 Lancement

### Mode développement

```bash
npm start
```

ou avec Sails CLI :

```bash
sails lift
```

L'API sera accessible sur `http://localhost:1337`

### Mode production

```bash
NODE_ENV=production node app.js
```

## 📁 Structure du Projet

```
doctavis-backend/
├── api/
│   ├── controllers/        # Contrôleurs des endpoints
│   │   ├── user/
│   │   ├── medical-request/
│   │   ├── payment/
│   │   ├── tranzak/
│   │   └── message-template/
│   ├── models/            # Modèles de données (ORM)
│   ├── policies/          # Middlewares d'authentification
│   └── helpers/           # Fonctions réutilisables
│       ├── database/      # Helpers CRUD
│       └── application/   # Logique métier
│           ├── twilio/
│           └── tranzak/
├── config/                # Configuration Sails.js
│   ├── routes.js         # Définition des routes
│   ├── policies.js       # Mapping policies/routes
│   ├── datastores.js     # Config base de données
│   ├── security.js       # CORS, CSRF
│   ├── custom.js         # Config personnalisée
│   ├── cron.js           # Configuration cron jobs
│   └── env/              # Config par environnement
│       └── production.js
├── protected-files/       # Fichiers protégés (non publics)
│   └── medical-documents/
├── .env                  # Variables d'environnement (gitignored)
├── .env.example          # Template des variables
└── package.json
```

## 🔌 API Endpoints

### Documentation Swagger

Accéder à la documentation interactive :

```
http://localhost:1337/api-docs
```

### Principaux endpoints

#### Authentification
- `POST /user/create-user` - Créer un utilisateur
- `POST /user/login` - Se connecter (retourne JWT)

#### Demandes médicales
- `POST /medical-request/save-medical-request` - Créer une demande
- `POST /medical-request/list-medical-request` - Lister les demandes
- `POST /medical-request/update-medical-request` - Mettre à jour
- `POST /medical-request/send-medical-request-response` - Envoyer réponse médecin

#### Paiements
- `POST /payment/list-payment` - Lister les paiements
- `POST /tranzak/process-payments` - Traiter paiements en attente
- `POST /tranzak/resend-payment-link` - Renvoyer lien de paiement
- `POST /tranzak/tranzak-webhook` - Webhook Tranzak (public)

#### Templates
- `POST /message-template/create-message-template` - Créer template
- `POST /message-template/list-message-template` - Lister templates
- `POST /message-template/update-message-template` - Modifier template

### Authentification des requêtes

La plupart des endpoints nécessitent un token JWT dans le header :

```bash
Authorization: Bearer <votre_token_jwt>
```

Exemple avec curl :

```bash
curl -X POST http://localhost:1337/user/list-user \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "Content-Type: application/json" \
  -d '{"data": {"search_criteria": {}}}'
```

## ⏰ Cron Jobs

### Traitement automatique des paiements

Un cron job traite automatiquement les paiements Tranzak en attente :

- **Fréquence** : 2 fois par jour (9h00 et 18h00, timezone Africa/Douala)
- **Configuration** : `config/cron.js`
- **Action** : Vérifie le statut de tous les paiements PENDING via l'API Tranzak

Pour modifier la fréquence :

```js
// config/cron.js
schedule: "0 9,18 * * *"  // 2 fois par jour
// ou
schedule: "0 * * * *"      // Toutes les heures
```

## 🚀 Déploiement

### Variables d'environnement en production

Assurez-vous de configurer :

```env
NODE_ENV=production
DATABASE_URL=mysql://user:pass@prod-host:3306/doctavis_prod
JWT_SECRET=<clé_très_sécurisée>
DATA_ENCRYPTION_KEY=<clé_générée_avec_openssl>
TRANZAK_BASE_URL=https://dsapi.tranzak.me  # Production!
```

### Checklist pré-déploiement

- [ ] Variables d'environnement configurées
- [ ] Base de données de production créée
- [ ] Migrations exécutées (`migrate: safe`)
- [ ] CORS configuré avec domaines de production uniquement
- [ ] HTTPS/SSL activé
- [ ] Logs configurés (niveau `info` ou `warn`)
- [ ] Backup base de données configuré
- [ ] Monitoring configuré (Sentry recommandé)

### Commande de démarrage production

```bash
NODE_ENV=production node app.js
```

### Avec PM2 (recommandé)

```bash
npm install -g pm2
pm2 start app.js --name doctavis-api -i max
pm2 save
pm2 startup
```

## 🧪 Tests

### Linter

```bash
npm run lint
```

### Tests (à implémenter)

```bash
npm test
```

## 📝 Notes importantes

### Sécurité

- **Jamais** commiter le fichier `.env`
- Changer `JWT_SECRET` et `DATA_ENCRYPTION_KEY` en production
- Utiliser HTTPS en production
- Activer les cookies sécurisés : `cookie.secure = true`
- Implémenter rate limiting pour éviter les attaques par force brute

### Fichiers protégés

Les documents médicaux sont stockés dans `protected-files/` et servis uniquement via des endpoints authentifiés :

- `GET /medical-request/download-medical-document/:document_id`

### Webhooks Tranzak

Configurer l'URL du webhook dans le dashboard Tranzak :

```
https://votre-domaine.com/tranzak/tranzak-webhook
```

## 🤝 Contribution

1. Fork le projet
2. Créer une branche feature (`git checkout -b feature/AmazingFeature`)
3. Commit les changements (`git commit -m 'Add some AmazingFeature'`)
4. Push vers la branche (`git push origin feature/AmazingFeature`)
5. Ouvrir une Pull Request

## 📄 License

Ce projet est privé et propriétaire.

## 📞 Support

Pour toute question ou problème :
- Email : support@doctavi.com
- Documentation : https://app.doctavi.com/docs

---

**Développé avec ❤️ pour Doctavis**
