Fix poll vote submission failure and add pridecorner.ca nginx routing

Users could not submit scheduling poll votes when an invalid or partial
email was entered — Zod rejected empty strings and non-email text with a
generic validation error. Added client-side email validation in both
SchedulingPollPage and SchedulingPollWidget, plus z.preprocess() on the
backend to coerce empty strings to undefined. Also added pridecorner.ca
to all nginx server blocks and added generate_nginx_configs() to
config.sh so template-based configs are generated during setup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-02 14:15:26 -07:00
parent 62f906d6f0
commit f57a6d07f5
6 changed files with 53 additions and 12 deletions

View File

@@ -1,6 +1,6 @@
server {
listen 80;
server_name api.cmlite.org api.betteredmonton.org;
server_name api.cmlite.org api.betteredmonton.org api.pridecorner.ca;
add_header X-Frame-Options "SAMEORIGIN" always;
# Media API endpoints (must come BEFORE / for longest prefix match)

View File

@@ -40,7 +40,7 @@ server {
# Grafana — allows iframe embedding from admin (app.cmlite.org)
server {
listen 80;
server_name grafana.cmlite.org grafana.betteredmonton.org;
server_name grafana.cmlite.org grafana.betteredmonton.org grafana.pridecorner.ca;
add_header Content-Security-Policy "frame-ancestors 'self' app.cmlite.org app.betteredmonton.org" always;
location / {
@@ -59,7 +59,7 @@ server {
# NocoDB (data browser) — allows iframe embedding from admin
server {
listen 80;
server_name db.cmlite.org db.betteredmonton.org;
server_name db.cmlite.org db.betteredmonton.org db.pridecorner.ca;
add_header Content-Security-Policy "frame-ancestors 'self' app.cmlite.org app.betteredmonton.org" always;
location / {
@@ -76,7 +76,7 @@ server {
# Listmonk
server {
listen 80;
server_name listmonk.cmlite.org listmonk.betteredmonton.org;
server_name listmonk.cmlite.org listmonk.betteredmonton.org listmonk.pridecorner.ca;
add_header X-Frame-Options "SAMEORIGIN" always;
location / {
@@ -92,7 +92,7 @@ server {
# MkDocs — allows iframe embedding from admin
server {
listen 80;
server_name docs.cmlite.org docs.betteredmonton.org;
server_name docs.cmlite.org docs.betteredmonton.org docs.pridecorner.ca;
add_header Content-Security-Policy "frame-ancestors 'self' app.cmlite.org app.betteredmonton.org" always;
location / {
@@ -207,7 +207,7 @@ server {
# Rocket.Chat (team chat) — allows iframe embedding from admin
server {
listen 80;
server_name chat.cmlite.org chat.betteredmonton.org;
server_name chat.cmlite.org chat.betteredmonton.org chat.pridecorner.ca;
add_header Content-Security-Policy "frame-ancestors 'self' app.cmlite.org app.betteredmonton.org" always;
location / {
@@ -246,7 +246,7 @@ server {
# Jitsi Meet (video conferencing) — allows iframe embedding from admin (app.cmlite.org)
server {
listen 80;
server_name meet.cmlite.org meet.betteredmonton.org;
server_name meet.cmlite.org meet.betteredmonton.org meet.pridecorner.ca;
add_header Content-Security-Policy "frame-ancestors 'self' app.cmlite.org app.betteredmonton.org" always;
location / {
@@ -366,7 +366,7 @@ server {
# Admin GUI — app subdomain
server {
listen 80;
server_name app.cmlite.org app.betteredmonton.org;
server_name app.cmlite.org app.betteredmonton.org app.pridecorner.ca;
add_header X-Frame-Options "SAMEORIGIN" always;
# Social media bot detection for OG meta tags
@@ -513,7 +513,7 @@ server {
# Root domain — routes to admin GUI (supports custom DOMAIN env var)
server {
listen 80;
server_name betteredmonton.org;
server_name betteredmonton.org pridecorner.ca;
add_header X-Frame-Options "SAMEORIGIN" always;
location / {