Dernière modification : Dec 08 , 2024

Objectifs

Dans cette leçon, nous allons tester quelques intégrations mineures Quarkus avec le Cloud.

Pour simplifier, nous allons utiliser dans notre cas GCP, et une base NoSQL Google Cloud Firestore.

La base sera fournie pour le TP ou bien vous devrez la créer vous-même.

Installation de l'extension Firestore

La documentation de l'extension est ici.

Pour ajouter cette extension à votre projet, utilisez la commande appropriée dans le répertoire de votre projet Quarkus :

Quarkus CLI

quarkus ext add io.quarkiverse.googlecloudservices:quarkus-google-cloud-firestore

Maven

./mvnw quarkus:add-extension -Dextensions="io.quarkiverse.googlecloudservices:quarkus-google-cloud-firestore"

Écriture du Repository pour Google Cloud Firestore

Nous allons produire un nouveau repository pour Google Cloud Firestore.

Créer le package com.byoskill.adapters.adoptions.firestore.

Créer une classe FirestoreAdoptionRepository.java qui hérite de AdoptionRepository.

La classe vide ressemblera à ceci :


@ApplicationScoped
@IfBuildProfile(anyOf = "firestore")
public class FirestoreAdoptionRepository implements AdoptionRepository {
    @Override
    public Multi<Monster> getAllMonsters() {
        return null;
    }

    @Override
    public Uni<Monster> addMonsterToAdopt(final Monster monster) {
        return null;
    }

    @Override
    public Uni<Monster> getMonsterByUuid(final String id) {
        return null;
    }

    @Override
    public Multi<Monster> searchMonstersByName(final String pattern, final Optional<Integer> size) {
        return null;
    }

    @Override
    public Multi<Monster> searchMonstersByDescription(final String pattern, final Optional<Integer> size) {
        return null;
    }

    @Override
    public void deleteMonsterByUuid(final String id) {

    }

    @Override
    public Uni<Monster> updateMonsterByUUID(final String id, final Monster monster) {
        return null;
    }

    @Override
    public Multi<Monster> searchMonstersByAge(final Integer age) {
        return null;
    }

    @Override
    public Uni<Monster> changeName(final Monster entityToBeUpdated, final String newName) {
        return null;
    }
}

Nous avons besoin d'injecter Firestore à la classe pour implémenter les différentes méthodes.

   @Inject
   Firestore firestore; // Inject Firestore

Voici un exemple simple d'implémentation avec la méthode d'ajout d'adoption :

   @Override
@Blocking
public Uni<Monster> addMonsterToAdopt(final Monster monster) {
    final CollectionReference persons = firestore.collection("monsters");
    final List<ApiFuture<WriteResult>> futures = new ArrayList<>();
    monster.setMonsterUUID(UUID.randomUUID().toString());
    futures.add(persons.document(monster.getMonsterUUID()).set(monster));
    try {
        ApiFutures.allAsList(futures).get();
    } catch (final InterruptedException | ExecutionException e) {
    throw new RuntimeException(e);
    }
    return Uni.createFrom().item(monster);
}

Configuration des propriétés pour l'accès à Firestore

Dans un nouveau fichier application-firestore.properties:

Copier le contenu suivant dans le fichier :

quarkus.google.cloud.project-id=<your-project-id>
quarkus.google.cloud.service-account-location=service-account.json
quarkus.google.cloud.firestore.devservice.enabled=true
quarkus.google.cloud.firestore.database-id=firestore-demo

L'ensemble des propriétés se trouvent ici.

Déploiement sur Google Cloud

Suivre la documentation ici.