docs: add comprehensive project documentation
Some checks failed
Deploy / deploy (push) Has been cancelled
Some checks failed
Deploy / deploy (push) Has been cancelled
- README.md: project overview, server status, quick start guide, architecture diagram, tech stack, and content inventory - docs/architecture.md: technical architecture, service diagram, component details, and design decisions - docs/game-servers.md: setup and operation guide for OpenFusion, MapleStory 2, and Minecraft FTB Infinity Evolved - docs/cms-content.md: Strapi content model, i18n strategy, documentary structure, and API endpoints - docs/deployment.md: local dev, production deploy, CI/CD, SSL setup, backup procedures, and monitoring Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
145
docs/cms-content.md
Normal file
145
docs/cms-content.md
Normal file
@@ -0,0 +1,145 @@
|
||||
# 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-infinity | mcftbinfd... | Minecraft: FTB Infinity Evolved | 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 <STRAPI_API_TOKEN>`.
|
||||
Reference in New Issue
Block a user