Backend API Rest application for ShortLink, a URL shortening service where you enter a valid URL and get back an encoded URL

Overview

ShortLink - The Shortest URL (API)


Sobre o Projeto   |    Como Usar   |    Importante!


Sobre o projeto

The Shortest URL é um projeto back-end de ShortLink, um serviço de encurtamento de URL onde você insere uma URL como https://codesubmit.io/library/react e retorna uma URL curta como http://short.est/GeAi9K.

O projeto foi proposto como desafio técnico para a empresa Going2 Mobile, onde o escopo solicitava:

  • Um serviço de ShortLink desenvolvido em Node.js e qualquer framework, utilizando boas práticas, com um código limpo e sustentável.
  • O projeto deveria contar com apenas 2 (dois) endpoints: "/encode" e "/decode".
  • O retorno desses endpoints deveriam ser num formato json.
  • A lógica e o algoritmo de codificação/decodificação ficaram à minha livre escolha, porém as URL's deveriam ser persistidas num Banco de Dados relacional, preferencialmente no MySQL.
  • Como bônus, realizar testes na aplicação.


Após a leitura do escopo do projeto e os requisitos iniciais em pauta, fui escrevendo em um arquivo "requisitos.md" todos estes requisitos funcionais da aplicação. A partir daí já comecei a pensar de forma mais organizada como iniciar o projeto, onde cheguei na seguinte linha de raciocínio:

  • Eu simplesmente deveria codificar um URL válido para um URL encurtado com um código aleatório alfanumérico, persistir a URL original em uma coluna e o código encurtado em outra coluna. E, para devolver para o cliente este URL codificado ou descodificado, eu só precisaria fazer uma busca simples no banco de dados referenciando um ou outro.

  • Para isso, sem a utilização de bibliotecas criei uma regra de validação de URL de entrada utilizando RegEx. Caso essa URL não passasse na validação, retornaria um erro 400 para o cliente. Após algumas refatorações do código, coloquei esta validação em um middleware específico para deixar a aplicação mais desacoplada e delegável (ela nem passava pelo controller mais!)

  • Caso a URL que seria codificada passasse na validação, o próximo passo seria criar um código curto, onde defini apenas 5 caracteres alfanuméricos para gerar um código short URL (tipo um ID, exemplo: "aUg8i") e, com ele gerado, deveria salvá-lo no Banco de Dados juntamente com a URL original, possibilitando assim a referência desse código curto ao URL de entrada original, afim de decodificação futura.

  • Como não haviam muitos dados a serem salvos no Banco de Dados, criei uma tabela só e nela estipulei os seguintes campos: UUID, url, short_url, created_at.

  • Tanto o campo "url" quanto o campo "short_url" defini como únicos para evitar conflitos de keys nas pesquisas e gravações - apesar de que no próprio algoritmo eu desenvolvi uma lógica para que isso não acontecesse no Banco de Dados.

  • Importante salientar que eu até poderia concatenar o domínio junto ao código short URL (exemplo: "http://dominio.com/a1b2c") e salvá-lo assim no Banco de Dados diretamente mesmo. De certa maneira, isso até seria mais fácil e simples de decodificar, entretanto, poderia ocasionar problemas ou transtornos futuros caso a aplicação viesse a mudar de domínio.

  • Sendo assim, essa parte de tratar caracteres e realizar o "encode" e "decode" das URL's ficou à cargo dos próprios algoritmos da aplicação, utilizando o poder dos RegEx's juntamente com métodos de string's e array's para capturar os caracteres necessários nos casos de uso e validá-los quando necessário.


Para desenvolver o projeto utilizei a metodologia TDD. Para deixar o código mais limpo, flexível e escalável, utilizei o máximo possível os princípios de SOLID e DRY.

Boa parte do tempo dispensado no desenvolvimento do projeto foi devido à refatorações de códigos e testes, mas o investimento de tempo fazendo isso valeu a pena no fim das contas.

Outro ponto importante que destaco aqui é que o projeto poderia sim ter ficado muito mais enxuto, porém, essa arquitetura mais extensa e "complexa" faz sentido em qualquer tipo de projeto pois é fácil de ler, de implementar coisas novas e de fazer manutenções.

Neste quesito de analisar e decidir sobre como iniciar um projeto, parto do princípio de que nunca sabemos com exatidão quão longe pode chegar nossa aplicação. A ideia é que, mesmo sabendo que hoje a minha aplicação pode ter 1 ou 2 rotas ou X features, a tendência é sempre aumentar. Então, que se for para dispensar tempo arquitetando o projeto, que seja no início :)

🚀 Para desenvolver esse projeto utilizei as seguintes tecnologias:

📌 Como Usar

1 - Para executar esta aplicação, você precisará ter instalado no seu computador:

2 - Para rodar a aplicação, realize cada uma das etapas abaixo no terminal:

# Clone esse repositório:
$ git clone https://github.com/brunohsweber/shortlink-the-shortest-url

# Entre no repositório:
$ cd shortlink-the-shortest-url

# Instale as dependências:
$ yarn
ou
$ npm run install

# Instancie o container do banco de dados com o Docker-Compose:
$ docker-compose up

# Para rodar as migrations:
$ yarn migrate:deploy
ou
$ npx run migrate:deploy

# Rode os testes:
$ yarn test
ou
$ npm run test

# Gere o build da aplicação
$ yarn build
ou
$ npm run build

# Rode a aplicação em modo produção:
$ yarn start:prod
ou
$ npm run start:prod

# Para acessar a página da documentação da API do projeto:
`http://localhost:3000/api-docs`

Para acessar as rotas já configuradas pelo Insomnia, é possível importar o arquivo JSON: Clique aqui para acessar o arquivo JSON


⚠️ Informações Importantes

Este projeto foi desenvolvido para fins de desafio técnico.



Feito com por Bruno Weber 👋

You might also like...

ACME client microservice for the Cumulocity IoT Edge to automatically issue and renew valid certificates via e.g. Let's Encrypt.

Cumulocity IoT Edge - ACME This repository contains the sources for an ACME microservice that can be used to periodically issue/renew certificates for

May 3, 2022

Contribute on this repository with VALID PRs to HACKTOBERFEST-2022 and earn amazing swags!

Contribute on this repository with VALID PRs to HACKTOBERFEST-2022 and earn amazing swags!

LINK- https://rbshop.netlify.app/ Hacktoberfest2022 You can make folders of programming languages and also you can contribute in the repo's below. Fee

Oct 25, 2022

Easiest 1-click way to install and use Stable Diffusion on your own computer. Provides a browser UI for generating images from text prompts and images. Just enter your text prompt, and see the generated image.

Easiest 1-click way to install and use Stable Diffusion on your own computer. Provides a browser UI for generating images from text prompts and images. Just enter your text prompt, and see the generated image.

Stable Diffusion UI Easiest way to install and use Stable Diffusion on your own computer. No dependencies or technical knowledge required. 1-click ins

Dec 30, 2022

Projeto de uma API REST usando backend em Node.js

🚧 WIP - ToDo API - T17 - Resilia Projeto de educacional do curso de Web Dev Full Stack da Resilia Educação referente ao Módulo 04. Projeto realizado

Nov 30, 2022

Loops through a list of Discord tokens in a file to check if they are valid/invalid

Loops through a list of Discord tokens in a file to check if they are valid/invalid

Discord Token Checker Loops through a list of Discord tokens in a file to check if they are valid/invalid. Click here to report bugs. Usage Download Z

Dec 31, 2022

A beginner friendly hacktoberfest2022 repo made lately to accept valid open source contribution.

A beginner friendly hacktoberfest2022 repo made lately to accept valid open source contribution.

Hacktoberfest2022 A hacktoberfest2022 repo made lately to accept valid open source contribution. What is Hacktoberfest? Hacktoberfest is digitalocean’

Oct 20, 2022

Demodal is a browser extension that automatically removes content blocking modals including paywalls, discount offers, promts to sign up or enter your email address and more.

Demodal Demodal is a browser extension that automatically removes content blocking modals including paywalls, discount offers, promts to sign up or en

Jan 4, 2023

Makes downloading Scratch projects easy. Simply enter two project IDs and click start.

Makes downloading Scratch projects easy. Simply enter two project IDs and click start. No need to pick the right format or include the assets, all of this is done automatically and in the browser.

May 27, 2022
Owner
Bruno Weber
Desenvolvedor Back-end | Node.js | JavaScript | TypeScript
Bruno Weber
Link Shortening on steroids ✨

LinkCtrl - Link Shortening on steroids ✨ ✨ ✨ LinkCtrl is a simple, easy-to-use, and powerful link shortening service. It is designed to be simple and

Prince Codes 3 Jul 8, 2022
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
This is a vanilla Node.js rest API created to show that it is possible to create a rest API using only vanilla Node.js

This is a vanilla Node.js rest API created to show that it is possible to create a rest API using only vanilla Node.js. But in most cases, I would recommend you to use something like Express in a production project for productivity purposes.

Eduardo Dantas 7 Jul 19, 2022
An API that allows you to scrape blog posts and articles and get a list of notes or a summary back.

EZAI-Web-Scraper An API that allows you to scrape blog posts and articles and get a list of notes or a summary back. Recommendations Use browserless.i

null 9 Dec 8, 2022
This is a frontend tool to help you craft valid seed poems.

seed-poem-tool This is a frontend tool to help you craft valid seed poems. A seed poem is a small 12 to 24 word poem that is also a valid BIP-39 mnemo

Matt DesLauriers 21 Sep 18, 2022
linuxbu - a chrome extension that helps you to enter SBU classes via html-view in linux

linuxbu is a chrome extension that helps you to enter SBU classes via html-view in linux

Hasan Zonuzi 8 Dec 19, 2022
A simple browser extension, intended to get you "Back To Work" when you start slacking off to one of those really addictive sites.

Back to Work A simple browser extension, intended to get you Back To Work when you start slacking off to one of those really addictive sites. What doe

Dheeraj Lalwani 29 Nov 19, 2022
radiQL, your one-stop-shop for migrating from a legacy REST backend to an efficient and modern GraphQL API

Welcome to radiQL, the one-stop solution for setting up GraphQL on a PostgreSQL database. Check out our Medium article here. At A Glance: Give us your

OSLabs Beta 90 Nov 14, 2022