O dono da imobiliária Kimóveis contratou sua empresa para desenvolver uma aplicação para o gerenciamento de seus serviços.
Através da aplicação deverá ser possível realizar o cadastro de imóveis e de usuários interessados na aquisição de propriedades. Além disso, deverá ser possível realizar o agendamento e consultar horários de visitas às propriedades disponíveis no banco de dados da imobiliária.
A sua empresa está te confiando esse desafio, portanto, dê o seu melhor no desenvolvimento desse projeto, seguindo todas as regras impostas pela empresa contratante.
A entrega deve seguir as seguintes regras:
- O código deve estar em TypeScript, caso não esteja a entrega será zerada;
- Deve ser feita a serialização dos dados utilizando a biblioteca zod;
- Deverá ser utilizado um banco de dados postgres para a elaboração da API;
- Deverá utilizar TypeORM no lugar de PG e PG-Format;
- O nome da tabela/entidade, colunas e demais especificações, devem ser seguidas à risca. Caso tenha divergência, os testes não funcionarão e será descontado nota;
- Tenha muita atenção sobre o nome das chaves nos objetos de entrada e saída de cada requisição;
Essa entrega possui testes automatizados, portanto:
- A alteração nos testes implica em ter a nota da entrega zerada.
- Os arquivos de testes e configuração para execução deles já se encontram no repositório da entrega, sendo necessário configurar a conexão com o banco de dados para teste e desenvolvimento, e todo o restante para que a aplicação funcione.
- Não altere nenhum arquivo, apenas acrescente os arquivos que forem necessários.
Para um melhor andamento da sua entrega, não deixe os testes para o fim, mas sim comece com eles.
- Como essa entrega contém testes, sempre que criar uma nova rota execute o comando de execução dos testes
npm run test
ouyarn test
a depender do gerenciador de pacotes usado. - Execute apenas a rota específica, com o comando
npm run test <pastaDentroDoIntegration>/<nomeDoArquivo>
como, por exemplo, rodando apenas a rota de criação de usuários:npm run test users/createUser.route.spec.ts
- A execução dos testes a cada criação de rota ajuda no debug e no andamento do projeto, e evita erros surpresas quando o projeto estiver 100% concluído.
Evite problemas com os testes:
- Indicamos que inicie o projeto criando todas as entidades corretamente, pois os testes só funcionaram caso as entidades estejam criadas e exportadas com seus devidos nomes e valores de forma correta.
- Devido a isso indicamos que antes de começar as rotas, rode qualquer teste para validar se a criação das suas entidades estão seguindo a risca o que foi pedido. Tanto a tipagem quantos os contraints pedidos em cada coluna são levados em consideração para os testes.
Crie suas tabelas seguindo essas nomenclaturas para banco e entidade:
- Tabela users: precisa estar com o nome da sua entidade: User
- Tabela addresses: precisa estar com o nome da sua entidade: Address
- Tabela categories: precisa estar com o nome da sua entidade: Category
- Tabela real_estate: precisa estar com o nome da sua entidade: RealEstate
- Tabela schedules: precisa estar com o nome da sua entidade: Schedule
Todas as entidades devem estar exportadas em seus respectivos arquivos, e na pasta entities deve ter um arquivo index.ts, importando e exportando todas as entidades em forma de módulo.
Método | Endpoint | Responsabilidade | Autenticação |
---|---|---|---|
POST | /users | Criação de usuário | Qualquer usuário, não necessita token |
GET | /users | Lista todos os usuários | Apenas Admnistradores |
PATCH | /users/:id | Atualiza um usuário | Apenas Admnistradores ou dono da conta |
DELETE | /users/:id | Realiza um soft delete no usuário | Apenas Admnistradores |
POST | /login | Gera o token de autenticação | Qualquer usuário, não necessita token |
POST | /categories | Criação de categoria | Apenas Admnistradores |
GET | /categories | Lista todas as categorias | Qualquer usuário, não necessita token |
GET | /categories/:id/realEstate | Lista todos imóveis que pertencem a uma categoria | Qualquer usuário, não necessita token |
POST | /realEstate | Criação de um imóvel | Apenas Admnistradores |
GET | /realEstate | Lista todos os imóveis | Qualquer usuário, não necessita token |
POST | /schedules | Agenda uma visita a um imóvel | Qualquer usuário, obrigatório token |
GET | /schedules/realEstate/:id | lista todos os agendamentos de um imóvel | Apenas Admnistradores |
- Rota para criação de usuário com os seguintes dados:
- id: Valor SERIAL. Não deve ser passado, mas gerado pelo typeORM;
- name: string, máximo de 45 caracteres e obrigatório;
- email: string, máximo de 45 caracteres, obrigatório e único;
- password: Deverá receber uma string, mas armazenar uma hash gerada com o bcryptjs diretamente pela entidade do typeORM e máximo de 120 caracteres;
- admin: boolean e false por padrão;
- createdAt: Não deve ser passado, mas gerado pelo typeORM;
- updatedAt: Não deve ser passado, mas gerado pelo typeORM;
- deletedAt: Não deve ser passado, mas gerado pelo typeORM.
- A rota de criação deve retornar todos os dados, com exceção da hash de senha;
- Não podem ser cadastrados dois usuários com o mesmo e-mail;
- A rota não precisa de autenticação para ser acessada.
- A rota deve retornar todos os dados dos usuários, com exceção da hash de senha;
- A rota pode ser acessada apenas por usuários administradores.
- A rota deve atualizar os dados do usuário;
- Não deve ser possível atualizar os campos id e admin;
- Apenas administradores podem atualizar qualquer usuário, usuários não-administradores podem apenas atualizar seu próprio usuário.
- A rota deve realizar um soft delete do usuário;
- A rota pode ser acessada apenas por administradores;
- Não deve ser possível realizar um soft delete em um usuário já deletado.
- Rota de login recebendo email e password;
- O login deve validar se o usuário existe e validar se a senha está correta;
- Não deve ser possível realizar o login de um usuário marcado como deletado;
- A rota não precisa de autenticação para ser acessada.
- Rota para criação de categorias com os seguintes dados:
- id: Valor SERIAL. Não deve ser passado, mas gerado pelo typeORM.
- name: string, máximo de 45 caracteres, obrigatório e único
- Não podem ser cadastradas duas categorias com o mesmo nome.
- A rota pode ser acessada apenas por usuários administradores.
- Rota deve listar todas as categorias.
- A rota não precisa de autenticação para ser acessada
- Rota deve listar todos os imóveis que pertencem a uma categoria.
- A rota não precisa de autenticação para ser acessada.
- Rota para criação de um imóvel com os seguintes dados:
- id: Valor SERIAL. Não deve ser passado, mas gerado pelo typeORM.
- value: decimal, obrigatório e 0 por padrão
- Quando trabalhamos com decimal, ela pode ser um number ou string, leve isso em consideração na hora de tipar e validar.
- size: inteiro e obrigatório
- address: um objeto com os seguintes dados:
- street: string, máximo de 45 caracteres e obrigatório
- zipCode: string, máximo de 8 caracteres e obrigatório
- number: string, máximo de 7 caracteres e opcional
- city: string, máximo de 20 caracteres e obrigatório
- state: string, máximo de 2 caracteres e obrigatório
- categoryId: inteiro
- sold: Não deve ser passado, mas gerado no momento da validação dos dados no formato boolean com default = false.
- createdAt: Não deve ser passado, mas gerado pelo typeORM.
- updatedAt: Não deve ser passado, mas gerado pelo typeORM.
- Não podem ser cadastrados dois imóveis com o mesmo endereço.
- A rota pode ser acessada apenas por administradores.
Rota deve listar todos os imóveis. A rota não precisa de autenticação para ser acessada.
- Rota responsável pelo agendamento de uma visita a um imóvel com os seguintes dados:
- id: Valor SERIAL. Não deve ser passado, mas gerado pelo typeORM.
- date: string da data de agendamento da visita ao imóvel, no formato americano AAAA-DD-MM
- hour: string do horário de agendamento da visita ao imóvel, no formato HH:MM
- realEstateId: inteiro
- userId: Não deve ser passado no body da requisição e sim pego através do token do usuário.
- Não deve ser possível agendar uma visita a um imóvel com a mesma data e hora, essa verificação deve ser implementada com query builder.
- Não deve ser possível o mesmo usuário agendar uma visita a 2 imóveis diferentes com a mesma data e hora, essa verificação deve ser implementada com query builder.
- Só deve ser possível agendar uma visita durante horário comercial (08:00 as 18:00).
- Só deve ser possível agendar uma visita durante dias úteis (segunda à sexta).
- A rota pode ser acessada tanto por usuários comuns quanto administradores.
- Rota deve listar todos os agendamentos de um imóvel.
- A rota pode ser acessada apenas por administradores.