# Modelo de Contenido CMS ## Strapi 5 — Content Types ### Game Entrada principal de cada juego preservado. | Campo | Tipo | Requerido | Localizado | Descripcion | |-------|------|-----------|------------|-------------| | title | string | si | si | Nombre del juego | | slug | uid | si | no | URL-friendly, auto-generado desde title | | description | richtext | no | si | Descripcion larga del juego | | genre | enum | si | no | MMORPG, FPS, Casual, Strategy, Sports, Other | | releaseYear | integer | si | no | Ano de lanzamiento original | | shutdownYear | integer | si | no | Ano de cierre de servidores | | developer | string | si | no | Estudio desarrollador | | publisher | string | no | no | Publisher/distribuidor | | screenshots | media[] | no | no | Capturas de pantalla (solo imagenes) | | coverImage | media | si | no | Imagen de portada principal | | serverStatus | enum | no | no | online, maintenance, coming_soon (default) | | serverLink | string | no | no | IP:puerto para conectarse | | documentary | relation | no | no | oneToOne con Documentary | ### Documentary Documental interactivo asociado a un juego. | Campo | Tipo | Requerido | Localizado | Descripcion | |-------|------|-----------|------------|-------------| | title | string | si | si | Titulo del documental | | description | text | no | si | Descripcion/subtitulo | | game | relation | no | no | oneToOne con Game | | chapters | relation | no | no | oneToMany con Chapter (ordenados) | ### Chapter Capitulo individual de un documental. | Campo | Tipo | Requerido | Localizado | Descripcion | |-------|------|-----------|------------|-------------| | title | string | si | si | Titulo del capitulo | | content | richtext | si | si | Contenido narrativo completo | | audioFile | media | no | no | Archivo de audio (narracion) | | audioDuration | integer | no | no | Duracion en segundos | | order | integer | si | no | Orden de aparicion (1, 2, 3...) | | coverImage | media | no | no | Imagen de portada del capitulo | | documentary | relation | no | no | manyToOne con Documentary | ## Modelo i18n de Strapi 5 Strapi 5 maneja la internacionalizacion con **filas separadas por locale**. Cada documento tiene un `document_id` compartido y multiples filas: ``` document_id: "abc123" ├── id: 1 (locale: en, draft) ├── id: 2 (locale: en, published) ├── id: 3 (locale: es, draft) └── id: 4 (locale: es, published) ``` Las **relaciones** (`_lnk` tables) conectan las filas del mismo estado. Un juego publicado en ES se conecta al documental publicado en ES, no al draft ni al EN. ### Tablas de enlace - `games_documentary_lnk` — game_id ↔ documentary_id - `chapters_documentary_lnk` — chapter_id ↔ documentary_id + chapter_ord ## Contenido Actual ### Juegos (3) | Slug | document_id | Titulo | Genre | Release | Shutdown | Server | |------|-------------|--------|-------|---------|----------|--------| | fusionfall | sx17hshy2d... | FusionFall | MMORPG | 2009 | 2013 | online | | maplestory2 | ms2maple2d... | MapleStory 2 | MMORPG | 2015 | 2020 | online | | minecraft-ftb-evolution | mcftbevol... | Minecraft: FTB Evolution | Sandbox | 2011 | - | online | ### Documentales (2) #### FusionFall: "El Mundo Que No Queriamos Perder" | # | Titulo | Contenido | |---|--------|-----------| | 1 | El Sueno Imposible | Origenes, Cartoon Network, Grigon Entertainment | | 2 | Cuando los Mundos Colisionaron | Desarrollo, motor Unity, estilo anime de Midori Foo | | 3 | Bienvenido al Futuro | Lanzamiento, viajes en el tiempo, sistema de Nanos | | 4 | La Caida de Grigon | Quiebra del estudio, CN asume el desarrollo | | 5 | La Academia | Free-to-play, The Academy, Adventure Time | | 6 | Seis Dias | Cierre con 6 dias de aviso, agosto 2013 | | 7 | Afterlife | Comunidad, FusionFall Retro/Legacy, OpenFusion | #### MapleStory 2: "El Mundo Que Construimos Juntos" | # | Titulo | Contenido | |---|--------|-----------| | 1 | El Siguiente Nivel | De MapleStory 1 a la vision 3D de NSquare | | 2 | Un Mundo de Cubos y Color | Arte voxel, UGC, musica, housing | | 3 | El Amanecer Coreano | Lanzamiento Korea julio 2015, primeros problemas | | 4 | La Conquista Global | Lanzamiento global octubre 2018, hype de Twitch | | 5 | La Tormenta Perfecta | Declive: RNG, limites semanales, exodo | | 6 | El Ultimo Despertar | Expansion Awakening, demasiado tarde | | 7 | Afterlife | Cierre mayo 2020, emulador MS2Community | ## Crear Contenido Nuevo ### Via Strapi Admin (recomendado) 1. Ir a http://localhost:1337/admin 2. Content Manager > Game / Documentary / Chapter 3. Crear en un idioma, luego usar "Localization" para traducir ### Via PostgreSQL (insercion directa) Cuando la API de Strapi tiene restricciones de permisos, se puede insertar directamente en PostgreSQL. Cada contenido necesita 4 filas: ```sql -- Draft EN INSERT INTO games (document_id, title, slug, ..., locale) VALUES ('unique_doc_id', 'Title', 'slug', ..., 'en'); -- Draft ES INSERT INTO games (document_id, title, slug, ..., locale) VALUES ('unique_doc_id', 'Titulo', 'slug', ..., 'es'); -- Published EN (con published_at) INSERT INTO games (document_id, title, slug, ..., published_at, locale) VALUES ('unique_doc_id', 'Title', 'slug', ..., NOW(), 'en'); -- Published ES (con published_at) INSERT INTO games (document_id, title, slug, ..., published_at, locale) VALUES ('unique_doc_id', 'Titulo', 'slug', ..., NOW(), 'es'); ``` Para documentales, ademas de los inserts hay que crear las relaciones en las tablas `_lnk`: ```sql INSERT INTO games_documentary_lnk (game_id, documentary_id) VALUES (game_id, doc_id); INSERT INTO chapters_documentary_lnk (chapter_id, documentary_id, chapter_ord) VALUES (ch_id, doc_id, 1); ``` ## API Endpoints La API de Strapi se consume desde Next.js via funciones en `apps/web/src/lib/api.ts`: | Funcion | Descripcion | |---------|------------| | `getGames(locale)` | Lista todos los juegos con portada | | `getGameBySlug(slug, locale)` | Juego con documental y capitulos | | `getDocumentaryByGameSlug(slug, locale)` | Documental completo de un juego | Todas las llamadas requieren el header `Authorization: Bearer `.