LNKY
Realizado durante el año 2025
LNKY es un servicio de backend, desarrollado en .NET 8, que va más allá de un simple acortador de URLs. El proyecto nació de la necesidad de no solo transformar enlaces largos y difíciles de manejar en URLs cortas y elegantes, sino también de obtener una capa de inteligencia sobre su uso. La motivación principal fue construir una herramienta que permitiera a los usuarios entender el alcance de sus contenidos compartidos, proporcionando analíticas detalladas de cada clic, como la geolocalización y el dispositivo del visitante.
Es una solución ideal para creadores de contenido, profesionales del marketing o cualquier persona que busque optimizar la forma en que comparte enlaces en la web.
Stack Tecnológico
Este proyecto fue construido utilizando un stack moderno y eficiente, enfocado en el rendimiento y la mantenibilidad.
- Lenguaje y Framework: C# con .NET 8 y ASP.NET Core Web API.
- Base de Datos: Entity Framework Core 8 como ORM, diseñado para trabajar con bases de datos relacionales como PostgreSQL o SQL Server.
- Autenticación: Sistema basado en JSON Web Tokens (JWT) para proteger los endpoints y gestionar las sesiones de usuario.
- Arquitectura: Patrones de diseño como Inyección de Dependencias (DI), Repositorio (implícito en EF Core) y DTOs (Data Transfer Objects) para una arquitectura limpia y desacoplada.
- Contenerización: Soporte para Docker a través de
docker-compose.yml, facilitando un despliegue rápido y consistente. - Mapeo de Objetos: AutoMapper para simplificar la transformación entre entidades de la base de datos y los DTOs expuestos en la API.
Flujo de Lógica y Arquitectura
El sistema sigue una arquitectura de API RESTful clásica, con una clara separación de responsabilidades.
- Creación de un Enlace:
- Un usuario autenticado envía una petición
POSTal endpoint/api/linkcon la URL original que desea acortar. - El
LinkControllerrecibe la solicitud y la delega alLinkService. - El servicio valida la URL, genera un código alfanumérico único y corto utilizando el
IdGeneratorService, y crea una nueva entidadLink. - A través de
ApplicationDbContext(Entity Framework Core), esta entidad se persiste en la base de datos. - Finalmente, se devuelve al usuario un
LinkDTOcon la nueva URL acortada.
- Un usuario autenticado envía una petición
- Redirección y Captura de Analíticas:
- Un visitante hace clic en una URL acortada (ej:
http://tu-dominio.com/XyZ123). - La petición llega al
RedirectController, que busca el códigoXyZ123en la base de datos. - Si lo encuentra, el sistema no solo redirige, sino que primero inicia un proceso asíncrono para registrar el clic.
- Utilizando servicios como
IpGeoLocationServiceyUserAgentService, captura y almacena en la entidadLinkClickel país, la ciudad, el navegador y el sistema operativo del visitante. - Una vez registrada la analítica, devuelve una respuesta
HTTP 308 Permanent Redirectal navegador del usuario, llevándolo a la URL original.
- Un visitante hace clic en una URL acortada (ej:
Implementaciones Destacadas
Dentro del código, se pueden destacar dos implementaciones por su diseño y valor técnico:
1. Sistema de Analíticas por Clic No Bloqueante
Una de las características más interesantes es cómo se gestiona el seguimiento de cada clic. En lugar de hacer que el usuario espere a que se registren todos los datos de geolocalización y User-Agent antes de redirigirlo, el RedirectController delega esta tarea a servicios que operan de forma rápida y desacoplada.
Decisión técnica acertada: Almacenar el clic y sus metadatos (LinkClick) de forma asíncrona asegura una experiencia de usuario fluida y una redirección casi instantánea. Esto es crucial, ya que la velocidad es un factor clave en la retención de usuarios. La separación de esta lógica en servicios especializados (IpGeoLocationService, UserAgentService) sigue el Principio de Responsabilidad Única, haciendo el sistema más mantenible y escalable.
2. Arquitectura Limpia y Segura con DTOs y Servicios
El proyecto demuestra una excelente separación de responsabilidades. Los Controllers son delgados y solo se ocupan de la capa HTTP. Toda la lógica de negocio reside en los Services (ej: LinkService, UserService), y la persistencia se abstrae con Entity Framework Core.
Decisión técnica acertada: El uso de DTOs (Data Transfer Objects) junto con AutoMapper es un pilar de esta arquitectura. En lugar de exponer las entidades de la base de datos (Link, ApplicationUser) directamente en la API, se crean modelos específicos para cada caso de uso (LinkDTO, UserDTO). Esto no solo evita exponer datos sensibles o innecesarios, sino que también desacopla la API del modelo de datos interno, permitiendo que la base de datos evolucione sin romper los contratos con los clientes de la API.
3. Funcionalidad
- Privacidad: Capa de seguridad para proteger el acceso a ciertos enlaces mediante contraseña.
- Métricas de Alto Rendimiento: Implementé un contador atómico en el endpoint de consumo. Al mantener la lógica de métricas simple (incremento directo en base de datos), se asegura que la latencia de la redirección sea mínima.
- Dashboard SPA: Panel de administración reactivo donde el usuario gestiona sus enlaces sin recargas de página.
4. Métricas
El proyecta cuenta con métrica según el IP del usuario para determinar los clicks, como también según el navegador en el que fue ejecutado el link: