Directus API créer un nouvel Item

Bonjour,

Progressivement je me familiarise avec cet outil génial conçu par @mbritto et @jmjoary qu’est le DirectusApiManager.
Mais depuis quelques jours, je suis en galère avec l’ajout d’un nouvel Item. J’avoue ne pas avoir bien saisi la méthode du Object.newItem().
J’ai créé mon ActivityService qui hérite de DirectusService.
Maintenant je veux créer une fonction d’ajout d’Activity dans ma base de données Directus. Je crée donc :

Future addNewActivity(){
apiManager.createNewItem<Activity>(objectToCreate: , createItemFunction:)
}

mais lorsque je crée en amont un objet « Activity » à passer à l’objectToCreate, il ne se passe rien et j’avoue ne pas trop savoir quoi passer à « CreateItemFunction » (fromDirectus()?).
De plus, je ne vois pas comment me servir de Activity.newItem(). Je le place où et j’en fait quoi ?

Activity({
          "id": ???,
          "title": title,
          "place": place,
          "start_time": startTime,
          "end_time": endTime
        })

Je sollicite donc votre aide si quelqu’un est à l’aise avec le sujet.
Au plaisir de vous lire.

La méthode Object.newItem permet de créer un objet vide car lorsque ton application crée l’objet, on ne dispose pas encore de l’id et comme ton objet dépend de DirectusItem, tu obtiendras une exception car le champs id est obligatoire.

Pour faire plus simple, newItem permet de passer outre les vérifications lors de la création de ton objet.

Ensuite, dans ton ActivityService, tu dois avoir implémenter fromDirectus. Cette fonction retournera dans ton cas, un objet Activity. Elle est utilisé pour pouvoir créer les objets à la volée lors des différents appels à l’API.

Un exemple sera peut être plus clair.

Dans mon projet, j’ai un objet Message qui hérite de DirectusItem. J’ai également un objet MessageService qui gère les appels à la base de données pour les objets Message.

Le service est déclaré de cette façon :

class MessageService extends DirectusService<Message> {
  MessageService({required DirectusApiManager apiManager})
      : super(
            apiManager: apiManager,
            typeName: 'messages',
            fields:"*"
            );

  @override
  Message fromDirectus(rawData) {
    return Message(rawData);
  }

lorsque je déclare mon service, je spécifie à plusieurs endroits le type d’objet qu’il va gérer (dans l’exemple, il s’agit de Message)

  • Lorsque je déclare que mon service hérite de DirectusService, note le Message entre les chevrons.
  • La méthode fromDirectus retourne également un objet de type Message

comme MessageService hérite de DirectusService, la fonction pour ajouter un message existe déjà. Tu n’as pas besoin de la refaire.

donc si je veux créer un nouveau message dans la base, je fais comme ceci :

final Message newMessage = Message.newItem(); // Je crée mon objet message
newMessage.title = "titre"; // J'initialise les propriétés que je souhaite
...
final MessageService messageService = MessageService(apiManager: apiManager); // Je crée mon objet MessageService
final DirectusItemCreationResult result = await messageService.create(newMessage); // J'attends la réponse de l'API

L’objet DirectusItemCreationResult contient :

  • isSuccess qui est un boolean te permettant de savoir si cela c’est bien passé
  • createdItemList qui est une liste de Message si j’ai le droit de voir les objets crées.
  • createdItem qui retourne le premier objet Message si j’ai le droit de voir les objets crées.
  • error qui contient le message d’erreur si cela s’est mal passé.
class DirectusItemCreationResult<T> {
 final bool isSuccess;
 List<T> createdItemList = [];
 DirectusApiError? error;

 DirectusItemCreationResult({required this.isSuccess, this.error}) {
   if (!isSuccess && error == null) {
     throw Exception("error must be initialized");
   }
 }

 T? get createdItem {
   return createdItemList.isEmpty ? null : createdItemList.first;
 }
}

Mille mercis :pray::pray::pray:@jmjoary.
C’est clair maintenant et tellement facile à mettre en oeuvre.
Encore bravo pour ton magnifique travail et ta disponibilité pour répondre à toutes nos questions.

Belle journée à toi.

Benoit

Depuis hier je travaille sur une nouvelle amélioration qui devrait vous plaire pour diminuer encore le code nécessaire pour chaque collection.
Je vous en parlerai un peu plus demain avant le meetup de Kévin :wink:

2 « J'aime »