Skip to content
Félix Martel edited this page Mar 22, 2017 · 1 revision

Quelques mots sur le nouveau datastore fait maison.

Récupérer des ressources

La première différence par rapport à l'ancien, c'est qu'il n'y a plus de find/findAll, il n'y juste que find find(baseName: string, id?: string|number, action?: string, resName?: string) En gros, récupère la ressource /baseName/action s'il n'y a pas d'id, et /baseName/id/action sinon, si pas d'action, et pas d'id, il considère que l'action est list, si pas d'action mais un id, il considère que c'est retrieve.

Dernière chose, le resName permet de définir le nom du type de ressource que le find est censé trouver. Par exemple, on peut vouloir find('group', 3, 'members') mais du coup ça doit pas retourner un group mais un group-member, donc on fait find('group', 3, 'members', 'group-member') Si jamais on le laisse vide, ça fait automatiquement resName = baseName

En résumé :

find('group', 7), find('group'), find('group', 7, 'members') par exemple


Gérer les données

Le fetch gère automatiquement les données de retour en fonction de si c'est une liste ou un seul objet, et crée et met en cache le bon objet, le find retourne alors cet objet. Si c'est un seul objet, vous pouvez directement le caster en ce que vous voulez find('group', 7).then((gr: Group) => {console.log(gr);});

Si c'est une collection, vous pouvez caster en Collection<T> sachant qu'une collection c'est juste une liste d'id. Pour explorer la collection, vous pouvez utiliser length, get(i), ou encore forEach(cb)

   grs.forEach((gr: Group) => {
       console.log(gr);
   });
});

Définir une ressource

Pour définir une ressource, c'est à dire un type de donnée à gérer, créez la dans un nouveau fichier dans /resources/ avec dedans une classe qui descend de Record où vous pouvez définir la classe qui sera instanciée pour chaque ressource

A la fin du fichier, vous devez à proprement parler définir la ressource via un objet qui contient :

  • le nom de la ressource (celui qu'on utilisait plus haut dans le resName de find)
  • la classe qui sera utilisée pour l'instanciation, donc celle que vous avez créé plus haut
  • le nom du champ qui correspond à l'id de l'objet (attention, ça doit correspondre avec celui de l'url), si c'est pas spécifié, il cherchera automatiquement pk, et a défaut id
  • les sous-collections qui ont un url différent, par exemple /group/3/members

Sous-collections

Pour les sous-collections, on les définit via un objet contenant :

  • le nom de l'action (par exemple 'members' pour /res/id/members)
  • le nom du type de ressource (par exemple 'group-members') Seules ses deux sont obligatoires, elles permettent de s'affranchir du resName lorsqu'on fait un find, d'où la possibilité de find('group', 7, 'members') sans spécifier resName = 'group-members'

Et eventuellement :

  • le nom du champ qui doit pointer vers ladite collection
  • un paramètre éventuel pour demander à faire un find automatique de la sous collection quand on find l'objet d'origine

Par exemple :

    public members: Collection<GroupMember>;
}

export const groupRessource = {
    name: 'group',
    klass: Group,
    subCollections: [{
        action: 'members',
        field: 'memberships',
        ressource: 'group-member',
        auto: true
    }]
};

Ici, lors d'un find('group', 7), le champ members pointera automatiquement vers la bonne collection (qu'elle soit présente en mémoire ou pas), puisqu'auto = true, un find('group', 7, 'members') sera automatiquement fait pour charger la collection en mémoire