Kini setelah Anda memiliki item game dalam tabel, Anda dapat mempelajari cara menyimulasikan pemain yang membuat gerakan untuk game yang sedang berlangsung.
Terdapat dua cara untuk Anda menangani operasi ini. Dalam cara pertama, Anda akan menarik item menggunakan GetItem API. Kemudian, Anda akan memperbarui item game dalam aplikasi berdasarkan gerakan yang dibuat oleh pemain. Terakhir, Anda mengganti item yang ada dalam DynamoDB menggunakan PutItem API. Walaupun dapat berjalan, opsi ini memerlukan beberapa permintaan ke tabel DynamoDB Anda dan memiliki risiko menyimpan setiap perubahan yang terjadi antara fetching dan menulis ulang item game.
Cara kedua untuk menangani operasi ini adalah dengan menggunakan panggilan UpdateItem API di DynamoDB. Dengan UpdateItem API, Anda dapat memperbarui item DynamoDB yang ada melalui satu permintaan. Anda menetapkan item yang ingin diubah, atribut yang ingin diubah, dan kondisi yang ingin dinyatakan pada item. Ini adalah cara yang lebih disukai untuk mengubah item karena tidak memerlukan beberapa panggilan ke database.
Dalam direktori scripts/, terdapat sebuah file yang disebut performMove.js dan memiliki konten berikut:
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 })
Skrip ini sedikit rumit, jadi mari kita lakukan langkah demi langkah.
Seperti skrip sebelumnya, Anda akan mengimpor AWS SDK dan membuat instans DynamoDB Document Client.
Kemudian, Anda menentukan sebuah metode yang disebut performMove. Metode ini mirip dengan metode internal yang akan digunakan dalam aplikasi Anda saat pengguna meminta membuat sebuah gerakan. Skrip ini akan mengumpulkan berbagai parameter untuk panggilan UpdateItem API. Pertama, skrip akan mengubah dua atribut pada game -- pengguna terakhir yang akan membuat gerakan, dan jumlah elemen dalam tumpukan yang berubah.
Parameter UpdateItem API kemudian membuat sejumlah penegasan mengenai status game saat ini. ConditionExpression dievaluasi sebelum item diperbarui untuk mengonfirmasi bahwa item dalam status yang Anda inginkan. Anda membuat tiga penegasan berikut dalam ekspresi kondisi Anda:
- Bahwa pengguna yang meminta menjalankan gerakan adalah satu dari dua pengguna dalam game;
- Bahwa giliran saat ini milik pengguna yang meminta menjalankan gerakan;
- Bahwa tumpukan yang sedang diubah memiliki nilai saat ini yang lebih tinggi daripada nilai yang diubah.
Terakhir, parameter menyatakan ReturnValue dari ALL_NEW, yang berarti bahwa DynamoDB mengembalikan seluruh item setelah nilainya telah diperbarui. Setelah Anda mendapatkannya, aplikasi Anda dapat mengevaluasi game untuk melihat apakah ada pemenang.
Pada bagian bawah file terdapat contoh bagaimana metode ini dipanggil dalam aplikasi Anda. Anda dapat menjalankan skrip dengan perintah berikut di:
Anda akan melihat output berikut di terminal Anda:
Updated game: { heap2: 4,
heap1: 3,
heap3: 5,
gameId: '5b5ee7d8',
user2: 'theseconduser',
user1: 'myfirstuser',
lastMoveBy: 'theseconduser' }
Anda dapat melihat bahwa penulisan berhasil dan game telah diperbarui.
Coba jalankan kembali skrip tersebut di terminal Anda. Anda akan melihat output berikut:
Permintaan kondisional Anda kali ini gagal. Pengguna yang meminta -- theseconduser -- adalah pemain terakhir yang bergerak. Lebih lanjut, tumpukan yang berubah -- heap1 -- telah memiliki nilai 3, yang berarti pengguna tidak mengubah apa pun. Karena itu, permintaan tersebut ditolak.