No description, website, or topics provided.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
app
bin
config
db
lib
log
public
spec
swagger/v1
.gitignore
Gemfile
Gemfile.lock
README.md
Rakefile
config.ru

README.md

Olympic

O projeto segue a especificação da jsonapi e utiliza a jsonapi-resource

Documentação adicional pode ser acessada em http://localhost:3000/api-docs seguindo o padrão openapi utilizando a gem swagger_rails que também proporciona testes de integração (baseado nas rotas).

Teste

bundle install
bundle exec rspec spec

Nos testes também é avaliado o número de queries executadas com a gem

Iniciando o server

  bundle install
  bundle exec rails s

API

A API é composta de recursos competition(com diversos subtipos), athlete e score Cada recurso como estipulado em jsonapi tem o formato:

{
  "data":{
    "id": 1,
    "type": "type",
    "links":{
    },
    "attributes":{ 
    },
    "relationships":{
      }
    }
  }
}

Abaixo um exemplo completo para atleta, nos exemplos futuros ignoraremos relationships por simplicidade

{
  "data":{
    "id":"6",
    "type":"athletes",
    "links":{
      "self":"http://localhost:3000/v1/athletes/6"
    },
    "attributes":{
      "name":"atl3",
      "sex":"f",
      "age":34
    },
    "relationships":{
      "scores":{
        "links":{
          "self":"http://localhost:3000/v1/athletes/6/relationships/scores",
          "related":"http://localhost:3000/v1/athletes/6/scores"
        }
      },
      "competitions":{
        "links":{
          "self":"http://localhost:3000/v1/athletes/6/relationships/competitions",
          "related":"http://localhost:3000/v1/athletes/6/competitions"
        }
      }
    }
  }
}
Competition
Listagem de tipos

Na rota /competitions/types é possivel listar todos os tips de competição.

{
  "data":[
    {
      "id":"1",
      "type":"competition-types",
      "links":{
        "self":"http://localhost:3000/v1/competitions/types"
      },
      "attributes":{
        "name":"JavelinThrow"
      }
    },
    {
      "id":"2",
      "type":"competition-types",
      "links":{
        "self":"http://localhost:3000/v1/competitions/types"
      },
      "attributes":{
        "name":"Run100m"
      }
    }
  ]
}

######Criação de competição Para criar uma nova competição deve-se enviar um POST para rota /v1/competitions

Deve-se enviar o body no formato abaixo. O atributo type deve ser um dos listados em /v1/competitions/types

{
  "data":{
    "type":"competitions",
    "attributes":{
      "name":"run2",
      "type":"Run100m",
      "status":"running",
        "max-scores":1,
        "unity":"s"
    }
  }
}

######Atualizar competição Para atualizacao de uma competição deve-se utilizar o mesmo formato, Só é necessário incluit o atributo alterado mas deve-se também incluir o id do recurso como abaixo:

{
  "data":{
    "type":"competitions",
    "id": 4,
    "attributes":{
      "name":"run2_update"
    }
  }
}
Detalhes de uma competição

Para obter os detalhes de uma competição deve-se fazer um GET na rota /v1/competitions/{id}

{  
  "data":{  
    "id":"4",
    "type":"run100ms",
    "links":{  
      "self":"http://localhost:3000/v1/run100ms/4"
    },
    "attributes":{  
      "name":"run2",
      "type":"Run100m",
      "status":"running",
        "max-scores":1,
        "unity":"s"
    },
    "relationships":{  
   
    }
  }
}
Listagem de competições

Da mesma forma a rota /v1/competitions lista todas as competições cadastradas

  {
  "data":[
    {
      "id":"1",
      "type":"javelin-throws",
      "links":{
        "self":"http://localhost:3000/v1/javelin-throws/1"
      },
      "attributes":{
        "name":"jav2",
        "type":"JavelinThrow",
        "status":"running",
        "max-scores":3,
        "unity":"m"
      },
      "relationships":{}
    },
    {
      "id":"2",
      "type":"javelin-throws",
      "links":{
        "self":"http://localhost:3000/v1/javelin-throws/2"
      },
      "attributes":{
        "name":"jav1",
        "type":"JavelinThrow",
        "status":"running",
        "max-scores":3,
        "unity":"m"
      },
      "relationships":{}
    },
    {
      "id":"6",
      "type":"javelin-throws",
      "links":{
        "self":"http://localhost:3000/v1/javelin-throws/6"
      },
      "attributes":{  
      "name":"jav2",
      "type":"JavelinThrow",
      "status":"running",
      "max-scores":3,
      "unity":"m"
    },
      "relationships":{}
    }],
  "links":{
    "first":"http://localhost:3000/v1/competitions?page%5Bnumber%5D=1\u0026page%5Bsize%5D=10",
    "last":"http://localhost:3000/v1/competitions?page%5Bnumber%5D=1\u0026page%5Bsize%5D=10"
  }
}
Athlete

O recurso athlete tem comportamento similar a competition. O formato para criação de um novo athlete é:

{
  "data":{
    "type":"athletes",
    "attributes":{
      "name":"atl3",
      "sex":"f",
      "age":34
    }
  }
}
Score

O recurso score representa uma pontução de um atleta em uma competição.

Criação de novo score

para ser criado um score deve ser mandar um post para rota /v1/competitions/:competition_id/athletes/:athlete_id/scores com o body:

{
  "data":{
    "type":"scores",
    "attributes":{
      "value":19.0
    }
  }
}
Atualização de score

Update é feito da mesma forma que os recursos anteriores na mesma rota realizda no post e contendo o id

Limitações na criação e atualização de score

Só é possível cadastrar ou atualizar um score se o status da competição for running

Rank

É possível obter o rank de uma competição na rota /v1/competitions/{id}/rank Será listado o melhor score do atleta (no caso de múltiplis) ordenados do melhor para o pior. Será mostrado nos atributos também a competição e atleta

{
  "data":[
    {
      "id":"68",
      "type":"scores",
      "links":{
        "self":"http://localhost:3000/v1/scores/68"
      },
      "attributes":{
        "value":100,
        "unity":"m",
        "athlete-id":18,
        "athlete-name":"atl15",
        "competition-id":1,
        "competition-name":"jav2"
      }
    },
    {
      "id":"56",
      "type":"scores",
      "links":{
        "self":"http://localhost:3000/v1/scores/56"
      },
      "attributes":{
        "value":99,
        "unity":"m",
        "athlete-id":7,
        "athlete-name":"atl4",
        "competition-id":1,
        "competition-name":"jav2"
      }
    },
    {
      "id":"151",
      "type":"scores",
      "links":{
        "self":"http://localhost:3000/v1/scores/151"
      },
      "attributes":{
        "value":97,
        "unity":"m",
        "athlete-id":27,
        "athlete-name":"atl24",
        "competition-id":1,
        "competition-name":"jav2"
      }
    },
    {
      "id":"114",
      "type":"scores",
      "links":{
        "self":"http://localhost:3000/v1/scores/114"
      },
      "attributes":{
        "value":97,
        "unity":"m",
        "athlete-id":28,
        "athlete-name":"atl25",
        "competition-id":1,
        "competition-name":"jav2"
      } 
    },
    {
      "id":"91",
      "type":"scores",
      "links":{
        "self":"http://localhost:3000/v1/scores/91"
      },
      "attributes":{
        "value":97,
        "unity":"m",
        "athlete-id":25,
        "athlete-name":"atl22",
        "competition-id":1,
        "competition-name":"jav2"
      }
    },
    {
      "id":"35",
      "type":"scores",
      "links":{
        "self":"http://localhost:3000/v1/scores/35"
      },
      "attributes":{
        "value":96,
        "unity":"m",
        "athlete-id":23,
        "athlete-name":"atl20",
        "competition-id":1,
        "competition-name":"jav2"
      }
    },
    {
      "id":"127",
      "type":"scores",
      "links":{
        "self":"http://localhost:3000/v1/scores/127"
      },
      "attributes":{
        "value":96,
        "unity":"m",
        "athlete-id":30,
        "athlete-name":"atl27",
        "competition-id":1,
        "competition-name":"jav2"
      }
    },
    {
      "id":"53",
      "type":"scores",
      "links":{
        "self":"http://localhost:3000/v1/scores/53"
      },
      "attributes":{
        "value":96,
        "unity":"m",
        "athlete-id":15,
        "athlete-name":"atl12",
        "competition-id":1,
        "competition-name":"jav2"
      }
    },
    {
      "id":"113",
      "type":"scores",
      "links":{
        "self":"http://localhost:3000/v1/scores/113"
      },
      "attributes":{
        "value":93,
        "unity":"m",
        "athlete-id":26,
        "athlete-name":"atl23",
        "competition-id":1,
        "competition-name":"jav2"
      }
    },
    {
      "id":"8",
      "type":"scores",
      "links":{
        "self":"http://localhost:3000/v1/scores/8"
      },
      "attributes":{
        "value":90,
        "unity":"m",
        "athlete-id":5,
        "athlete-name":"atl2",
        "competition-id":1,
        "competition-name":"jav2"
      },
  "links":{
    "first":"http://localhost:3000/v1/competitions/1/rank?competition_id=1&page%5Bnumber%5D=1&page%5Bsize%5D=10",
    "next":"http://localhost:3000/v1/competitions/1/rank?competition_id=1&page%5Bnumber%5D=2&page%5Bsize%5D=10",
    "last":"http://localhost:3000/v1/competitions/1/rank?competition_id=1&page%5Bnumber%5D=3&page%5Bsize%5D=10"
  }
}
Paginação

Os links de paginação são retornados numa listagem com os seguintes campos (quando nao aplicavéis alguns serão omitidos)

   "links":{
    "first":"link para primeira pagina, sempre presente",
    "next":"link para proxima pagina, quando relevante",
    "prev":"link para pagina anterior, quando relevante",
    "last":"link para primeira pagina, sempre presente"
  }

O tamanho de itens por pagina pode ser alterado com o parametro page[size]. O parametro page[number] fornece a página corrente.

Filtro

É possível filtrar os resultados para os recursos athlete e competition por algum atributo com o parametro filter[attr] por exemplo com a rota

/competitions?filter[name]=name

O recurso competition pode ser filtrado pelos atributos:name, status, type.

O recurso athlete pode ser filtrado pelos atributos: name, age, sex