Uma aplicação back-end desenvolvida com ASP.NET e linguagem C#. Se trata de uma administração de reservas de quartos. Um CRUD que envolve os principais aspectos de uma
administração hotoleira.
A aplicação possui JWT(Jason Web Token) para verificar as questões de autorização. SQL Server Dockerizado e foi desenvolvida com o Entity Framework.
Os diretórios foram divididos em:
Controller: Onde está a lógica da aplicação.
Models: Representação do banco de Dados.
Repository: Lógicas de interação como banco de dados.
DTO: Entradas/Saídas das lógicas.
-
Clone este repositório.
git clone git@github.com:GustavoTorres94/hotel-management.git - Entre no diretório criado.
-
Entre no diretório src/Trybehotel e execute o comando para instalar as dependências do projeto.
dotnet restore -
Na Raiz do projeto utilize o seguinte scrypt para "subir" os containers do Docker.
docker compose up -d --build -
configure a string de conexção para acessar o banco de dados, caso não esteja configurada:
var connectionString = "Server=localhost;Database=TrybeHotel;User=SA;Password=TrybeHotel12!;TrustServerCertificate=True"; -
Utilize a CLI para executar as migrations do Entity FrameWork
dotnet ef database update -
Execute o CLI para rodar a aplicação.Utlize um software de auxílio (insomnia ou semelhante) ou uma extensão do vscode (thunderclient ou semelhante) para realizar as requisições para os endpoints. Com o projeto clonado podes fazer requisições para a rota
dotnet run
Endpoints:
/booking - { post }
/booking/:bookingId - { get }
/city - { get, post, put }
/geo/status - { get }
/geo/address - { get }
/hotel - { get, post }
/login - { post }
/room - { post }
/room/:id { get, delete }
/user { get, post }
Este endpoint contém serviços para lidar com operações relacionadas a reserva, A autenticação é feita utilizando JWT (JSON Web Tokens). Os usuários precisam estar autenticados para acessar os endpoints de reservas e devem possuir a política "Client".
Funcionalidades Principais
- POST|GET /booking
- Adiciona uma nova reserva.
- Autorização: Necessário token JWT com política "Client".
-
POST - Corpo da requisição:
{ "RoomId": 1, "GuestQuant": 2, "CheckIn": "2023-06-01", "CheckOut": "2023-06-05" } -
Possíveis respostas:
- 201 Created: Reserva criada com sucesso. POST
- 400 Bad Request: Erro de validação ou sala não encontrada. POST
- 200 OK: Detalhes da reserva retornados com sucesso. GET
- 400 Bad Request: Erro ao buscar a reserva. GET
Este endpoint contém as responsabilidades de tratar com as questões que envolvem as cidades, Como encontrar todas as cidades cadastradas e adicionar uma nova cidade.
- GET /city
- Retorna a lista de todas as cidades.
- Resposta:
- 200 OK: Lista de cidades.
-
Exemplo de resposta:
[ { "CityId": 1, "Name": "São Paulo", "State": "SP" }, { "CityId": 2, "Name": "Rio de Janeiro", "State": "RJ" } ] - POST /city
- Adiciona uma nova cidade.
-
Corpo da requisição:
{ "Name": "Belo Horizonte", "State": "MG" } - Possíveis respostas:
- 201 Created: Cidade criada com sucesso.
-
Exemplo de resposta:
{ "CityId": 3, "Name": "Belo Horizonte", "State": "MG" } - PUT /city
- Atualiza uma cidade existente.
-
Corpo da requisição:
{ "CityId": 3, "Name": "BH", "State": "MG" } - Possíveis respostas:
- 200 OK: Cidade atualizada com sucesso.
- 400 Bad Request: Cidade não encontrada.
-
Exemplo de resposta:
{ "CityId": 3, "Name": "BH", "State": "MG" }
Este endpoint é responsável por lidar das questões de localização do usuário. Ele faz utilização de uma API externa que trás as localizações.
- GET /geo/status
-
Ela verifica se o usuário correspondente ao ID decodificado do token existe no banco de dados e retorna o papel associado a esse usuário.
- Retorna o status do serviço de geolocalização (Nominatim).
- Resposta:
- 200 OK: Status do serviço.
-
Exemplo de resposta:
{ "status": "OK", "message": "Service is running" } - GET /geo/address
- Retorna a lista de hotéis baseados na localização fornecida.
-
Corpo da requisição:
{ "Address": "Rua Exemplo", "City": "Cidade Exemplo", "State": "Estado Exemplo" } - Possíveis respostas:
- 200 OK: Lista de hotéis próximos à localização fornecida.
- 400 Bad Request: Erro ao buscar a localização ou hotéis.
-
Exemplo de resposta:
[ { "HotelId": 1, "Name": "Hotel Exemplo", "Address": "Rua Exemplo", "CityName": "Cidade Exemplo", "State": "Estado Exemplo", "Distance": 5 }, { "HotelId": 2, "Name": "Hotel Exemplo 2", "Address": "Rua Exemplo 2", "CityName": "Cidade Exemplo", "State": "Estado Exemplo", "Distance": 10 } ]
Este endpoint é responsável pelas requisições relacionadas aos hotéis. A autenticação é feita através do JWT, algumas das funcionalidades utilizam a política de "Admin".
- GET /hotel
- Retorna a lista de todos os hotéis.
- Resposta:
- 200 OK: Lista de hotéis.
- 500 Internal Server Error: Erro interno do servidor.
-
Exemplo de resposta:
[ { "HotelId": 1, "Name": "Hotel Exemplo", "Address": "Rua Exemplo, 123", "CityId": 1, "CityName": "Cidade Exemplo", "State": "Estado Exemplo" }, { "HotelId": 2, "Name": "Hotel Exemplo 2", "Address": "Rua Exemplo, 456", "CityId": 2, "CityName": "Outra Cidade", "State": "Outro Estado" } ] - POST /hotel
- Adiciona um novo hotel. Requer autenticação JWT e permissão de administrador.
-
Corpo da requisição:
{ "Name": "Hotel Novo", "Address": "Rua Nova, 789", "CityId": 3 } - Resposta:
- 201 Created: Hotel criado com sucesso.
- 500 Internal Server Error: Erro interno do servidor.
-
Exemplo de resposta:
{ "HotelId": 3, "Name": "Hotel Novo", "Address": "Rua Nova, 789", "CityId": 3, "CityName": "Nova Cidade", "State": "Novo Estado" }
Este endpoint contém um serviço para lidar com Login de usuários e pequenas verificações de dados.
Funcionalidades Principais
- POST /login
- Autentica um usuário e retorna um token JWT.
-
Corpo da requisição:
{ "Email": "usuario@exemplo.com", "Password": "senha" } - Resposta:
-
200 OK: Token JWT gerado com sucesso.
{ "token": "jwt_token" } -
401 Unauthorized: E-mail ou senha incorretos.
{ "message": "Incorrect e-mail or password" }
Este endpoint contém um serviço para lidar com operações relacionadas aos quartos de um hotel. Ela utiliza a verficação JWT com a política de "Admin", somente com essa verificação algumas alterações são permitidas.
- GET /room/{HotelId}
- Retorna a lista de quartos de um hotel específico.
- Parâmetros:
- HotelId: ID do hotel.
- Resposta:
-
200 OK: Lista de quartos do hotel.
[ { "RoomId": 1, "Name": "Quarto Luxo", "Capacity": 2, "Image": "url_da_imagem", "Hotel": { "HotelId": 1, "Name": "Hotel Exemplo", "Address": "Rua Exemplo, 123", "CityId": 1, "CityName": "Cidade Exemplo", "State": "Estado Exemplo" } } ] - POST /room
- Adiciona um novo quarto.
- Autorização: Necessário token JWT e permissões de Admin.
-
Corpo da requisição:
{ "Name": "Quarto Luxo", "Capacity": 2, "Image": "url_da_imagem", "HotelId": 1 } - Resposta:
-
201 Created: Quarto adicionado com sucesso.
{ "RoomId": 1, "Name": "Quarto Luxo", "Capacity": 2, "Image": "url_da_imagem", "Hotel": { "HotelId": 1, "Name": "Hotel Exemplo", "Address": "Rua Exemplo, 123", "CityId": 1, "CityName": "Cidade Exemplo", "State": "Estado Exemplo" } } - 400 Bad Request: Objeto de quarto inválido.
- 500 Internal Server Error: Erro interno do servidor.
O endpoint de user oferece funcionalidades para lidar com informações sobre usuários, desde cadastro até pesquisa por algum ou todos. A rota é verificada por autorizações JWT, pelo política de "Admin".
- GET /user
- Retorna a lista de usuários.
- Autorização: Necessário token JWT e permissões de Admin.
- Resposta:
-
200 OK: Lista de usuários.
[ { "UserId": 1, "Name": "John Doe", "Email": "john.doe@example.com", "UserType": "admin" } ] - POST /user
- Adiciona um novo usuário.
-
Corpo da requisição:
{ "Name": "John Doe", "Email": "john.doe@example.com", "Password": "password" } - Resposta:
-
201 Created: Usuário adicionado com sucesso.
{ "UserId": 1, "Name": "John Doe", "Email": "john.doe@example.com", "UserType": "client" } -
409 Conflict: Email do usuário já existe.
{ "message": "User email already exists" }
Neste projeto utilizei as seguintes ferramentas: