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

Avant de passer des commandes, vérifiez les détails des produits pour obtenir les tarifs en temps réel, les dénominations disponibles (types) et les niveaux de stock. Cet endpoint retourne des prix de gros personnalisés pour votre compte.
N’affichez jamais les prix de gros aux clients. Appliquez votre marge avant d’afficher.

Référence API

GET /v3/gift-cards/checkProduct/{productId}

Documentation complète de l’endpoint

Vérification de base d’un produit

async function checkProduct(productId) {
  const response = await fetch(
    `https://api.oneclickdz.com/v3/gift-cards/checkProduct/${productId}`,
    {
      headers: {
        "X-Access-Token": process.env.API_KEY,
      },
    }
  );

  if (!response.ok) {
    throw new Error(`Failed to check product: ${response.status}`);
  }

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

// Usage
const productId = "507f1f77bcf86cd799439011";
const product = await checkProduct(productId);

console.log(`Product: ${product.productTitle}`);
console.log(`Available types: ${product.types.length}`);
product.types.forEach((type) => {
  console.log(`  - ${type.name}: ${type.price} DA (stock: ${type.quantity})`);
});

Structure de la réponse

{
  "success": true,
  "data": {
    "productId": "507f1f77bcf86cd799439011",
    "productTitle": "PlayStation Network",
    "types": [
      {
        "id": "type_001",
        "name": "PSN 500 DA",
        "price": 490,
        "quantity": 150
      },
      {
        "id": "type_002",
        "name": "PSN 1000 DA",
        "price": 980,
        "quantity": 87
      },
      {
        "id": "type_003",
        "name": "PSN 2000 DA",
        "price": 1960,
        "quantity": 0
      }
    ]
  }
}

Filtrage du stock disponible

N’afficher que les types en stock :
function getAvailableTypes(product) {
  return product.types.filter((type) => type.quantity > 0);
}

// Usage
const product = await checkProduct(productId);
const available = getAvailableTypes(product);

if (available.length === 0) {
  console.log("Product currently out of stock");
} else {
  console.log(`${available.length} denominations available`);
}

Application de la marge client

Ajoutez votre marge bénéficiaire aux prix de gros :
function applyMarkup(types, markupPercent = 5) {
  return types
    .filter((type) => type.quantity > 0)
    .map((type) => ({
      id: type.id,
      name: type.name,
      wholesalePrice: type.price, // Store but don't show
      customerPrice: Math.ceil(type.price * (1 + markupPercent / 100)),
      available: true,
    }));
}

// Usage
const product = await checkProduct(productId);
const customerPrices = applyMarkup(product.types, 5); // 5% markup

customerPrices.forEach((type) => {
  console.log(`${type.name}: ${type.customerPrice} DA`);
  // Ne pas journaliser wholesalePrice en production !
});

Validation du stock avant la commande

Vérifiez toujours le stock avant d’autoriser les commandes :
async function validateStock(productId, typeId, quantity) {
  const product = await checkProduct(productId);
  const type = product.types.find((t) => t.id === typeId);

  if (!type) {
    throw new Error("Invalid type ID");
  }

  if (type.quantity === 0) {
    throw new Error("Product out of stock");
  }

  if (type.quantity < quantity) {
    throw new Error(
      `Insufficient stock. Available: ${type.quantity}, Requested: ${quantity}`
    );
  }

  return {
    valid: true,
    type,
    totalCost: type.price * quantity,
  };
}

// Usage
try {
  const validation = await validateStock(productId, "type_001", 5);
  console.log(`Order valid. Total cost: ${validation.totalCost} DA`);
} catch (error) {
  console.error("Validation failed:", error.message);
}

Bonnes pratiques

Vérifier avant la commande

Vérifiez toujours le stock avant de passer des commandes

Masquer les prix de gros

N’affichez jamais les valeurs brutes de price aux clients

Mettre en cache brièvement

Mettez en cache pendant 1-2 minutes lors du flux de paiement

Gérer les ruptures de stock

Gérez gracieusement les scénarios de quantité nulle

Gestion des erreurs

async function checkProductSafely(productId) {
  try {
    return await checkProduct(productId);
  } catch (error) {
    if (error.message.includes("404")) {
      throw new Error("Product not found or disabled");
    }

    if (error.message.includes("401")) {
      throw new Error("Invalid API key");
    }

    console.error("Failed to check product:", error);
    throw new Error("Unable to load product details. Please try again.");
  }
}

Étapes suivantes

Passer des commandes

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 le catalogue

Récupérer les produits disponibles

Vue d'ensemble

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

Livraison sécurisée

Chiffrer et livrer les cartes