You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs: pin electrodb and dynamodb client in dungeon adventure (#338)
* docs: pin electrodb and dynamodb client in dungeon adventure
Ensure all dungeon adventure dependencies are tested by integration tests and kept up to date by our
automation.
Fixes#334
* docs: update translations
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
## Module 2: Game API and Inventory MCP Server implementation
25
27
26
28
We are going to start by implementing our Game API. To do this, we need to create 5 APIs in total:
@@ -104,9 +106,9 @@ game ||--o{ item
104
106
@enduml
105
107
*/}
106
108
107
-
We are going to implement our Database in DynamoDB and will be using the [ElectroDB](https://electrodb.dev/en/core-concepts/introduction/) DynamoDB client library to simplify things. To get started we need to first install `electrodb` by running the following command:
109
+
We are going to implement our Database in DynamoDB and will be using the [ElectroDB](https://electrodb.dev/en/core-concepts/introduction/) DynamoDB client library to simplify things. To get started we need to first install `electrodb`and the DynamoDB Client by running the following command:
All dependencies are added to the root `package.json` as the `@aws/nx-plugin` follows the [single version policy](https://nx.dev/concepts/decisions/dependency-management#single-version-policy) principle. For more information, please refer to the <Linkpath="guides/typescript-project#dependencies">ts#project guide</Link>.
## Módulo 2: Implementación de la API del juego y el servidor MCP de inventario
27
29
28
-
Comenzaremos implementando nuestra Game API. Para esto necesitamos crear 5 APIs en total:
30
+
Comenzaremos implementando nuestra Game API. Para esto, necesitamos crear 5 APIs en total:
29
31
30
32
1.`saveGame` - crear o actualizar un juego.
31
-
2.`queryGames` - devolver una lista paginada de juegos guardados previamente.
33
+
2.`queryGames` - devolver una lista paginada de juegos guardados anteriormente.
32
34
3.`saveAction` - guardar una acción para un juego específico.
33
35
4.`queryActions` - devolver una lista paginada de todas las acciones relacionadas con un juego.
34
36
5.`queryInventory` - devolver una lista paginada de ítems en el inventario de un jugador.
@@ -58,12 +60,12 @@ Para definir las entradas y salidas de nuestra API, crearemos nuestro esquema us
58
60
También puedes eliminar el archivo `packages/game-api/src/schema/echo.ts` ya que no lo usaremos en este proyecto.
59
61
60
62
<Asidetype="tip">
61
-
Como se muestra arriba, para cada esquema que definimos en Zod, también exportamos una interfaz usando la sintaxis `z.TypeOf`. ¡Esto convierte nuestra definición zod en una interfaz de Typescript sin duplicar esfuerzos!
63
+
Como se muestra arriba, para cada esquema que definimos en Zod, también exportamos una interfaz usando la sintaxis `z.TypeOf`. ¡Esto convierte nuestra definición de Zod en una interfaz de Typescript sin duplicar esfuerzos!
62
64
</Aside>
63
65
64
66
### Modelado de entidades
65
67
66
-
El diagrama ER de nuestra aplicación es el siguiente:
68
+
El diagrama ER para nuestra aplicación es el siguiente:
Implementaremos nuestra base de datos en DynamoDB usando la biblioteca cliente [ElectroDB](https://electrodb.dev/en/core-concepts/introduction/). Para comenzar, primero necesitamos instalar `electrodb` ejecutando el siguiente comando:
111
+
Implementaremos nuestra base de datos en DynamoDB usando la biblioteca cliente [ElectroDB](https://electrodb.dev/en/core-concepts/introduction/). Para comenzar, primero necesitamos instalar `electrodb`y el cliente DynamoDB ejecutando el siguiente comando:
Todas las dependencias se agregan al `package.json` raíz ya que `@aws/nx-plugin` sigue el principio de [política de versión única](https://nx.dev/concepts/decisions/dependency-management#single-version-policy). Para más información, consulta la <Linkpath="guides/typescript-project#dependencies">guía de proyectos TypeScript</Link>.
116
+
Todas las dependencias se agregan al `package.json` raíz ya que el `@aws/nx-plugin` sigue el principio de [política de versión única](https://nx.dev/concepts/decisions/dependency-management#single-version-policy). Para más información, consulta la <Linkpath="guides/typescript-project#dependencies">guía de proyectos TypeScript</Link>.
115
117
</Aside>
116
118
117
119
Ahora creemos los siguientes archivos en nuestra carpeta `packages/game-api/src/entities` para definir nuestras entidades ElectroDB según el diagrama ER anterior:
@@ -128,7 +130,7 @@ Ahora creemos los siguientes archivos en nuestra carpeta `packages/game-api/src/
128
130
</TabItem>
129
131
</Tabs>
130
132
131
-
ElectroDB nos permite no solo definir nuestros tipos, sino también proporcionar valores predeterminados para ciertos campos como las marcas de tiempo. Además, ElectroDB sigue el [diseño de tabla única](https://electrodb.dev/en/core-concepts/single-table-relationships/), que es la mejor práctica al usar DynamoDB.
133
+
ElectroDB nos permite no solo definir nuestros tipos, sino también proporcionar valores predeterminados para ciertos campos como los timestamps anteriores. Además, ElectroDB sigue el [diseño de tabla única](https://electrodb.dev/en/core-concepts/single-table-relationships/), que es la mejor práctica al usar DynamoDB.
132
134
133
135
<Aside>
134
136
Aunque ElectroDB soporta [colecciones](https://electrodb.dev/en/modeling/collections/), hemos optado por no usarlas en este tutorial para simplificar.
@@ -143,10 +145,10 @@ Para preparar la interacción del servidor MCP con el inventario, asegurémonos
143
145
</Tabs>
144
146
145
147
:::note
146
-
La estructura del paquete sería mejor si refactorizamos las entidades en su propio proyecto compartido, para que el servidor MCP no necesite depender de la API.
148
+
La estructura del paquete sería mejor si refactorizamos las entidades en su propio proyecto compartido, para que el servidor MCP no dependa de la API.
147
149
:::
148
150
149
-
### Añadiendo el cliente DynamoDB a nuestro contexto tRPC
151
+
### Añadiendo el cliente DynamoDB al contexto de tRPC
150
152
151
153
Dado que necesitamos acceso al cliente DynamoDB en cada uno de nuestros procedimientos, queremos crear una única instancia del cliente que podamos pasar a través del contexto. Para esto, realiza los siguientes cambios en `packages/game-api/src`:
152
154
@@ -164,10 +166,10 @@ Aumentamos nuestro `IMiddlewareContext` para añadir el `IDynamoDBContext`.
La API `concat`vincula nuestro middleware a los procedimientos que definimos. Para más detalles, consulta la [guía de concat](https://trpc.io/docs/server/middlewares#concat).
172
+
La API `concat`enlaza nuestro middleware a los procedimientos definidos. Para más detalles, consulta la [guía de concat](https://trpc.io/docs/server/middlewares#concat).
171
173
</Aside>
172
174
</TabItem>
173
175
</Tabs>
@@ -213,17 +215,17 @@ Ahora que hemos definido nuestros procedimientos, conectémoslos a nuestra API.
213
215
</TabItem>
214
216
</Tabs>
215
217
216
-
### Servidor MCP de Inventario
218
+
### Servidor MCP de inventario
217
219
218
-
Ahora creemos un servidor MCP que permita a nuestro agente gestionar ítems en el inventario de un jugador.
220
+
Ahora creemos un servidor MCP que permita a nuestro agente gestionar los ítems en el inventario de un jugador.
219
221
220
222
Definiremos las siguientes herramientas para nuestro Agente:
221
223
222
224
-`list-inventory-items` para obtener los ítems actuales del inventario del jugador
223
225
-`add-to-inventory` para añadir ítems al inventario del jugador
224
226
-`remove-from-inventory` para eliminar ítems del inventario del jugador
225
227
226
-
Para ahorrar tiempo, definiremos todas las herramientas en línea:
228
+
Para ahorrar tiempo, definiremos todas las herramientas inline:
@@ -277,20 +279,20 @@ Puede que necesites hacer bootstrap de tu cuenta AWS primero, ejecuta:
277
279
Tu primer despliegue tomará aproximadamente 8 minutos. Los despliegues posteriores tomarán alrededor de 2 minutos.
278
280
279
281
:::tip
280
-
Si estás iterando cambios en el código de las funciones lambda, puedes desplegar con la bandera`--hotswap` después de construir la base de código para un tiempo de despliegue mucho más rápido (2-3 segundos).
282
+
Si estás iterando en cambios de código de funciones lambda, puedes desplegar con el flag`--hotswap` después de construir la base de código para un tiempo de despliegue mucho menor (2-3 segundos).
@@ -305,11 +307,11 @@ Podemos probar nuestra API de dos formas:
305
307
<ul>
306
308
<li>Iniciando una instancia local del backend tRPC e invocando las APIs con `curl`.</li>
307
309
<li>
308
-
<Drawertitle="curl con Sigv4 habilitado"trigger="Llamando a la API desplegada usando curl con Sigv4">
310
+
<Drawertitle="curl con Sigv4 habilitado"trigger="Llamar a la API desplegada usando curl con Sigv4">
309
311
310
312
<Tabs>
311
313
<TabItemlabel="Bash/Linux/macOS">
312
-
Puedes añadir el siguiente script a tu archivo `.bashrc` (y hacer `source`) o simplemente pegar lo siguiente en la misma terminal donde quieras ejecutar el comando.
314
+
Puedes agregar el siguiente script a tu archivo `.bashrc` (y hacer `source`) o pegarlo directamente en la terminal donde ejecutarás el comando.
313
315
```bash
314
316
// ~/.bashrc
315
317
acurl () {
@@ -320,22 +322,21 @@ acurl () {
320
322
}
321
323
```
322
324
323
-
Luego para hacer una petición curl autenticada con sigv4, puedes invocar `acurl` como en los siguientes ejemplos:
325
+
Ejemplos de uso:
324
326
325
327
###### API Gateway
326
328
```bash
327
329
acurl ap-southeast-2 execute-api -X GET https://xxx
328
330
```
329
331
330
-
###### URL de función Lambda streaming
332
+
###### URL de función Lambda
331
333
```bash
332
334
acurl ap-southeast-2 lambda -N -X POST https://xxx
333
335
```
334
336
</TabItem>
335
337
<TabItemlabel="Windows PowerShell">
336
-
Puedes añadir la siguiente función a tu perfil de PowerShell o pegarla directamente en la sesión actual.
338
+
Agrega esta función a tu perfil de PowerShell o pégala en la sesión actual.
337
339
```powershell
338
-
# Perfil de PowerShell o sesión actual
339
340
function acurl {
340
341
param(
341
342
[Parameter(Mandatory=$true)][string]$Region,
@@ -351,14 +352,14 @@ function acurl {
351
352
}
352
353
```
353
354
354
-
Luego para hacer una petición curl autenticada con sigv4, puedes invocar `acurl` como en los siguientes ejemplos:
355
+
Ejemplos de uso:
355
356
356
357
###### API Gateway
357
358
```powershell
358
359
acurl ap-southeast-2 execute-api -X GET https://xxx
359
360
```
360
361
361
-
###### URL de función Lambda streaming
362
+
###### URL de función Lambda
362
363
```powershell
363
364
acurl ap-southeast-2 lambda -N -X POST https://xxx
Usa el valor de salida `dungeon-adventure-infra-sandbox-Application.ElectroDbTableTableNameXXX`del despliegue CDK para reemplazar el marcador de posición resaltado.
381
+
Usa el valor de salida `dungeon-adventure-infra-sandbox-Application.ElectroDbTableTableNameXXX`de CDK para reemplazar el marcador de posición.
381
382
</Aside>
382
383
383
-
Una vez que el servidor esté en funcionamiento, puedes llamarlo ejecutando:
384
-
384
+
Una vez iniciado el servidor, puedes llamarlo con:
385
385
```bash
386
386
curl -X GET 'http://localhost:2022/games.query?input=%7B%7D'
acurl ap-southeast-2 execute-api -X GET 'https://xxx.execute-api.ap-southeast-2.amazonaws.com/prod/games.query?input=%7B%7D'
392
392
```
393
393
<Asidetype="caution">
394
-
Usa el valor de salida `dungeon-adventure-infra-sandbox-Application.GameApiGameApiEndpointXXX`del despliegue CDK para reemplazar el marcador de posición y ajusta la región correspondientemente.
394
+
Usa el valor de salida `dungeon-adventure-infra-sandbox-Application.GameApiGameApiEndpointXXX`de CDK y ajusta la región correspondiente.
395
395
</Aside>
396
396
</TabItem>
397
397
</Tabs>
398
398
399
399
:::note
400
-
El `%7B%7D` que pasamos para probar la API es un objeto JSON vacío codificado en URI (`{}`).
400
+
El `%7B%7D` que pasamos para probar la API es un objeto JSON vacío codificado (`{}`).
401
401
:::
402
402
403
-
Si el comando se ejecuta exitosamente, deberías ver una respuesta como esta:
403
+
Si el comando se ejecuta correctamente, verás una respuesta como:
0 commit comments