Git Product home page Git Product logo

golang-family-tree's Introduction

Árvore genealógica

O Problema

Nesse desafio deve-se criar uma API que expõe um endpoint HTTP
para a criação e manipulação de entidades Person.

{
"name": "string"
}
e relações de paternidade.
{
"parent": "Person.identifier",
"children": "Person.identifier"
}

⚠ Importante: Os corpos de entrada podem ter mais campos que os do exemplo, mas devem conter os campos
mostrados acima.
A API deve prover também um endpoint que retorna a árvore genealógica de um certo indivíduo contendo todos os ascendentes possíveis até o seu nível. Por exemplo, suponha a seguinte família:

Árvore genealógica

Se procurarmos pelo identificador de Bruce, a API deve retornar:
Bruce, Mike, Sonny, Phoebe, Anastasiae Martin.
Já se buscarmos pelo identificador de Phoebe, devem retornar os membros Martin, Anastasia, Phoebe.
O retorno deve prover todas as informações para que quem o consuma seja capaz de construir a árvore, minimizando informações redundantes.

Soluçao

No conceito de árvores genealógica, relação entre duas pessoas se dá pela ligação pais e filhos, ou seja, uma pessoa poder ter um pai, uma mãe e filhos. Vale ressaltar que essas ligações são opcionais, como no caso de pessoas na raiz da árvore, pessoas com pai ou mãe desconhecidos ou pessoas sem filhos.
Essa estrutura representada por uma tabela pessoa e outra tabela associativa contendo os identificadores dos pais e filhos. Essa abordagem permitiria ligar uma pessoa a vários pais, entretanto, GENETICAMENTE falando, é impossível que uma pessoa tenha mais de que dois pais. Portanto, adicionaremos validações para garantir que uma pessoa tenha no máximo dois pais.

Modelo Dados

Dados de entrada:

{
    "name":"string",
    "parent": 1,
    "children": [1, 2]
}

Consulta de ascendentes

A consulta de ascendentes receberá o identificador indivíduo e retornará sua árvore genealógica contendo todos os ascendentes possíveis até o seu nível.

Tipo de resposta:

[
    {
        "id": 6,
        "name": "Mike",
        "depth": 0,
        "parents": [
            {
                "id": 1,
                "name": "Sony"
            }
        ]
    },
    {
        "id": 1,
        "name": "Sony",
        "depth": 1,
        "parents": null
    }
]

O campo depth representa o BACON'S NUMBER, mencionado como extras no desafio.

Arquiterura

Architecture

Pre-requisitos

Golang 1.20.3
GoMock v1.6.0
Docker 24.0.2
Docker Compose 14.1
GNU Make 3.81
Postgresql 14.1

Tecnologias

Golang, Golang-migrate, GoMock, Testify, Logrus
Docker, Docker Compose, git, GNU Make, Posgresql

Instalaçao

Conforme mencionado no desafio, a aplicacao rodará em um docker container, por meio um docker compose contendo todas as configuraçoes necessárias.

Download

Para clonar o repositorio, execute o seguinte comando:

git clone https://github.com/ergildo/golang-family-tree.git && cd golang-family-tree

Build

Para buildar a imagem docker, execute o seguinte comando:

docker build --tag golang-family-tree-api:latest .

Rodar a aplicaçao

Para rodar a aplicaçao, execute o seguinte comando:

docker-compose up -d

No seu navegador web, acesse a url http://localhost:8080/ping, caso o retorno seja "pong" siginifica que a aplicacao subiu com sucesso.

Observçao

Certifique-se que a imagem docker golang-family-tree-api:latest foi gerada corretamente.

Eu tive alguns problemas para rodar aplicação em MacOS. A primeira vez que docker-compose era iniciado a inicializaçao da api falhava. Caso isso aconteça, excute o docker-compose up -d novamente, isso deve resolver o problema.

Migração de banco de dados

A migraçao de dados será executada automáticamente ao rodar a aplicacao. Além de criar o esquema de banco de dados, será inserido uma carga inicial as seguintes pessoas:

Sony, Martin, Anastasia, Ellen, Oprah, Mike, Phoebe, Ursula, Eric, Ariel, Duny, Bruce, Jaqueline e Melody .

Conforme árvore genealógica mencionado no desafio.

Como usar a aplicaçao

No Postman, importe o arquivo tests/data/family-tree.postman_collection.json. Esse arquivo contém coleçao com todos enpoints da api.

API

Consulta de ascendentes

GET
/api/v1/person/ascendants/{id}

Lista os ascendentes de uma pessoa por id.

Exemplo de resposta:

[
    {
        "id": 6,
        "name": "Mike",
        "depth": 0,
        "parents": [
            {
                "id": 1,
                "name": "Sony"
            }
        ]
    },
    {
        "id": 1,
        "name": "Sony",
        "depth": 1,
        "parents": null
    }
]

Listar pessoas

GET
/api/v1/person

Retorna a lista de cadastradas no sistema.

Exemplo de resposta:

[
  {
    "id": 1,
    "name": "Sony"
  },
  {
    "id": 2,
    "name": "Martin"
  }
]

Adicionar pessoa

POST
/api/v1/person

Adiciona um nova pessoa.

Examplo de requisiçao:

{
    "name":"Ticio",
    "parent": 5,
    "children": [10]
}

Testes

Para rodar os tests, execute o seguinte comando:

go test ./internal/domain/service/... -v -cover

Contatos

Dúvidas?

e-mail: ergildo@gmail

whatsapp: +46 76 081 36 43

golang-family-tree's People

Contributors

ergildo 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.