]> git.ekhem.eu.org Git - website.git/commitdiff
Add an endpoint for reading the number of views for a page.
authorJakub Czajka <jakub@ekhem.eu.org>
Sun, 11 Feb 2024 12:39:35 +0000 (13:39 +0100)
committerJakub Czajka <jakub@ekhem.eu.org>
Sun, 11 Feb 2024 12:44:13 +0000 (13:44 +0100)
create.sql
drop.sql
views.sh [new file with mode: 0755]
website.conf

index 59d73124f8d6b896fa8a4b907ec8b579dd9ba429..c29b3903cfdce420324b64127ea5f80fd3fd15c9 100644 (file)
@@ -22,3 +22,20 @@ BEGIN
                       TO rsyslog', current_database());
     END IF;
 END$$;
+
+DO $$
+BEGIN
+    IF NOT EXISTS (SELECT * FROM pg_user WHERE usename = 'analytics_reader')
+    THEN
+      CREATE ROLE analytics_reader LOGIN;
+
+      GRANT SELECT
+      ON access_logs
+      TO analytics_reader;
+
+      /* Execute for the current database. */
+      EXECUTE FORMAT('GRANT CONNECT
+                      ON DATABASE %I
+                      TO analytics_reader', current_database());
+    END IF;
+END$$;
index 55adc2786ef206a1376a677231f3930d7c893367..7a44707db232bdc9251ae48bd999800d3bc01b31 100644 (file)
--- a/drop.sql
+++ b/drop.sql
@@ -1,6 +1,23 @@
 /* Copyright (c) 2024 Jakub Czajka <jakub@ekhem.eu.org>
    License: GPL-3.0 or later. */
 
+DO $$
+BEGIN
+    IF EXISTS (SELECT * FROM pg_user WHERE usename = 'analytics_reader')
+    THEN
+        REVOKE SELECT
+        ON access_logs
+        FROM analytics_reader;
+
+        EXECUTE
+            FORMAT('REVOKE CONNECT
+                    ON DATABASE %I
+                    FROM analytics_reader;', current_database());
+
+        DROP ROLE analytics_reader;
+    END IF;
+END$$;
+
 DO $$
 BEGIN
     IF EXISTS (SELECT * FROM pg_user WHERE usename = 'rsyslog')
diff --git a/views.sh b/views.sh
new file mode 100755 (executable)
index 0000000..915493e
--- /dev/null
+++ b/views.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+# Copyright (c) 2024 Jakub Czajka <jakub@ekhem.eu.org>
+# License: GPL-3.0 or later.
+
+. /etc/environment
+
+_querypath="/${FILENAME}"
+
+echo "HTTP/1.1 200 OK"
+echo "Content-Type: text/html"
+echo ""
+
+/usr/bin/psql --user=analytics_reader --dbname="${analytics_db}" --tuples-only \
+  --no-align --command="\
+SELECT COUNT(*)
+FROM access_logs
+WHERE access_log::json->>'path' = '${_querypath}'"
index 6858ad5640df59f91355794b2ea2c684ba335cdb..393297db73735bf3152aab0c4738f4f81ffd8b00 100644 (file)
@@ -28,6 +28,15 @@ server {
     userid_expires 365d;
 
     access_log ${website_log_file} as_json;
+    root ${prod_dir}/www;
+
+    location ~ /views/(.*)$ {
+        include fastcgi_params;
+        fastcgi_pass unix:/var/run/fcgiwrap.socket;
+
+        fastcgi_param URL ${dollar}uri;
+        fastcgi_param SCRIPT_FILENAME ${dollar}document_root/views.sh;
+    }
 
     location /cv {
         root ${prod_dir}/cv;
@@ -36,7 +45,6 @@ server {
     }
 
     location / {
-        root ${prod_dir}/www;
         index index.html;
     }
 }