LNKY

.NET Core Web API

Entity Framework

Identity

SQL Server

React

Tailwind

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.

  1. Creación de un Enlace:
    • Un usuario autenticado envía una petición POST al endpoint /api/link con la URL original que desea acortar.
    • El LinkController recibe la solicitud y la delega al LinkService.
    • El servicio valida la URL, genera un código alfanumérico único y corto utilizando el IdGeneratorService, y crea una nueva entidad Link.
    • A través de ApplicationDbContext (Entity Framework Core), esta entidad se persiste en la base de datos.
    • Finalmente, se devuelve al usuario un LinkDTO con la nueva URL acortada.
  2. 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ódigo XyZ123 en 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 IpGeoLocationService y UserAgentService, captura y almacena en la entidad LinkClick el país, la ciudad, el navegador y el sistema operativo del visitante.
    • Una vez registrada la analítica, devuelve una respuesta HTTP 308 Permanent Redirect al navegador del usuario, llevándolo a la URL original.

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: