Descrição do Problema Temos um problema grande com reuniões, elas são muitas e temos poucas salas disponíveis. Precisamos de uma agenda para nos mantermos sincronizados e esse será seu desafio!
- Temos 4 salas e podemos usá-las somente em horário comercial,
- Segunda a sexta das 09:00 até as 18:00.
- Sua tarefa será de criar uma API REST que crie, edite, mostre e delete o agendamento dos horários para que os usuários não se percam ao agendar as salas.
Notas [x] O teste deve ser escrito utilizando Ruby e Ruby on Rails [x] Utilize as gems que achar necessário [x] Não faça squash dos seus commits, gostamos de acompanhar a evolução gradual da aplicação via commits. [x] Estamos avaliando coisas como design, higiene do código, confiabilidade e boas práticas [x] Esperamos testes automatizados. [x] A aplicação deverá subir com docker-compose [x] Crie um README.md descrevendo a sua solução e as issues caso houver [x] O desafio pode ser entregue abrindo um pull request ou fazendo um fork do repositório
##DESCRIÇÃO DO DESAFIO
Para criação das salas e o dos usuários basta rodar um seeds, criei apenas o básico para focar no principal problema que é a questão dos agendamentos. Pra isso usei a gem https://github.com/bokmann/business_time Com ela eu consigo configurar os horários, dias e até feriados fazendo assim que com apenas 1 método eu consiga validar se a data está dentro do range que precisamos, dentro do horário comercial e de segunda sexta como mostra o arquivo schedule-room/config/initializers/business_time.rb São basicamente 3 tabelas:
- Room que guarda as salas.
- User com os usuários.
- Schedule que guarda os agendamentos.
##SUBINDO O PROJETO
docker-compose up
docker-compose exec web bundle exec rails db:create
docker-compose exec web bundle exec rails db:migrate
docker-compose exec web bundle exec rails db:seed
docker-compose exec web bundle exec rake spec
##EXEMPLOS DE REQUISIÇÕES
- É possível fazer a busca por room_id ou user_id caso não seja passado nenhum parametro retorna todos os agendamentos
##GET INDEX request:
curl --location --request GET 'localhost:3000/api/v1/schedules?room_id=1'
response:
{
"status": "SUCCESS",
"message": "Schedule list.",
"data": [
{
"id": 2,
"room_id": 1,
"user_id": 1,
"scheduled_at": "2022-06-21T09:00:00.000Z",
"created_at": "2022-06-21T22:33:52.914Z",
"updated_at": "2022-06-21T22:33:52.914Z"
}
]
}
##POST CREATE request:
curl --location --request POST 'localhost:3000/api/v1/schedules' \
--header 'Content-Type: application/json' \
--data-raw '{
"room_id": 1,
"user_id": 1,
"scheduled_at": "2022-06-28, 10:00 am"
}'
response:
{
"status": "SUCCESS",
"message": "Schedule added.",
"data": {
"id": 1,
"room_id": 1,
"user_id": 1,
"scheduled_at": "2022-06-28T10:00:00.000Z",
"created_at": "2022-06-22T20:25:35.352Z",
"updated_at": "2022-06-22T20:25:35.352Z"
}
}
##GET SHOW
request:
curl --location --request GET 'localhost:3000/api/v1/schedules/1'
response:
{
"status": "SUCCESS",
"message": "Schedule founded.",
"data": {
"id": 1,
"room_id": 1,
"user_id": 1,
"scheduled_at": "2022-06-21T10:00:00.000Z",
"created_at": "2022-06-22T00:10:14.370Z",
"updated_at": "2022-06-22T00:31:55.593Z"
}
}
##PUT UPDATE
request:
curl --location --request PUT 'localhost:3000/api/v1/schedules/1' \
--header 'Content-Type: application/json' \
--data-raw '{
"scheduled_at": "2022-07-22, 10:00 am"
}'
response:
{
"status": "SUCCESS",
"message": "Schedule updated.",
"data": {
"scheduled_at": "2022-07-22T10:00:00",
"id": 1,
"room_id": 1,
"user_id": 1,
"created_at": "2022-06-22T00:10:14.370Z",
"updated_at": "2022-06-22T20:33:03.905Z"
}
}
##DELETE DESTROY
request:
curl --location --request DELETE 'localhost:3000/api/v1/schedules/1'
response:
{
"status": "SUCCESS",
"message": "Schedule deleted.",
"data": {
"id": 1,
"room_id": 1,
"user_id": 1,
"scheduled_at": "2022-07-22T10:00:00.000Z",
"created_at": "2022-06-22T00:10:14.370Z",
"updated_at": "2022-06-22T20:33:03.905Z"
}
}