-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhandler.js
More file actions
103 lines (87 loc) · 2.44 KB
/
Copy pathhandler.js
File metadata and controls
103 lines (87 loc) · 2.44 KB
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
const AWS = require('aws-sdk')
const s3 = new AWS.S3()
const errors = require('./errors')
exports.listEntries = async (event) => {
if (!event.queryStringParameters || !event.queryStringParameters.sort) {
return {
statusCode: 400,
body: JSON.stringify(errors.NoSortError)
}
}
let entries = await getEntries()
entries = sortEntries(entries, event.queryStringParameters.sort)
return {
statusCode: 200,
body: JSON.stringify(stripSecrets(entries))
}
}
exports.addEntry = async (event) => {
const newEntry = JSON.parse(event.body)
let entries = await getEntries()
if (!newEntry.name || !newEntry.score) {
return {
statusCode: 400,
body: JSON.stringify(errors.MissingDataError)
}
}
const existingUser = findExistingUser(entries, newEntry)
if (existingUser && !isSecretCorrect(existingUser, newEntry.secret)) {
return {
statusCode: 403,
body: JSON.stringify(errors.NameTakenError)
}
}
entries.push({
name: newEntry.name,
score: newEntry.score,
secret: newEntry.secret || '',
date: new Date()
})
if (event.queryStringParameters && event.queryStringParameters.sort) {
entries = sortEntries(entries, event.queryStringParameters.sort)
}
await s3.putObject({
Bucket: process.env.BUCKET_NAME,
Key: process.env.DB_NAME,
Body: Buffer.from(JSON.stringify(entries))
}).promise()
return {
statusCode: 200,
body: JSON.stringify(stripSecrets(entries))
}
}
const getEntries = async () => {
try {
const leaderboard = await s3.getObject({
Bucket: process.env.BUCKET_NAME,
Key: process.env.DB_NAME
}).promise()
return JSON.parse(leaderboard.Body.toString())
} catch (err) {
// db doesn't exist yet
console.log(err.message)
return []
}
}
const sortEntries = (entries, sort) => {
switch (sort) {
case 'top': return entries.sort((a, b) => b.score - a.score)
case 'new': return entries.sort((a, b) => new Date(b.date) - new Date(a.date))
}
}
const stripSecrets = (entries) => {
return entries.map((entry) => {
let strippedEntry = { ...entry }
delete strippedEntry.secret
return strippedEntry
})
}
const findExistingUser = (entries, newEntry) => {
return entries.find((e) => {
return e.name.toLowerCase() === newEntry.name.toLowerCase()
})
}
const isSecretCorrect = (entry, secret) => {
if (!secret || secret.trim().length === 0) return true;
return entry.secret === secret
}