Ajouter les modèles et DAO des entités #54

Closed
opened 2026-07-20 15:34:34 +02:00 by fy59 · 0 comments
Owner

Ajouter les modèles et DAO des entités

Contexte

Le schéma SQLite contient déjà les tables nécessaires à la gestion des entités OSINT :

  • types_entite ;
  • entites ;
  • preuve_entites ;
  • relations ;
  • relation_preuves.

L'application ne possède cependant pas encore de couche métier C permettant de manipuler les types d'entité et les entités persistées.

Cette étape est indispensable avant de développer :

  • la création d'entités depuis l'interface ;
  • les liaisons entre preuves et entités ;
  • les relations entre entités ;
  • le futur tableau blanc affichant graphiquement les données SQLite et leurs relations.

Objectif

Ajouter une couche métier et une couche DAO robustes pour les types d'entité et les entités.

À la fin du ticket, le programme doit pouvoir :

  • charger le catalogue des types d'entité ;
  • créer une entité métier valide ;
  • insérer une entité dans SQLite ;
  • rechercher une entité par son UUID ;
  • charger toutes les entités dans un ordre déterministe ;
  • compter les entités persistées ;
  • signaler proprement les erreurs de validation, de contrainte et de lecture.

Périmètre

1. Modèle EntityType

Créer :

include/models/entity_type.h
src/models/entity_type.c
tests/test_entity_type.c

Le modèle doit représenter au minimum :

  • l'identifiant SQLite ;
  • le code métier ;
  • le libellé ;
  • la description éventuelle.

Le modèle doit être opaque et exposer des getters en lecture seule.

2. Modèle EntityRecord

Créer :

include/models/entity_record.h
src/models/entity_record.c
tests/test_entity_record.c

Le modèle doit représenter les colonnes métier de la table entites, notamment :

  • identifiant UUID ;
  • type d'entité ;
  • valeur ;
  • libellé facultatif ;
  • description facultative ;
  • niveau de confiance ;
  • date de création ;
  • date de mise à jour ;
  • statut.

Le modèle doit :

  • normaliser les chaînes selon les conventions du projet ;
  • refuser un UUID invalide ;
  • refuser une valeur vide ;
  • refuser un type absent ;
  • refuser un niveau de confiance hors de l'intervalle autorisé ;
  • valider le statut ;
  • rester indépendant de GTK.

3. DAO EntityTypeDao

Créer :

include/dao/entity_type_dao.h
src/dao/entity_type_dao.c
tests/test_entity_type_dao.c

Fonction minimale attendue :

GPtrArray *entity_type_dao_list_all(
    EntityTypeDao *entity_type_dao,
    GError **error
);

Le chargement doit utiliser un ordre déterministe.

4. DAO EntityDao

Créer :

include/dao/entity_dao.h
src/dao/entity_dao.c
tests/test_entity_dao.c

Fonctions minimales attendues :

gboolean entity_dao_insert(
    EntityDao *entity_dao,
    const EntityRecord *entity_record,
    GError **error
);

EntityRecord *entity_dao_find_by_identifier(
    EntityDao *entity_dao,
    const char *identifier,
    GError **error
);

GPtrArray *entity_dao_list_all(
    EntityDao *entity_dao,
    GError **error
);

gboolean entity_dao_count(
    EntityDao *entity_dao,
    guint64 *out_count,
    GError **error
);

Le DAO doit :

  • utiliser les abstractions Database et DatabaseStatement existantes ;
  • ne jamais exposer directement sqlite3 dans son interface publique ;
  • distinguer les erreurs d'argument, de préparation, de liaison, d'exécution, de lecture, de contrainte et de modèle ;
  • distinguer une entité absente d'une erreur SQLite ;
  • conserver les champs facultatifs sous forme de NULL SQL lorsque cela est approprié ;
  • retourner des tableaux possédant leurs éléments ;
  • documenter clairement les règles de propriété.

Contraintes d'architecture

  • C17 uniquement.
  • Compilation avec :
-Wall -Wextra -Wpedantic -Werror
  • Structures opaques dans les fichiers d'en-tête.
  • Fonctions préfixées par leur module.
  • Aucun accès GTK dans les modèles ou DAO.
  • Aucun accès direct à SQLite depuis les futurs widgets.
  • UUID stables pour permettre la représentation future des entités dans le graphe.
  • Aucun champ de position graphique dans EntityRecord.
  • Les informations de disposition du futur tableau blanc devront rester dans une couche séparée.

Tests attendus

EntityType

  • création valide ;
  • identifiant SQLite invalide ;
  • code métier vide ;
  • libellé vide ;
  • champs facultatifs ;
  • getters ;
  • libération avec NULL.

EntityRecord

  • création valide complète ;
  • création valide avec champs facultatifs absents ;
  • UUID invalide ;
  • type absent ;
  • valeur vide ;
  • niveau de confiance trop faible ;
  • niveau de confiance trop élevé ;
  • statut invalide ;
  • normalisation des chaînes ;
  • getters ;
  • libération avec NULL.

EntityTypeDao

  • chargement du catalogue ;
  • ordre stable ;
  • catalogue vide ;
  • erreur de schéma ;
  • arguments invalides.

EntityDao

  • insertion complète ;
  • insertion avec champs facultatifs ;
  • doublon interdit par les contraintes du schéma ;
  • type inexistant ;
  • recherche d'une entité existante ;
  • recherche d'une entité absente sans erreur ;
  • comptage d'une table vide ;
  • comptage de plusieurs entités ;
  • chargement de plusieurs entités dans un ordre stable ;
  • reconstruction fidèle du modèle depuis SQLite ;
  • arguments invalides ;
  • erreur de préparation ;
  • erreur de liaison ;
  • erreur d'exécution ;
  • erreur de lecture.

Critères d'acceptation

Le ticket est terminé lorsque :

  • les quatre modules sont implémentés ;
  • les interfaces publiques sont documentées avec Doxygen ;
  • les règles de propriété sont explicites ;
  • tous les tests passent ;
  • make clean && make && make test réussit ;
  • git diff --check ne signale aucune erreur ;
  • aucune régression n'est introduite dans l'import ou la vérification des preuves ;
  • aucune modification du schéma SQLite n'est ajoutée sans nécessité démontrée.

Hors périmètre

Ce ticket ne doit pas encore ajouter :

  • le formulaire GTK de création d'une entité ;
  • la liaison preuve ↔ entité ;
  • les relations entité ↔ entité ;
  • les modèles GTK d'affichage ;
  • le tableau blanc ;
  • les positions graphiques ;
  • l'extraction automatique d'e-mails, d'IBAN, de téléphones ou de pseudonymes ;
  • l'intégration d'outils OSINT externes.

Suite prévue

Après ce ticket :

  1. ajouter le DAO des liaisons preuve ↔ entité ;
  2. créer une entité depuis la fiche d'une preuve ;
  3. afficher les entités liées à une preuve ;
  4. ajouter les modèles et DAO des relations entre entités ;
  5. construire un modèle de graphe en mémoire ;
  6. développer le tableau blanc GTK/Cairo.
# Ajouter les modèles et DAO des entités ## Contexte Le schéma SQLite contient déjà les tables nécessaires à la gestion des entités OSINT : - `types_entite` ; - `entites` ; - `preuve_entites` ; - `relations` ; - `relation_preuves`. L'application ne possède cependant pas encore de couche métier C permettant de manipuler les types d'entité et les entités persistées. Cette étape est indispensable avant de développer : - la création d'entités depuis l'interface ; - les liaisons entre preuves et entités ; - les relations entre entités ; - le futur tableau blanc affichant graphiquement les données SQLite et leurs relations. ## Objectif Ajouter une couche métier et une couche DAO robustes pour les types d'entité et les entités. À la fin du ticket, le programme doit pouvoir : - charger le catalogue des types d'entité ; - créer une entité métier valide ; - insérer une entité dans SQLite ; - rechercher une entité par son UUID ; - charger toutes les entités dans un ordre déterministe ; - compter les entités persistées ; - signaler proprement les erreurs de validation, de contrainte et de lecture. ## Périmètre ### 1. Modèle `EntityType` Créer : ```text include/models/entity_type.h src/models/entity_type.c tests/test_entity_type.c ``` Le modèle doit représenter au minimum : - l'identifiant SQLite ; - le code métier ; - le libellé ; - la description éventuelle. Le modèle doit être opaque et exposer des getters en lecture seule. ### 2. Modèle `EntityRecord` Créer : ```text include/models/entity_record.h src/models/entity_record.c tests/test_entity_record.c ``` Le modèle doit représenter les colonnes métier de la table `entites`, notamment : - identifiant UUID ; - type d'entité ; - valeur ; - libellé facultatif ; - description facultative ; - niveau de confiance ; - date de création ; - date de mise à jour ; - statut. Le modèle doit : - normaliser les chaînes selon les conventions du projet ; - refuser un UUID invalide ; - refuser une valeur vide ; - refuser un type absent ; - refuser un niveau de confiance hors de l'intervalle autorisé ; - valider le statut ; - rester indépendant de GTK. ### 3. DAO `EntityTypeDao` Créer : ```text include/dao/entity_type_dao.h src/dao/entity_type_dao.c tests/test_entity_type_dao.c ``` Fonction minimale attendue : ```c GPtrArray *entity_type_dao_list_all( EntityTypeDao *entity_type_dao, GError **error ); ``` Le chargement doit utiliser un ordre déterministe. ### 4. DAO `EntityDao` Créer : ```text include/dao/entity_dao.h src/dao/entity_dao.c tests/test_entity_dao.c ``` Fonctions minimales attendues : ```c gboolean entity_dao_insert( EntityDao *entity_dao, const EntityRecord *entity_record, GError **error ); EntityRecord *entity_dao_find_by_identifier( EntityDao *entity_dao, const char *identifier, GError **error ); GPtrArray *entity_dao_list_all( EntityDao *entity_dao, GError **error ); gboolean entity_dao_count( EntityDao *entity_dao, guint64 *out_count, GError **error ); ``` Le DAO doit : - utiliser les abstractions `Database` et `DatabaseStatement` existantes ; - ne jamais exposer directement `sqlite3` dans son interface publique ; - distinguer les erreurs d'argument, de préparation, de liaison, d'exécution, de lecture, de contrainte et de modèle ; - distinguer une entité absente d'une erreur SQLite ; - conserver les champs facultatifs sous forme de `NULL` SQL lorsque cela est approprié ; - retourner des tableaux possédant leurs éléments ; - documenter clairement les règles de propriété. ## Contraintes d'architecture - C17 uniquement. - Compilation avec : ```text -Wall -Wextra -Wpedantic -Werror ``` - Structures opaques dans les fichiers d'en-tête. - Fonctions préfixées par leur module. - Aucun accès GTK dans les modèles ou DAO. - Aucun accès direct à SQLite depuis les futurs widgets. - UUID stables pour permettre la représentation future des entités dans le graphe. - Aucun champ de position graphique dans `EntityRecord`. - Les informations de disposition du futur tableau blanc devront rester dans une couche séparée. ## Tests attendus ### `EntityType` - création valide ; - identifiant SQLite invalide ; - code métier vide ; - libellé vide ; - champs facultatifs ; - getters ; - libération avec `NULL`. ### `EntityRecord` - création valide complète ; - création valide avec champs facultatifs absents ; - UUID invalide ; - type absent ; - valeur vide ; - niveau de confiance trop faible ; - niveau de confiance trop élevé ; - statut invalide ; - normalisation des chaînes ; - getters ; - libération avec `NULL`. ### `EntityTypeDao` - chargement du catalogue ; - ordre stable ; - catalogue vide ; - erreur de schéma ; - arguments invalides. ### `EntityDao` - insertion complète ; - insertion avec champs facultatifs ; - doublon interdit par les contraintes du schéma ; - type inexistant ; - recherche d'une entité existante ; - recherche d'une entité absente sans erreur ; - comptage d'une table vide ; - comptage de plusieurs entités ; - chargement de plusieurs entités dans un ordre stable ; - reconstruction fidèle du modèle depuis SQLite ; - arguments invalides ; - erreur de préparation ; - erreur de liaison ; - erreur d'exécution ; - erreur de lecture. ## Critères d'acceptation Le ticket est terminé lorsque : - les quatre modules sont implémentés ; - les interfaces publiques sont documentées avec Doxygen ; - les règles de propriété sont explicites ; - tous les tests passent ; - `make clean && make && make test` réussit ; - `git diff --check` ne signale aucune erreur ; - aucune régression n'est introduite dans l'import ou la vérification des preuves ; - aucune modification du schéma SQLite n'est ajoutée sans nécessité démontrée. ## Hors périmètre Ce ticket ne doit pas encore ajouter : - le formulaire GTK de création d'une entité ; - la liaison preuve ↔ entité ; - les relations entité ↔ entité ; - les modèles GTK d'affichage ; - le tableau blanc ; - les positions graphiques ; - l'extraction automatique d'e-mails, d'IBAN, de téléphones ou de pseudonymes ; - l'intégration d'outils OSINT externes. ## Suite prévue Après ce ticket : 1. ajouter le DAO des liaisons preuve ↔ entité ; 2. créer une entité depuis la fiche d'une preuve ; 3. afficher les entités liées à une preuve ; 4. ajouter les modèles et DAO des relations entre entités ; 5. construire un modèle de graphe en mémoire ; 6. développer le tableau blanc GTK/Cairo.
fy59 closed this issue 2026-07-20 21:41:27 +02:00
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: fy59/labfy-investigation#54
No description provided.