Debido a la cuarentena en la que estamos inmersos todos, se me ha ocurrido crear un proyecto bastante simple para pasar el aburrimiento, el proyecto es solo un backend para generar url cortas similar a lo que hace por ejemplo bitly.com.
El proyecto le puse por nombre atlas, esto no es importante solo fue un nombre al azar que se me ocurrió.
Descripción
El proyecto lo tengo en una fase muy inicial pero funcional, consta de solo el backend desarrollado con Net Core version 3.1 y obviamente lenguaje C#.
La base de datos que usa es mongodb, nada complejo realmente incluso consta de un único modelo para almacenar los documentos.
No esta conterizado, esto es que no estoy usando docker ni nada de ese estilo se ejecuta tal cual se ejecuta otro desarrollo en net core y se implementa de la misma manera, tal vez en el futuro implemente un contenedor, pero de momento no es necesaria tal complejidad.
Base de datos
Como dije la base de datos consta de un solo modelo de documento, en el proyecto la clase se llama UrlShortenedModelDb
Tiene una propiedad importante y es la que se llama obj básicamente es un identificador de tipo de documento el cual guardo como un entero y lo tengo como un enumerador en el código que se llama SHORT_URL, esto con el fin de que en el futuro tenga mas tipos de documentos y para no hacer una colección por tipo los identificare de esta manera, los cuales también estáran indexados, el indice que cree para este documento es el siguiente:
db.collection1.createIndex( { "obj": 1, "short_code": 1 }, { "v": 2, "unique": true, "name": "index_obj_short_code", "ns": "atlas.collection1", "background": true, "sparse": true });
Aquí es un indice compuesto, ya que exactamente es así como buscare el documento, este consta de la propiedad short_code que es realmente el código acostado, compuesto por la url del servicio.
API Rest
Esta parte es la parte mas sencilla costa solo de dos partes una api para enviar la url que se acortara y la parte que te redirecciona a la web original.
La api para generar el código acortado ni siquiera tiene seguridad, esto por hacer una primera implementación, tal vez en el futuro meta algún tipo de token para usuarios, nada complejo sin registro ni nada, solo un token por usuario en la base de datos.
Si llegaste hasta acá el código en GitHub es el siguiente: atlasapi.
Para ejecutarlo simplemente tienes que tener instalado el runtime de net core 3.1 que puede bajar desde aquí.
Una vez lo tengas instalado y el código clonado solo se hace lo siguiente, en la consola de comandos:
$ dotnet restore
$ dotnet run
El servicio se ejecuta en el puerto 5000 para http y 5001 para https y desde ahi puedes hacer la siguiente llamada.
Como pueden ver en la captura es algo muy sencillo, la url simplemente recibe un post con el cuerpo y una sola propiedad que es la url que quieres acortar y te retorna un mensaje compuesto de tres partes, el dato que interesa aquí es short_url que es el código corto de la url real y que es el que se buscara en la base de datos.
Por cierto el mensaje esta compuesto así por medio de una librería que implemente que por default ya me trae las tres partes, code, messages y content, la puedes descargar por aquí. (Nota no tengo documentación de ella).
Para obtener la ruta original basado en el código que se obtiene, simplemente es consultar la url como sigue:
https://dominiocorto.com/n7eD
Para este caso el dominio ya podrás cambiarlo tu, en mi caso estoy buscando dominios cortos para implementarlo en un ambiente real a futuro.
Configuraciones
la solución consta de un archivo de configuraciones json llamado appsettings.json.
Las propiedades importantes son:
"MongoConnectionString": "mongodb://admin:1234567890@atlas.database/atlas",
"MongoDatabaseName": "atlas",
"MongoCollection": "collection1",
"SizeCode": "4"
Las primeras tres como su nombre indica corresponden a las configuraciones para la base de datos mongodb, la ultima es el tamaño de código que se quiere generar.
El coding se genera aleatoriamente mediante un diccionario alfanumerico con mayusculas y minúsculas sin tomar en cuenta la Ññ.
el alfabeto es el siguiente:
abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ
Como se darán cuenta consta de 62 caracteres por lo que con un tamaño 4 tienes un total de 62^4 = 14,776,336 de combinaciones, si quieres aumentar el numero de combinaciones solo aumenta el tamaño y listo, esto es trivial incluso se puede hacer en tiempo de ejecución, como referencia webs como bitly.com usan un tamaño 7.
Si tienes sugerencias para mejorar el código solo házmelo saber en los comentarios y/o haz un fork, edita y envíame un pull request.
Happy Coding!