{"id":71,"date":"2020-04-16T15:48:28","date_gmt":"2020-04-16T20:48:28","guid":{"rendered":"http:\/\/80bits.blog\/?p=71"},"modified":"2020-05-25T18:20:25","modified_gmt":"2020-05-25T23:20:25","slug":"atlas-proyecto-acortador-de-url","status":"publish","type":"post","link":"https:\/\/80bits.blog\/index.php\/2020\/04\/16\/atlas-proyecto-acortador-de-url\/","title":{"rendered":"Atlas. Proyecto acortador de url"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">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 <a rel=\"noreferrer noopener\" href=\"https:\/\/bitly.com\/\" target=\"_blank\">bitly.com<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El proyecto le puse por nombre <strong>atlas<\/strong>, esto no es importante solo fue un nombre al azar que se me ocurri\u00f3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Descripci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">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#.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La base de datos que usa es mongodb, nada complejo realmente incluso consta de un \u00fanico modelo para almacenar los documentos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Base de datos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como dije la base de datos consta de un solo modelo de documento, en el proyecto la clase se llama <em>UrlShortenedModelDb<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tiene una propiedad importante y es la que se llama <em>obj<\/em> b\u00e1sicamente es un identificador de tipo de documento el cual guardo como un entero y lo tengo como un enumerador en el c\u00f3digo que se llama <em>SHORT_URL<\/em>, esto con el fin de que en el futuro tenga mas tipos de documentos y para no hacer una colecci\u00f3n por tipo los identificare de esta manera, los cuales tambi\u00e9n est\u00e1ran indexados, el indice que cree para este documento es el siguiente:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>db.collection1.createIndex( { \"obj\": 1, \"short_code\": 1 }, { \"v\": 2, \"unique\": true, \"name\": \"index_obj_short_code\", \"ns\": \"atlas.collection1\", \"background\": true, \"sparse\": true });<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed es un indice compuesto, ya que exactamente es as\u00ed como buscare el documento, este consta de la propiedad <em>short_code<\/em> que es realmente el c\u00f3digo acostado, compuesto por la url del servicio.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">API Rest<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La api para generar el c\u00f3digo acortado ni siquiera tiene seguridad, esto por hacer una primera implementaci\u00f3n, tal vez en el futuro meta alg\u00fan tipo de token para usuarios, nada complejo sin registro ni nada, solo un token por usuario en la base de datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si llegaste hasta ac\u00e1 el c\u00f3digo en GitHub es el siguiente: <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/genitalico\/atlasapi\" target=\"_blank\">atlasapi<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ejecutarlo simplemente tienes que tener instalado el runtime de net core 3.1 que puede bajar desde <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/genitalico\/atlasapi\" target=\"_blank\">aqu\u00ed<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez lo tengas instalado y el c\u00f3digo clonado solo se hace lo siguiente, en la consola de comandos:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>$ dotnet restore<\/code><br><code>$ dotnet run<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El servicio se ejecuta en el puerto 5000 para http y 5001 para https y desde ahi puedes hacer la siguiente llamada.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"685\" height=\"636\" src=\"http:\/\/80bits.blog\/wp-content\/uploads\/2020\/04\/captura-postman-atlasapi-addurl.png\" alt=\"captura-postman-atlasapi-addurl\" class=\"wp-image-75\"\/><figcaption>captura-postman-atlasapi-addurl<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">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\u00ed es <em>short_url<\/em> que es el c\u00f3digo corto de la url real y que es el que se buscara en la base de datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por cierto el mensaje esta compuesto as\u00ed por medio de una librer\u00eda que implemente que por default ya me trae las tres partes, code, messages y content, la puedes descargar por <a rel=\"noreferrer noopener\" href=\"https:\/\/www.nuget.org\/packages\/webServiceTools\/\" target=\"_blank\">aqu\u00ed<\/a>. (Nota no tengo documentaci\u00f3n de ella).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para obtener la ruta original basado en el c\u00f3digo que se obtiene, simplemente es consultar la url como sigue:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">https:\/\/dominiocorto.com\/n7eD<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"655\" height=\"621\" src=\"http:\/\/80bits.blog\/wp-content\/uploads\/2020\/04\/captura-postman-atlasapi-geturl.png\" alt=\"captura-postman-atlasapi-geturl\" class=\"wp-image-76\"\/><figcaption>captura-postman-atlasapi-geturl<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Para este caso el dominio ya podr\u00e1s cambiarlo tu, en mi caso estoy buscando dominios cortos para implementarlo en un ambiente real a futuro.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuraciones<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">la soluci\u00f3n consta de un archivo de configuraciones json llamado appsettings.json.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las propiedades importantes son:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\"MongoConnectionString\": \"mongodb:\/\/admin:1234567890@atlas.database\/atlas\",<br>\"MongoDatabaseName\": \"atlas\",<br>\"MongoCollection\": \"collection1\",<br>\"SizeCode\": \"4\" <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Las primeras tres como su nombre indica corresponden a las configuraciones para la base de datos mongodb, la ultima es el tama\u00f1o de c\u00f3digo que se quiere generar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El coding se genera aleatoriamente mediante un diccionario alfanumerico con mayusculas y min\u00fasculas sin tomar en cuenta la \u00d1\u00f1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">el alfabeto es el siguiente:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como se dar\u00e1n cuenta consta de 62 caracteres por lo que con un tama\u00f1o 4 tienes un total de 62^4 = 14,776,336 de combinaciones, si quieres aumentar el numero de combinaciones solo aumenta el tama\u00f1o y listo, esto es trivial incluso se puede hacer en tiempo de ejecuci\u00f3n, como referencia webs como bitly.com usan un tama\u00f1o 7.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si tienes sugerencias para mejorar el c\u00f3digo solo h\u00e1zmelo saber en los comentarios y\/o haz un fork, edita y env\u00edame un pull request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Happy Coding!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Proyecto atlas, acortado de url muy simple pero poderoso, c\u00f3digo abierto, se libre de hacer un fork y compartirlo con los demas.<\/p>\n","protected":false},"author":1,"featured_media":78,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[14,13,22,44],"tags":[17,19,15,16,46,45,18],"class_list":["post-71","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-csharp","category-dev","category-frameworks","category-netcore","tag-c","tag-codigo","tag-dev","tag-development","tag-mongodb","tag-netcore","tag-programacion"],"jetpack_featured_media_url":"https:\/\/80bits.blog\/wp-content\/uploads\/2020\/04\/programmer.jpg","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/posts\/71","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/comments?post=71"}],"version-history":[{"count":4,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/posts\/71\/revisions"}],"predecessor-version":[{"id":79,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/posts\/71\/revisions\/79"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/media\/78"}],"wp:attachment":[{"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/media?parent=71"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/categories?post=71"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/80bits.blog\/index.php\/wp-json\/wp\/v2\/tags?post=71"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}