Files
soft_usite/API_ADMIN_GUIA.md
Lizandro Guarnizo 24e1cf1439 feat: add VCard API integration with configuration and proxy endpoints
- Implemented VCard API controller with methods to manage configuration (save, get).
- Added proxy functions to handle API requests for users, vcards, memberships, payments, transactions, logs, and miniwebs.
- Included error handling and response formatting for API interactions.
2026-05-19 20:08:50 -05:00

316 lines
10 KiB
Markdown

# API Admin — Guia de Implementacion
> Stack: Laravel + MongoDB + Laravel Sanctum
> Prefijo base: /api/admin/*
> Seguridad: Bearer Token (Sanctum) + rol administrador
---
## 1. Archivos creados / modificados
| Archivo | Descripcion |
|---------|-------------|
| app/Http/Middleware/AdminApiMiddleware.php | Verifica rol=administrador. Retorna JSON 403 (sin redirect). |
| app/Http/Kernel.php | Registra alias admin.api |
| app/Http/Controllers/Api/Admin/UsuarioController.php | CRUD usuarios + activar/desactivar |
| app/Http/Controllers/Api/Admin/VcardController.php | Listar, ver, editar vcards; por usuario |
| app/Http/Controllers/Api/Admin/MembresiaController.php | Ver/activar/desactivar membresia + cambiar plan |
| app/Http/Controllers/Api/Admin/PagoController.php | Historial HealthPagos + transacciones wallet |
| app/Http/Controllers/Api/Admin/LogController.php | Log de movimientos global y por usuario |
| app/Http/Controllers/Api/Admin/MiniWebController.php | Miniwebs con usuario y vcard vinculada |
| routes/api.php | 34 rutas nuevas bajo /api/admin/* |
---
## 2. Implementar en otro proyecto
### 2.1 Requisitos previos
- Laravel >= 10
- mongodb/laravel-mongodb instalado
- laravel/sanctum configurado
- Modelo User con HasApiTokens y relacion rol() -> Rol
- Modelo Rol con campo nombre (valor "administrador")
### 2.2 Copiar estos archivos
```
app/Http/Middleware/AdminApiMiddleware.php
app/Http/Controllers/Api/Admin/UsuarioController.php
app/Http/Controllers/Api/Admin/VcardController.php
app/Http/Controllers/Api/Admin/MembresiaController.php
app/Http/Controllers/Api/Admin/PagoController.php
app/Http/Controllers/Api/Admin/LogController.php
app/Http/Controllers/Api/Admin/MiniWebController.php
```
### 2.3 Registrar middleware en app/Http/Kernel.php
```php
protected $routeMiddleware = [
// ... existentes ...
'admin.api' => \App\Http\Middleware\AdminApiMiddleware::class,
];
```
### 2.4 Agregar rutas en routes/api.php
```php
use App\Http\Controllers\Api\Admin\UsuarioController as AdminUsuario;
use App\Http\Controllers\Api\Admin\VcardController as AdminVcard;
use App\Http\Controllers\Api\Admin\MembresiaController as AdminMembresia;
use App\Http\Controllers\Api\Admin\PagoController as AdminPago;
use App\Http\Controllers\Api\Admin\LogController as AdminLog;
use App\Http\Controllers\Api\Admin\MiniWebController as AdminMiniWeb;
Route::middleware(['auth:sanctum', 'admin.api'])->prefix('admin')->name('admin.')->group(function () {
// Usuarios
Route::get('usuarios', [AdminUsuario::class, 'index']);
Route::get('usuarios/{id}', [AdminUsuario::class, 'show']);
Route::put('usuarios/{id}', [AdminUsuario::class, 'update']);
Route::post('usuarios/{id}/activar', [AdminUsuario::class, 'activar']);
Route::post('usuarios/{id}/desactivar', [AdminUsuario::class, 'desactivar']);
// VCards
Route::get('vcards', [AdminVcard::class, 'index']);
Route::get('vcards/{id}', [AdminVcard::class, 'show']);
Route::put('vcards/{id}', [AdminVcard::class, 'update']);
Route::get('usuarios/{userId}/vcards', [AdminVcard::class, 'byUsuario']);
// Membresias
Route::get('planes', [AdminMembresia::class, 'planes']);
Route::get('usuarios/{id}/membresia', [AdminMembresia::class, 'show']);
Route::post('usuarios/{id}/activar-membresia', [AdminMembresia::class, 'activar']);
Route::post('usuarios/{id}/desactivar-membresia', [AdminMembresia::class, 'desactivar']);
Route::post('usuarios/{id}/cambiar-plan', [AdminMembresia::class, 'cambiarPlan']);
// Pagos
Route::get('pagos', [AdminPago::class, 'index']);
Route::get('transacciones', [AdminPago::class, 'transacciones']);
Route::get('usuarios/{userId}/pagos', [AdminPago::class, 'byUsuario']);
Route::get('usuarios/{userId}/transacciones', [AdminPago::class, 'transaccionesByUsuario']);
// Logs
Route::get('logs', [AdminLog::class, 'index']);
Route::get('usuarios/{userId}/logs', [AdminLog::class, 'byUsuario']);
// MiniWebs
Route::get('miniwebs', [AdminMiniWeb::class, 'index']);
Route::get('miniwebs/{id}', [AdminMiniWeb::class, 'show']);
Route::get('usuarios/{userId}/miniwebs', [AdminMiniWeb::class, 'byUsuario']);
});
```
---
## 3. Flujo de autenticacion
### Login
```http
POST /api/login
Content-Type: application/json
{
"email": "admin@example.com",
"password": "secret"
}
```
Respuesta:
```json
{
"access_token": "1|abc123...",
"token_type": "Bearer",
"user": { ... }
}
```
### Usar token en cada peticion
```
Authorization: Bearer 1|abc123...
```
### Logout
```http
POST /api/logout
Authorization: Bearer 1|abc123...
```
---
## 4. Referencia de endpoints
### Usuarios /api/admin/usuarios
| Metodo | Ruta | Descripcion | Query params |
|--------|------|-------------|--------------|
| GET | /api/admin/usuarios | Lista paginada | search, estado, plan_id, per_page |
| GET | /api/admin/usuarios/{id} | Detalle: plan, vcards, wallet, perfil | — |
| PUT | /api/admin/usuarios/{id} | Edita name, email, rol_id, plan_id | — |
| POST | /api/admin/usuarios/{id}/activar | Activa cuenta (estado=true) | — |
| POST | /api/admin/usuarios/{id}/desactivar | Desactiva cuenta (estado=false) | — |
Ejemplo PUT:
```json
{ "name": "Juan Garcia", "email": "juan@empresa.com", "plan_id": "664abc123" }
```
---
### VCards /api/admin/vcards
| Metodo | Ruta | Descripcion | Query params |
|--------|------|-------------|--------------|
| GET | /api/admin/vcards | Lista paginada | search, estado, user_id, per_page |
| GET | /api/admin/vcards/{id} | Detalle con usuario | — |
| PUT | /api/admin/vcards/{id} | Edita datos basicos | — |
| GET | /api/admin/usuarios/{userId}/vcards | Vcards de un usuario | — |
Campos editables: nombre, cargo, descripcion, telefono, whatsapp, email, empresa,
direccion, website, pais, ciudad, estado, privacidad, es_borrador
---
### Membresias
| Metodo | Ruta | Descripcion | Body |
|--------|------|-------------|------|
| GET | /api/admin/planes | Lista planes activos | — |
| GET | /api/admin/usuarios/{id}/membresia | Estado de membresia | — |
| POST | /api/admin/usuarios/{id}/activar-membresia | Activa/renueva | { "anual": true, "dias": 365 } |
| POST | /api/admin/usuarios/{id}/cambiar-plan | Cambia plan | { "plan_id": "abc", "anual": false } |
| POST | /api/admin/usuarios/{id}/desactivar-membresia | Desactiva | — |
Logica activar-membresia:
- Si ya tiene membresia vigente, los dias se SUMAN (no se pisa la fecha).
- anual:true = +365 dias. anual:false = +30 dias (o los dias que se indiquen).
---
### Pagos
| Metodo | Ruta | Descripcion | Query params |
|--------|------|-------------|--------------|
| GET | /api/admin/pagos | Historial global HealthPagos | user_id, estado, moneda, desde, hasta, per_page |
| GET | /api/admin/transacciones | Transacciones wallet global | type, status, per_page |
| GET | /api/admin/usuarios/{id}/pagos | Pagos de un usuario + total pagado | — |
| GET | /api/admin/usuarios/{id}/transacciones | Wallet de un usuario | — |
Valores estado (HealthPago): pendiente, completado, fallido
Valores type (Transaction): deposit, withdraw, transfer_in, transfer_out, purchase, adjustment
Valores status (Transaction): pending, completed, failed
---
### Logs
| Metodo | Ruta | Descripcion | Query params |
|--------|------|-------------|--------------|
| GET | /api/admin/logs | Log global de movimientos | user_id, type, search, desde, hasta, per_page |
| GET | /api/admin/usuarios/{id}/logs | Logs de un usuario | — |
Valores type: create, edit, delete, delete cuenta
---
### MiniWebs
| Metodo | Ruta | Descripcion | Query params |
|--------|------|-------------|--------------|
| GET | /api/admin/miniwebs | Lista paginada | search, user_id, per_page |
| GET | /api/admin/miniwebs/{id} | Detalle con usuario + vcard vinculada | — |
| GET | /api/admin/usuarios/{id}/miniwebs | Miniwebs de un usuario | — |
---
## 5. Respuestas de error
| HTTP | Cuando |
|------|--------|
| 401 | Token ausente o invalido |
| 403 | Autenticado pero sin rol administrador |
| 404 | Recurso no encontrado |
| 422 | Validacion fallida |
Ejemplo 403:
```json
{
"error": "Acceso denegado. Se requieren privilegios de administrador.",
"code": 403
}
```
---
## 6. Modelos requeridos
| Modelo | Coleccion MongoDB | Relaciones usadas |
|--------|------------------|-------------------|
| User | users | rol, plan, perfil, wallet, vcards, setup |
| Vcard | vcard | user |
| Planes | planes | tarifas |
| HealthPago | health_pagos | — |
| Transaction | transactions | wallet |
| Wallet | wallets | user |
| Log | log | user |
| MiniWeb | miniwebs | user, vcard |
| Rol | rol | — |
---
## 7. Paginacion
Todos los listados retornan estructura estandar de Laravel:
```json
{
"current_page": 1,
"data": [ ... ],
"per_page": 20,
"total": 150,
"last_page": 8,
"next_page_url": "https://...",
"prev_page_url": null
}
```
Maximo per_page: 100
---
## 8. Prueba rapida con curl
```bash
# 1. Login y guardar token
TOKEN=$(curl -s -X POST https://tudominio.com/api/login \
-H "Content-Type: application/json" \
-d '{"email":"admin@example.com","password":"secret"}' \
| python3 -c "import sys,json; print(json.load(sys.stdin)['access_token'])")
# 2. Listar usuarios
curl https://tudominio.com/api/admin/usuarios \
-H "Authorization: Bearer $TOKEN"
# 3. Vcards de un usuario
curl https://tudominio.com/api/admin/usuarios/USER_ID/vcards \
-H "Authorization: Bearer $TOKEN"
# 4. Activar membresia anual
curl -X POST https://tudominio.com/api/admin/usuarios/USER_ID/activar-membresia \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"anual": true}'
# 5. Cambiar plan
curl -X POST https://tudominio.com/api/admin/usuarios/USER_ID/cambiar-plan \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"plan_id": "PLAN_ID"}'
# 6. Historial de pagos con filtros
curl "https://tudominio.com/api/admin/pagos?estado=completado&desde=2026-01-01&per_page=50" \
-H "Authorization: Bearer $TOKEN"
# 7. Logs de un usuario
curl https://tudominio.com/api/admin/usuarios/USER_ID/logs \
-H "Authorization: Bearer $TOKEN"
# 8. MiniWebs con busqueda
curl "https://tudominio.com/api/admin/miniwebs?search=empresa" \
-H "Authorization: Bearer $TOKEN"
```