Aller au contenu

Référence des tables

Cette page est générée depuis le schéma réel de la base (information_schema et pg_constraint). Les règles métier — valeurs autorisées, fenêtres de dates, absence d’auto-référence — sont des contraintes CHECK : la base les refuse même si le code se trompe. Les horodatages sont avec fuseau (timestamptz), les montants en centimes, les paramètres en jsonb.

Premier niveau de la taxonomie — « المجال الرئيسي ». Un produit appartient obligatoirement à un domaine.

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
title_ar texte non — Titre en arabe.
slug texte non — Identifiant d’URL, unique.
subtitle_ar texte oui — Sous-titre en arabe.
description_ar texte long oui — Description en arabe.
color texte oui — Repère visuel.
position entier non 0 Ordre d’affichage.
active booléen non true Masqué de la vitrine si faux.
created_at date-heure (fuseau) oui — Création.
updated_at date-heure (fuseau) oui — Dernière modification.

Contraintes

  • unique : slug

Second niveau de la taxonomie — le vivier de la vente croisée. Facultative pour un parcours ou un niveau.

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
theme_id entier non — Domaine (obligatoire).
title_ar texte non — Titre en arabe.
slug texte non — Identifiant d’URL, unique.
description_ar texte long oui — Description en arabe.
position entier non 0 Ordre d’affichage.
active booléen non true Masqué de la vitrine si faux.
created_at date-heure (fuseau) oui — Création.
updated_at date-heure (fuseau) oui — Dernière modification.

Contraintes

  • unique : slug
  • theme_id → themes.id (suppression en cascade)

Tout ce qui se vend : article, livre audio, programme, parcours, pack, niveau. Les composites ne sont pas des tables à part.

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
title_ar texte non — Titre en arabe.
slug texte non — Identifiant d’URL, unique.
subtitle_ar texte oui — Sous-titre en arabe.
description_ar texte long oui — Description en arabe.
author_ar texte oui — Auteur en arabe.
cover_path texte oui — Visuel (chemin privé).
theme_id entier non — Domaine (obligatoire).
sub_theme_id entier oui — Sous-thématique (facultative).
position entier non 0 Ordre d’affichage.
kind texte non — Type sur l’échelle de montée en gamme.
is_offer booléen non true Vendable séparément.
is_featured booléen non false Mis en avant sur l’accueil.
price_base entier oui — Prix de base, en centimes.
price_promo entier oui — Prix promotionnel, en centimes.
promo_starts_at date-heure (fuseau) oui — Début de la fenêtre promotionnelle.
promo_ends_at date-heure (fuseau) oui — Fin de la fenêtre promotionnelle.
currency texte non ‘MAD’ Devise (ISO 4217).
status texte non ‘draft’ Cycle de vie.
published_at date-heure (fuseau) oui — Date de publication.
created_at date-heure (fuseau) oui — Création.
updated_at date-heure (fuseau) oui — Dernière modification.

Contraintes

  • kind ∈ { article, collection, livre, programme, parcours, pack_specialise, pack_global, presentiel, podcast }
  • CHECK ((price_promo IS NULL) OR (price_base IS NULL) OR (price_promo <= price_base))
  • CHECK ((promo_starts_at IS NULL) OR (promo_ends_at IS NULL) OR (promo_ends_at > promo_starts_at))
  • unique : slug
  • status ∈ { draft, published, archived }
  • sub_theme_id → sub_themes.id (mis à vide à la suppression)
  • theme_id → themes.id

Arbre réflexif : un produit en contient d’autres, dans un ordre. Un même produit peut avoir plusieurs parents.

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
parent_product_id entier non — Le produit qui contient.
child_product_id entier non — Le produit contenu.
position entier non 0 Ordre d’affichage.

Contraintes

  • child_product_id → products.id (suppression en cascade)
  • parent_product_id ≠ child_product_id — pas d’auto-référence
  • unique : parent_product_id, child_product_id
  • parent_product_id → products.id (suppression en cascade)

Les segments consommables d’un produit — jamais vendus séparément, donc sans prix.

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
product_id entier non — Produit concerné.
title_ar texte non — Titre en arabe.
type texte non — Type de média.
position entier non 0 Ordre d’affichage.
duration_s entier oui — Durée en secondes.
storage_key texte oui — Clé du fichier sur le stockage privé — jamais exposée.
preview booléen non false Extrait gratuit.
status texte non ‘draft’ Cycle de vie.
created_at date-heure (fuseau) oui — Création.
updated_at date-heure (fuseau) oui — Dernière modification.

Contraintes

  • product_id → products.id (suppression en cascade)
  • status ∈ { draft, published, archived }
  • type ∈ { audio, article, article_audio, video }

Un produit en exige un autre, selon une règle. Relation distincte de la composition : exiger n’est pas contenir.

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
product_id entier non — Produit concerné.
required_product_id entier non — Le produit exigé.
rule texte non ‘certified’ Ce qui satisfait le prérequis : acquis, terminé, certifié.
created_at date-heure (fuseau) oui — Création.
updated_at date-heure (fuseau) oui — Dernière modification.

Contraintes

  • product_id ≠ required_product_id — pas d’auto-référence
  • product_id → products.id (suppression en cascade)
  • unique : product_id, required_product_id
  • required_product_id → products.id (suppression en cascade)
  • rule ∈ { owned, completed, certified }

Apprenants et administrateurs dans une seule table. L’identifiant est l’e-mail ou le téléphone.

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
name texte non — Nom.
email texte oui — Adresse e-mail, unique.
phone texte oui — Téléphone E.164, unique.
password texte oui — Mot de passe haché — administrateurs seulement.
role texte non ‘learner’ Apprenant ou administrateur.
status texte non ‘invited’ Cycle de vie.
locale texte non ‘ar’ Langue de l’interface.
verified_at date-heure (fuseau) oui — Première connexion réussie.
last_login_at date-heure (fuseau) oui — Dernière connexion.
invited_by entier oui — Administrateur qui a invité le compte.
remember_token texte oui — Session persistante (cadre Laravel).
created_at date-heure (fuseau) oui — Création.
updated_at date-heure (fuseau) oui — Dernière modification.

Contraintes

  • unique : email
  • CHECK ((email IS NOT NULL) OR (phone IS NOT NULL))
  • invited_by → users.id (mis à vide à la suppression)
  • unique : phone
  • role ∈ { learner, admin }
  • status ∈ { invited, active, disabled }

Les appareils connectés à un compte ; un jeton par appareil.

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
user_id entier non — Compte concerné.
device_key texte non — Identifiant stable fourni par l’application.
platform texte non — ios, android ou web.
name texte oui — Nom.
app_version texte oui — Version de l’application.
push_token texte oui — Jeton de notification (lot L10).
token_id entier oui — Jeton d’API courant.
last_seen_at date-heure (fuseau) oui — Dernière requête vue.
created_at date-heure (fuseau) oui — Création.
updated_at date-heure (fuseau) oui — Dernière modification.

Contraintes

  • platform ∈ { ios, android, web }
  • unique : user_id, device_key
  • user_id → users.id (suppression en cascade)

Un code à usage unique en attente. Le code n’est jamais stocké en clair.

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
identifier texte non — E-mail ou téléphone normalisé.
channel texte non — Canal d’envoi du code.
code_hash texte non — Empreinte HMAC du code.
expires_at date-heure (fuseau) non — Échéance.
attempts entier non ‘0’ Tentatives consommées.
consumed_at date-heure (fuseau) oui — Consommé (utilisé ou invalidé).
ip_address texte oui — Adresse de la demande.
created_at date-heure (fuseau) oui — Création.
updated_at date-heure (fuseau) oui — Dernière modification.

Contraintes

  • channel ∈ { mail, sms, whatsapp, log }

Jetons Sanctum portés par l’application mobile (table du cadre Laravel).

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
tokenable_type texte non — Type du porteur (cadre).
tokenable_id entier non — Porteur du jeton.
name texte long non — Nom.
token texte non — Empreinte du jeton.
abilities texte long oui — Permissions.
last_used_at date-heure oui — Dernière utilisation.
expires_at date-heure oui — Échéance.
created_at date-heure oui — Création.
updated_at date-heure oui — Dernière modification.

Contraintes

  • unique : token

Le « DROIT_ACCES » du dossier d’architecture, à la granularité produit, avec son origine.

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
user_id entier non — Compte concerné.
product_id entier non — Produit concerné.
status texte non ‘active’ Cycle de vie.
origin texte non — D’où vient le droit : achat, pack, parcours, abonnement, promotion, cadeau, admin, migration, partenaire.
source_ref texte oui — Référence de la source (commande, note d’octroi…).
granted_by entier oui — Administrateur qui a accordé.
granted_at date-heure (fuseau) non — Accordé le.
expires_at date-heure (fuseau) oui — Échéance.
revoked_at date-heure (fuseau) oui — Révoqué le.
created_at date-heure (fuseau) oui — Création.
updated_at date-heure (fuseau) oui — Dernière modification.

Contraintes

  • granted_by → users.id (mis à vide à la suppression)
  • origin ∈ { purchase, pack, pathway, subscription, promotion, gift, admin, migration, partner }
  • product_id → products.id (suppression en cascade)
  • status ∈ { active, revoked, expired }
  • user_id → users.id (suppression en cascade)

Réglages métier modifiables sans déploiement, typés, mis en cache.

Colonne Type Nul Défaut Rôle
id entier non séquence Identifiant technique.
group texte non — Onglet de l’écran Paramètres.
key texte non — Clé lue par le code, unique.
type texte non — Type de média.
value jsonb oui — Valeur typée (jsonb).
options jsonb oui — Choix possibles pour une liste.
label texte non — Libellé affiché (clé de traduction).
help texte oui — Aide affichée (clé de traduction).
unit texte oui — Unité affichée.
position entier non 0 Ordre d’affichage.
created_at date-heure (fuseau) oui — Création.
updated_at date-heure (fuseau) oui — Dernière modification.

Contraintes

  • unique : key
  • type ∈ { string, text, integer, boolean, money, select }