Web: API response (esp. request response)

This commit is contained in:
Oskar Winkels 2020-12-01 17:38:37 +01:00 committed by Oskar
parent db6b1eef77
commit e6f4a8dd24
2 changed files with 140 additions and 37 deletions

View File

@ -66,7 +66,7 @@ def post_arrival():
db.insert({ db.insert({
'name': name, 'name': name,
'room': data['room'], 'room': data['room'],
'arrival': now.isoformat(), 'arrival': data.get('arrival') or now.isoformat(),
'departure': None 'departure': None
}) })
@ -104,7 +104,7 @@ def post_departure():
now = datetime.utcnow() now = datetime.utcnow()
db.update( db.update(
operations.set('departure', now.isoformat()), operations.set('departure', data.get('departure') or now.isoformat()),
(Entry.name == name) & (Entry.departure == None) (Entry.name == name) & (Entry.departure == None)
) )

View File

@ -42,6 +42,7 @@
input { input {
border: none; border: none;
padding: 16px; padding: 16px;
margin: 4px 0;
font-size: 16px; font-size: 16px;
} }
input[type=text] { input[type=text] {
@ -62,6 +63,21 @@
width: 32px; width: 32px;
margin-right: 8px; margin-right: 8px;
} }
.request {
display: block;
position: fixed;
background: #ddd;
top: 16px;
left: 16px;
width: calc(100% - 32px);
box-shadow: 0 1px 4px 0;
}
input[type=datetime-local] {
width: calc(100% - 24px);
padding: 12px;
font-size: 12px;
background: #fff;
}
</style> </style>
<script> <script>
// 1st script, prepares values needed for writing document // 1st script, prepares values needed for writing document
@ -93,7 +109,7 @@
<h1><script> <h1><script>
document.write(qp.action + "<br>Room " + qp.room) document.write(qp.action + "<br>Room " + qp.room)
</script></h1> </script></h1>
<form> <form id="mainform">
<label> <label>
Full Name:<br> Full Name:<br>
<input type="text" name="name" id="name" placeholder="John Doe" required> <input type="text" name="name" id="name" placeholder="John Doe" required>
@ -111,13 +127,20 @@
document.getElementById('name').value = savedName document.getElementById('name').value = savedName
// 2nd script, server API communication // 2nd script, server API communication
form = document.querySelector('form') var name, agreed
form.onsubmit= function(e) { var mform = document.getElementById('mainform')
e.preventDefault() mform.onsubmit = function(e) {
console.log(e)
var name = e.srcElement[0].value e.preventDefault()
var agreed = e.srcElement[1].checked
name = e.srcElement[0].value
agreed = e.srcElement[1].checked
sendMainData()
}
function sendMainData() {
// POST JSON. See docs/API.md // POST JSON. See docs/API.md
var payload = (qp.action == 'arrival') ? var payload = (qp.action == 'arrival') ?
@ -131,29 +154,38 @@
'cleanedworkspace': agreed 'cleanedworkspace': agreed
} }
console.log(payload) post("/" + qp.action, payload)
fetch("/" + qp.action, { }
function post(url, payload) {
console.log("Sending payload:", payload)
return fetch(url, {
method: "POST", method: "POST",
body: JSON.stringify(payload) body: JSON.stringify(payload)
}).then(res => { }).then(res => {
handleResponse(res)
})
}
function handleResponse(res) {
console.log("Request complete! response:", res) console.log("Request complete! response:", res)
if (Math.floor(res.status / 100) == 2) { if (Math.floor(res.status / 100) == 2) {
// Success // Success
form.innerHTML = "<h2>Done. Thanks!</h2>" mform = document.getElementById('mainform')
mform.innerHTML = "<h2>Done. Thanks!</h2>"
localStorage.setItem('name', name) localStorage.setItem('name', name)
} else if (res.status == 409) { } else if (res.status == 409) {
// Conflict, more data requested // Conflict, more data requested
res.json().then(function (json) { handleRequest(res)
// TODO: Ask user for data and resend both
alert(json.message)
})
} else { } else {
@ -163,7 +195,78 @@
}) })
} }
}
function handleRequestSubmit(e, json) {
e.preventDefault()
var input = e.srcElement[0].value
var iso = new Date(input).toISOString()
// POST JSON. See docs/API.md
var payload = (json.request == 'arrival') ?
{
'room': qp.room,
'name': name,
'arrival': iso,
'agreetoguidelines': agreed
} :
{
'name': name,
'departure': iso,
'cleanedworkspace': agreed
}
return post("/" + json.request, payload)
}
function handleRequest(res) {
var reqt = {
'arrival': 'You probably forgot to sign in when you arrived. Please enter your arrival time now:',
'departure': 'You probably forgot to sign out when you left. Please enter your departure time now:'
}
mform.innerHTML = "<h2>Processing Request...</h2>"
res.json().then(function (json) {
var aInfo = ''
var minD = ''
if (json.request == 'departure') {
var d = new Date(json.arrival.time)
var dInfo = d.toString('en-GB').split(' ').slice(0,5).join(' ')
aInfo = `Your last arrival was on <b>${dInfo}</b> in room <b>${json.arrival.room}</b>.`
minD = `min="${json.arrival.time.split(':').slice(0,2).join(':')}"`
}
var now = new Date().toISOString().split(':').slice(0,2).join(':')
document.body.innerHTML +=
`<div class="request">
<h1>${json.request} missing!</h1>
<form id="reqform">
<label>
${reqt[json.request]}
<input type="datetime-local" id="datetime" ${minD} max="${now}" required>
${aInfo}
</label>
<input type="submit">
</form>
</div>`
rform = document.getElementById('reqform')
rform.onsubmit = async function(e) {
await handleRequestSubmit(e, json)
document.querySelector('.request').remove()
setTimeout(sendMainData, 200)
}
}) })
} }
</script> </script>
</body> </body>