Maintenant que l’élément de jeu se trouve dans votre table, vous pouvez apprendre à simuler un joueur qui effectue un déplacement dans un jeu en cours.
Cette opération peut se faire de deux manières. Dans la première méthode, vous récupérez l’élément à l’aide de l’API GetItem. Ensuite, vous mettez à jour l’élément de jeu dans votre application suivant le déplacement effectué par le joueur. Pour finir, vous remplacez l’élément existant dans DynamoDB en utilisant l’API PutItem. Bien qu’elle soit efficace, cette méthode nécessite plusieurs requêtes vers votre table DynamoDB et risque d’écraser tous les changements intervenus entre la récupération et la réécriture de votre élément de jeu.
La seconde méthode consiste à utiliser l’appel d’API UpdateItem dans DynamoDB. Avec l’API UpdateItem, vous pouvez mettre à jour votre élément DynamoDB en place via une seule requête. Pour ce faire, vous spécifiez l’élément et les attributs que vous souhaitez modifier, ainsi que les conditions que vous désirez déclarer sur l’élément. Cette option est la plus indiquée pour modifier un élément, car elle ne nécessite pas plusieurs appels à votre base de données.
Le répertoire scripts/ comprend un fichier dénommé performMove.js, dont le contenu est le suivant :
const AWS = require('aws-sdk')
const documentClient = new AWS.DynamoDB.DocumentClient()
const performMove = async ({ gameId, user, changedHeap, changedHeapValue }) => {
if (changedHeapValue < 0 ) {
throw new Error('Cannot set heap value below 0')
}
const params = {
TableName: 'turn-based-game',
Key: {
gameId: gameId
},
UpdateExpression: `SET lastMoveBy = :user, ${changedHeap} = :changedHeapValue`,
ConditionExpression: `(user1 = :user OR user2 = :user) AND lastMoveBy <> :user AND ${changedHeap} > :changedHeapValue`,
ExpressionAttributeValues: {
':user': user,
':changedHeapValue': changedHeapValue,
},
ReturnValues: 'ALL_NEW'
}
try {
const resp = await documentClient.update(params).promise()
console.log('Updated game: ', resp.Attributes)
} catch (error) {
console.log('Error updating item: ', error.message)
}
}
performMove({ gameId: '5b5ee7d8', user: 'theseconduser', changedHeap: 'heap1', changedHeapValue: 3 })
Ce script est légèrement compliqué. Procédons donc étape par étape.
À l’instar du script précédent, vous importez le kit AWS SDK et créez une instance de client de document DynamoDB.
Ensuite, vous définissez une méthode appelée performMove. Cette méthode est similaire à une méthode interne que vous emploieriez dans votre application lorsqu’un utilisateur demande à effectuer un déplacement. Le script regroupe les paramètres pour un appel d’API UpdateItem. Pour commencer, il modifie deux attributs sur le jeu, à savoir le dernier utilisateur à avoir effectué un déplacement et le nombre d’éléments formant le tas modifié.
Les paramètres de l’API UpdateItem effectuent ensuite quelques déclarations concernant l’état actuel du jeu. Le paramètre ConditionExpression est évalué avant la mise à jour de l’élément pour confirmer que ce dernier est dans l’état désiré. Vous effectuez les trois déclarations suivantes dans votre expression de condition :
- L’utilisateur qui souhaite effectuer un déplacement est l’un des deux utilisateurs du jeu.
- Le tour actuel revient à l’utilisateur souhaitant effectuer le déplacement.
- La valeur actuelle du tas d’objets en cours de modification est supérieure à la valeur de modification en cours.
Pour finir, les paramètres indiquent une valeur ReturnValue de ALL_NEW, ce qui signifie que DynamoDB renvoie l’élément intégral après la mise à jour de ses valeurs. Une fois que vous possédez cette sortie, votre application peut évaluer le jeu pour vérifier s’il y a un gagnant.
Au bas de ce fichier se trouve un exemple d’appel de cette méthode dans votre application. Vous pouvez exécuter le script avec la commande ci-dessous :
Vous obtiendrez la sortie suivante dans votre terminal :
Updated game: { heap2: 4,
heap1: 3,
heap3: 5,
gameId: '5b5ee7d8',
user2: 'theseconduser',
user1: 'myfirstuser',
lastMoveBy: 'theseconduser' }
Comme vous pouvez le voir, l’écriture est réussie, et le jeu a été mis à jour.
Essayez d’exécuter à nouveau le script dans votre terminal. Vous obtiendrez la sortie suivante :
Vos requêtes conditionnelles ont échoué cette fois. L’utilisateur demandeur, theseconduser, est le joueur qui a effectué le déplacement le plus récent. Par ailleurs, le tas modifié, heap1, possédait déjà une valeur 3, ce qui signifie que l’utilisateur n’a rien modifié. En conséquence, la requête a été rejetée.