RESTFul API

História

Os desenvolvedores de front-end da plataforma IoT proposta (Web, iOS e Android) precisam acessar uma RESTful API que suporte as operações que o usuário é capaz de desempenhar nos aplicativos. 

É esperado que através dos apps o usuário possa visualizar sensores e streams ativos, registrar novos sensores e vincular/registrar novas streams aos mesmos. Para as streams, é possível consultar o fluxo de dados que vai sendo publicado pelos sensores reais ao longo do tempo.

É esperado que a RESTful API permita interagir com duas entidades principais sensor stream através de mensagens em JSON. Foi definido um conjunto de requisitos mínimos que a API deve atender bem como determinados os formatos das mensagens de cada requisição, como listadas no fim do documento.

Objetivo

Implementar um serviço de backend (com um modelo e persistência de dados) que provê uma RESTFul API para os desenvolvedores de front-end atendendo as necessidades em anexo.

Implementação do Serviço

À implementação do serviço não impõe restrições tecnológicas, nem sobre banco de dados nem sobre linguagem/framework para desenvolvimento, algumas sugestões são:

Ferramentas

Entregável

O candidato deve apresentar o serviço implementado e demonstrar o funcionamento dos endpoints sugeridos em anexo, bem como apresentar a maneira como a base foi modelada.

Definição da API


[GET] Consultar unidades de grandeza (unit)

<= response

[
  {
    "oid": 1,
    "label": "ºC"
  }
 {
   "oid": 2,
   "label": "mg/m³"
 },
 {
   "oid": 3,
   "label": "hPA"
 },
 {
   "oid": 4,
   "label": "lux"
 },
 {
   "oid": 5,
   "label": "%"
 }
]

[GET] Consultar Sensores (sensor) de um Usuário (user)

<= response

[
  {
    "oid": 1,
    "key": "10dd35008a0f4d838c3dc22856660928",
    "label": "sensor 001",
    "description": "Isaac's Room control",
    "streams": [
      {
        "oid": 1,
        "key": "b4ea3ba494644200b679ac593f55cb87",
        "label": "temperature",
        "unit": 1,
        "sensor": 1,
        "totalSize": 84
      },
      {
        "oid": 3,
        "key": "ae194d2b61e0496fbf601f9edcf8b0c5",
        "name": "humidity",
        "unit": 5,
        "sensor": 1,
        "totalSize": 6
      },
      {
        "oid": 4,
        "key": "3170f851fd9045ed99e5d86ababdb80e",
        "label": "carbon dioxide",
        "unit": 2,
        "sensor": 1,
        "totalSize": 7
      }
    ]
  },
  {
    "oid": 2,
    "key": "27b26e48cd674cc38ec45808cf48fa07",
    "label": "Kitchen's freezer sensor (Arduino)",
    "description": "Kitchen's freezer sensor (Arduino)",
    "streams": [
      {
        "oid": 2,
        "key": "8961bd9a4d1e439ebf3b86af5b9d5c1f",
        "label": "temperature",
        "unit": 1,
        "sensor": 2,
        "totalSize": 19
      }
    ]
  }
]

[GET] Consulta de um Sensor (sensor) específico. Ex: key: 27b26e48cd674cc38ec45808cf48fa07

<= response

{
    "oid": 2,
    "key": "27b26e48cd674cc38ec45808cf48fa07",
    "label": "Kitchen's freezer sensor (Arduino)",
    "description": "Kitchen's freezer sensor (Arduino)",
    "streams": [
      {
        "oid": 2,
        "key": "8961bd9a4d1e439ebf3b86af5b9d5c1f",
        "label": "temperature",
        "unit": 1,
        "sensor": 2,
        "totalSize": 19,
        "data": [
          {
            "timestamp": 1506455591,
            "data": -6.56
          },
          {
            "timestamp": 1506455566,
            "data": -6.54
          },
          {
            "timestamp": 1506455551,
            "data": -6.56
          },
          {
            "timestamp": 1506455530,
            "data": -6.55
          },
          {
            "timestamp": 1506455510,
            "data": -6.56
          },
        ]
      }
    ]
  }

obs: a consulta individual de um sensor retorna adicionalmente os 5 dados mais recentes de cada stream que o mesmo possui.


[GET] Consulta de dados de um Stream (stream) específico. Ex: key: 8961bd9a4d1e439ebf3b86af5b9d5c1f

<= response

{
  "oid": 2,
  "key": "8961bd9a4d1e439ebf3b86af5b9d5c1f",
  "label": "temperature",
  "unit": 1,
  "sensor": 2,
  "totalSize": 19,
  "data": [
    {
      "timestamp": 1506455591,
      "data": -6.56
    },
    {
      "timestamp": 1506455566,
      "data": -6.54
    },
    {
      "timestamp": 1506455551,
      "data": -6.56
    },
    {
      "timestamp": 1506455530,
      "data": -6.55
    },
    {
      "timestamp": 1506455510,
      "data": -6.56
    },
    ...
  ]
}

[POST] Registrar Sensor (sensor)

request =>

{
  "label": "Kitchen's freezer sensor (Arduino)",
  "description": "Kitchen's freezer sensor (Arduino)",
}

<= response

{
  "oid": 2,
  "key": "8961bd9a4d1e439ebf3b86af5b9d5c1f",
  "label": "Kitchen's freezer sensor (Arduino)",
  "description": "Kitchen's freezer sensor (Arduino)",
}

obs: oid (identificador interno) e key (chave de identificação) são atribuídos no momento do registro do sensor pelo serviço.


[POST] Registrar Stream (stream) para Sensor (sensor). Ex: key: 27b26e48cd674cc38ec45808cf48fa07

 request =>

{
  "label": "temperature",
  "unit": 1
}

<= response

{
  "oid": 2,
  "key": "8961bd9a4d1e439ebf3b86af5b9d5c1f",
  "label": "temperature",
  "unit": 1,
  "sensor": 2,
  "totalSize": 0
}

obs: oid (identificador interno) e key (chave de identificação) são atribuídos no momento do registro da stream pelo serviço.

 


[POST] Publicar dado em um Stream (stream). Ex: key: 8961bd9a4d1e439ebf3b86af5b9d5c1f

 request =>

{
  "timestamp": 1506521102,
  "value": 28.5
}

<= response

{
  "oid": 123,
  "timestamp": 1506521102,
  "value": 28.5
}

obs: oid (identificador interno) e key (chave de identificação) são atribuídos no momento do registro da stream pelo serviço.