Passer au contenu principal

Documentation Index

Fetch the complete documentation index at: https://docs.oneclickdz.com/llms.txt

Use this file to discover all available pages before exploring further.

Vue d’ensemble

Validez toujours les numéros de téléphone avant de soumettre des commandes de recharge internet. Cela prévient les erreurs, réduit les remboursements et améliore l’expérience utilisateur en détectant immédiatement les problèmes de format.
Étape critique : La validation prévient 90% des échecs de commande. Ne sautez jamais cette étape.

Référence API

GET /v3/internet/check-number

Documentation complète de l’endpoint

Formats de numéro de téléphone

Modèle : ^0[0-9]{8}$Description : 9 chiffres commençant par 0Exemples valides :
  • 036362608
  • 031417237
  • 021123456
Exemples invalides :
  • 36362608 - Zéro de tête manquant
  • 0363626081 - Trop long (10 chiffres)
  • 213636362608 - Format incorrect (contient l’indicatif pays)
  • +213636362608 - Format incorrect (contient +)

Validation de base

async function validateInternetNumber(type, number) {
  const response = await fetch(
    `https://api.oneclickdz.com/v3/internet/check-number?type=${type}&number=${number}`,
    {
      headers: {
        "X-Access-Token": process.env.API_KEY,
      },
    }
  );

  if (!response.ok) {
    const error = await response.json();
    throw new Error(error.error.message);
  }

  const result = await response.json();
  return result.data;
}

// Usage
try {
  await validateInternetNumber('ADSL', '036362608');
  console.log('✅ Number is valid');
} catch (error) {
  console.error('❌ Validation failed:', error.message);
}

Validation de format côté client

Validez le format côté client en premier pour un retour instantané :
function validateADSLFormat(number) {
  const pattern = /^0[0-9]{8}$/;
  return pattern.test(number);
}

function validate4GFormat(number) {
  const pattern = /^213[0-9]{9}$/;
  return pattern.test(number);
}

function validateFormat(type, number) {
  if (type === 'ADSL') {
    return validateADSLFormat(number);
  } else if (type === '4G') {
    return validate4GFormat(number);
  }
  return false;
}

// Usage
const number = '036362608';
const type = 'ADSL';

if (!validateFormat(type, number)) {
  console.error('Invalid format. Please check the number.');
} else {
  // Le format est correct, validez maintenant avec l'API
  await validateInternetNumber(type, number);
}

Flux de validation complet

async function validateCompleteFlow(type, number) {
  // Étape 1 : Valider le type de service
  if (!['ADSL', '4G'].includes(type)) {
    return {
      valid: false,
      error: 'INVALID_TYPE',
      message: 'Service type must be ADSL or 4G'
    };
  }

  // Étape 2 : Vérification du format côté client
  if (!validateFormat(type, number)) {
    return {
      valid: false,
      error: 'INVALID_FORMAT',
      message: type === 'ADSL' 
        ? 'ADSL numbers must be 9 digits starting with 0 (e.g., 036362608)'
        : '4G numbers must be 12 digits starting with 213 (e.g., 213665983439)'
    };
  }

  // Étape 3 : Validation via API
  try {
    await validateInternetNumber(type, number);
    return {
      valid: true,
      type,
      number
    };
  } catch (error) {
    return {
      valid: false,
      error: 'API_VALIDATION_FAILED',
      message: error.message
    };
  }
}

// Usage
const result = await validateCompleteFlow('ADSL', '036362608');

if (!result.valid) {
  console.error(`Validation failed: ${result.message}`);
} else {
  console.log('✅ Ready to place order');
}

Mise en cache de la validation

Mettez en cache brièvement les validations réussies pour réduire les appels API :
class ValidationCache {
  constructor(ttlSeconds = 300) { // 5 minutes
    this.cache = new Map();
    this.ttl = ttlSeconds * 1000;
  }

  async validate(type, number) {
    const key = `${type}:${number}`;
    const cached = this.cache.get(key);
    const now = Date.now();

    // Return cached if valid
    if (cached && (now - cached.timestamp) < this.ttl) {
      return cached.result;
    }

    // Validate with API
    try {
      const result = await validateInternetNumber(type, number);
      this.cache.set(key, {
        result: { valid: true, ...result },
        timestamp: now,
      });
      return { valid: true, ...result };
    } catch (error) {
      // Don't cache failures
      throw error;
    }
  }

  invalidate(type, number) {
    const key = `${type}:${number}`;
    this.cache.delete(key);
  }
}

// Usage
const validationCache = new ValidationCache(300); // 5 minutes

// First call - validates with API
const result1 = await validationCache.validate('ADSL', '036362608');

// Second call within 5 minutes - returns cached
const result2 = await validationCache.validate('ADSL', '036362608');

Messages d’Erreur Conviviaux

Fournissez des retours clairs selon le type d’erreur :
function getValidationErrorMessage(type, error) {
  const messages = {
    INVALID_TYPE: 'Veuillez sélectionner ADSL ou 4G comme type de service.',
    
    INVALID_FORMAT: {
      ADSL: 'Veuillez saisir un numéro ADSL valide (9 chiffres commençant par 0).\nExemple : 036362608',
      '4G': 'Veuillez saisir un numéro 4G valide (12 chiffres commençant par 213).\nExemple : 213665983439'
    },
    
    API_VALIDATION_FAILED: {
      default: 'Ce numéro n\'est pas valide pour le type de service sélectionné.',
      'ERR_PHONE': 'Ce numéro ne peut pas être utilisé pour la recharge internet.'
    }
  };
  
  if (error === 'INVALID_FORMAT') {
    return messages.INVALID_FORMAT[type];
  }
  
  if (error === 'API_VALIDATION_FAILED') {
    return messages.API_VALIDATION_FAILED.default;
  }
  
  return messages[error] || 'Impossible de valider le numéro. Veuillez réessayer.';
}

Tests de Validation

async function testValidation() {
  const testCases = [
    // Tests ADSL
    { type: 'ADSL', number: '036362608', expected: true },
    { type: 'ADSL', number: '031417237', expected: true },
    { type: 'ADSL', number: '36362608', expected: false },  // 0 manquant
    { type: 'ADSL', number: '0363626081', expected: false }, // Trop long
    
    // Tests 4G
    { type: '4G', number: '213665983439', expected: true },
    { type: '4G', number: '213472731602', expected: true },
    { type: '4G', number: '0665983439', expected: false },   // Mauvais format
    { type: '4G', number: '+213665983439', expected: false }, // Contient +
  ];

  console.log('🧪 Test de validation...\n');

  for (const test of testCases) {
    const result = await validateCompleteFlow(test.type, test.number);
    const passed = result.valid === test.expected;
    
    console.log(
      `${passed ? '✅' : '❌'} ${test.type} ${test.number}: ${result.valid ? 'VALIDE' : 'INVALIDE'}`
    );
    
    if (!passed) {
      console.log(`  Attendu : ${test.expected}, Obtenu : ${result.valid}`);
      if (!result.valid) {
        console.log(`  Erreur : ${result.message}`);
      }
    }
  }
}

Bonnes pratiques

Valider tôt

Vérifier le format côté client avant l’appel API

Messages clairs

Afficher des messages d’erreur spécifiques et utiles

Mettre en cache les résultats

Mettre en cache les numéros valides pendant 5 minutes

Retour visuel

Afficher le statut de validation en temps réel pendant la saisie

Étapes suivantes

Envoyer les recharges

Soumettre des commandes validées

Suivre le statut

Surveiller l’exécution des commandes

Référence API

Documentation complète de l’endpoint

Charger les produits

Récupérer les cartes disponibles

Vue d'ensemble

Retour à la vue d’ensemble de l’intégration

Livrer les cartes

Livrer les codes de carte en toute sécurité