Files
roi-theme/admin/README.md
FrankZamora 677fbd4368 Fase-00: Estructura Clean Architecture Context-First creada
- Creada estructura shared/ con Domain, Application, Infrastructure
- Documentación completa de arquitectura (5 READMEs, ~6150 líneas)
- Archivos .gitkeep para preservar estructura en Git
- Contextos admin/ y public/ documentados

Estructura shared/:
- Domain/ (ValueObjects, Exceptions, Contracts)
- Application/ (Contracts, Services)
- Infrastructure/ (Services, Traits)

Documentación incluye:
- Principios de Clean Architecture
- Reglas de dependencia
- Ejemplos de código
- Guías de testing
- Mejores prácticas

Preparación completa para implementación en Fase-1.
2025-11-18 23:36:06 -06:00

258 lines
7.4 KiB
Markdown

# Contexto Admin - Administración de Componentes
## Propósito
El contexto `admin/` contiene **todo el código relacionado con la administración de componentes** en el panel
de WordPress. Cada componente tiene su propia carpeta con su Clean Architecture completa.
## Filosofía: Context-First Architecture
En lugar de separar por capas (Domain, Application, Infrastructure), separamos por **contextos**
(admin, public, shared) y cada contexto tiene sus propias capas internas.
## Estructura (Fase-00)
En Fase-00 solo creamos la estructura base. Los componentes se crearán en fases posteriores:
```
admin/
├── README.md (este archivo)
└── .gitkeep (preserva directorio en Git)
```
## Estructura Futura (Post Fase-00)
```
admin/
├── Navbar/ # Componente Navbar
│ ├── Domain/
│ │ ├── NavbarComponent.php # Entidad
│ │ └── NavbarRepositoryInterface.php
│ ├── Application/
│ │ ├── SaveNavbarUseCase.php # Caso de uso
│ │ └── DTO/
│ │ └── NavbarSettingsDTO.php
│ ├── Infrastructure/
│ │ ├── Persistence/
│ │ │ └── WordPressNavbarRepository.php
│ │ ├── UI/
│ │ │ ├── NavbarAdminPage.php # Página de admin
│ │ │ ├── NavbarForm.php # Formulario
│ │ │ └── views/
│ │ │ └── navbar-settings.php
│ │ └── API/
│ │ └── NavbarAjaxHandler.php # AJAX endpoints
│ └── README.md
├── Footer/ # Otro componente
│ └── (misma estructura)
└── (más componentes...)
```
## Principios del Contexto Admin
1. **Aislamiento**: Cada componente es independiente
2. **Clean Architecture**: Cada componente tiene Domain, Application, Infrastructure
3. **Sin acoplamiento**: Un componente no depende de otro directamente
4. **Código compartido**: Va en `shared/` si es usado por múltiples componentes
## Responsabilidades
El contexto `admin/` se encarga de:
**Formularios de configuración** de componentes
**Validación de entrada** del usuario administrador
**Guardado de configuraciones** en la base de datos
**Páginas de administración** en el panel de WordPress
**AJAX endpoints** para operaciones administrativas
**Permisos y capabilities** de administrador
**NO** se encarga de:
- Renderizado frontend de componentes (va en `public/`)
- Lógica compartida entre contextos (va en `shared/`)
- Configuraciones globales del tema
## Ejemplo de Flujo de Admin
### 1. Usuario administra el Navbar
```
Usuario Admin (navegador)
NavbarAdminPage.php (muestra formulario)
Usuario envía formulario via AJAX
NavbarAjaxHandler.php (recibe request)
SaveNavbarUseCase.php (orquesta la lógica)
WordPressNavbarRepository.php (guarda en DB)
Respuesta JSON al navegador
```
### 2. Código de ejemplo
```php
// admin/Navbar/Application/SaveNavbarUseCase.php
namespace ROITheme\Admin\Navbar\Application;
use ROITheme\Admin\Navbar\Domain\NavbarRepositoryInterface;
use ROITheme\Shared\Application\Contracts\ValidationServiceInterface;
final class SaveNavbarUseCase
{
public function __construct(
private readonly NavbarRepositoryInterface $repository,
private readonly ValidationServiceInterface $validator
) {}
public function execute(array $data): void
{
$validated = $this->validator->validate($data, [
'logo_url' => 'url',
'menu_items' => 'array',
'sticky' => 'bool',
]);
if ($this->validator->fails()) {
throw new ValidationException($this->validator->errors());
}
$this->repository->save($validated);
}
}
```
```php
// admin/Navbar/Infrastructure/UI/NavbarAdminPage.php
namespace ROITheme\Admin\Navbar\Infrastructure\UI;
final class NavbarAdminPage
{
public function register(): void
{
add_action('admin_menu', [$this, 'addMenuPage']);
}
public function addMenuPage(): void
{
add_menu_page(
'Navbar Settings',
'Navbar',
'manage_options',
'roi-navbar-settings',
[$this, 'render'],
'dashicons-menu',
30
);
}
public function render(): void
{
require __DIR__ . '/views/navbar-settings.php';
}
}
```
## Relación con Otros Contextos
```
admin/ → Administra configuraciones
↓ guarda
Base de Datos → Almacena settings
↓ lee
public/ → Renderiza componentes en frontend
```
**Clave**: `admin/` y `public/` NO se hablan directamente. Se comunican a través de la base de datos.
## Reglas de Dependencia
**PUEDE** depender de:
- `shared/Domain/` (Value Objects, Exceptions)
- `shared/Application/` (Contracts, Services)
- `shared/Infrastructure/` (Implementaciones de servicios)
- WordPress admin functions (`add_menu_page`, `add_settings_section`, etc.)
**NO PUEDE** depender de:
- `public/` (contexto independiente)
- Código de frontend (JS/CSS va en Infrastructure/UI/)
## Testing
### Tests Unitarios
```php
// tests/Unit/Admin/Navbar/Application/SaveNavbarUseCaseTest.php
public function test_saves_valid_navbar_settings()
{
$repository = $this->createMock(NavbarRepositoryInterface::class);
$validator = $this->createMock(ValidationServiceInterface::class);
$useCase = new SaveNavbarUseCase($repository, $validator);
$useCase->execute(['logo_url' => 'http://example.com/logo.png']);
// Assertions...
}
```
### Tests de Integración
```php
// tests/Integration/Admin/Navbar/Infrastructure/WordPressNavbarRepositoryTest.php
public function test_saves_and_retrieves_navbar_settings()
{
$repository = new WordPressNavbarRepository();
$settings = ['logo_url' => 'http://example.com/logo.png'];
$repository->save($settings);
$retrieved = $repository->get();
$this->assertEquals($settings, $retrieved);
}
```
### Tests E2E (Playwright)
```php
// tests/E2E/Admin/NavbarAdminPageTest.php
public function test_admin_can_save_navbar_settings()
{
$this->loginAsAdmin();
$this->visit('/wp-admin/admin.php?page=roi-navbar-settings');
$this->fillField('logo_url', 'http://example.com/logo.png');
$this->click('Save Settings');
$this->see('Settings saved successfully');
}
```
## Cuándo Agregar Código Aquí
Agrega código a `admin/` cuando:
- Creas un nuevo componente administrable
- Necesitas una página de configuración en el panel de WordPress
- Manejas formularios de administrador
- Procesas AJAX desde el admin
- Validas o guardas configuraciones
No agregues aquí:
- Renderizado frontend (va en `public/`)
- Lógica compartida (va en `shared/`)
- Configuraciones globales del tema
## Estado Actual (Fase-00)
En Fase-00, `admin/` solo tiene la estructura base. Los componentes se crearán en las siguientes fases:
- **Fase-1**: Estructura base e infraestructura
- **Fase-2**: Migración de base de datos
- **Fase-3**: Implementación de componentes admin
- **Fase-4+**: Componentes adicionales
## Próximos Pasos
1. Crear primer componente en Fase-3 (ej: Navbar)
2. Implementar Domain layer del componente
3. Implementar Application layer (casos de uso)
4. Implementar Infrastructure layer (WordPress integration)
5. Crear tests unitarios e integración
6. Repetir para cada componente