Proyecto: Shortener (acortador de URLs)
Este proyecto es una aplicación de acortador de URLs escrita en Java usando Javalin como framework web. Incluye:
- Interfaz web (Thymeleaf + recursos estáticos) para registrar usuarios, crear/administrar enlaces, ver estadísticas y generar códigos QR.
- API REST para operaciones sobre URLs.
- Servicio gRPC para operaciones de creación y listado de URLs (definido en
src/main/proto/shortener.proto). - Persistencia con MongoDB (driver sync y reactive-streams incluidos como dependencias).
- Autenticación basada en JWT para las rutas API.
- Acortar URLs y redirigir (
/acortar,/go/{shortUrl}). - Generación de códigos QR en base64 al crear un short URL.
- Estadísticas de acceso (IP, browser, plataforma, timestamp) y vista con Google Maps (clave por variable de entorno).
- Dashboard y gestión de usuarios (roles: admin, usuario, anonymous).
- Endpoints API bajo
/api/*protegidos por JWT (excepto/api/login). - Generación de
shadowJarpara producción (plugin ShadowJar configurado enbuild.gradle).
- JDK 17+ (o JDK recomendado por el desarrollador).
- Gradle (incluye wrapper
gradlewygradlew.bat). - MongoDB en ejecución (si quieres persistencia real).
- Variables de entorno opcionales para configuración (ver sección "Variables de entorno").
- Javalin (web framework)
- MongoDB Java Drivers (sync y reactive-streams)
- Thymeleaf (templating)
- Jackson (JSON)
- JJWT (JWT handling)
- gRPC / Protobuf (protoc, grpc-java)
- ZXing (generación de QR)
Directorio principal de interés:
src/main/java/edu/pucmm/eict/- Código fuente JavaMain.java- Punto de entrada. Arranca Javalin, configura Thymeleaf, registra rutas y middleware.controladores/- Controladores HTTP:AuthController,UrlController,UserController, APIs REST y gRPC controllers.clientes/grpc/- Cliente y servidor gRPC, implementación del servicioUrlShortenerServiceImpl.modelos/- ModelosUrl,Usuario,AccessDetail.services/- Lógica de negocio:UrlService,UserService.util/- Utilidades, por ejemploJwtUtilpara manejo de tokens.
src/main/proto/shortener.proto- Definición Protobuf del servicio gRPC.src/main/resources/public/- Recursos estáticos (templates Thymeleaf, JS, HTML cliente).build.gradle- Configuración de build, plugins (ShadowJar, protobuf), dependencias.
La aplicación soporta las siguientes variables de entorno (opcional):
PORT- Puerto donde arranca la aplicación (por defecto: 7000).BASE_URL- Dominio base usado para construir los short URLs (por defecto:http://localhost:7000).GOOGLE_MAPS_API_KEY- Clave para mostrar mapas/estadísticas con Google Maps.JWT_SECRET- Clave secreta usada porJwtUtilpara firmar/validar tokens JWT (si no está, reviseJwtUtilpara comportamiento por defecto).
Usando el wrapper de Gradle (recomendado):
PowerShell (Windows):
.\n+\gradlew.bat build
.
\gradlew.bat shadowJar
O para ejecutar directamente desde Gradle:
.
\gradlew.bat run
Al usar shadowJar se genera un JAR ejecutable en build/libs/ que puede ejecutarse con:
java -jar build\libs\proyecto-final-1.0-SNAPSHOT-all.jar
Rutas expuestas por la app (parcial):
-
Autenticación / sesiones (web):
- GET
/login,/register,/logout - POST
/login,/register(web forms) - POST
/api/login(retorna JWT para API)
- GET
-
URLs y redirecciones:
- POST
/acortar- Crea un short URL (form) - GET
/go/{shortUrl}- Redirige a la URL original y registra acceso - GET
/urls- Lista URLs (según usuario en sesión) - POST
/dashboard/urls/acortar- Endpoint usado desde dashboard (ajax o form) - POST
/dashboard/urls/delete- Eliminar URL - GET
/stats/{shortUrl}- Obtener estadísticas (vista web) - GET
/preview?url=...- Obtiene vista previa de una URL (usa microlink API)
- POST
-
API JSON:
- GET
/api/urls- Listar URLs (requiere JWT con rol apropiado) - POST
/api/urls- Crear URL vía API (requiere JWT)
- GET
El servicio gRPC está definido en src/main/proto/shortener.proto con el paquete edu.pucmm.eict.clientes.grpc.
Servicios principales:
- UrlShortenerService
- CreateUrl(CreateUrlRequest) -> CreateUrlResponse
- ListUrls(ListUrlsRequest) -> ListUrlsResponse
El proyecto incluye dependencias y configuración de protobuf en build.gradle para generar las clases gRPC durante el build.
- JWT: Asegúrate de configurar
JWT_SECRETcon una clave segura en producción. - HTTPS: En producción usa un proxy (NGINX) o plataforma que sirva TLS. No expongas tokens JWT sin TLS.
- MongoDB: No dejes la base de datos pública sin autenticación. Usa credenciales/roles y conexiones seguras.
- Dependencias: Revisa
build.gradley actualiza versiones si es necesario. Ejecuta análisis de seguridad (por ejemplo, Trivy / sonarqube) cuando agregues dependencias.
- Clonar el repositorio.
- Ejecutar
gradlew.bat run. - Abrir
http://localhost:7000en tu navegador (o el puerto configurado porPORT).
El proyecto está configurado para usar JUnit 5. Ejecuta las pruebas con:
.
\gradlew.bat test
Para preguntas o mejoras, abre un issue o contacta al mantenedor del repositorio.