Giter Club home page Giter Club logo

desafio_spot_sat's Introduction

Desafio Spot Sat

Esse é o meu repositório onde vou desenvolver os desafios propostos pela SpoT sat.

Segue abaixo a descrição dos desafios propostos:

DESAFIO BACKEND

Nós trabalhamos com a criação de soluções que lidam com dados geográficos, como mapeamento de áreas, localização de clientes, entre outros. Para isso, estamos propondo um desafio técnico dividido em várias etapas, cada uma com um nível de dificuldade crescente. O objetivo é avaliar a capacidade de resolver problemas e desenvolver soluções eficientes.

Você deve criar um projeto no github e implementar uma JSON REST API com as especificações abaixo. Cada parte cresce em nível de dificuldade e você não precisa necessariamente desenvolver todas.

Primeira Parte

  1. GET /v1/

Retorna uma mensagem padrão com status 200 OK. Exemplo de resposta:

{

“message”: “Bem vindo a API GeoPoly!” }

  1. POST /v1/auth

Simula uma rota de autenticação (não precisa implementar uma autenticação de verdade). Retorna umas das possíveis respostas dependendo do corpo da requisição.

Exemplo de requisição:

{

“email”: “[email protected]”, “password”: “abcd1234”

}

Exemplo de resposta (200 OK) para caso as credenciais estejam corretas (pode considerar corretas as credenciais acima):

{

“message”: “Autenticado com sucesso!” }

Exemplo de resposta (401 Unauthorized) para caso as credenciais estejam incorretas:

{

“message”: “Falha ao autenticar!” }

Exemplo de resposta (400 Bad Request) para caso o formato do corpo da requisição (nome dos atributos errados e/ou atributos a mais ou a menos) esteja incorreto:

{

“message”: “Formato da requisição inválido!” }

Segunda Parte

Os próximos itens do desafio consistem em desenvolver uma API RESTful para gerenciar uma lista de lugares com informações geográficas, como nome, latitude e longitude. A API deve fornecer as seguintes rotas e não precisa de integração com banco de dados neste primeiro momento, você pode deixar a lista de lugares hardcoded.

  1. GET /v2/places

Retorna uma lista de lugares com informações geográficas em formato JSON. Exemplo de resposta (lugares em São José dos Campos - SP):

[

{

"id": 1,

"name": "Parque da Cidade", "latitude": -23.221112, "longitude": -45.899678

},

{

"id": 2,

"name": "Praça Ulisses Guimarães", "latitude": -23.180038, "longitude": -45.884357

},

...outros lugares

]

  1. GET /v2/places/:id

Retorna um lugar específico da lista acima pelo seu ID em formato JSON. Exemplo de resposta:

{

"id": 1,

"name": "Parque da Cidade", "latitude": -23.221112, "longitude": -45.899678

}

Terceira Parte

Refazer as rotas acima em /v2/places porém agora persistindo os dados. Esta nova implementação deve estar em /v3/places. E incluir essas outras rotas:

  1. POST /v3/places

Cria um novo lugar com informações geográficas a partir de um objeto JSON. Exemplo de requisição:

{

"name": "Lago do Vale",

"latitude": -23.200443,

"longitude": -45.896235 }

Exemplo de resposta:

{

"id": 5,

"name": "Lago do Vale", "latitude": -23.200443, "longitude": -45.896235

}

  1. PUT /places/:id

Atualiza um lugar específico pelo seu ID a partir de um objeto JSON com as informações a serem atualizadas.

Exemplo de requisição:

{

"name": "Parque da Cidade - São José dos Campos", "latitude": -23.221112,

"longitude": -45.899678

}

Exemplo de resposta:

{

"id": 1,

"name": "Parque da Cidade - São José dos Campos", "latitude": -23.221112,

"longitude": -45.899678

}

  1. DELETE /places/:id

Deleta um lugar específico pelo seu ID. Exemplo de resposta:

{

"message": "Lugar removido com sucesso!" }

Quarta Parte

Os dois próximos itens envolvem alguns cálculos em cima das coordenadas. Para este desafio você pode usar a fórmula de distância euclidiana para calcular a distância entre os pontos.

distance = sqrt((x1-x2)**2 + (y1-y2)**2)

  1. GET /v4/places/:id1/distanceto/:id2 Retorna a distância entre 2 pontos. Exemplo de resposta:

{

“distance”: 1300.00 }

  1. GET /v4/search?latitude={latitude}&longitude={longitude}&radius={radius}

Retorna uma lista de lugares e/ou áreas em um raio específico a partir de uma localização central (latitude e longitude) e um raio em metros. Cada lugar deve incluir a distância do ponto central especificado. Exemplo de resposta:

[

{

"id": 1,

"name": "Parque da Cidade", "latitude": -23.221112, "longitude": -45.899678, "distance": 1300.0

}, {

"id": 2,

"name": "Praça Ulisses Guimarães", "latitude": -23.180038, "longitude": -45.884357, "distance": 5000.0

},

{

"id": 3,

"name": "Shopping Center Vale", "latitude": -23.186732, "longitude": -45.884104, "distance": 5600.0

},

...outros lugares

]

Quinta Parte

Nesta parte você deve implementar um CRUD completo para lugares (nome + ponto) e áreas (nome + polígono) que deverão ser persistidos em um banco PostgreSQL com a extensão PostGIS. Você deve utilizar o formato GeoJSON e pode usar o site https://geojson.io/ para gerar e visualizar os polígonos. Além das rotas com operações de listagem, criação, visualização, atualização, e remoção você deve incluir rotas para pesquisar lugares e áreas dentro de um círculo, calcular a distância entre dois lugares (usando a projeção adequada), verificar se um lugar está dentro de uma área e uma última rota para listar lugares dentro de uma área. As rotas devem ser autenticadas usando JWT mas não é necessário criar rotas para criar usuários, recuperação de senhas e outros relacionados apenas deixar um usuário administrador cadastrado no banco de dados e suas credenciais no readme do projeto.

Fique a vontade, leve quanto tempo precisar e pode interromper o desenvolvimento em qualquer uma das partes.

Os seguintes aspectos serão avaliados:

  • Facilidade de executar o projeto
  • Qualidade do código (clean code, uso de linter etc.)
  • Histórico de commits (mensagem claras, commits concisos)
  • Testes
  • Documentação

desafio_spot_sat's People

Contributors

incivius avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.