From 0373c11946146556a2840d9663693b352894c5e2 Mon Sep 17 00:00:00 2001 From: skyFzz Date: Thu, 25 Sep 2025 19:37:16 -0400 Subject: [PATCH 01/11] Add admin dashboard --- Dockerfile.dev | 2 +- Makefile | 3 --- main.go | 6 ++++-- migrations/seed.sql | 7 +++++++ templates/index.html.tpl | 15 +++++++++++++++ 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Dockerfile.dev b/Dockerfile.dev index 8c0e079..a5e78bf 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM golang:1.23.2-alpine +FROM golang:1.25-alpine RUN apk add make curl diff --git a/Makefile b/Makefile index cfc73b9..bb2284b 100644 --- a/Makefile +++ b/Makefile @@ -2,11 +2,8 @@ all: build tailwind: @mkdir -p tmp - @if [ ! -f tmp/tailwindcss ]; then curl -sL https://github.com/tailwindlabs/tailwindcss/releases/latest/download/tailwindcss-linux-x64 -o tmp/tailwindcss; fi - @chmod +x tmp/tailwindcss prepare: tailwind build: tailwind - @tmp/tailwindcss -i styles.css -o static/tailwind.css --minify @go build -o tmp/main . diff --git a/main.go b/main.go index fa67b11..57b83c0 100644 --- a/main.go +++ b/main.go @@ -142,12 +142,13 @@ func (r *Router) index(w http.ResponseWriter, req *http.Request) { if hasUserId { row := r.db.QueryRow(` UPDATE users SET last_seen_timestamp = strftime('%s', 'now') WHERE buck_id = ?1 - RETURNING name_num, discord_id, added_to_mailinglist + RETURNING name_num, discord_id, added_to_mailinglist, is_admin `, userId) var nameNum string var discordId sql.NullString var isOnMailingList bool - err := row.Scan(&nameNum, &discordId, &isOnMailingList) + var isAdmin bool + err := row.Scan(&nameNum, &discordId, &isOnMailingList, &isAdmin) if err != nil { log.Println("Failed to get user:", err, userId) http.Redirect(w, req, "/signout", http.StatusTemporaryRedirect) @@ -189,6 +190,7 @@ func (r *Router) index(w http.ResponseWriter, req *http.Request) { "canAttend": canAttend, "hasLinkedDiscord": discordId.Valid, "isOnMailingList": isOnMailingList, + "isAdmin": isAdmin, }) if err != nil { log.Println("Failed to render template:", err) diff --git a/migrations/seed.sql b/migrations/seed.sql index 6d162a4..3c0decb 100644 --- a/migrations/seed.sql +++ b/migrations/seed.sql @@ -1,3 +1,9 @@ +BEGIN; +INSERT OR REPLACE INTO users +(buck_id, discord_id, display_name, name_num, last_seen_timestamp, last_attended_timestamp, added_to_mailinglist, student, alum, employee, faculty, is_admin) +VALUES +(500123456, NULL, 'Brutus Buckeye', 'buckeye.1', NULL, NULL, 1,1,0,0,0,1); + INSERT OR REPLACE INTO users (buck_id, discord_id, display_name, name_num, last_seen_timestamp, last_attended_timestamp, added_to_mailinglist, student, alum, employee, faculty) VALUES @@ -1001,3 +1007,4 @@ VALUES (525119038,NULL,'Rickie Cheetam','cheetam.4576',1684794159,1652435455,0,1,0,1,0), (506436165,6536698969953349102,'Brook Andreu','andreu.3878',1638836524,1651666692,0,1,1,1,0), (533335732,NULL,'Gale Biggins','biggins.3347',1655272710,1663024697,1,1,0,0,1); +COMMIT; diff --git a/templates/index.html.tpl b/templates/index.html.tpl index c4845b2..5e0b087 100644 --- a/templates/index.html.tpl +++ b/templates/index.html.tpl @@ -78,5 +78,20 @@ + {{ if .isAdmin }} +
+
Admin Dashboard
+
+

+ You are an admin. Click + here to go to the admin page. +

+
+
+ {{ end }} {{ end }} From f89b57d58a40e47901dac94aebb35ec63d7073d2 Mon Sep 17 00:00:00 2001 From: Haoling_Zhou Date: Thu, 2 Oct 2025 18:16:03 -0400 Subject: [PATCH 02/11] fixed lint --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 5f6ddd0..0702388 100644 --- a/main.go +++ b/main.go @@ -148,7 +148,7 @@ func (r *Router) index(w http.ResponseWriter, req *http.Request) { var nameNum string var discordId sql.NullString var isOnMailingList bool - var isAdmin bool + var isAdmin bool err := row.Scan(&nameNum, &discordId, &isOnMailingList, &isAdmin) if err != nil { log.Println("Failed to get user:", err, userId) From 8a99e97ed6613484751b284ac6d32b6786e48d53 Mon Sep 17 00:00:00 2001 From: Haoling_Zhou Date: Thu, 2 Oct 2025 18:17:49 -0400 Subject: [PATCH 03/11] fixed lint --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 0702388..fe3ab5f 100644 --- a/main.go +++ b/main.go @@ -191,7 +191,7 @@ func (r *Router) index(w http.ResponseWriter, req *http.Request) { "canAttend": canAttend, "hasLinkedDiscord": discordId.Valid, "isOnMailingList": isOnMailingList, - "isAdmin": isAdmin, + "isAdmin": isAdmin, }) if err != nil { log.Println("Failed to render template:", err) From 85ada1e1e55f80d3bf1bb01f032a2a398b31b062 Mon Sep 17 00:00:00 2001 From: Haoling_Zhou Date: Thu, 9 Oct 2025 10:51:01 -0400 Subject: [PATCH 04/11] add raw ugly table --- .vote.go.swp | Bin 0 -> 16384 bytes Dockerfile | 2 +- docker-compose-saml.yaml | 4 +--- main.go | 3 ++- templates/admin-vote-edit-partial.html.tpl | 23 +++++++++++++++++---- templates/admin-vote-edit.html.tpl | 10 --------- 6 files changed, 23 insertions(+), 19 deletions(-) create mode 100644 .vote.go.swp diff --git a/.vote.go.swp b/.vote.go.swp new file mode 100644 index 0000000000000000000000000000000000000000..fb8ef9d541536dfb4479c5b00838a2240aad6244 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/Dockerfile b/Dockerfile index 452c3e4..3b04483 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,5 +16,5 @@ COPY --from=0 /app/main main COPY keys/sp-cert.pem keys/sp-cert.pem COPY keys/sp-key.pem keys/sp-key.pem COPY .env .env -ENV ENV=prod +ENV ENV="" CMD ["/app/main"] diff --git a/docker-compose-saml.yaml b/docker-compose-saml.yaml index c85faee..f9bc232 100644 --- a/docker-compose-saml.yaml +++ b/docker-compose-saml.yaml @@ -1,15 +1,13 @@ services: auth: ports: - - 443:443 + - 3000:3000 build: dockerfile: Dockerfile.dev command: air volumes: - ./keys:/app/keys - ./tlskeys:/app/tlskeys - environment: - - ENV=saml develop: watch: - action: sync diff --git a/main.go b/main.go index fe3ab5f..0563e39 100644 --- a/main.go +++ b/main.go @@ -537,7 +537,8 @@ func main() { } jwtSecret := os.Getenv("JWT_SECRET") - if jwtSecret == "" { + if jwtSecret == "" {os.Getenv("ENV") + if authEnvironment != "" && authEnvironment != "saml" { log.Fatalln("JWT_SECRET not set") } diff --git a/templates/admin-vote-edit-partial.html.tpl b/templates/admin-vote-edit-partial.html.tpl index cff4051..f5a70da 100644 --- a/templates/admin-vote-edit-partial.html.tpl +++ b/templates/admin-vote-edit-partial.html.tpl @@ -34,10 +34,28 @@ hx-patch="/admin/vote/{{ .electionId }}" />

Candidates

-
    + + + + + + + + {{ range.candidates }} + + + + + + {{ + end + }} + +
    NameVote CountPercentage
    {{ .Name }}{{ .Votes }}1
    +
    • - {{ - end - }}