]> git.ekhem.eu.org Git - gym.git/commitdiff
Add a script for inserting exercise/gym/workout to the database.
authorJakub Czajka <jakub@ekhem.eu.org>
Sun, 17 Dec 2023 21:06:47 +0000 (22:06 +0100)
committerJakub Czajka <jakub@ekhem.eu.org>
Sun, 31 Dec 2023 11:00:55 +0000 (12:00 +0100)
insert.sh [new file with mode: 0755]

diff --git a/insert.sh b/insert.sh
new file mode 100755 (executable)
index 0000000..a5e2817
--- /dev/null
+++ b/insert.sh
@@ -0,0 +1,143 @@
+#!/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>"