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 ;
0 commit comments