Skip to content

Commit a80fafc

Browse files
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>
1 parent 94b9c02 commit a80fafc

File tree

12 files changed

+351
-363
lines changed

12 files changed

+351
-363
lines changed

docs/src/content/docs/en/get_started/tutorials/dungeon-game/2.mdx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import nxGraphPng from '@assets/nx-graph.png'
2121
import gameSelectPng from '@assets/game-select.png'
2222
import gameConversationPng from '@assets/game-conversation.png'
2323

24+
import { getDungeonAdventureElectroDbDependencies } from '../../../../../../../../e2e/src/utils';
25+
2426
## Module 2: Game API and Inventory MCP Server implementation
2527

2628
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
104106
@enduml
105107
*/}
106108

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:
108110

109-
<InstallCommand pkg="electrodb @aws-sdk/client-dynamodb" />
111+
<InstallCommand pkg={getDungeonAdventureElectroDbDependencies()} />
110112

111113
<Aside>
112114
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 <Link path="guides/typescript-project#dependencies">ts#project guide</Link>.

docs/src/content/docs/es/get_started/tutorials/dungeon-game/2.mdx

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ import nxGraphPng from '@assets/nx-graph.png'
2323
import gameSelectPng from '@assets/game-select.png'
2424
import gameConversationPng from '@assets/game-conversation.png'
2525

26+
import { getDungeonAdventureElectroDbDependencies } from '../../../../../../../../e2e/src/utils';
27+
2628
## Módulo 2: Implementación de la API del juego y el servidor MCP de inventario
2729

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:
2931

3032
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.
3234
3. `saveAction` - guardar una acción para un juego específico.
3335
4. `queryActions` - devolver una lista paginada de todas las acciones relacionadas con un juego.
3436
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
5860
También puedes eliminar el archivo `packages/game-api/src/schema/echo.ts` ya que no lo usaremos en este proyecto.
5961

6062
<Aside type="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!
6264
</Aside>
6365

6466
### Modelado de entidades
6567

66-
El diagrama ER de nuestra aplicación es el siguiente:
68+
El diagrama ER para nuestra aplicación es el siguiente:
6769

6870
<Image class="centered-image white-bg" src={dungeonAdventureErPng} alt="dungeon-adventure-er.png" width="400" height="300" />
6971

@@ -106,12 +108,12 @@ game ||--o{ item
106108
@enduml
107109
*/}
108110

109-
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:
110112

111-
<InstallCommand pkg="electrodb @aws-sdk/client-dynamodb" />
113+
<InstallCommand pkg={getDungeonAdventureElectroDbDependencies()} />
112114

113115
<Aside>
114-
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 <Link path="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 <Link path="guides/typescript-project#dependencies">guía de proyectos TypeScript</Link>.
115117
</Aside>
116118

117119
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/
128130
</TabItem>
129131
</Tabs>
130132

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.
132134

133135
<Aside>
134136
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
143145
</Tabs>
144146

145147
:::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.
147149
:::
148150

149-
### Añadiendo el cliente DynamoDB a nuestro contexto tRPC
151+
### Añadiendo el cliente DynamoDB al contexto de tRPC
150152

151153
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`:
152154

@@ -164,10 +166,10 @@ Aumentamos nuestro `IMiddlewareContext` para añadir el `IDynamoDBContext`.
164166
<TabItem label="init.ts">
165167
<E2EDiff lang="typescript" before="dungeon-adventure/2/init.ts.old.template" after="dungeon-adventure/2/init.ts.template" />
166168

167-
El plugin de DynamoDB es instrumentado.
169+
El plugin de DynamoDB está instrumentado.
168170

169171
<Aside>
170-
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).
171173
</Aside>
172174
</TabItem>
173175
</Tabs>
@@ -213,17 +215,17 @@ Ahora que hemos definido nuestros procedimientos, conectémoslos a nuestra API.
213215
</TabItem>
214216
</Tabs>
215217

216-
### Servidor MCP de Inventario
218+
### Servidor MCP de inventario
217219

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.
219221

220222
Definiremos las siguientes herramientas para nuestro Agente:
221223

222224
- `list-inventory-items` para obtener los ítems actuales del inventario del jugador
223225
- `add-to-inventory` para añadir ítems al inventario del jugador
224226
- `remove-from-inventory` para eliminar ítems del inventario del jugador
225227

226-
Para ahorrar tiempo, definiremos todas las herramientas en línea:
228+
Para ahorrar tiempo, definiremos todas las herramientas inline:
227229

228230
<Tabs>
229231
<TabItem label="packages/inventory/src/mcp-server/server.ts">
@@ -259,7 +261,7 @@ Primero, construyamos la base de código:
259261
<NxCommands commands={['run-many --target build --all']} />
260262

261263
<Aside type="tip">
262-
Si encuentras errores de lint, puedes ejecutar el siguiente comando para corregirlos automáticamente.
264+
Si encuentras errores de linting, puedes ejecutar el siguiente comando para corregirlos automáticamente.
263265

264266
<NxCommands commands={['run-many --target lint --configuration=fix --all']} />
265267
</Aside>
@@ -277,20 +279,20 @@ Puede que necesites hacer bootstrap de tu cuenta AWS primero, ejecuta:
277279
Tu primer despliegue tomará aproximadamente 8 minutos. Los despliegues posteriores tomarán alrededor de 2 minutos.
278280

279281
:::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).
281283

282284
<NxCommands commands={['run @dungeon-adventure/infra:deploy dungeon-adventure-infra-sandbox/* --hotswap']} />
283285
:::
284286

285-
Una vez completado el despliegue, deberías ver salidas similares a las siguientes _(algunos valores han sido omitidos)_:
287+
Una vez completado el despliegue, verás salidas similares a las siguientes _(algunos valores han sido omitidos)_:
286288

287289
```bash
288290
dungeon-adventure-sandbox-Application
289291
dungeon-adventure-sandbox-Application: deploying... [2/2]
290292

291293
✅ dungeon-adventure-sandbox-Application
292294

293-
Tiempo de despliegue: 354s
295+
Deployment time: 354s
294296

295297
Outputs:
296298
dungeon-adventure-sandbox-Application.ElectroDbTableTableNameXXX = dungeon-adventure-sandbox-Application-ElectroDbTableXXX-YYY
@@ -305,11 +307,11 @@ Podemos probar nuestra API de dos formas:
305307
<ul>
306308
<li>Iniciando una instancia local del backend tRPC e invocando las APIs con `curl`.</li>
307309
<li>
308-
<Drawer title="curl con Sigv4 habilitado" trigger="Llamando a la API desplegada usando curl con Sigv4">
310+
<Drawer title="curl con Sigv4 habilitado" trigger="Llamar a la API desplegada usando curl con Sigv4">
309311

310312
<Tabs>
311313
<TabItem label="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.
313315
```bash
314316
// ~/.bashrc
315317
acurl () {
@@ -320,22 +322,21 @@ acurl () {
320322
}
321323
```
322324

323-
Luego para hacer una petición curl autenticada con sigv4, puedes invocar `acurl` como en los siguientes ejemplos:
325+
Ejemplos de uso:
324326

325327
###### API Gateway
326328
```bash
327329
acurl ap-southeast-2 execute-api -X GET https://xxx
328330
```
329331

330-
###### URL de función Lambda streaming
332+
###### URL de función Lambda
331333
```bash
332334
acurl ap-southeast-2 lambda -N -X POST https://xxx
333335
```
334336
</TabItem>
335337
<TabItem label="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.
337339
```powershell
338-
# Perfil de PowerShell o sesión actual
339340
function acurl {
340341
param(
341342
[Parameter(Mandatory=$true)][string]$Region,
@@ -351,14 +352,14 @@ function acurl {
351352
}
352353
```
353354

354-
Luego para hacer una petición curl autenticada con sigv4, puedes invocar `acurl` como en los siguientes ejemplos:
355+
Ejemplos de uso:
355356

356357
###### API Gateway
357358
```powershell
358359
acurl ap-southeast-2 execute-api -X GET https://xxx
359360
```
360361

361-
###### URL de función Lambda streaming
362+
###### URL de función Lambda
362363
```powershell
363364
acurl ap-southeast-2 lambda -N -X POST https://xxx
364365
```
@@ -377,11 +378,10 @@ acurl ap-southeast-2 lambda -N -X POST https://xxx
377378
<NxCommands highlights={['dungeon-adventure-infra-sandbox-Application-ElectroDbTableXXX-YYY']} env={{TABLE_NAME:"dungeon-adventure-infra-sandbox-Application-ElectroDbTableXXX-YYY"}} commands={["run @dungeon-adventure/game-api:serve"]} />
378379

379380
<Aside type="caution">
380-
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.
381382
</Aside>
382383

383-
Una vez que el servidor esté en funcionamiento, puedes llamarlo ejecutando:
384-
384+
Una vez iniciado el servidor, puedes llamarlo con:
385385
```bash
386386
curl -X GET 'http://localhost:2022/games.query?input=%7B%7D'
387387
```
@@ -391,16 +391,16 @@ acurl ap-southeast-2 lambda -N -X POST https://xxx
391391
acurl ap-southeast-2 execute-api -X GET 'https://xxx.execute-api.ap-southeast-2.amazonaws.com/prod/games.query?input=%7B%7D'
392392
```
393393
<Aside type="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.
395395
</Aside>
396396
</TabItem>
397397
</Tabs>
398398

399399
:::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 (`{}`).
401401
:::
402402

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:
404404

405405
```json
406406
{"result":{"data":{"items":[],"cursor":null}}}

0 commit comments

Comments
 (0)