Ajouter un provider
Lors de l'intégration d'un nouveau provider dans l'application il y a plusieurs étapes à suivre :
Infrastructure
Cette première partie est la plus dépendante du provider. En effet, il faut pouvoir mettre en place une infrastructure permettant de mettre à disposition des comptes "jetables" aux joueurs où l'on peut facilement monitorer ce qui se passe sur le compte (via des évènements en général). Cela nécessite un gros travail préliminaire pour connaitre les outils mis à disposition par le provider.
Code
Du côté du code de l'application il y a 4 grandes étapes à réaliser dans le back pour l'intégration du nouveau provider et cela commence par en premier lieu, ajouter le provider à l'enum listant tous ceux disponibles :
export enum Provider {
AWS = "AWS",
Azure = "Azure",
}
1️⃣ Gestion des comptes
Pour permettre à l'application de gérer les comptes il faut créer l'implémentation de l'interface AccountService
. Celle-ci dispose de deux méthodes qui sont appelées à l'enregistrement d'un joueur :
- une permettant de préparer le compte (droits, nettoyage etc.) et ses credentials
- l'autre préparant l'infrastructure spécifique au scénario qui va être joué
export interface AccountService {
prepareUser(account: Account, username: string): Promise<Credentials>;
createInfra(team: Team): Promise<string>;
}
Une fois cette implémentation faite il suffit de l'ajouter dans la tableau accountProviders
pour permettre à l'application d'enregistrer des joueurs.
const accountProviders: AccountProviders = {
[Provider.AWS]: new AWSAccountService(),
[Provider.Azure]: new AzureAccountService(),
};
Il faut ensuite mettre à disposition le pool de comptes lié au provider dans le fichier accounts.json
{
"AWS": [
{ "id": "162341927974", "type": "master", "name": "ippon-gameday-dev" },
{ "id": "216398478392", "type": "easy", "name": "ippon-gameday-easy-03" }
],
"Azure": [
{
"id": "f49d61df-1855-4032-8d8c-84483763ec876",
"type": "easy",
"name": "team1"
}
]
}
Ce fichier est récupérer sur les branches dev
et master
grâce au script start.sh
donc il faut modifier le script ou merge pour voir apparaitre ses changements sur votre branche.
2️⃣ Récupération d'évènements
Pour que l'application connaisse l'avancement du joueur elle doit pouvoir récupérer les évènements du provider et pour ça il faut implémenter un MessageService
décrivant comment recevoir les messages et comment les supprimer une fois lus.
export interface MessageService {
receiveMessages(useCase: UseCase): Promise<Message[]>;
deleteMessage(message: Message, useCase: UseCase): Promise<void>;
}
- NB : Ne typer que ce qui est important, les interfaces sont ouvertes : c'est-à-dire qu'un objet avec des propriétés supplémentaires pourra toujours implémenter votre interface si les champs spécifiés dans celle-ci sont présents dans l'objet. Donc les events peuvent avoir plus d'infos que ce qui est décrit (cf AzureEvent)
Il faut ensuite créer le use case correspondant dans l'index.
export const eventUseCaseAWS = new EventUseCase(
new AWSMessageService(),
teamRepository
);
export const eventUseCaseAzure = new EventUseCase(
new AzureMessageService(),
teamRepository
);
Enfin, il faut lancer la récupération des events depuis la racine de l'application avec useCase.startPullEvents
.
3️⃣ Scénarios
Pour les scénarios c'est simple il suffit de créer un nouveau scénario contenant le nom du provider en titre selon la méthode vu ici. Le fichier rules.json
devra simplement décrire les propriétés à vérifier à chaque étape suivant la structure des évènements spécifiques à ce provider.
A partir de ce moment la partie Recrutement de l'application est fonctionnelle, modulo les modifications nécessaires dans le front pour afficher le choix de provider.
4️⃣ Scoring
Pour que la partie Gameday soit fonctionnel il ne manque plus que le scoring. Il suffit de mettre en place les ressources pour lesquels le score doit être calculé comme vu ici.