Skip to content

Commit 050d146

Browse files
committed
Enviando código para nova branch splash-tools-new
1 parent ba504a6 commit 050d146

File tree

13 files changed

+6521
-1087
lines changed

13 files changed

+6521
-1087
lines changed

localsite/customerService.js

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
const express = require('express');
2+
const router = express.Router();
3+
const Datastore = require('nedb');
4+
const path = require('path');
5+
6+
const db = new Datastore({ filename: path.join(__dirname, 'users.db'), autoload: true });
7+
8+
db.ensureIndex({ fieldName: 'email', unique: true });
9+
db.ensureIndex({ fieldName: 'username', unique: true });
10+
db.ensureIndex({ fieldName: 'cpf', unique: true });
11+
12+
function validarCPF(cpf) {
13+
cpf = cpf.replace(/\D/g, '');
14+
if (cpf.length !== 11 || /^([0-9])\1+$/.test(cpf)) return false;
15+
let soma = 0, resto;
16+
for (let i = 1; i <= 9; i++) soma += parseInt(cpf[i-1]) * (11 - i);
17+
resto = (soma * 10) % 11;
18+
if (resto === 10 || resto === 11) resto = 0;
19+
if (resto !== parseInt(cpf[9])) return false;
20+
soma = 0;
21+
for (let i = 1; i <= 10; i++) soma += parseInt(cpf[i-1]) * (12 - i);
22+
resto = (soma * 10) % 11;
23+
if (resto === 10 || resto === 11) resto = 0;
24+
if (resto !== parseInt(cpf[10])) return false;
25+
return true;
26+
}
27+
28+
function validarTelefone(telefone) {
29+
telefone = telefone.replace(/\D/g, '');
30+
return telefone.length >= 10 && telefone.length <= 11;
31+
}
32+
33+
function validarMaioridade(dataNasc) {
34+
const hoje = new Date();
35+
const nasc = new Date(dataNasc);
36+
let idade = hoje.getFullYear() - nasc.getFullYear();
37+
const m = hoje.getMonth() - nasc.getMonth();
38+
if (m < 0 || (m === 0 && hoje.getDate() < nasc.getDate())) idade--;
39+
return idade >= 18;
40+
}
41+
42+
function validateCustomer(data, isRegister = true, cb) {
43+
const errors = [];
44+
if (!data.name || data.name.length < 3) {
45+
errors.push('Nome deve ter pelo menos 3 caracteres.');
46+
}
47+
if (!data.email || !/^\S+@\S+\.\S+$/.test(data.email)) {
48+
errors.push('Email inválido.');
49+
}
50+
if (!data.cpf || !validarCPF(data.cpf)) {
51+
errors.push('CPF inválido.');
52+
}
53+
if (!data.phone || !validarTelefone(data.phone)) {
54+
errors.push('Telefone inválido.');
55+
}
56+
if (!data.birth || !validarMaioridade(data.birth)) {
57+
errors.push('É necessário ser maior de 18 anos.');
58+
}
59+
if (!data.username || data.username.length < 3) {
60+
errors.push('Usuário deve ter pelo menos 3 caracteres.');
61+
}
62+
if (!data.password || data.password.length < 6) {
63+
errors.push('Senha deve ter pelo menos 6 caracteres.');
64+
}
65+
if (isRegister && data.password !== data.password2) {
66+
errors.push('As senhas não coincidem.');
67+
}
68+
if (isRegister) {
69+
db.findOne({ $or: [
70+
{ email: data.email },
71+
{ username: data.username },
72+
{ cpf: data.cpf }
73+
] }, (err, user) => {
74+
if (user) {
75+
if (user.email === data.email) errors.push('Já existe um cadastro com este email.');
76+
if (user.username === data.username) errors.push('Já existe um cadastro com este usuário.');
77+
if (user.cpf === data.cpf) errors.push('Já existe um cadastro com este CPF.');
78+
}
79+
cb(errors);
80+
});
81+
} else {
82+
cb(errors);
83+
}
84+
}
85+
86+
router.post('/register', (req, res) => {
87+
const data = req.body;
88+
validateCustomer(data, true, (errors) => {
89+
if (errors.length) return res.json({ success: false, errors });
90+
db.insert({ name: data.name, email: data.email, cpf: data.cpf, phone: data.phone, birth: data.birth, username: data.username, password: data.password }, (err, newUser) => {
91+
if (err) {
92+
return res.json({ success: false, errors: [err.message] });
93+
}
94+
res.json({ success: true });
95+
});
96+
});
97+
});
98+
99+
router.post('/login', (req, res) => {
100+
const { usernameOrEmail, password } = req.body;
101+
db.findOne({ $or: [{ username: usernameOrEmail }, { email: usernameOrEmail }] }, (err, user) => {
102+
if (!user || user.password !== password) {
103+
return res.json({ success: false, errors: ['Usuário ou senha incorretos.'] });
104+
}
105+
res.json({ success: true, user: { id: user._id, name: user.name, email: user.email, username: user.username } });
106+
});
107+
});
108+
109+
router.get('/users', (req, res) => {
110+
db.find({}, { password: 0 }).sort({ name: 1 }).exec((err, users) => {
111+
res.json(users);
112+
});
113+
});
114+
115+
module.exports = router;

localsite/db.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
const Database = require('better-sqlite3');
2+
const path = require('path');
3+
4+
const dbPath = path.join(__dirname, 'users.db');
5+
const db = new Database(dbPath);
6+
7+
db.prepare(`
8+
CREATE TABLE IF NOT EXISTS users (
9+
id INTEGER PRIMARY KEY AUTOINCREMENT,
10+
name TEXT NOT NULL,
11+
email TEXT NOT NULL UNIQUE,
12+
username TEXT NOT NULL UNIQUE,
13+
password TEXT NOT NULL
14+
)
15+
`).run();
16+
17+
function registerUser({ name, email, username, password }) {
18+
try {
19+
db.prepare('INSERT INTO users (name, email, username, password) VALUES (?, ?, ?, ?)')
20+
.run(name, email, username, password);
21+
return { success: true };
22+
} catch (e) {
23+
if (e.code === 'SQLITE_CONSTRAINT_UNIQUE') {
24+
return { success: false, error: 'Email ou usuário já cadastrado.' };
25+
}
26+
return { success: false, error: e.message };
27+
}
28+
}
29+
30+
function loginUser({ usernameOrEmail, password }) {
31+
const user = db.prepare('SELECT * FROM users WHERE (username = ? OR email = ?) AND password = ?')
32+
.get(usernameOrEmail, usernameOrEmail, password);
33+
if (user) {
34+
return { success: true, user };
35+
}
36+
return { success: false, error: 'Usuário ou senha incorretos.' };
37+
}
38+
39+
function getAllUsers() {
40+
return db.prepare('SELECT id, name, email, username FROM users').all();
41+
}
42+
43+
module.exports = { registerUser, loginUser, getAllUsers };

0 commit comments

Comments
 (0)