-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
102 lines (102 loc) · 3.94 KB
/
server.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
let sequelize = require("sequelize")
let express = require("express")
let jsonwebtoken = require("jsonwebtoken")
let bcryptjs = require("bcryptjs")
let keys = require("./keys")
let database = new sequelize(keys.database, {
dialect: "postgres",
dialectOptions: {
ssl: { rejectUnauthorized: false }
}
})
let users = database.define("users", { size: sequelize.DataTypes.DOUBLE, user: sequelize.DataTypes.TEXT, description: sequelize.DataTypes.TEXT, password: sequelize.DataTypes.TEXT })
let items = database.define("items", { user: sequelize.DataTypes.TEXT, index: sequelize.DataTypes.DOUBLE, parent: sequelize.DataTypes.DOUBLE, order: sequelize.DataTypes.DOUBLE, name: sequelize.DataTypes.TEXT, description: sequelize.DataTypes.TEXT, address: sequelize.DataTypes.TEXT, public: sequelize.DataTypes.BOOLEAN, shortcut: sequelize.DataTypes.DOUBLE })
let tags = database.define("tags", { name: sequelize.DataTypes.TEXT, item: sequelize.DataTypes.DOUBLE })
let shares = database.define("shares", { user: sequelize.DataTypes.TEXT, item: sequelize.DataTypes.DOUBLE })
let user
function filter(user, index) {
let filter = {
where: { user: user }
}
if (index) {
filter.where.index = index
}
return filter
}
async function authenticate(user, response, body, next) {
if (bcryptjs.compareSync(body.password, (await users.findAll(filter(user)))[0].dataValues.password)) {
next(user, response, body)
} else {
response.send()
}
}
let api = express()
api.use(express.json())
api.use(express.static(__dirname + "/build"))
api.get("*", function(request, response) {
response.sendFile(__dirname + "/build/")
})
api.post("/find", async function(request, response) {
response.send(await Promise.all([
users.findAll({ order: [["size", "desc"]], attributes: ["user", "description"] }),
items.findAll(filter(request.body.user))
]))
})
api.post("/itemsFind", async function(request, response) {
response.send(await items.findAll(filter(request.body.user)))
})
api.post("/create", function(request, response) {
response.send(jsonwebtoken.sign({ user: request.body.user }, keys.token))
request.body.password = bcryptjs.hashSync(request.body.password)
users.create(request.body)
})
api.post("/usersFind", function(request, response) {
authenticate(request.body.user, response, request.body, function(user, response) {
response.send(jsonwebtoken.sign({ user: user }, keys.token))
})
})
api.use(function(request, response, next) {
user = request.get("user")
try {
if (jsonwebtoken.verify(request.get("token"), keys.token).user === user) {
next()
}
} catch {}
})
api.put("/createIncrementUpdate", function(request, response) {
response.sendStatus(200)
if (request.body.create) {
items.create(request.body.create)
if (request.body.create.address) {
users.increment("size", filter(user))
}
}
for (let index in request.body.update) {
items.update(request.body.update[index], filter(user, request.body.update[index].index))
}
})
api.put("/destroyIncrement", function(request, response) {
response.sendStatus(200)
items.destroy(filter(user, request.body.destroy))
users.increment({ size: request.body.increment }, filter(user))
})
api.put("/usersUpdate", function(request, response) {
response.sendStatus(200)
users.update(request.body, filter(user))
})
api.put("/findUpdate", function(request, response) {
authenticate(user, response, request.body, function(user, response, body) {
response.sendStatus(200)
users.update({ password: bcryptjs.hashSync(body.new) }, filter(user))
})
})
api.put("/findDestroy", function(request, response) {
authenticate(user, response, request.body, function(user, response) {
response.sendStatus(200)
users.destroy(filter(user))
items.destroy(filter(user))
})
})
database.sync().then(function() {
api.listen(3000)
})