--- /dev/null
+#!/bin/bash
+# Copyright (c) 2023 Jakub Czajka <jakub@ekhem.eu.org>
+# License: GPL-3.0 or later.
+
+. /etc/environment
+
+request_body=$(echo "${REQUEST_BODY}" | /usr/bin/python3 -c "\
+import sys;
+from urllib.parse import unquote_plus;
+print(unquote_plus(sys.stdin.read()));")
+
+get_query_param() {
+ echo "${request_body}" | sed "s/^.*${1}=// ; s/\&.*$//"
+}
+
+query_db() {
+ /usr/bin/psql --user=gym_tracker --dbname="${GYM_DB}" --tuples-only \
+ --no-align --command="${1}"
+}
+
+echo "HTTP/1.1 200 OK"
+echo "Content-Type: text/html"
+echo "
+<!DOCTYPE html>
+<html>
+<head>
+ <style>
+ body {
+ white-space: pre-wrap;
+ }
+ @media screen and (max-width: 980px) {
+ body {
+ font-size: 2.5em;
+ }
+ }
+ </style>
+<head>
+<body>"
+
+case ${RECORD_TYPE} in
+ exercise)
+ exercise=$(get_query_param exercise)
+
+ query_db "\
+ INSERT INTO exercises (name)
+ VALUES ('${exercise}')"
+
+ id=$(query_db "\
+ SELECT id
+ FROM exercises
+ WHERE name='${exercise}'")
+
+ echo "Recorded new exercise '${exercise}' (id=${id})."
+ ;;
+ gym)
+ gym=$(get_query_param gym)
+
+ query_db "\
+ INSERT INTO gyms (name)
+ VALUES ('${gym}')"
+
+ id=$(query_db "\
+ SELECT id
+ FROM gyms
+ WHERE name='${gym}'")
+
+ echo "Recorded new gym '${gym}' (id=${id})."
+ ;;
+ workout)
+ gym=$(get_query_param gym)
+ date=$(get_query_param date)
+ duration=$(get_query_param duration)
+
+ query_db "\
+ INSERT INTO workouts (date, duration_min)
+ VALUES ('${date}', '${duration}')"
+
+ id=$(query_db "\
+ SELECT id
+ FROM workouts
+ WHERE date='${date}'")
+
+ echo "Recorded new workout on ${date} with duration ${duration} (id=${id})."
+
+ gym_id=$(query_db "\
+ SELECT id
+ FROM gyms
+ WHERE name='${gym}'")
+
+ query_db "\
+ INSERT INTO workouts_gyms (workout_id, gym_id)
+ VALUES ('${id}', '${gym_id}')"
+
+ echo "Associated workout (id=${id}) with gym ${gym} (id=${gym_id})."
+
+ echo "${request_body}&" | while IFS='=' read -r -d '&' key val
+ do
+ # $exercise, $exercise_id and $value retain their values between
+ # iterations.
+ [ -n "${val}" ] && case ${key} in
+ *_local_record)
+ query_db "\
+ INSERT INTO gyms_records (gym_id, exercise_id, value)
+ VALUES ('${gym_id}', '${exercise_id}', '${value}')
+ ON CONFLICT (gym_id, exercise_id)
+ DO UPDATE SET value='${value}'"
+
+ echo "Recorded new record for '${exercise}' (id=${exercise_id}) in\
+ ${gym} (id=${gym_id}) (value=${value})."
+ ;;
+ *_global_record)
+ query_db "\
+ INSERT INTO records (exercise_id, value)
+ VALUES ('${exercise_id}', '${value}')
+ ON CONFLICT (exercise_id)
+ DO UPDATE SET value='${value}'"
+
+ echo "Recorded new global record for '${exercise}'\
+ (id=${exercise_id}) (value=${value})."
+ ;;
+ [0-9]*)
+ exercise_id="${key}"
+ value="${val}"
+
+ query_db "\
+ INSERT INTO workouts_exercises (workout_id, exercise_id, value)
+ VALUES ('${id}', '${exercise_id}', '${value}')"
+
+ exercise=$(query_db "\
+ SELECT name
+ FROM exercises
+ WHERE id='${exercise_id}'")
+ echo "Recorded exercise '${exercise}' (id=${exercise_id}) for workout\
+ (id=${id}) (value=${value})."
+ ;;
+ esac
+ done
+ ;;
+esac
+
+echo "
+</body>
+</html>"