-
Notifications
You must be signed in to change notification settings - Fork 0
/
handler.js
153 lines (130 loc) · 2.96 KB
/
handler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
const AWS = require('aws-sdk')
const { v4: uuidv4 } = require('uuid')
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const dynamoDb = new AWS.DynamoDB.DocumentClient()
const USERS_TABLE = 'users'
const JWT_SECRET = 'rocketseat-api-secret'
const defaultResponse = {
statusCode: 500,
headers: {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': true,
},
body: JSON.stringify({
message: 'Ocorreu um erro',
}),
}
// USERS
const createUser = async event => {
try {
const user = JSON.parse(event.body)
const id = uuidv4()
const { name, email, access, password } = user
const newUser = {
id,
name,
email,
access,
password: bcrypt.hashSync(password, 10),
}
const params = {
TableName: USERS_TABLE,
Item: newUser,
}
await dynamoDb.put(params).promise()
return {
...defaultResponse,
statusCode: 201,
body: JSON.stringify(newUser),
}
} catch (err) {
console.log(err)
return defaultResponse
}
}
const getUser = async event => {
try {
const { id } = event.pathParameters
const params = {
TableName: USERS_TABLE,
Key: {
id,
},
}
const response = await dynamoDb.get(params).promise()
if (!response || !response.Item) {
return {
...defaultResponse,
statusCode: 404,
body: JSON.stringify({
message: 'Usuário não encontrado',
}),
}
}
return {
...defaultResponse,
statusCode: 200,
body: JSON.stringify(response.Item),
}
} catch (err) {
console.log(err)
return defaultResponse
}
}
const authenticateUser = async event => {
try {
const { email, password } = JSON.parse(event.body)
const params = {
TableName: USERS_TABLE,
ExpressionAttributeNames: {
'#e': 'email',
},
ExpressionAttributeValues: {
':email': email,
},
FilterExpression: '#e = :email',
}
const response = await dynamoDb.scan(params).promise()
if (!response || !response.Items.length) {
return {
...defaultResponse,
statusCode: 404,
body: JSON.stringify({
message: 'Usuário ou senha inválidos.',
}),
}
}
const Item = response.Items[0]
if (!bcrypt.compareSync(password, Item.password)) {
return {
...defaultResponse,
statusCode: 404,
body: JSON.stringify({
message: 'Usuário ou senha inválidos.',
}),
}
}
const tokenUser = {
id: Item.id,
name: Item.name,
email: Item.email,
}
let token = jwt.sign(tokenUser, JWT_SECRET, { expiresIn: '1d' })
return {
...defaultResponse,
statusCode: 200,
body: JSON.stringify({
token: token,
}),
}
} catch (err) {
console.log(err)
return defaultResponse
}
}
module.exports = {
createUser,
getUser,
authenticateUser,
}