Uma API RESTful para gerenciamento de cidades e usuários, permitindo operações de criação, listagem, atualização e exclusão (CRUD), desenvolvida com Node.js, Express e Knex.
- Node.js
- Express
- TypeScript
- Knex.js
- SQLite (testes)
- dotenv
- bcryptjs
- jsonwebtoken (JWT)
- zod
- http-status-codes
- ESLint + typescript-eslint
- Jest + Supertest + ts-jest
- ts-node-dev e tsx
npm run start→ Inicia a aplicação em modo produçãonpm run start:dev→ Inicia a aplicação em modo desenvolvimento com reload automáticonpm run test→Executa a suíte de testes com Jestnpm run knex:migrate→ Executa as migrações pendentesnpm run knex:rollback→ Desfaz todas as migraçõesnpm run knex:rollback-all→ Executa as migrações pendentesnpm run knex:seed→ Popula o banco de dados com dados iniciais
-
Clone este repositório:
git clone https://github.com/joaodev2005/myboards
-
Acesse o diretório do projeto:
cd myboards -
Instale as dependências:
npm install
-
Configure as Variáveis de Ambiente Crie um arquivo chamado
.envna raiz do projeto com as seguintes variáveis (preencha os valores conforme sua configuração):PORT=4000 NODE_ENV=dev JWT_SECRET=your_jwt_secret_key
-
Execute migrações do banco de dados:
npm run knex:migrate
-
Popule dados iniciais (opcional):
npm run knex:seed
-
Inicie o servidor:
npm run start:dev
-
Acesse a aplicação em
http://localhost:4000.
Este projeto utiliza SQLite como banco de dados, através do Knex.js.
- O arquivo do banco é criado automaticamente na pasta
/database(ou conforme definido no seuknexfile). - Não é necessário instalar nenhum servidor de banco de dados.
- O SQLite é leve e ideal para ambientes de desenvolvimento e testes.
usuarios→ tabela para gerenciamento de usuárioscidades→ tabela para gerenciamento de cidadespessoas→ tabela para gerenciamento de pessoas
| Campo | Tipo | Descrição |
|---|---|---|
| id | INT | Identificador único do usuário |
| nome | STRING | Nome do usuário |
| STRING | E-mail do usuário | |
| senha | STRING | Senha criptografada do usuário |
| Campo | Tipo | Descrição |
|---|---|---|
| id | INT | Identificador único da cidade |
| nome | STRING | Nome da cidade |
| Campo | Tipo | Descrição |
|---|---|---|
| id | INT | Identificador único da pessoa |
| nome | STRING | Primeiro nome da pessoa |
| sobrenome | STRING | Sobrenome da pessoa |
| STRING | E-mail da pessoa | |
| cidadeId | INT | Referência à tabela cidades |
| Método | Rota | Descrição | Validação | Autenticação | Exemplo de body |
|---|---|---|---|---|---|
| GET | /cidades | Lista cidades | query: page, limit, filter, id | Sim | — |
| POST | /cidades | Cria cidade | body: { nome } | Sim | { "nome": "São Paulo" } |
| GET | /cidades/:id | Detalha cidade | params: { id } | Sim | — |
| PUT | /cidades/:id | Atualiza cidade | params + body | Sim | { "nome": "Rio de Janeiro" } |
| DELETE | /cidades/:id | Remove cidade | params: { id } | Sim | — |
| Método | Rota | Descrição | Validação | Autenticação | Exemplo de body |
|---|---|---|---|---|---|
| GET | /pessoas | Lista pessoas | query: page, limit, filter | Sim | — |
| POST | /pessoas | Cria pessoa | body: { nome, sobrenome, email, cidadeId } | Sim | { "nome": "João", "sobrenome": "Silva", "email": "joao@email.com", "cidadeId": 1 } |
| GET | /pessoas/:id | Detalha pessoa | params: { id } | Sim | — |
| PUT | /pessoas/:id | Atualiza pessoa | params + body | Sim | { "nome": "João", "sobrenome": "Silva", "email": "joao2@email.com", "cidadeId": 2 } |
| DELETE | /pessoas/:id | Remove pessoa | params: { id } | Sim | — |
| Método | Rota | Descrição | Validação | Autenticação | Exemplo de body |
|---|---|---|---|---|---|
| POST | /cadastrar | Cria usuário | Não | — | { "nome": "João", "email": "joao@email.com", "senha": "123456" } |
| POST | /entrar | Login do usuário | Não | — | { "email": "joao@email.com", "senha": "123456" } |
Retorna a lista completa de cidades cadastradas.
Query Parameters (opcional):
page(inteiro, default 1) – página da listagemlimit(inteiro, default 7) – quantidade de registros por páginafilter(string) – filtra pelo nome da cidadeid(inteiro) – retorna cidade específica
Resposta (exemplo):
[
{ "id": 1, "nome": "São Paulo" },
{ "id": 2, "nome": "Rio de Janeiro" }
]Cria uma nova cidade.
{ "nome": "Belo Horizonte" }Resposta (exemplo):
{ "id": 3, "nome": "Belo Horizonte" }Retorna os detalhes de uma cidade pelo ID.
Parâmetros:
- id (inteiro): ID da cidade.
{ "id": 1, "nome": "São Paulo" }Atualiza uma cidade pelo ID.
Parâmetros:
- id (inteiro): ID da cidade.
{ "nome": "São Paulo Atualizada" }Status 204 No Content
Deleta uma cidade pelo ID.
Parâmetros:
- id (inteiro): ID da cidade.
Retorna a lista completa de pessoas cadastradas.
Query Parameters
page(inteiro, default 1) - página da listagemlimit(inteiro, default 7) - quantidade de registros por páginafilter(string) - filtra pelo nome ou sobrenome
[
{ "id": 1, "nome": "João", "sobrenome": "Silva", "email": "joao@email.com", "cidadeId": 1 },
{ "id": 2, "nome": "Maria", "sobrenome": "Souza", "email": "maria@email.com", "cidadeId": 2 }
]Cria uma nova pessoa.
{
"nome": "Carlos",
"sobrenome": "Pereira",
"email": "carlos@email.com",
"cidadeId": 1
}Resposta (exemplo)
{
"id": 3,
"nome": "Carlos",
"sobrenome": "Pereira",
"email": "carlos@email.com",
"cidadeId": 1
}Retorna os detalhes de uma pessoa pelo ID.
Parâmetros:
- id (inteiro): ID da pessoa.
{ "id": 1, "nome": "João", "sobrenome": "Silva", "email": "joao@email.com", "cidadeId": 1 }Atualiza uma pessoa pelo ID.
Parâmetros:
- id (inteiro): ID da pessoa.
{
"nome": "João Atualizado",
"sobrenome": "Silva",
"email": "joaoatualizado@email.com",
"cidadeId": 2
}Deleta uma pessoa pelo ID.
Parâmetros:
- id (inteiro): ID da pessoa.
Cria um novo usuário.
Corpo da requisição:
{ "nome": "João", "email": "joao@email.com", "senha": "123456" }Resposta (exemplo)
{ "id": 1, "nome": "João", "email": "joao@email.com" }Realiza login do usuário.
Corpo da requisição:
{ "email": "joao@email.com", "senha": "123456" }Resposta (exemplo)
{ "accessToken": "jwt.token.aqui" }- Desenvolvedor: João Barbosa
- E-mail: joaovictor.dev2005@gmail.com