119 lines
2.5 KiB
JavaScript
119 lines
2.5 KiB
JavaScript
/**
|
|
* Webservice mit Express
|
|
* WBE-Praktikum
|
|
*/
|
|
|
|
var express = require('express')
|
|
var app = express()
|
|
|
|
// Fehlerobjekt anlegen
|
|
//
|
|
function error(status, msg) {
|
|
var err = new Error(msg)
|
|
err.status = status
|
|
return err
|
|
}
|
|
|
|
// Zufällige ID erzeugen, Quelle:
|
|
// https://stackoverflow.com/questions/6860853/generate-random-string-for-div-id#6860916
|
|
//
|
|
function guidGenerator() {
|
|
var S4 = function() {
|
|
return (((1+Math.random())*0x10000)|0).toString(16).substring(1)
|
|
}
|
|
return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4())
|
|
}
|
|
|
|
// Statische Dateien im Verzeichnis public
|
|
app.use(express.static('public'))
|
|
|
|
// API-Key überprüfen
|
|
//
|
|
app.use('/api', function(req, res, next){
|
|
var key = req.query['api-key']
|
|
|
|
// Key fehlt
|
|
if (!key) {
|
|
return next(error(400, 'api key required'))
|
|
}
|
|
// Key falsch
|
|
if (!~apiKeys.indexOf(key)) {
|
|
return next(error(401, 'invalid api key'))
|
|
}
|
|
// korrekter Key
|
|
req.key = key
|
|
next()
|
|
})
|
|
|
|
// JSON-Daten akzeptieren
|
|
app.use(express.json())
|
|
|
|
// gültige API-Keys
|
|
var apiKeys = ['wbeweb', 'c4game']
|
|
|
|
|
|
// unsere tolle in-memory Datenbank :)
|
|
const columns = 7
|
|
const rows = 6
|
|
var data = {}
|
|
|
|
// GET-Request bearbeiten
|
|
//
|
|
app.get('/', function(req, res, next){
|
|
console.log("received default GET request")
|
|
res.sendFile('public/connect4.html', { root: __dirname })
|
|
})
|
|
|
|
app.get('/api/data/:id', function(req, res, next){
|
|
console.log("received API get request")
|
|
var id = req.params.id
|
|
var result = data[id]
|
|
if (result) res.send(result)
|
|
else next()
|
|
})
|
|
|
|
// POST-Request bearbeiten
|
|
//
|
|
app.post('/api/data', function (req, res, next) {
|
|
console.log("received POST request")
|
|
var id = guidGenerator()
|
|
data[id] = req.body
|
|
res.send({id})
|
|
})
|
|
|
|
// DELETE-Request bearbeiten
|
|
//
|
|
app.delete('/api/data/:id', function(req, res, next){
|
|
var id = req.params.id
|
|
delete data[id]
|
|
res.sendStatus(204)
|
|
})
|
|
|
|
// PUT-Request bearbeiten
|
|
//
|
|
app.put('/api/data/:id', function(req, res, next){
|
|
var id = req.params.id
|
|
if (data[id]) {
|
|
data[id] = req.body
|
|
res.send(req.body)
|
|
}
|
|
else next()
|
|
})
|
|
|
|
// Middleware mit vier Argumenten wird zur Fehlerbehandlung verwendet
|
|
//
|
|
app.use(function(err, req, res, next){
|
|
res.status(err.status || 500)
|
|
res.send({ error: err.message })
|
|
})
|
|
|
|
// Catch-all: wenn keine vorangehende Middleware geantwortet hat, wird
|
|
// hier ein 404 (not found) erzeugt
|
|
//
|
|
app.use(function(req, res){
|
|
res.status(404)
|
|
res.send({ error: "not found" })
|
|
})
|
|
|
|
app.listen(3000)
|
|
console.log('Express started on port 3000') |