forked from fdnd-task/connect-your-tribe-squad-page
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
128 lines (101 loc) · 4.3 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
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
// Importeer het npm pakket express uit de node_modules map
import express from 'express'
// Importeer de zelfgemaakte functie fetchJson uit de ./helpers map
import fetchJson from './helpers/fetch-json.js'
// Stel het basis endpoint in
const apiUrl = 'https://fdnd.directus.app/items'
// Haal alle squads uit de WHOIS API op
const squadData = await fetchJson(apiUrl + '/squad')
// Maak een nieuwe express app aan
const app = express()
// Stel ejs in als template engine
app.set('view engine', 'ejs')
// Zorg dat werken met request data makkelijker wordt
app.use(express.urlencoded({extended: true}))
// Stel de map met ejs templates in
app.set('views', './views')
// Gebruik de map 'public' voor statische resources, zoals stylesheets, afbeeldingen en client-side JavaScript
app.use(express.static('public'))
// Maak een GET route voor de index
app.get('/', function (request, response) {
// Haal alle personen uit de WHOIS API op
var query = request.query;
var url = apiUrl + '/person';
if (query.name || query.id) {
var queryString = '?filter={';
var filters = [];
if (query.name) {
// Zet de naam eerst volledig naar kleine letters en vervolgens de eerste letter naar hoofdletter
var formattedName = query.name.toLowerCase().charAt(0).toUpperCase() + query.name.toLowerCase().slice(1);
filters.push('"name":"' + encodeURIComponent(formattedName) + '"');
}
if (query.id) {
filters.push('"squad_id":"' + encodeURIComponent(query.id) + '"');
}
queryString += filters.join(', ') + '}';
url += queryString;
} else {
// Maak url alleen voor squad_id 4
var queryString = '?filter={';
var filters = [];
filters.push('"squad_id":"' + 4 + '"');
queryString += filters.join(', ') + '}';
url += queryString;
}
fetchJson(url).then((apiData) => {
// apiData bevat gegevens van alle personen uit alle squads
// Je zou dat hier kunnen filteren, sorteren, of zelfs aanpassen, voordat je het doorgeeft aan de view
// Render index.ejs uit de views map en geef de opgehaalde data mee als variabele, genaamd persons
response.render('index', { persons: apiData.data, squads: squadData.data })
})
})
// Maak een POST route voor de index
app.post('/', function (request, response) {
// Er is nog geen afhandeling van POST, redirect naar GET op /
response.redirect(303, '/')
})
// Maak een GET route voor een detailpagina met een request parameter id
app.get('/person/:id', function (request, response) {
// Gebruik de request parameter id en haal de juiste persoon uit de WHOIS API op
fetchJson(apiUrl + '/person/' + request.params.id).then((apiData) => {
// Render person.ejs uit de views map en geef de opgehaalde data mee als variable, genaamd person
response.render('person', { person: apiData.data, squads: squadData.data })
})
})
app.post('/:id/like-or-unlike', function (request, response) {
// STAP 1: Haal de huidige gegevens voor deze persoon op, uit de WHOIS API
fetchJson('https://fdnd.directus.app/items/person/' + request.params.id).then((apiResponse) => { // Het custom field is een String, dus die moeten we eerst omzetten (= parsen)
// naar een Object, zodat we er mee kunnen werken
try {
apiResponse.data.custom = JSON.parse(apiResponse.data.custom)
} catch (e) {
apiResponse.data.custom = {}
}
// STAP 2: Voeg de like toe aan het custom object..
if (request.body.action == 'liked') {
apiResponse.data.custom.like = true
} else {
apiResponse.data.custom.like = false
}
// STAP 3: Overschrijf het custom field voor deze persoon
fetchJson('https://fdnd.directus.app/items/person/' + request.params.id, {
method: 'PATCH',
body: JSON.stringify({
custom: apiResponse.data.custom
}),
headers: {
'Content-type': 'application/json; charset=UTF-8'
}
}).then((patchResponse) => {
// Redirect naar de persoon pagina
response.redirect(303, '/#members')
})
})
})
// Stel het poortnummer in waar express op moet gaan luisteren
app.set('port', process.env.PORT || 8000)
// Start express op, haal daarbij het zojuist ingestelde poortnummer op
app.listen(app.get('port'), function () {
// Toon een bericht in de console en geef het poortnummer door
console.log(`Application started on http://localhost:${app.get('port')}`)
})