# Linsei - Acortador de URLs

Acortador de URLs ligero y autoinstalable: **subes los archivos a
tu hosting, abres la URL y un asistente te pide 4 datos**. Sin consola, sin npm, sin
Composer. Panel multiusuario y **multiidioma**, con estadisticas, complementos y API.

## Tecnologia

- **PHP puro** (sin framework, sin Composer) - corre en cualquier hosting.
- **MySQL/MariaDB** (recomendado) **o SQLite** (sin configuracion) via PDO.
- Sesiones nativas, contrasenas con `password_hash` (bcrypt), tokens CSRF.
- **Bootstrap Icons + Chart.js** (CDN) para la interfaz y los graficos.

Requisitos: **PHP 7.4 o superior** con PDO (pdo_mysql o pdo_sqlite).

## Instalacion (en tu hosting)

1. Sube **todo el contenido** de esta carpeta a tu hosting (FTP o gestor de archivos),
   normalmente a `public_html` o a una subcarpeta.
2. Abre la URL en el navegador (p. ej. `https://tudominio.com`).
3. El **asistente** se abre solo: requisitos -> base de datos (MySQL o SQLite) ->
   usuario administrador y URL del sitio. Crea `config.php` y las tablas.
4. Entra al panel en `tudominio.com/admin`.

Si la carpeta no tiene permisos de escritura, el instalador te muestra el `config.php`
para crearlo a mano.

## Probar en local con Laravel Herd

1. Copia esta carpeta en los sitios de Herd (o `herd link linsei`).
2. Abre `https://linsei.test`.
3. En el instalador elige **SQLite** (cero configuracion).
4. Crea el admin y entra. Funciona bajo el nginx de Herd sin tocar nada.

## Funciones

- **Personalizacion de enlaces**: prefijo + slug (`tudominio.com/blog-mi-enlace`),
  prefijo de titulo, y "actualizar si el slug ya existe".
- **Expiracion** por fecha y/o por numero maximo de clics.
- **Roles**: administrador (ve todo) y gestor (solo lo suyo).
- **Estadisticas**: clics totales/hoy/30 dias, por pais, dispositivo y navegador,
  ranking de enlaces, rendimiento por gestor, detalle por enlace y export **CSV**.

## Multiidioma (i18n)

Interfaz en **espanol, ingles, frances y portugues**, con selector en la barra superior
y en el instalador. El idioma se detecta del navegador y se recuerda en la sesion.
Para anadir idiomas, crea `app/lang/<codigo>.php` copiando `app/lang/es.php`.

## Ayuda

Pagina **/admin/ayuda** con la documentacion de uso y el **token de API** de cada usuario.

## Complementos (plugins)

Sistema de **hooks** (acciones y filtros). Coloca complementos en la
carpeta `plugins/` y se cargan solos. Hooks disponibles: `init`, `admin_menu`,
`dashboard_after`, `help_after`, `link_created`, `link_clicked`. Incluye un plugin de
ejemplo en `plugins/welcome-note/`. Mas detalles en `plugins/README.md`.

## API y extension de Chrome

Endpoint **`POST /api/links`** con cabecera `Authorization: Bearer <token>` y cuerpo
`{ "url": "..." }` (acepta JSON o formulario). Devuelve JSON con `short_url`. Cada
usuario tiene su token en *Panel -> Ayuda*.

La carpeta **`chrome-extension/`** contiene una extension (Manifest V3) que acorta la
URL de la pestana actual con un clic. Instrucciones en `chrome-extension/README.md`.

## Estructura

```
index.php            Controlador frontal (router)
.htaccess            Reescritura de URLs (Apache) + proteccion
config.sample.php    Ejemplo de configuracion (config.php lo crea el instalador)
app/
  bootstrap.php      Arranque (config, sesion, plugins)
  i18n.php           Traducciones t() y deteccion de idioma
  hooks.php          Sistema de complementos (acciones/filtros)
  Database.php       PDO (MySQL/SQLite) + creacion de tablas
  helpers.php        Utilidades, CSRF, render de vistas
  auth.php           Sesion, roles, log, tokens de API
  slug.php           Generacion de codigos cortos
  ua.php / geo.php   Navegador/dispositivo y pais
  stats.php          Consultas de estadisticas
  controllers/       install, auth, dashboard, links, gestores, help, api, redirect
  lang/              es, en, fr, pt
  views/             Plantillas (panel + instalador + ayuda)
assets/              CSS y JS (Chart.js)
plugins/             Complementos (con un ejemplo)
chrome-extension/    Extension de navegador
data/                Base de datos SQLite (si la eliges) - protegida
_referencia-node/    Version anterior en Node (no se usa; puedes borrarla)
```

## Seguridad

Consultas con PDO preparado, contrasenas con bcrypt, CSRF en todos los formularios,
proteccion de acceso directo a `/app`, `/data` y `config.php`. Tras instalar, conviene
quitar el permiso de escritura de `config.php`.

## Como se ha probado

Validado de extremo a extremo con un runtime **PHP 8.3 real** (via `@php-wasm/node`) y
analizador de sintaxis sobre los 40 archivos PHP. Se ejecutaron 30 comprobaciones que
cubren: instalador (SQLite), login correcto/incorrecto, dashboard, creacion de enlaces
con prefijo+slug, redireccion y registro de clic, actualizar-si-existe sin duplicar,
expiracion (410), limite de clics (410), CSRF (403), separacion por gestor, export CSV,
404, multiidioma (ES/EN/FR), pagina de Ayuda con token, complementos (hooks) y API.
Todas correctas. La prueba final en tu hosting o en Herd con SQLite lleva un par de minutos.

## Estado por fases

- **Fase 1 (completa)**: personalizacion de enlaces, roles, estadisticas, login,
  dashboard e instalador web.
- **Fase 2 (parcial)**: logs de actividad y export CSV. Pendiente: filtros por
  fecha/gestor en la interfaz.
- **Fase 3 (anticipo)**: expiracion por fecha y por nº de clics. Pendiente: redireccion
  inteligente por pais/horario y roles personalizados.
- **Extras**: multiidioma, pagina de Ayuda, sistema de complementos, API y extension de Chrome.

## Licencia

MIT
