{"id":20322412,"url":"https://github.com/carolinasfreitas/trucksystem-api","last_synced_at":"2026-04-08T16:02:48.854Z","repository":{"id":210597908,"uuid":"723185878","full_name":"CarolinaSFreitas/TruckSystem-API","owner":"CarolinaSFreitas","description":"Trabalho #3 de Desenvolvimento de APIs | Recursos de Segurança | Cadastro de Usuário | Login | Criptografia e Token | CRUD | Pesquisa","archived":false,"fork":false,"pushed_at":"2024-12-18T17:42:48.000Z","size":20761,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-12T16:06:56.033Z","etag":null,"topics":["bcrypt","cors","dotenv","express","javascript","jsonwebtoken","md5","mysql","node","nodemailer","nodemon","sequelize"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CarolinaSFreitas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-11-24T22:05:29.000Z","updated_at":"2024-12-18T17:42:45.000Z","dependencies_parsed_at":"2025-01-14T13:47:29.567Z","dependency_job_id":"9481298e-8b37-4d81-b5f8-6a0ed6a74fb7","html_url":"https://github.com/CarolinaSFreitas/TruckSystem-API","commit_stats":null,"previous_names":["carolinasfreitas/trucksystem-api"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/CarolinaSFreitas/TruckSystem-API","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarolinaSFreitas%2FTruckSystem-API","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarolinaSFreitas%2FTruckSystem-API/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarolinaSFreitas%2FTruckSystem-API/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarolinaSFreitas%2FTruckSystem-API/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CarolinaSFreitas","download_url":"https://codeload.github.com/CarolinaSFreitas/TruckSystem-API/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CarolinaSFreitas%2FTruckSystem-API/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31562697,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bcrypt","cors","dotenv","express","javascript","jsonwebtoken","md5","mysql","node","nodemailer","nodemon","sequelize"],"created_at":"2024-11-14T19:21:40.946Z","updated_at":"2026-04-08T16:02:48.837Z","avatar_url":"https://github.com/CarolinaSFreitas.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# API - TruckSystem - Trabalho #3\n\nTrabalho #3 de Desenvolvimento de APIs - Entrega: 08/12/23\n\n### Instalações e p/ rodar:\n\n1. `` npm init -y `` \n2. ``npm i express sequelize mysql2 cors `` \n3. ``npm i bcrypt ``  \n4. `` npm i jsonwebtoken `` \n5. `` npm i dotenv `` \n6. `` npm i nodemailer `` \n7. ``npm i md5 ``\n8. `` npm i --save-dev nodemon ``\n9.   ``npx nodemon app `` \n\n### Docs e links úteis:\n- https://sequelize.org/docs/v6/core-concepts/paranoid/\n- https://nodemailer.com/about/\n- https://mailtrap.io/pt/\n\n### Acesso Localhost: \n- ``http://localhost:3000/``\n\n## Logs nas rotas que tem o middleware:\n\nNa rota de deletar um caminhão registrado no sistema, ele verifica quem está fazendo (através do \"Bearer TOKEN_JWT\") e traz esse registro para a tabela \"Logs\" do banco de dados:\n\n- A exclusão sendo feita com sucesso:\n![image](https://github.com/CarolinaSFreitas/TruckSystem-API/assets/99994934/88268605-364c-48a6-8dec-aad628fc9920)\n\n- O registro nos Logs:\n![image](https://github.com/CarolinaSFreitas/TruckSystem-API/assets/99994934/679b4db3-e56b-4c8a-9f17-3d1ad2dd74b2)\n\n# Recursos Escolhidos:\n**4. Impedir o cadastro de 2 usuários com o mesmo e-mail. Exibir mensagem indicativa deste erro.**\n   \n````\n// função de create - vai criar um novo registro no insomnia\nexport async function usuarioCreate(req, res) {\n    const { nomeMotorista, email, senha, telefone, rgOuCpf, registroCNH, nascimento } = req.body\n\n    if (!nomeMotorista || !email || !senha || !telefone || !rgOuCpf || !registroCNH || !nascimento) {\n        res.status(400).json(\"Erro... Informe nome, email e senha.\")\n        return\n    }\n\n    const mensagem = validaSenha(senha)\n    if (mensagem.length \u003e 0) {\n        res.status(400).json({ erro: mensagem.join(', ') })\n        return\n    }\n\n    try {\n        //verifica se ja tem email cadastrado no sistema\n        const usuarioExistente = await Usuario.findOne({ where: { email } });\n\n        if (usuarioExistente) {\n            res.status(400).json({ erro: \"E-mail já está em uso. Escolha outro e-mail.\" });\n            return;\n        }\n        const usuario = await Usuario.create({\n            nomeMotorista, email, senha, telefone, rgOuCpf, registroCNH, nascimento\n        })\n        res.status(201).json(usuario)\n    } catch (error) {\n        res.status(400).send(error)\n    }\n}\n````\nSaída no Insomnia: \n![image](https://github.com/CarolinaSFreitas/TruckSystem-API/assets/99994934/95fb283a-81d1-4ebc-acdb-e649deaf0c76)\n\n**5. Registrar data/hora do último login do usuário. Exibir essa data/hora no login (“Bem-vindo ... Seu último \nacesso ao sistema foi ...”)**\n\n````\n\nexport async function loginUsuario(req, res) {\n    const { email, senha } = req.body;\n    const mensaErroPadrao = \"Erro... Login ou Senha Inválidos\";\n\n    if (!email || !senha) {\n        res.status(400).json({ erro: mensaErroPadrao });\n        return;\n    }\n\n    try {\n        const usuario = await Usuario.findOne({ where: { email } });\n\n        await log.create({\n            descricao: `Tentativa de Login Inválida`,\n            complemento: `Nome: ${usuario ? usuario.nomeMotorista : 'Usuário Desconhecido'}, E-mail: ${email}`\n        });\n\n        if (!usuario || !bcrypt.compareSync(senha, usuario.senha)) {\n            res.status(400).json({ erro: mensaErroPadrao });\n            return;\n        }\n\n        await Usuario.update({ ultimo_login: new Date() }, { where: { id: usuario.id } });\n\n        const token = jwt.sign({\n            usuario_logado_id: usuario.id,\n            usuario_logado_nome: usuario.nomeMotorista\n        }, process.env.JWT_KEY, { expiresIn: \"1h\" });\n\n        await log.create({\n            descricao: `Tentativa de Login Bem-sucedida`,\n            complemento: `Nome: ${usuario.nomeMotorista}, E-mail: ${email}`\n        });\n\n        res.status(200).json({\n            msg: `Bem-vindo ${usuario.nomeMotorista}! Seu último acesso ao sistema foi em ${new Date().toLocaleString()}.`,\n            token\n        });\n\n    } catch (error) {\n        res.status(400).json({ erro: 'Erro interno no servidor...' });\n    }\n}\n````\n\n![image](https://github.com/CarolinaSFreitas/TruckSystem-API/assets/99994934/f5199705-217f-4119-b00b-bc68a9dacb14)\n\n**3. Implementar um controle de tentativas de acesso inválidas para o usuário. Desta forma, ao atingir, por \nexemplo, 3 tentativas inválidas bloqueia o usuário (não permite novos acessos até ser retirado o \nbloqueio).**\n\nNesse recurso, o usuário tem seus acessos bloqueados após 3 tentativas de login inválidas e isso é registrado no banco de dados:\n![image](https://github.com/CarolinaSFreitas/TruckSystem-API/assets/99994934/33b74294-12c7-4106-a3f0-cae8512c08c7)\n\n![image](https://github.com/CarolinaSFreitas/TruckSystem-API/assets/99994934/85930c09-964c-454c-bd37-0944afd44fc1)\n\nComo sugerido na mensagem de erro, o usuário deve solicitar o desbloqueio de conta e após isso trocar a senha e, assim, executar o login novamente. Então:\n- O desbloqueio de usuário é feito na rota `` http://localhost:3000/usuario/desbloquear/:id ``\n  ![image](https://github.com/CarolinaSFreitas/TruckSystem-API/assets/99994934/5854fa5b-6757-4d6a-91ec-06a92f8f7294)\n- Após isso ele deve trocar de senha e tentar logar novamente com a nova senha (além de que o valor de tentativas de login no banco é alterado para 0):\n  ![image](https://github.com/CarolinaSFreitas/TruckSystem-API/assets/99994934/c18aff2d-661a-4226-a943-8e04c1231a7e)\n\n  ![image](https://github.com/CarolinaSFreitas/TruckSystem-API/assets/99994934/23dbf324-64ab-49e3-ac99-7f0e1fbb6e8a)\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarolinasfreitas%2Ftrucksystem-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcarolinasfreitas%2Ftrucksystem-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcarolinasfreitas%2Ftrucksystem-api/lists"}