From bfaffa88bd6b853e1e540bf34f31eee93ad2073d Mon Sep 17 00:00:00 2001 From: TMA Date: Sat, 14 Mar 2026 22:52:46 +0100 Subject: [PATCH] /members --- src/brmelect.scm | 143 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 118 insertions(+), 25 deletions(-) diff --git a/src/brmelect.scm b/src/brmelect.scm index fec3672..04f8f23 100644 --- a/src/brmelect.scm +++ b/src/brmelect.scm @@ -27,34 +27,127 @@ ; ) ;; Thread-local parameter to re-use SQLite3 DB handle for subsequent queries -(define *cached-brmelect-db* (make-parameter #f)) -(define =brmelect-db-path= "/home/brmelect/brmelect/brmelect.sqlite3") +;(define *cached-brmelect-db* (make-parameter #f)) +;(define =brmelect-db-path= "/home/brmelect/brmelect/brmelect.sqlite3") +(define db + (connect + database: "brmelect" + user: "brmelect" + password: "brm" + host: "localhost")) +(define db + (connect + '((dbname . "brmelect") + (user . "brmelectmgr") + (host . "localhost")))) + +(define (query-db sql . params) + (apply query* db sql params)) + +(define (exec sql . params) + (apply exec* db sql params)) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; helpers +(define (param parameters key) + (hash-table-ref/default parameters key "")) + +(define (int-param parameters key) + (string->number (param parameters key))) + +(define (redirect url) + (make-response + code: 302 + headers: `((location . ,url)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; navigation menu +(define (layout title body) + `@html{ + @head{ + @title{,title} + } + @body{ + @h1{,title} + @nav{ + @a[href: "/members"]{"Members"} " | " + @a[href: "/meetings"]{"Meetings"} " | " + @a[href: "/votes"]{"Votes"} + } + @hr{} + ,body + }}) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; members +(define-resource (members "members" parameters) + (let ((rows (query-db "SELECT member_id,nick,name,surname FROM brm.members ORDER BY member_id"))) + (make-html-response + 200 + (layout + "Members" + `@div{ + ;@a[href: "/members/add"]{"Add Member"} + @table{ + @tr{@th{"ID"} @th{"Nick"} @th{"Name"} @th{"Surname"} @th{"Edit"}} + ,@(row-map* + (lambda (id nick name surname) + `@tr{@td{,id}@td{,nick}@td{,name}@td{,surname}}) + rows) + } + })))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; /members/add +;(define-resource (members-add "elect" "members" "add" parameters) +; (if (param parameters 'submit) +; (begin +; (exec +; "INSERT INTO brm.members(member_id,nick,name,surname) VALUES($1,$2,$3,$4)" +; (int-param parameters 'member_id) +; (param parameters 'nick) +; (param parameters 'name) +; (param parameters 'surname)) +; (redirect "/members")) +; (make-html-response +; 200 +; (layout +; "Add Member" +; `@form[action: "/members/add" method: "get"]{ +; "ID:" @input[name: "member_id"]{} @br{} +; "Nick:" @input[name: "nick"]{} @br{} +; "Name:" @input[name: "name"]{} @br{} +; "Surname:" @input[name: "surname"]{} @br{} +; @input[type: "submit" name: "submit" value: "Create"]{} +; })))) +; ;; Returns (possibly cached) SQLite3 DB handle -(define (brmelect-db) - (let ((cdb (*cached-brmelect-db*))) - (if cdb - cdb - (begin - (*cached-brmelect-db* - (let ((handler (make-busy-timeout 2000))) - (let ((db (open-database =brmelect-db-path=))) - (set-busy-handler! db handler) - db))) - (*cached-brmelect-db*))))) +;(define (brmelect-db) +; (let ((cdb (*cached-brmelect-db*))) +; (if cdb +; cdb +; (begin +; (*cached-brmelect-db* +; (let ((handler (make-busy-timeout 2000))) +; (let ((db (open-database =brmelect-db-path=))) +; (set-busy-handler! db handler) +; db))) +; (*cached-brmelect-db*))))) -(define (initialize-db) - (let ((db (brmelect-db))) - ;; admin passwords - (execute db "create table if not exists admins (login text not null primary key, password text not null)") - ;; GA - (execute db "create table if not exists general_assemblies (id integer primary key, ga_date text not null, ga_open integer not null)") - (execute db "insert or ignore into general_assemblies (id, ga_date, ga_open) values (17, '2025-01-21', 1)") - ;; elections - (execute db "create table if not exists elections (id integer primary key autoincrement, ga_id integer not null, election_name text not null, election_running integer not null, election_file text not null, foreign key (ga_id) references general_assemblies(id))") - ;; candidates - (execute db "create table if not exists candidates (id integer primary key autoincrement, election_id integer not null, candidate_name text not null, candidate_nick text not null, foreign key (election_id) references elections(id)") - )) +;(define (initialize-db) +; (let ((db (brmelect-db))) +; ;; admin passwords +; (execute db "create table if not exists admins (login text not null primary key, password text not null)") +; ;; GA +; (execute db "create table if not exists general_assemblies (id integer primary key, ga_date text not null, ga_open integer not null)") +; (execute db "insert or ignore into general_assemblies (id, ga_date, ga_open) values (17, '2025-01-21', 1)") +; ;; elections +; (execute db "create table if not exists elections (id integer primary key autoincrement, ga_id integer not null, election_name text not null, election_running integer not null, election_file text not null, foreign key (ga_id) references general_assemblies(id))") +; ;; candidates +; (execute db "create table if not exists candidates (id integer primary key autoincrement, election_id integer not null, candidate_name text not null, candidate_nick text not null, foreign key (election_id) references elections(id)") +; )) ;(initialize-db)