From d010993994da17b9de7844227415282e1b30570b Mon Sep 17 00:00:00 2001 From: bunker-admin Date: Tue, 7 Apr 2026 16:50:20 -0600 Subject: [PATCH] Add pagination to public endpoints, Pangolin site picker, and docs editor toolbar - Paginate public APIs: campaigns, petitions, shifts, products, pages, shop - Add safety caps (take limits) to gallery ads, cuts, plans, donation pages - Add Pangolin connect-site endpoint with .env writer and site ID validation - Add formatting toolbar + keyboard shortcuts to shared doc editor - Fix Dockerfile to support su-exec privilege dropping for mounted volumes - Fix duplicate WebSocket headers in nginx API location block - Update MkDocs site build and social card assets Bunker Admin --- .../src/components/docs/DocsEditorToolbar.tsx | 129 + admin/src/components/docs/mkdocs-snippets.ts | 117 + .../payments/ProductInsertModal.tsx | 4 +- .../src/components/payments/ProductWidget.tsx | 4 +- admin/src/pages/DocsPage.tsx | 121 +- admin/src/pages/MkDocsSettingsPage.tsx | 4 +- admin/src/pages/PangolinPage.tsx | 203 +- .../pages/media/AdAnalyticsDashboardPage.tsx | 3 +- admin/src/pages/public/CampaignsListPage.tsx | 22 +- admin/src/pages/public/PagesIndexPage.tsx | 26 +- admin/src/pages/public/PetitionsListPage.tsx | 36 +- .../src/pages/public/SharedDocEditorPage.tsx | 66 +- admin/src/pages/public/ShiftsPage.tsx | 22 +- admin/src/pages/public/ShopPage.tsx | 28 +- admin/src/types/api.ts | 21 + api/Dockerfile | 8 +- .../migration.sql | 3 + .../gallery-ads/gallery-ads.service.ts | 1 + .../campaigns/campaigns-public.routes.ts | 10 +- .../influence/campaigns/campaigns.service.ts | 31 +- .../petitions/petitions-public.routes.ts | 10 +- .../influence/petitions/petitions.service.ts | 41 +- api/src/modules/map/cuts/cuts.routes.ts | 7 +- api/src/modules/map/cuts/cuts.service.ts | 3 +- api/src/modules/map/shifts/shifts.routes.ts | 10 +- api/src/modules/map/shifts/shifts.service.ts | 57 +- api/src/modules/pages/pages-public.routes.ts | 40 +- api/src/modules/pangolin/pangolin.routes.ts | 117 +- .../payments/donation-pages-public.routes.ts | 7 +- .../payments/donation-pages.service.ts | 3 +- .../payments/payments-public.routes.ts | 15 +- api/src/modules/payments/plans.service.ts | 3 +- api/src/modules/payments/products.service.ts | 25 +- .../social/assets/images/social/404.png | Bin 69240 -> 26255 bytes .../03/22/introducing-changemaker-lite-v2.png | Bin 78985 -> 35744 bytes .../2026/03/27/test-blog-post---version-7.png | Bin 75290 -> 32212 bytes .../images/social/blog/archive/2026.png | Bin 64490 -> 21044 bytes .../social/blog/category/announcements.png | Bin 68396 -> 25416 bytes .../images/social/blog/category/platform.png | Bin 64408 -> 21252 bytes .../images/social/blog/category/testing.png | Bin 64697 -> 21820 bytes .../assets/images/social/blog/index.png | Bin 64756 -> 20392 bytes .../images/social/comments/callback.png | Bin 64477 -> 21176 bytes .../social/docs/admin/advocacy/campaigns.png | Bin 81434 -> 38340 bytes .../docs/admin/advocacy/email-queue.png | Bin 65369 -> 22466 bytes .../social/docs/admin/advocacy/index.png | Bin 68951 -> 26033 bytes .../docs/admin/advocacy/representatives.png | Bin 70329 -> 27391 bytes .../social/docs/admin/advocacy/responses.png | Bin 76661 -> 33543 bytes .../docs/admin/broadcast/email-templates.png | Bin 68252 -> 25384 bytes .../social/docs/admin/broadcast/index.png | Bin 70530 -> 27848 bytes .../docs/admin/broadcast/newsletter.png | Bin 74906 -> 31638 bytes .../social/docs/admin/broadcast/sms.png | Bin 77276 -> 34034 bytes .../images/social/docs/admin/dashboard.png | Bin 70885 -> 28075 bytes .../assets/images/social/docs/admin/index.png | Bin 70130 -> 27160 bytes .../images/social/docs/admin/map/areas.png | Bin 72831 -> 29777 bytes .../social/docs/admin/map/canvassing.png | Bin 70588 -> 27674 bytes .../social/docs/admin/map/data-quality.png | Bin 69165 -> 26189 bytes .../images/social/docs/admin/map/index.png | Bin 74009 -> 30913 bytes .../social/docs/admin/map/locations.png | Bin 66758 -> 24048 bytes .../images/social/docs/admin/map/settings.png | Bin 74393 -> 31208 bytes .../images/social/docs/admin/map/shifts.png | Bin 67649 -> 24517 bytes .../images/social/docs/admin/media/ads.png | Bin 71486 -> 28639 bytes .../social/docs/admin/media/analytics.png | Bin 70053 -> 27211 bytes .../social/docs/admin/media/curated.png | Bin 71637 -> 28736 bytes .../images/social/docs/admin/media/index.png | Bin 66646 -> 23454 bytes .../social/docs/admin/media/library.png | Bin 68261 -> 24770 bytes .../social/docs/admin/media/moderation.png | Bin 68917 -> 26135 bytes .../social/docs/admin/payments/donations.png | Bin 68503 -> 25744 bytes .../social/docs/admin/payments/index.png | Bin 69232 -> 26416 bytes .../social/docs/admin/payments/plans.png | Bin 63964 -> 20513 bytes .../social/docs/admin/payments/products.png | Bin 68892 -> 26170 bytes .../social/docs/admin/payments/settings.png | Bin 75544 -> 32424 bytes .../social/docs/admin/people-access.png | Bin 69536 -> 26813 bytes .../social/docs/admin/services/crowdsec.png | Bin 83783 -> 40857 bytes .../social/docs/admin/services/index.png | Bin 65862 -> 23064 bytes .../docs/admin/services/integrations.png | Bin 72809 -> 29755 bytes .../social/docs/admin/services/monitoring.png | Bin 68232 -> 25036 bytes .../social/docs/admin/services/tunnel.png | Bin 71164 -> 28155 bytes .../docs/admin/services/user-provisioning.png | Bin 68349 -> 25468 bytes .../images/social/docs/admin/settings.png | Bin 75069 -> 32028 bytes .../social/docs/admin/web/documentation.png | Bin 70880 -> 27873 bytes .../images/social/docs/admin/web/homepage.png | Bin 74214 -> 31120 bytes .../images/social/docs/admin/web/index.png | Bin 69891 -> 26864 bytes .../social/docs/admin/web/landing-pages.png | Bin 68641 -> 25785 bytes .../social/docs/admin/web/navigation.png | Bin 71566 -> 28566 bytes .../assets/images/social/docs/api/index.png | Bin 74512 -> 29475 bytes .../images/social/docs/architecture/index.png | Bin 69841 -> 24900 bytes .../images/social/docs/deployment/index.png | Bin 72292 -> 27498 bytes .../docs/getting-started/control-panel.png | Bin 72355 -> 29391 bytes .../getting-started/environment-variables.png | Bin 73564 -> 29066 bytes .../social/docs/getting-started/features.png | Bin 68519 -> 25745 bytes .../docs/getting-started/first-steps.png | Bin 68355 -> 25639 bytes .../social/docs/getting-started/index.png | Bin 70055 -> 25750 bytes .../docs/getting-started/installation.png | Bin 67832 -> 24631 bytes .../docs/getting-started/prerequisites.png | Bin 0 -> 40285 bytes .../social/docs/getting-started/services.png | Bin 71011 -> 27990 bytes .../social/docs/getting-started/upgrades.png | Bin 71301 -> 28439 bytes .../assets/images/social/docs/index.png | Bin 71285 -> 26886 bytes .../social/assets/images/social/docs/phil.png | Bin 69887 -> 26859 bytes .../images/social/docs/services/index.png | Bin 72726 -> 27794 bytes .../social/docs/troubleshooting/index.png | Bin 72676 -> 28259 bytes .../social/docs/user-guide/campaigns.png | Bin 70610 -> 27827 bytes .../social/docs/user-guide/donations.png | Bin 68827 -> 26077 bytes .../images/social/docs/user-guide/events.png | Bin 75084 -> 32066 bytes .../images/social/docs/user-guide/gallery.png | Bin 68035 -> 25200 bytes .../images/social/docs/user-guide/index.png | Bin 66779 -> 23958 bytes .../images/social/docs/user-guide/map.png | Bin 65131 -> 21433 bytes .../images/social/docs/user-guide/profile.png | Bin 80320 -> 37405 bytes .../images/social/docs/user-guide/shifts.png | Bin 68456 -> 25304 bytes .../images/social/docs/user-guide/shop.png | Bin 70160 -> 27386 bytes .../social/docs/volunteer/achievements.png | Bin 81026 -> 37839 bytes .../social/docs/volunteer/canvassing.png | Bin 72312 -> 29300 bytes .../images/social/docs/volunteer/index.png | Bin 70735 -> 27781 bytes .../images/social/docs/volunteer/shifts.png | Bin 69026 -> 26249 bytes .../images/social/docs/volunteer/social.png | Bin 75071 -> 32045 bytes .../images/social/includes/abbreviations.png | Bin 69735 -> 26779 bytes .../social/assets/images/social/index.png | Bin 64317 -> 19685 bytes .../social/assets/images/social/lander.png | Bin 64979 -> 20574 bytes .../social/assets/images/social/main.png | Bin 63797 -> 18850 bytes .../integrations/analytics/custom.png | Bin 65590 -> 21840 bytes .../social/assets/images/social/test-page.png | Bin 66077 -> 23368 bytes .../social/assets/images/social/test.png | Bin 62892 -> 19112 bytes mkdocs/.cache/plugin/social/manifest.json | 175 +- mkdocs/docs/assets/favicon.svg | 1 + mkdocs/docs/assets/logo.svg | 1 + .../repo-data/admin-changemaker.lite.json | 4 +- .../repo-data/anthropics-claude-code.json | 10 +- .../assets/repo-data/coder-code-server.json | 10 +- .../repo-data/gethomepage-homepage.json | 10 +- .../docs/assets/repo-data/go-gitea-gitea.json | 10 +- .../docs/assets/repo-data/knadh-listmonk.json | 10 +- .../docs/assets/repo-data/lyqht-mini-qr.json | 6 +- mkdocs/docs/assets/repo-data/n8n-io-n8n.json | 10 +- .../docs/assets/repo-data/nocodb-nocodb.json | 10 +- .../docs/assets/repo-data/ollama-ollama.json | 10 +- .../repo-data/squidfunk-mkdocs-material.json | 8 +- .../getting-started/environment-variables.md | 142 +- mkdocs/docs/docs/getting-started/index.md | 1 + .../docs/docs/getting-started/installation.md | 9 + .../docs/getting-started/prerequisites.md | 196 ++ mkdocs/docs/overrides/lander.html | 83 +- mkdocs/docs/test.md | 4 +- mkdocs/mkdocs.yml | 16 +- mkdocs/mkdocs.yml.bak | 20 +- mkdocs/site/404.html | 135 +- mkdocs/site/404/index.html | 137 +- mkdocs/site/assets/favicon.svg | 1 + mkdocs/site/assets/images/social/404.png | Bin 69240 -> 26255 bytes .../03/22/introducing-changemaker-lite-v2.png | Bin 78985 -> 35744 bytes .../2026/03/27/test-blog-post---version-7.png | Bin 75290 -> 32212 bytes .../images/social/blog/archive/2026.png | Bin 64490 -> 21044 bytes .../social/blog/category/announcements.png | Bin 68396 -> 25416 bytes .../images/social/blog/category/platform.png | Bin 64408 -> 21252 bytes .../images/social/blog/category/testing.png | Bin 64697 -> 21820 bytes .../site/assets/images/social/blog/index.png | Bin 64756 -> 20392 bytes .../images/social/comments/callback.png | Bin 64477 -> 21176 bytes .../social/docs/admin/advocacy/campaigns.png | Bin 81434 -> 38340 bytes .../docs/admin/advocacy/email-queue.png | Bin 65369 -> 22466 bytes .../social/docs/admin/advocacy/index.png | Bin 68951 -> 26033 bytes .../docs/admin/advocacy/representatives.png | Bin 70329 -> 27391 bytes .../social/docs/admin/advocacy/responses.png | Bin 76661 -> 33543 bytes .../docs/admin/broadcast/email-templates.png | Bin 68252 -> 25384 bytes .../social/docs/admin/broadcast/index.png | Bin 70530 -> 27848 bytes .../docs/admin/broadcast/newsletter.png | Bin 74906 -> 31638 bytes .../social/docs/admin/broadcast/sms.png | Bin 77276 -> 34034 bytes .../images/social/docs/admin/dashboard.png | Bin 70885 -> 28075 bytes .../assets/images/social/docs/admin/index.png | Bin 70130 -> 27160 bytes .../images/social/docs/admin/map/areas.png | Bin 72831 -> 29777 bytes .../social/docs/admin/map/canvassing.png | Bin 70588 -> 27674 bytes .../social/docs/admin/map/data-quality.png | Bin 69165 -> 26189 bytes .../images/social/docs/admin/map/index.png | Bin 74009 -> 30913 bytes .../social/docs/admin/map/locations.png | Bin 66758 -> 24048 bytes .../images/social/docs/admin/map/settings.png | Bin 74393 -> 31208 bytes .../images/social/docs/admin/map/shifts.png | Bin 67649 -> 24517 bytes .../images/social/docs/admin/media/ads.png | Bin 71486 -> 28639 bytes .../social/docs/admin/media/analytics.png | Bin 70053 -> 27211 bytes .../social/docs/admin/media/curated.png | Bin 71637 -> 28736 bytes .../images/social/docs/admin/media/index.png | Bin 66646 -> 23454 bytes .../social/docs/admin/media/library.png | Bin 68261 -> 24770 bytes .../social/docs/admin/media/moderation.png | Bin 68917 -> 26135 bytes .../social/docs/admin/payments/donations.png | Bin 68503 -> 25744 bytes .../social/docs/admin/payments/index.png | Bin 69232 -> 26416 bytes .../social/docs/admin/payments/plans.png | Bin 63964 -> 20513 bytes .../social/docs/admin/payments/products.png | Bin 68892 -> 26170 bytes .../social/docs/admin/payments/settings.png | Bin 75544 -> 32424 bytes .../social/docs/admin/people-access.png | Bin 69536 -> 26813 bytes .../social/docs/admin/services/crowdsec.png | Bin 83783 -> 40857 bytes .../social/docs/admin/services/index.png | Bin 65862 -> 23064 bytes .../docs/admin/services/integrations.png | Bin 72809 -> 29755 bytes .../social/docs/admin/services/monitoring.png | Bin 68232 -> 25036 bytes .../social/docs/admin/services/tunnel.png | Bin 71164 -> 28155 bytes .../docs/admin/services/user-provisioning.png | Bin 68349 -> 25468 bytes .../images/social/docs/admin/settings.png | Bin 75069 -> 32028 bytes .../social/docs/admin/web/documentation.png | Bin 70880 -> 27873 bytes .../images/social/docs/admin/web/homepage.png | Bin 74214 -> 31120 bytes .../images/social/docs/admin/web/index.png | Bin 69891 -> 26864 bytes .../social/docs/admin/web/landing-pages.png | Bin 68641 -> 25785 bytes .../social/docs/admin/web/navigation.png | Bin 71566 -> 28566 bytes .../assets/images/social/docs/api/index.png | Bin 74512 -> 29475 bytes .../images/social/docs/architecture/index.png | Bin 69841 -> 24900 bytes .../images/social/docs/deployment/index.png | Bin 72292 -> 27498 bytes .../docs/getting-started/control-panel.png | Bin 72355 -> 29391 bytes .../getting-started/environment-variables.png | Bin 73564 -> 29066 bytes .../social/docs/getting-started/features.png | Bin 68519 -> 25745 bytes .../docs/getting-started/first-steps.png | Bin 68355 -> 25639 bytes .../social/docs/getting-started/index.png | Bin 70055 -> 25750 bytes .../docs/getting-started/installation.png | Bin 67832 -> 24631 bytes .../docs/getting-started/prerequisites.png | Bin 0 -> 40285 bytes .../social/docs/getting-started/services.png | Bin 71011 -> 27990 bytes .../social/docs/getting-started/upgrades.png | Bin 71301 -> 28439 bytes .../site/assets/images/social/docs/index.png | Bin 71285 -> 26886 bytes .../site/assets/images/social/docs/phil.png | Bin 69887 -> 26859 bytes .../images/social/docs/services/index.png | Bin 72726 -> 27794 bytes .../social/docs/troubleshooting/index.png | Bin 72676 -> 28259 bytes .../social/docs/user-guide/campaigns.png | Bin 70610 -> 27827 bytes .../social/docs/user-guide/donations.png | Bin 68827 -> 26077 bytes .../images/social/docs/user-guide/events.png | Bin 75084 -> 32066 bytes .../images/social/docs/user-guide/gallery.png | Bin 68035 -> 25200 bytes .../images/social/docs/user-guide/index.png | Bin 66779 -> 23958 bytes .../images/social/docs/user-guide/map.png | Bin 65131 -> 21433 bytes .../images/social/docs/user-guide/profile.png | Bin 80320 -> 37405 bytes .../images/social/docs/user-guide/shifts.png | Bin 68456 -> 25304 bytes .../images/social/docs/user-guide/shop.png | Bin 70160 -> 27386 bytes .../social/docs/volunteer/achievements.png | Bin 81026 -> 37839 bytes .../social/docs/volunteer/canvassing.png | Bin 72312 -> 29300 bytes .../images/social/docs/volunteer/index.png | Bin 70735 -> 27781 bytes .../images/social/docs/volunteer/shifts.png | Bin 69026 -> 26249 bytes .../images/social/docs/volunteer/social.png | Bin 75071 -> 32045 bytes .../images/social/includes/abbreviations.png | Bin 69735 -> 26779 bytes mkdocs/site/assets/images/social/index.png | Bin 64317 -> 19685 bytes mkdocs/site/assets/images/social/lander.png | Bin 64979 -> 20574 bytes mkdocs/site/assets/images/social/main.png | Bin 63797 -> 18850 bytes .../integrations/analytics/custom.png | Bin 65590 -> 21840 bytes .../site/assets/images/social/test-page.png | Bin 66077 -> 23368 bytes mkdocs/site/assets/images/social/test.png | Bin 62892 -> 19112 bytes mkdocs/site/assets/logo.svg | 1 + .../repo-data/admin-changemaker.lite.json | 4 +- .../repo-data/anthropics-claude-code.json | 10 +- .../assets/repo-data/coder-code-server.json | 10 +- .../repo-data/gethomepage-homepage.json | 10 +- .../site/assets/repo-data/go-gitea-gitea.json | 10 +- .../site/assets/repo-data/knadh-listmonk.json | 10 +- .../site/assets/repo-data/lyqht-mini-qr.json | 6 +- mkdocs/site/assets/repo-data/n8n-io-n8n.json | 10 +- .../site/assets/repo-data/nocodb-nocodb.json | 10 +- .../site/assets/repo-data/ollama-ollama.json | 10 +- .../repo-data/squidfunk-mkdocs-material.json | 8 +- .../index.html | 137 +- .../27/test-blog-post---version-7/index.html | 137 +- mkdocs/site/blog/archive/2026/index.html | 135 +- .../blog/category/announcements/index.html | 135 +- mkdocs/site/blog/category/platform/index.html | 135 +- mkdocs/site/blog/category/testing/index.html | 135 +- mkdocs/site/blog/index.html | 135 +- mkdocs/site/comments/callback/index.html | 137 +- .../docs/admin/advocacy/campaigns/index.html | 139 +- .../admin/advocacy/email-queue/index.html | 139 +- mkdocs/site/docs/admin/advocacy/index.html | 139 +- .../admin/advocacy/representatives/index.html | 139 +- .../docs/admin/advocacy/responses/index.html | 139 +- .../broadcast/email-templates/index.html | 139 +- mkdocs/site/docs/admin/broadcast/index.html | 139 +- .../admin/broadcast/newsletter/index.html | 139 +- .../site/docs/admin/broadcast/sms/index.html | 139 +- mkdocs/site/docs/admin/dashboard/index.html | 139 +- mkdocs/site/docs/admin/index.html | 139 +- mkdocs/site/docs/admin/map/areas/index.html | 139 +- .../site/docs/admin/map/canvassing/index.html | 139 +- .../docs/admin/map/data-quality/index.html | 139 +- mkdocs/site/docs/admin/map/index.html | 139 +- .../site/docs/admin/map/locations/index.html | 139 +- .../site/docs/admin/map/settings/index.html | 139 +- mkdocs/site/docs/admin/map/shifts/index.html | 139 +- mkdocs/site/docs/admin/media/ads/index.html | 139 +- .../docs/admin/media/analytics/index.html | 139 +- .../site/docs/admin/media/curated/index.html | 139 +- mkdocs/site/docs/admin/media/index.html | 139 +- .../site/docs/admin/media/library/index.html | 139 +- .../docs/admin/media/moderation/index.html | 139 +- .../docs/admin/payments/donations/index.html | 139 +- mkdocs/site/docs/admin/payments/index.html | 139 +- .../site/docs/admin/payments/plans/index.html | 139 +- .../docs/admin/payments/products/index.html | 139 +- .../docs/admin/payments/settings/index.html | 139 +- .../site/docs/admin/people-access/index.html | 139 +- .../docs/admin/services/crowdsec/index.html | 139 +- mkdocs/site/docs/admin/services/index.html | 139 +- .../admin/services/integrations/index.html | 139 +- .../docs/admin/services/monitoring/index.html | 139 +- .../docs/admin/services/tunnel/index.html | 139 +- .../services/user-provisioning/index.html | 139 +- mkdocs/site/docs/admin/settings/index.html | 139 +- .../docs/admin/web/documentation/index.html | 139 +- .../site/docs/admin/web/homepage/index.html | 139 +- mkdocs/site/docs/admin/web/index.html | 139 +- .../docs/admin/web/landing-pages/index.html | 139 +- .../site/docs/admin/web/navigation/index.html | 139 +- mkdocs/site/docs/api/index.html | 139 +- mkdocs/site/docs/architecture/index.html | 139 +- mkdocs/site/docs/deployment/index.html | 139 +- .../getting-started/control-panel/index.html | 169 +- .../environment-variables/index.html | 842 ++++- .../docs/getting-started/features/index.html | 169 +- .../getting-started/first-steps/index.html | 169 +- mkdocs/site/docs/getting-started/index.html | 176 +- .../getting-started/installation/index.html | 183 +- .../getting-started/prerequisites/index.html | 3134 +++++++++++++++++ .../docs/getting-started/services/index.html | 169 +- .../docs/getting-started/upgrades/index.html | 169 +- mkdocs/site/docs/index.html | 139 +- mkdocs/site/docs/phil/index.html | 139 +- mkdocs/site/docs/services/index.html | 139 +- mkdocs/site/docs/troubleshooting/index.html | 139 +- .../site/docs/user-guide/campaigns/index.html | 139 +- .../site/docs/user-guide/donations/index.html | 139 +- mkdocs/site/docs/user-guide/events/index.html | 139 +- .../site/docs/user-guide/gallery/index.html | 139 +- mkdocs/site/docs/user-guide/index.html | 139 +- mkdocs/site/docs/user-guide/map/index.html | 139 +- .../site/docs/user-guide/profile/index.html | 139 +- mkdocs/site/docs/user-guide/shifts/index.html | 139 +- mkdocs/site/docs/user-guide/shop/index.html | 139 +- .../docs/volunteer/achievements/index.html | 139 +- .../site/docs/volunteer/canvassing/index.html | 139 +- mkdocs/site/docs/volunteer/index.html | 139 +- mkdocs/site/docs/volunteer/shifts/index.html | 139 +- mkdocs/site/docs/volunteer/social/index.html | 139 +- mkdocs/site/includes/abbreviations/index.html | 137 +- mkdocs/site/index.html | 83 +- mkdocs/site/lander/index.html | 83 +- mkdocs/site/main/index.html | 137 +- mkdocs/site/overrides/lander.html | 83 +- mkdocs/site/search/search_index.json | 2 +- mkdocs/site/sitemap.xml | 178 +- mkdocs/site/sitemap.xml.gz | Bin 860 -> 870 bytes mkdocs/site/tags.json | 2 +- mkdocs/site/test-page/index.html | 135 +- mkdocs/site/test/index.html | 137 +- nginx/conf.d/default.conf.template | 4 +- 338 files changed, 6579 insertions(+), 11740 deletions(-) create mode 100644 admin/src/components/docs/DocsEditorToolbar.tsx create mode 100644 admin/src/components/docs/mkdocs-snippets.ts create mode 100644 api/prisma/migrations/20260404100000_disable_public_map_by_default/migration.sql create mode 100644 mkdocs/.cache/plugin/social/assets/images/social/docs/getting-started/prerequisites.png create mode 100644 mkdocs/docs/assets/favicon.svg create mode 100644 mkdocs/docs/assets/logo.svg create mode 100644 mkdocs/docs/docs/getting-started/prerequisites.md create mode 100644 mkdocs/site/assets/favicon.svg create mode 100644 mkdocs/site/assets/images/social/docs/getting-started/prerequisites.png create mode 100644 mkdocs/site/assets/logo.svg create mode 100644 mkdocs/site/docs/getting-started/prerequisites/index.html diff --git a/admin/src/components/docs/DocsEditorToolbar.tsx b/admin/src/components/docs/DocsEditorToolbar.tsx new file mode 100644 index 00000000..f47a0a15 --- /dev/null +++ b/admin/src/components/docs/DocsEditorToolbar.tsx @@ -0,0 +1,129 @@ +import { useCallback } from 'react'; +import { Button, Dropdown, Tooltip } from 'antd'; +import { + BoldOutlined, + ItalicOutlined, + StrikethroughOutlined, + HighlightOutlined, + CodeOutlined, + FontSizeOutlined, + AlertOutlined, + PlusOutlined, + DownOutlined, + LinkOutlined, + FileMarkdownOutlined, + TableOutlined, +} from '@ant-design/icons'; +import type { editor as monacoEditor } from 'monaco-editor'; +import { SNIPPETS, PLATFORM_INSERT_IDS, applySnippet } from './mkdocs-snippets'; + +interface DocsEditorToolbarProps { + editorRef: React.RefObject; + monacoRef: React.RefObject; + /** If true, show platform-specific inserts (video card, donate, etc.) */ + showPlatformInserts?: boolean; + /** Custom handler for snippet IDs that need special treatment (modals, etc.) */ + onCustomSnippet?: (snippetId: string) => boolean; + /** Background color — defaults to transparent */ + background?: string; + /** Border color — defaults to rgba(255,255,255,0.08) */ + borderColor?: string; +} + +export default function DocsEditorToolbar({ + editorRef, + monacoRef, + showPlatformInserts = false, + onCustomSnippet, + background = 'transparent', + borderColor = 'rgba(255,255,255,0.08)', +}: DocsEditorToolbarProps) { + const handleSnippet = useCallback((snippetId: string) => { + if (onCustomSnippet?.(snippetId)) return; + + const snippet = SNIPPETS.find(s => s.id === snippetId); + if (!snippet || !editorRef.current || !monacoRef.current) return; + applySnippet(editorRef.current, snippet, monacoRef.current); + }, [editorRef, monacoRef, onCustomSnippet]); + + const insertSnippets = SNIPPETS.filter(s => + s.group === 'insert' && (showPlatformInserts || !PLATFORM_INSERT_IDS.has(s.id)) + ); + + const getInsertIcon = (id: string) => { + if (id === 'link') return ; + if (id === 'image') return ; + if (id === 'table') return ; + return ; + }; + + const btnStyle = { width: 26, height: 24 }; + + return ( +
+ + + + +
+ + s.group === 'heading').map(s => ({ key: s.id, label: s.label, icon: , onClick: () => handleSnippet(s.id) })) }} trigger={['click']}> + + + +
+ + s.group === 'admonition').map(s => ({ key: s.id, label: s.label, icon: , onClick: () => handleSnippet(s.id) })) }} trigger={['click']}> + + + + s.group === 'code').map(s => ({ key: s.id, label: s.label, icon: , onClick: () => handleSnippet(s.id) })) }} trigger={['click']}> + + + + ({ + key: s.id, + label: s.label, + icon: getInsertIcon(s.id), + onClick: () => handleSnippet(s.id), + })) }} trigger={['click']}> + + +
+ ); +} diff --git a/admin/src/components/docs/mkdocs-snippets.ts b/admin/src/components/docs/mkdocs-snippets.ts new file mode 100644 index 00000000..5d47f0db --- /dev/null +++ b/admin/src/components/docs/mkdocs-snippets.ts @@ -0,0 +1,117 @@ +import type { editor as monacoEditor } from 'monaco-editor'; + +export interface MkDocsSnippet { + id: string; + label: string; + group: 'formatting' | 'heading' | 'admonition' | 'code' | 'insert'; + type: 'wrap' | 'block' | 'insert'; + prefix?: string; + suffix?: string; + template?: string; + keybinding?: 'ctrl+b' | 'ctrl+i'; +} + +export const SNIPPETS: MkDocsSnippet[] = [ + // Formatting + { id: 'bold', label: 'Bold', group: 'formatting', type: 'wrap', prefix: '**', suffix: '**', keybinding: 'ctrl+b' }, + { id: 'italic', label: 'Italic', group: 'formatting', type: 'wrap', prefix: '*', suffix: '*', keybinding: 'ctrl+i' }, + { id: 'strikethrough', label: 'Strikethrough', group: 'formatting', type: 'wrap', prefix: '~~', suffix: '~~' }, + { id: 'highlight', label: 'Highlight', group: 'formatting', type: 'wrap', prefix: '==', suffix: '==' }, + { id: 'inline-code', label: 'Inline Code', group: 'formatting', type: 'wrap', prefix: '`', suffix: '`' }, + { id: 'kbd', label: 'Keyboard Key', group: 'formatting', type: 'wrap', prefix: '++', suffix: '++' }, + // Headings + { id: 'h1', label: 'Heading 1', group: 'heading', type: 'block', template: '# $CURSOR' }, + { id: 'h2', label: 'Heading 2', group: 'heading', type: 'block', template: '## $CURSOR' }, + { id: 'h3', label: 'Heading 3', group: 'heading', type: 'block', template: '### $CURSOR' }, + { id: 'h4', label: 'Heading 4', group: 'heading', type: 'block', template: '#### $CURSOR' }, + // Admonitions + ...(['note', 'warning', 'tip', 'danger', 'info', 'success', 'question', 'abstract', 'example', 'bug', 'quote'] as const).map((t) => ({ + id: `admonition-${t}`, + label: `${t.charAt(0).toUpperCase() + t.slice(1)}`, + group: 'admonition' as const, + type: 'block' as const, + template: `!!! ${t} "Title"\n Content here`, + })), + { id: 'admonition-collapsible-open', label: 'Collapsible (open)', group: 'admonition', type: 'block', template: '???+ note "Title"\n Content here' }, + { id: 'admonition-collapsible-closed', label: 'Collapsible (closed)', group: 'admonition', type: 'block', template: '??? note "Title"\n Content here' }, + // Code + { id: 'code-block', label: 'Code Block', group: 'code', type: 'block', template: '```python\n$CURSOR\n```' }, + { id: 'code-annotated', label: 'Annotated Code', group: 'code', type: 'block', template: '```python\ncode # (1)!\n```\n\n1. Annotation' }, + { id: 'mermaid', label: 'Mermaid Diagram', group: 'code', type: 'block', template: '```mermaid\ngraph LR\n A --> B\n```' }, + // Inserts (standard markdown — no auth required) + { id: 'link', label: 'Link', group: 'insert', type: 'wrap', prefix: '[', suffix: '](url)' }, + { id: 'image', label: 'Image', group: 'insert', type: 'insert', template: '![Alt text](image.png)' }, + { id: 'button', label: 'Button', group: 'insert', type: 'insert', template: '[Text](url){ .md-button }' }, + { id: 'button-primary', label: 'Primary Button', group: 'insert', type: 'insert', template: '[Text](url){ .md-button .md-button--primary }' }, + { id: 'icon', label: 'Material Icon', group: 'insert', type: 'insert', template: ':material-icon-name:' }, + { id: 'table', label: 'Table', group: 'insert', type: 'insert', template: '| Column 1 | Column 2 | Column 3 |\n| -------- | -------- | -------- |\n| Cell 1 | Cell 2 | Cell 3 |\n| Cell 4 | Cell 5 | Cell 6 |' }, + { id: 'tasklist', label: 'Task List', group: 'insert', type: 'insert', template: '- [ ] Task 1\n- [ ] Task 2\n- [x] Done' }, + { id: 'tabs', label: 'Tabs', group: 'insert', type: 'insert', template: '=== "Tab 1"\n\n Content\n\n=== "Tab 2"\n\n Content' }, + { id: 'math-block', label: 'Math Block', group: 'insert', type: 'block', template: '$$\n$CURSOR\n$$' }, + { id: 'footnote', label: 'Footnote', group: 'insert', type: 'insert', template: '[^1]\n\n[^1]: Text' }, + { id: 'def-list', label: 'Definition List', group: 'insert', type: 'insert', template: 'Term\n: Definition' }, + { id: 'hr', label: 'Horizontal Rule', group: 'insert', type: 'insert', template: '---' }, + // Platform-specific inserts (require auth — handled by DocsPage modals) + { id: 'video-card', label: 'Video Card', group: 'insert', type: 'insert', template: '' }, + { id: 'photo-insert', label: 'Photo', group: 'insert', type: 'insert', template: '' }, + { id: 'donate-button', label: 'Donate Button', group: 'insert', type: 'insert', template: '' }, + { id: 'pricing-table', label: 'Pricing Table', group: 'insert', type: 'insert', template: '' }, + { id: 'product-card', label: 'Product Card', group: 'insert', type: 'insert', template: '' }, + { id: 'ad-insert', label: 'Ad', group: 'insert', type: 'insert', template: '' }, + { id: 'scheduling-poll', label: 'Scheduling Poll', group: 'insert', type: 'insert', template: '' }, + { id: 'wiki-link', label: 'Wiki Link [[]]', group: 'insert', type: 'insert', template: '' }, +]; + +/** IDs of insert snippets that require authenticated API access (modal-based) */ +export const PLATFORM_INSERT_IDS = new Set([ + 'video-card', 'photo-insert', 'donate-button', 'pricing-table', + 'product-card', 'ad-insert', 'scheduling-poll', 'wiki-link', +]); + +export function applySnippet( + ed: monacoEditor.IStandaloneCodeEditor, + snippet: MkDocsSnippet, + monaco: typeof import('monaco-editor'), +) { + const sel = ed.getSelection(); + const model = ed.getModel(); + if (!sel || !model) return; + + const selectedText = model.getValueInRange(sel); + + if (snippet.type === 'wrap' && snippet.prefix != null && snippet.suffix != null) { + if (selectedText) { + ed.executeEdits('mkdocs-snippet', [{ + range: sel, + text: snippet.prefix + selectedText + snippet.suffix, + }]); + } else { + const placeholder = 'text'; + ed.executeEdits('mkdocs-snippet', [{ + range: sel, + text: snippet.prefix + placeholder + snippet.suffix, + }]); + const pos = sel.getStartPosition(); + const startCol = pos.column + snippet.prefix.length; + ed.setSelection(new monaco.Selection(pos.lineNumber, startCol, pos.lineNumber, startCol + placeholder.length)); + } + } else if (snippet.type === 'block' && snippet.template) { + const pos = sel.getStartPosition(); + let text = snippet.template.replace('$CURSOR', selectedText); + const lineContent = model.getLineContent(pos.lineNumber); + if (pos.column > 1 && lineContent.substring(0, pos.column - 1).trim().length > 0) { + text = '\n' + text; + } + ed.executeEdits('mkdocs-snippet', [{ + range: sel, + text, + }]); + } else if (snippet.type === 'insert' && snippet.template) { + ed.executeEdits('mkdocs-snippet', [{ + range: sel, + text: snippet.template, + }]); + } + + ed.focus(); +} diff --git a/admin/src/components/payments/ProductInsertModal.tsx b/admin/src/components/payments/ProductInsertModal.tsx index 92f409de..dc8444b3 100644 --- a/admin/src/components/payments/ProductInsertModal.tsx +++ b/admin/src/components/payments/ProductInsertModal.tsx @@ -35,8 +35,8 @@ export function ProductInsertModal({ open, onClose, onInsert }: ProductInsertMod if (open && products.length === 0) { setLoading(true); setError(null); - axios.get('/api/payments/products') - .then(({ data }) => setProducts(data)) + axios.get('/api/payments/products', { params: { limit: 50 } }) + .then(({ data }) => setProducts(data.products)) .catch(() => setError('Failed to load products')) .finally(() => setLoading(false)); } diff --git a/admin/src/components/payments/ProductWidget.tsx b/admin/src/components/payments/ProductWidget.tsx index 811e2722..1350e1af 100644 --- a/admin/src/components/payments/ProductWidget.tsx +++ b/admin/src/components/payments/ProductWidget.tsx @@ -21,9 +21,9 @@ export function ProductWidget({ productSlug, buttonText = 'Buy Now' }: ProductWi return; } - axios.get('/api/payments/products') + axios.get('/api/payments/products', { params: { limit: 50 } }) .then(({ data }) => { - const found = (data as Product[]).find(p => p.slug === productSlug); + const found = (data.products as Product[]).find(p => p.slug === productSlug); if (found) { setProduct(found); } else { diff --git a/admin/src/pages/DocsPage.tsx b/admin/src/pages/DocsPage.tsx index 55b98231..6b6466b0 100644 --- a/admin/src/pages/DocsPage.tsx +++ b/admin/src/pages/DocsPage.tsx @@ -329,68 +329,9 @@ function filterTree(nodes: FileNode[], query: string): FileNode[] { return filtered; } -// --- MkDocs Snippet System --- - -interface MkDocsSnippet { - id: string; - label: string; - group: 'formatting' | 'heading' | 'admonition' | 'code' | 'insert'; - type: 'wrap' | 'block' | 'insert'; - prefix?: string; - suffix?: string; - template?: string; - keybinding?: 'ctrl+b' | 'ctrl+i'; -} - -const SNIPPETS: MkDocsSnippet[] = [ - // Formatting - { id: 'bold', label: 'Bold', group: 'formatting', type: 'wrap', prefix: '**', suffix: '**', keybinding: 'ctrl+b' }, - { id: 'italic', label: 'Italic', group: 'formatting', type: 'wrap', prefix: '*', suffix: '*', keybinding: 'ctrl+i' }, - { id: 'strikethrough', label: 'Strikethrough', group: 'formatting', type: 'wrap', prefix: '~~', suffix: '~~' }, - { id: 'highlight', label: 'Highlight', group: 'formatting', type: 'wrap', prefix: '==', suffix: '==' }, - { id: 'inline-code', label: 'Inline Code', group: 'formatting', type: 'wrap', prefix: '`', suffix: '`' }, - { id: 'kbd', label: 'Keyboard Key', group: 'formatting', type: 'wrap', prefix: '++', suffix: '++' }, - // Headings - { id: 'h1', label: 'Heading 1', group: 'heading', type: 'block', template: '# $CURSOR' }, - { id: 'h2', label: 'Heading 2', group: 'heading', type: 'block', template: '## $CURSOR' }, - { id: 'h3', label: 'Heading 3', group: 'heading', type: 'block', template: '### $CURSOR' }, - { id: 'h4', label: 'Heading 4', group: 'heading', type: 'block', template: '#### $CURSOR' }, - // Admonitions - ...(['note', 'warning', 'tip', 'danger', 'info', 'success', 'question', 'abstract', 'example', 'bug', 'quote'] as const).map((t) => ({ - id: `admonition-${t}`, - label: `${t.charAt(0).toUpperCase() + t.slice(1)}`, - group: 'admonition' as const, - type: 'block' as const, - template: `!!! ${t} "Title"\n Content here`, - })), - { id: 'admonition-collapsible-open', label: 'Collapsible (open)', group: 'admonition', type: 'block', template: '???+ note "Title"\n Content here' }, - { id: 'admonition-collapsible-closed', label: 'Collapsible (closed)', group: 'admonition', type: 'block', template: '??? note "Title"\n Content here' }, - // Code - { id: 'code-block', label: 'Code Block', group: 'code', type: 'block', template: '```python\n$CURSOR\n```' }, - { id: 'code-annotated', label: 'Annotated Code', group: 'code', type: 'block', template: '```python\ncode # (1)!\n```\n\n1. Annotation' }, - { id: 'mermaid', label: 'Mermaid Diagram', group: 'code', type: 'block', template: '```mermaid\ngraph LR\n A --> B\n```' }, - // Inserts - { id: 'link', label: 'Link', group: 'insert', type: 'wrap', prefix: '[', suffix: '](url)' }, - { id: 'image', label: 'Image', group: 'insert', type: 'insert', template: '![Alt text](image.png)' }, - { id: 'button', label: 'Button', group: 'insert', type: 'insert', template: '[Text](url){ .md-button }' }, - { id: 'button-primary', label: 'Primary Button', group: 'insert', type: 'insert', template: '[Text](url){ .md-button .md-button--primary }' }, - { id: 'icon', label: 'Material Icon', group: 'insert', type: 'insert', template: ':material-icon-name:' }, - { id: 'table', label: 'Table', group: 'insert', type: 'insert', template: '| Column 1 | Column 2 | Column 3 |\n| -------- | -------- | -------- |\n| Cell 1 | Cell 2 | Cell 3 |\n| Cell 4 | Cell 5 | Cell 6 |' }, - { id: 'tasklist', label: 'Task List', group: 'insert', type: 'insert', template: '- [ ] Task 1\n- [ ] Task 2\n- [x] Done' }, - { id: 'tabs', label: 'Tabs', group: 'insert', type: 'insert', template: '=== "Tab 1"\n\n Content\n\n=== "Tab 2"\n\n Content' }, - { id: 'math-block', label: 'Math Block', group: 'insert', type: 'block', template: '$$\n$CURSOR\n$$' }, - { id: 'footnote', label: 'Footnote', group: 'insert', type: 'insert', template: '[^1]\n\n[^1]: Text' }, - { id: 'def-list', label: 'Definition List', group: 'insert', type: 'insert', template: 'Term\n: Definition' }, - { id: 'video-card', label: 'Video Card', group: 'insert', type: 'insert', template: '' }, - { id: 'photo-insert', label: 'Photo', group: 'insert', type: 'insert', template: '' }, - { id: 'donate-button', label: 'Donate Button', group: 'insert', type: 'insert', template: '' }, - { id: 'pricing-table', label: 'Pricing Table', group: 'insert', type: 'insert', template: '' }, - { id: 'product-card', label: 'Product Card', group: 'insert', type: 'insert', template: '' }, - { id: 'ad-insert', label: 'Ad', group: 'insert', type: 'insert', template: '' }, - { id: 'scheduling-poll', label: 'Scheduling Poll', group: 'insert', type: 'insert', template: '' }, - { id: 'wiki-link', label: 'Wiki Link [[]]', group: 'insert', type: 'insert', template: '' }, - { id: 'hr', label: 'Horizontal Rule', group: 'insert', type: 'insert', template: '---' }, -]; +// --- MkDocs Snippet System (shared) --- +import { SNIPPETS, applySnippet as applySnippetShared } from '@/components/docs/mkdocs-snippets'; +import type { MkDocsSnippet } from '@/components/docs/mkdocs-snippets'; // --- Inline Donate Block Generator --- // Produces HTML with data-role attributes for hydration by payment-widgets.js. @@ -523,55 +464,7 @@ function generateInlineProductHtml(o: InlineProductOpts): string { return lines.filter(Boolean).join('\n'); } -function applySnippet( - ed: monacoEditor.IStandaloneCodeEditor, - snippet: MkDocsSnippet, - monaco: typeof import('monaco-editor'), -) { - const sel = ed.getSelection(); - const model = ed.getModel(); - if (!sel || !model) return; - - const selectedText = model.getValueInRange(sel); - - if (snippet.type === 'wrap' && snippet.prefix != null && snippet.suffix != null) { - if (selectedText) { - ed.executeEdits('mkdocs-snippet', [{ - range: sel, - text: snippet.prefix + selectedText + snippet.suffix, - }]); - } else { - const placeholder = 'text'; - ed.executeEdits('mkdocs-snippet', [{ - range: sel, - text: snippet.prefix + placeholder + snippet.suffix, - }]); - // Select the placeholder so user can type over it - const pos = sel.getStartPosition(); - const startCol = pos.column + snippet.prefix.length; - ed.setSelection(new monaco.Selection(pos.lineNumber, startCol, pos.lineNumber, startCol + placeholder.length)); - } - } else if (snippet.type === 'block' && snippet.template) { - const pos = sel.getStartPosition(); - let text = snippet.template.replace('$CURSOR', selectedText); - // If cursor is in the middle of a line, prepend newline - const lineContent = model.getLineContent(pos.lineNumber); - if (pos.column > 1 && lineContent.substring(0, pos.column - 1).trim().length > 0) { - text = '\n' + text; - } - ed.executeEdits('mkdocs-snippet', [{ - range: sel, - text, - }]); - } else if (snippet.type === 'insert' && snippet.template) { - ed.executeEdits('mkdocs-snippet', [{ - range: sel, - text: snippet.template, - }]); - } - - ed.focus(); -} +const applySnippet = applySnippetShared; /** Wrapper component so useDocsEditor() hook only runs on mobile */ function MobileDocsEditorWrapper() { @@ -1648,9 +1541,9 @@ export default function DocsPage() { {isSuperAdmin && ( <>
- - )} diff --git a/admin/src/pages/MkDocsSettingsPage.tsx b/admin/src/pages/MkDocsSettingsPage.tsx index 194c8d07..cb590867 100644 --- a/admin/src/pages/MkDocsSettingsPage.tsx +++ b/admin/src/pages/MkDocsSettingsPage.tsx @@ -304,14 +304,14 @@ export default function MkDocsSettingsPage() { const [configRes, filesRes, campaignsRes] = await Promise.all([ api.get('/docs/mkdocs-config'), api.get('/docs/files'), - api.get('/campaigns/public').catch(() => ({ data: [] as Campaign[] })), + api.get('/campaigns/public', { params: { limit: 50 } }).catch(() => ({ data: { campaigns: [] } })), ]); const content = configRes.data.content; setRawYaml(content); setOriginalYaml(content); setEditorYaml(content); setFileTree(filesRes.data); - setCampaigns(campaignsRes.data); + setCampaigns(campaignsRes.data.campaigns); // Parse for settings tab syncSettingsFromYaml(content); diff --git a/admin/src/pages/PangolinPage.tsx b/admin/src/pages/PangolinPage.tsx index 5d1840c3..0f23681f 100644 --- a/admin/src/pages/PangolinPage.tsx +++ b/admin/src/pages/PangolinPage.tsx @@ -12,7 +12,7 @@ import { api } from '@/lib/api'; import type { AppOutletContext } from '@/components/AppLayout'; import type { PangolinStatus, PangolinConfig, PangolinResource, PangolinNewtStatus, PangolinExitNode, - ResourceStatusResponse, ResourceStatusItem, SyncResult, + PangolinSite, ConnectSiteResult, ResourceStatusResponse, ResourceStatusItem, SyncResult, } from '@/types/api'; const { Text, Paragraph } = Typography; @@ -90,6 +90,9 @@ export default function PangolinPage() { const [resourceStatus, setResourceStatus] = useState(null); const [statusLoading, setStatusLoading] = useState(false); const [syncResult, setSyncResult] = useState(null); + const [orgSites, setOrgSites] = useState<(PangolinSite & { isCurrentSite?: boolean })[]>([]); + const [sitesLoading, setSitesLoading] = useState(false); + const [connectLoading, setConnectLoading] = useState(null); // siteId being connected useEffect(() => { setPageHeader({ title: 'Tunnel Management' }); @@ -155,6 +158,46 @@ export default function PangolinPage() { } }, [status?.configured, config?.siteId, fetchResourceStatus]); + // Fetch org sites when site ID is stale/missing (for site picker) + const fetchOrgSites = useCallback(async () => { + setSitesLoading(true); + try { + const res = await api.get<{ sites: (PangolinSite & { isCurrentSite?: boolean })[]; currentNewtId: string | null }>('/pangolin/sites'); + setOrgSites(res.data.sites); + } catch { + message.error('Failed to load sites from Pangolin'); + } finally { + setSitesLoading(false); + } + }, [message]); + + useEffect(() => { + // Load org sites when: configured but site ID is stale/missing (for site picker) + if (status?.configured && (status?.siteIdMismatch || !config?.siteId)) { + fetchOrgSites(); + } + }, [status?.configured, status?.siteIdMismatch, config?.siteId, fetchOrgSites]); + + const handleConnectSite = async (siteId: string) => { + setConnectLoading(siteId); + try { + const res = await api.post('/pangolin/connect-site', { siteId }); + if (res.data.success) { + message.success(res.data.message); + // Refresh everything after connecting + setTimeout(() => { + fetchData(); + fetchNewtStatus(); + }, 1500); + } + } catch (err: unknown) { + const msg = (err as { response?: { data?: { error?: { message?: string } } } })?.response?.data?.error?.message ?? 'Failed to connect to site'; + message.error(msg); + } finally { + setConnectLoading(null); + } + }; + // Fetch exit nodes for site creation useEffect(() => { if (status?.configured && !config?.siteId) { @@ -312,11 +355,105 @@ export default function PangolinPage() { {config?.orgId || 'Not set'} - {config?.siteId || 'Not set'} + + {config?.siteId || 'Not set'} + {status?.siteIdMismatch && ( + } color="warning">Stale + )} + {status?.siteIdValid === true && ( + } color="success">Valid + )} + + {/* Site Picker — shown when site ID is stale or mismatched */} + {isConfigured && status?.siteIdMismatch && ( + Site ID Mismatch}> + + + The site ID {config?.siteId} in your .env file + {status?.resolvedSiteId + ? <> does not match the detected site {status.resolvedSiteId}. + : <> was not found in the organization. + } + {' '}The Newt tunnel may still be working, but resource management (sync, status checks) will fail. + + Select the correct site below to fix this: +
+ } + style={{ marginBottom: 16 }} + /> + + dataSource={orgSites} + rowKey="siteId" + size="small" + loading={sitesLoading} + pagination={false} + columns={[ + { + title: 'Site Name', + dataIndex: 'name', + key: 'name', + render: (name: string, record) => ( + + {sanitizeText(name)} + {record.isCurrentSite && Matches Newt ID} + + ), + }, + { + title: 'Site ID', + dataIndex: 'siteId', + key: 'siteId', + render: (id: string) => {id}, + }, + ...(!isMobile ? [{ + title: 'Status', + key: 'online', + width: 100, + render: (_: unknown, record: PangolinSite) => + record.online + ? Online + : Offline, + }] : []), + ...(!isMobile ? [{ + title: 'Last Seen', + dataIndex: 'lastSeen', + key: 'lastSeen', + render: (d: string) => d ? new Date(d).toLocaleString() : '—', + }] : []), + { + title: '', + key: 'action', + width: 120, + render: (_: unknown, record: PangolinSite) => ( + + ), + }, + ]} + /> +
+ +
+ + )} + {/* Setup Card — shown when API credentials configured but no site yet */} {isConfigured && !config?.siteId && ( Automated Setup}> @@ -437,6 +574,68 @@ export default function PangolinPage() { }, ]} /> + + {/* Connect to existing site — shown when org already has sites */} + {orgSites.length > 0 && ( + <> + Or Connect to an Existing Site + + + dataSource={orgSites} + rowKey="siteId" + size="small" + loading={sitesLoading} + pagination={false} + columns={[ + { + title: 'Site Name', + dataIndex: 'name', + key: 'name', + render: (name: string, record) => ( + + {sanitizeText(name)} + {record.isCurrentSite && Matches Newt ID} + + ), + }, + { + title: 'Site ID', + dataIndex: 'siteId', + key: 'siteId', + render: (id: string) => {id}, + }, + ...(!isMobile ? [{ + title: 'Status', + key: 'online', + width: 100, + render: (_: unknown, record: PangolinSite) => + record.online + ? Online + : Offline, + }] : []), + { + title: '', + key: 'action', + width: 120, + render: (_: unknown, record: PangolinSite) => ( + + ), + }, + ]} + /> + + )} )} diff --git a/admin/src/pages/media/AdAnalyticsDashboardPage.tsx b/admin/src/pages/media/AdAnalyticsDashboardPage.tsx index 80c5c71d..2d1a31dd 100644 --- a/admin/src/pages/media/AdAnalyticsDashboardPage.tsx +++ b/admin/src/pages/media/AdAnalyticsDashboardPage.tsx @@ -309,11 +309,10 @@ export default function AdAnalyticsDashboardPage() { )} diff --git a/admin/src/pages/public/CampaignsListPage.tsx b/admin/src/pages/public/CampaignsListPage.tsx index cc19c65b..73a10dc1 100644 --- a/admin/src/pages/public/CampaignsListPage.tsx +++ b/admin/src/pages/public/CampaignsListPage.tsx @@ -19,6 +19,7 @@ import { Grid, Tooltip, Popover, + Pagination, message, theme, } from 'antd'; @@ -55,6 +56,8 @@ export default function CampaignsListPage() { const [campaigns, setCampaigns] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(false); + const [page, setPage] = useState(1); + const [total, setTotal] = useState(0); const { token } = theme.useToken(); const screens = Grid.useBreakpoint(); const isMobile = !screens.md; @@ -85,14 +88,15 @@ export default function CampaignsListPage() { useEffect(() => { fetchCampaigns(); - }, []); + }, [page]); // eslint-disable-line react-hooks/exhaustive-deps const fetchCampaigns = async () => { setLoading(true); setError(false); try { - const { data } = await axios.get('/api/campaigns/public'); - setCampaigns(data); + const { data } = await axios.get('/api/campaigns/public', { params: { page, limit: 20 } }); + setCampaigns(data.campaigns); + setTotal(data.pagination.total); } catch { setError(true); } finally { @@ -527,6 +531,18 @@ export default function CampaignsListPage() { )} + {total > 20 && ( +
+ { setPage(p); window.scrollTo({ top: 0, behavior: 'smooth' }); }} + showSizeChanger={false} + /> +
+ )} + setAuthModalOpen(false)} diff --git a/admin/src/pages/public/PagesIndexPage.tsx b/admin/src/pages/public/PagesIndexPage.tsx index 7a32dc62..b1a71624 100644 --- a/admin/src/pages/public/PagesIndexPage.tsx +++ b/admin/src/pages/public/PagesIndexPage.tsx @@ -1,6 +1,6 @@ import { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; -import { Typography, Card, Row, Col, Spin, Empty, Grid, theme } from 'antd'; +import { Typography, Card, Row, Col, Spin, Empty, Grid, Pagination, theme } from 'antd'; import { FileTextOutlined } from '@ant-design/icons'; import axios from 'axios'; import dayjs from 'dayjs'; @@ -19,6 +19,8 @@ interface ListedPage { export default function PagesIndexPage() { const [pages, setPages] = useState([]); const [loading, setLoading] = useState(true); + const [page, setPage] = useState(1); + const [total, setTotal] = useState(0); const { token } = theme.useToken(); const screens = Grid.useBreakpoint(); const isMobile = !screens.md; @@ -29,11 +31,15 @@ export default function PagesIndexPage() { }, [settings?.organizationName]); useEffect(() => { - axios.get('/api/pages/listed') - .then(({ data }) => setPages(data)) + setLoading(true); + axios.get('/api/pages/listed', { params: { page, limit: 20 } }) + .then(({ data }) => { + setPages(data.pages); + setTotal(data.pagination.total); + }) .catch(() => {}) .finally(() => setLoading(false)); - }, []); + }, [page]); if (loading) { return ( @@ -122,6 +128,18 @@ export default function PagesIndexPage() { ))} )} + + {total > 20 && ( +
+ { setPage(p); window.scrollTo({ top: 0, behavior: 'smooth' }); }} + showSizeChanger={false} + /> +
+ )} ); } diff --git a/admin/src/pages/public/PetitionsListPage.tsx b/admin/src/pages/public/PetitionsListPage.tsx index 6f592c67..0be0d7dc 100644 --- a/admin/src/pages/public/PetitionsListPage.tsx +++ b/admin/src/pages/public/PetitionsListPage.tsx @@ -1,6 +1,6 @@ import { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; -import { Typography, Card, Row, Col, Spin, Empty, Progress, Grid, theme } from 'antd'; +import { Typography, Card, Row, Col, Spin, Empty, Progress, Grid, Pagination, theme } from 'antd'; import { FileTextOutlined, TeamOutlined } from '@ant-design/icons'; import axios from 'axios'; import type { Petition } from '@/types/api'; @@ -11,22 +11,22 @@ const API = '/api'; export default function PetitionsListPage() { const [petitions, setPetitions] = useState([]); const [loading, setLoading] = useState(true); + const [page, setPage] = useState(1); + const [total, setTotal] = useState(0); const { token } = theme.useToken(); const screens = Grid.useBreakpoint(); const isMobile = !screens.md; useEffect(() => { - (async () => { - try { - const { data } = await axios.get(`${API}/petitions/public`); - setPetitions(data); - } catch { - /* ignore */ - } finally { - setLoading(false); - } - })(); - }, []); + setLoading(true); + axios.get(`${API}/petitions/public`, { params: { page, limit: 20 } }) + .then(({ data }) => { + setPetitions(data.petitions); + setTotal(data.pagination.total); + }) + .catch(() => {}) + .finally(() => setLoading(false)); + }, [page]); if (loading) return ; if (!petitions.length) return ; @@ -84,6 +84,18 @@ export default function PetitionsListPage() { ); })} + + {total > 20 && ( +
+ { setPage(p); window.scrollTo({ top: 0, behavior: 'smooth' }); }} + showSizeChanger={false} + /> +
+ )} ); } diff --git a/admin/src/pages/public/SharedDocEditorPage.tsx b/admin/src/pages/public/SharedDocEditorPage.tsx index fffaf73d..bcf6f615 100644 --- a/admin/src/pages/public/SharedDocEditorPage.tsx +++ b/admin/src/pages/public/SharedDocEditorPage.tsx @@ -14,6 +14,8 @@ import type { editor as monacoEditor } from 'monaco-editor'; import { MonacoBinding } from 'y-monaco'; import { useDocShareCollaboration } from '@/hooks/useDocShareCollaboration'; import { CollaboratorAvatars } from '@/components/docs/CollaboratorAvatars'; +import DocsEditorToolbar from '@/components/docs/DocsEditorToolbar'; +import { SNIPPETS, applySnippet } from '@/components/docs/mkdocs-snippets'; const { Header, Content } = Layout; const { Title, Text } = Typography; @@ -36,6 +38,7 @@ export default function SharedDocEditorPage() { const [pageState, setPageState] = useState({ status: 'loading' }); const monacoEditorRef = useRef(null); + const monacoRef = useRef(null); const monacoBindingRef = useRef(null); const [editorReady, setEditorReady] = useState(false); @@ -95,9 +98,23 @@ export default function SharedDocEditorPage() { }, [shareToken]); // Monaco editor mount handler - const handleEditorMount: OnMount = useCallback((editor) => { + const handleEditorMount: OnMount = useCallback((editor, monaco) => { monacoEditorRef.current = editor; + monacoRef.current = monaco; setEditorReady(true); + + // Register Ctrl+B / Ctrl+I keyboard shortcuts for markdown formatting + SNIPPETS.filter(s => s.keybinding).forEach(snippet => { + const kb = snippet.keybinding === 'ctrl+b' + ? monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyB + : monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyI; + editor.addAction({ + id: `mkdocs.${snippet.id}`, + label: snippet.label, + keybindings: [kb], + run: (ed) => applySnippet(ed as monacoEditor.IStandaloneCodeEditor, snippet, monaco), + }); + }); }, []); // MonacoBinding effect: binds Y.Text to Monaco editor when both are ready @@ -150,7 +167,7 @@ export default function SharedDocEditorPage() { }, }} > - + {/* Header */}
+
{!collab.active && (
)} - + {/* Formatting toolbar for editable markdown files */} + {shareData?.canEdit && shareData.documentPath.endsWith('.md') && ( + + )} + +
+ +
)} diff --git a/admin/src/pages/public/ShiftsPage.tsx b/admin/src/pages/public/ShiftsPage.tsx index eb127b07..11320d5a 100644 --- a/admin/src/pages/public/ShiftsPage.tsx +++ b/admin/src/pages/public/ShiftsPage.tsx @@ -10,6 +10,7 @@ import { message, Spin, Result, + Pagination, Grid, theme, } from 'antd'; @@ -57,6 +58,8 @@ export default function PublicShiftsPage() { const [shifts, setShifts] = useState([]); const [loading, setLoading] = useState(true); + const [page, setPage] = useState(1); + const [total, setTotal] = useState(0); const [signupModalOpen, setSignupModalOpen] = useState(false); const [selectedShift, setSelectedShift] = useState(null); const [relatedCampaigns, setRelatedCampaigns] = useState([]); @@ -74,13 +77,14 @@ export default function PublicShiftsPage() { useEffect(() => { fetchShifts(); - }, []); + }, [page]); // eslint-disable-line react-hooks/exhaustive-deps const fetchShifts = async () => { setLoading(true); try { - const { data } = await axios.get(`${apiBase}/map/shifts/public`); - setShifts(data); + const { data } = await axios.get(`${apiBase}/map/shifts/public`, { params: { page, limit: 20 } }); + setShifts(data.shifts); + setTotal(data.pagination.total); } catch { message.error('Failed to load volunteer opportunities'); } finally { @@ -239,6 +243,18 @@ export default function PublicShiftsPage() { )} + {total > 20 && ( +
+ { setPage(p); window.scrollTo({ top: 0, behavior: 'smooth' }); }} + showSizeChanger={false} + /> +
+ )} + {/* Related Campaigns */} diff --git a/admin/src/pages/public/ShopPage.tsx b/admin/src/pages/public/ShopPage.tsx index a5219efe..bf9d075f 100644 --- a/admin/src/pages/public/ShopPage.tsx +++ b/admin/src/pages/public/ShopPage.tsx @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react'; -import { Card, Row, Col, Button, Typography, Tag, Spin, Select, Space, App } from 'antd'; +import { Card, Row, Col, Button, Typography, Tag, Spin, Select, Space, Pagination, App } from 'antd'; import { ShoppingCartOutlined, PlayCircleOutlined } from '@ant-design/icons'; import { useNavigate } from 'react-router-dom'; import axios from 'axios'; @@ -15,6 +15,8 @@ export default function ShopPage() { const [products, setProducts] = useState([]); const [loading, setLoading] = useState(true); const [typeFilter, setTypeFilter] = useState(); + const [page, setPage] = useState(1); + const [total, setTotal] = useState(0); const { user, isAuthenticated } = useAuthStore(); const { message } = App.useApp(); const { settings: siteSettings } = useSettingsStore(); @@ -26,13 +28,17 @@ export default function ShopPage() { }, [siteSettings?.organizationName]); useEffect(() => { - const params: Record = {}; + setLoading(true); + const params: Record = { page, limit: 20 }; if (typeFilter) params.type = typeFilter; axios.get('/api/payments/products', { params }) - .then(({ data }) => setProducts(data)) + .then(({ data }) => { + setProducts(data.products); + setTotal(data.pagination.total); + }) .catch(() => message.error('Failed to load products')) .finally(() => setLoading(false)); - }, [typeFilter]); // eslint-disable-line react-hooks/exhaustive-deps + }, [typeFilter, page]); // eslint-disable-line react-hooks/exhaustive-deps const handlePurchase = async (e: React.MouseEvent, product: Product) => { e.stopPropagation(); // prevent card click navigation @@ -80,7 +86,7 @@ export default function ShopPage() { placeholder="Filter by type" allowClear value={typeFilter} - onChange={setTypeFilter} + onChange={(v) => { setTypeFilter(v); setPage(1); }} style={{ width: 200 }} options={[ { value: 'DIGITAL', label: 'Digital Products' }, @@ -202,6 +208,18 @@ export default function ShopPage() { })} )} + + {total > 20 && ( +
+ { setPage(p); window.scrollTo({ top: 0, behavior: 'smooth' }); }} + showSizeChanger={false} + /> +
+ )}
); } diff --git a/admin/src/types/api.ts b/admin/src/types/api.ts index 832b3785..639212fa 100644 --- a/admin/src/types/api.ts +++ b/admin/src/types/api.ts @@ -1304,6 +1304,9 @@ export interface PangolinStatus { orgId: string | null; siteId: string | null; newtConfigured: boolean; + siteIdValid: boolean | null; + resolvedSiteId: string | null; + siteIdMismatch: boolean; } export interface PangolinConfig { @@ -1329,6 +1332,24 @@ export interface PangolinSite { lastSeen?: string; online?: boolean; type?: string; + isCurrentSite?: boolean; +} + +export interface ConnectSiteResult { + success: boolean; + site: { + siteId: string; + name: string; + niceId: string; + online: boolean; + }; + envUpdate: { + success: boolean; + updated: string[]; + added: string[]; + error?: string; + }; + message: string; } export interface PangolinExitNode { diff --git a/api/Dockerfile b/api/Dockerfile index 52207f14..532243a2 100644 --- a/api/Dockerfile +++ b/api/Dockerfile @@ -25,6 +25,8 @@ RUN npm run build # Production stage FROM node:22-alpine AS production WORKDIR /app +# su-exec for dropping privileges after fixing mounted volume permissions +RUN apk add --no-cache su-exec # Copy compiled output and manifests COPY --from=build /app/dist ./dist COPY --from=build /app/package.json ./ @@ -37,8 +39,10 @@ COPY --from=build /app/tsconfig.json ./ RUN npm ci --omit=dev && npm install tsx && npx prisma generate COPY --from=build /app/docker-entrypoint.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/docker-entrypoint.sh \ - && mkdir -p /app/uploads && chown -R node:node /app/uploads + && mkdir -p /app/uploads /app/logs /data/geoip \ + && chown -R node:node /app/uploads /app/logs /data/geoip -USER node +# Note: USER node is NOT set here — entrypoint runs as root to fix +# mounted volume permissions, then drops to node via su-exec ENTRYPOINT ["docker-entrypoint.sh"] CMD ["npm", "start"] diff --git a/api/prisma/migrations/20260404100000_disable_public_map_by_default/migration.sql b/api/prisma/migrations/20260404100000_disable_public_map_by_default/migration.sql new file mode 100644 index 00000000..e677b0d9 --- /dev/null +++ b/api/prisma/migrations/20260404100000_disable_public_map_by_default/migration.sql @@ -0,0 +1,3 @@ +-- Change default for public map toggles so fresh installs start with map disabled +ALTER TABLE "map_settings" ALTER COLUMN "publicMapEnabled" SET DEFAULT false; +ALTER TABLE "site_settings" ALTER COLUMN "enableMap" SET DEFAULT false; diff --git a/api/src/modules/gallery-ads/gallery-ads.service.ts b/api/src/modules/gallery-ads/gallery-ads.service.ts index d7ad34af..1ea21f8e 100644 --- a/api/src/modules/gallery-ads/gallery-ads.service.ts +++ b/api/src/modules/gallery-ads/gallery-ads.service.ts @@ -142,6 +142,7 @@ class GalleryAdsService { ], }, orderBy: { position: 'asc' }, + take: 100, // Safety cap: post-fetch filter may reduce further }); // Filter in application layer for complex logic diff --git a/api/src/modules/influence/campaigns/campaigns-public.routes.ts b/api/src/modules/influence/campaigns/campaigns-public.routes.ts index e54b41cb..41f417db 100644 --- a/api/src/modules/influence/campaigns/campaigns-public.routes.ts +++ b/api/src/modules/influence/campaigns/campaigns-public.routes.ts @@ -5,13 +5,15 @@ import { redis } from '../../../config/redis'; const router = Router(); -// GET /api/campaigns/public — list all active campaigns (public) +// GET /api/campaigns/public?page=1&limit=20 — list active campaigns (public, paginated) router.get( '/public', - async (_req: Request, res: Response, next: NextFunction) => { + async (req: Request, res: Response, next: NextFunction) => { try { - const campaigns = await campaignsService.findActiveCampaigns(); - res.json(campaigns); + const page = Math.max(parseInt(req.query.page as string) || 1, 1); + const limit = Math.min(parseInt(req.query.limit as string) || 20, 50); + const result = await campaignsService.findActiveCampaigns(page, limit); + res.json(result); } catch (err) { next(err); } diff --git a/api/src/modules/influence/campaigns/campaigns.service.ts b/api/src/modules/influence/campaigns/campaigns.service.ts index 530f9ba5..0ff5a143 100644 --- a/api/src/modules/influence/campaigns/campaigns.service.ts +++ b/api/src/modules/influence/campaigns/campaigns.service.ts @@ -256,15 +256,28 @@ export const campaignsService = { return campaign; }, - async findActiveCampaigns() { - return prisma.campaign.findMany({ - where: { status: 'ACTIVE' }, - select: publicCampaignSelect, - orderBy: [ - { highlightCampaign: 'desc' }, - { createdAt: 'desc' }, - ], - }); + async findActiveCampaigns(page: number = 1, limit: number = 20) { + const where = { status: 'ACTIVE' as const }; + const skip = (page - 1) * limit; + + const [campaigns, total] = await Promise.all([ + prisma.campaign.findMany({ + where, + select: publicCampaignSelect, + orderBy: [ + { highlightCampaign: 'desc' }, + { createdAt: 'desc' }, + ], + skip, + take: limit, + }), + prisma.campaign.count({ where }), + ]); + + return { + campaigns, + pagination: { page, limit, total, totalPages: Math.ceil(total / limit) }, + }; }, async findBySlugPublic(slug: string) { diff --git a/api/src/modules/influence/petitions/petitions-public.routes.ts b/api/src/modules/influence/petitions/petitions-public.routes.ts index 646ef9d0..728a78f9 100644 --- a/api/src/modules/influence/petitions/petitions-public.routes.ts +++ b/api/src/modules/influence/petitions/petitions-public.routes.ts @@ -6,13 +6,15 @@ import { petitionSignRateLimit } from '../../../middleware/rate-limit'; const router = Router(); -// GET /api/petitions/public — list active petitions +// GET /api/petitions/public?page=1&limit=20 — list active petitions (paginated) router.get( '/public', - async (_req: Request, res: Response, next: NextFunction) => { + async (req: Request, res: Response, next: NextFunction) => { try { - const petitions = await petitionsService.findActivePetitions(); - res.json(petitions); + const page = Math.max(parseInt(req.query.page as string) || 1, 1); + const limit = Math.min(parseInt(req.query.limit as string) || 20, 50); + const result = await petitionsService.findActivePetitions(page, limit); + res.json(result); } catch (err) { next(err); } } ); diff --git a/api/src/modules/influence/petitions/petitions.service.ts b/api/src/modules/influence/petitions/petitions.service.ts index 63c249b8..98bfb2ee 100644 --- a/api/src/modules/influence/petitions/petitions.service.ts +++ b/api/src/modules/influence/petitions/petitions.service.ts @@ -251,21 +251,34 @@ export const petitionsService = { // ─── Public Routes ─────────────────────────────────────────────────── - async findActivePetitions() { - return prisma.petition.findMany({ - where: { - status: 'ACTIVE', - OR: [ - { isUserGenerated: false }, - { isUserGenerated: true, moderationStatus: 'APPROVED' }, - ], - }, - select: publicPetitionSelect, - orderBy: [ - { highlightPetition: 'desc' }, - { createdAt: 'desc' }, + async findActivePetitions(page: number = 1, limit: number = 20) { + const where = { + status: 'ACTIVE' as const, + OR: [ + { isUserGenerated: false }, + { isUserGenerated: true, moderationStatus: 'APPROVED' as const }, ], - }); + }; + const skip = (page - 1) * limit; + + const [petitions, total] = await Promise.all([ + prisma.petition.findMany({ + where, + select: publicPetitionSelect, + orderBy: [ + { highlightPetition: 'desc' }, + { createdAt: 'desc' }, + ], + skip, + take: limit, + }), + prisma.petition.count({ where }), + ]); + + return { + petitions, + pagination: { page, limit, total, totalPages: Math.ceil(total / limit) }, + }; }, async findBySlugPublic(slug: string) { diff --git a/api/src/modules/map/cuts/cuts.routes.ts b/api/src/modules/map/cuts/cuts.routes.ts index 23240a60..5c05280e 100644 --- a/api/src/modules/map/cuts/cuts.routes.ts +++ b/api/src/modules/map/cuts/cuts.routes.ts @@ -175,12 +175,13 @@ adminRouter.get( // --- Public Router --- const publicRouter = Router(); -// GET /api/map/cuts/public — all public cuts for map display +// GET /api/map/cuts/public?limit=50 — public cuts for map display publicRouter.get( '/public', - async (_req: Request, res: Response, next: NextFunction) => { + async (req: Request, res: Response, next: NextFunction) => { try { - const cuts = await cutsService.getPublicCuts(); + const limit = Math.min(parseInt(req.query.limit as string) || 50, 100); + const cuts = await cutsService.getPublicCuts(limit); res.json(cuts); } catch (err) { next(err); diff --git a/api/src/modules/map/cuts/cuts.service.ts b/api/src/modules/map/cuts/cuts.service.ts index 35b2fd87..7cdd5bb0 100644 --- a/api/src/modules/map/cuts/cuts.service.ts +++ b/api/src/modules/map/cuts/cuts.service.ts @@ -125,7 +125,7 @@ export const cutsService = { await prisma.cut.delete({ where: { id } }); }, - async getPublicCuts() { + async getPublicCuts(limit: number = 50) { const cuts = await prisma.cut.findMany({ where: { isPublic: true }, select: { @@ -139,6 +139,7 @@ export const cutsService = { bounds: true, }, orderBy: { name: 'asc' }, + take: limit, }); return cuts; }, diff --git a/api/src/modules/map/shifts/shifts.routes.ts b/api/src/modules/map/shifts/shifts.routes.ts index 2ab4e8b8..1a6547b2 100644 --- a/api/src/modules/map/shifts/shifts.routes.ts +++ b/api/src/modules/map/shifts/shifts.routes.ts @@ -260,13 +260,15 @@ volunteerRouter.delete( // --- Public Router --- const publicRouter = Router(); -// GET /api/map/shifts/public — list upcoming public shifts +// GET /api/map/shifts/public?page=1&limit=20 — list upcoming public shifts (paginated) publicRouter.get( '/public', - async (_req: Request, res: Response, next: NextFunction) => { + async (req: Request, res: Response, next: NextFunction) => { try { - const shifts = await shiftsService.getPublicShifts(); - res.json(shifts); + const page = Math.max(parseInt(req.query.page as string) || 1, 1); + const limit = Math.min(parseInt(req.query.limit as string) || 20, 50); + const result = await shiftsService.getPublicShifts(page, limit); + res.json(result); } catch (err) { next(err); } diff --git a/api/src/modules/map/shifts/shifts.service.ts b/api/src/modules/map/shifts/shifts.service.ts index ff93e91e..54cefaaa 100644 --- a/api/src/modules/map/shifts/shifts.service.ts +++ b/api/src/modules/map/shifts/shifts.service.ts @@ -1121,30 +1121,41 @@ export const shiftsService = { return signups; }, - async getPublicShifts() { - const shifts = await prisma.shift.findMany({ - where: { - isPublic: true, - status: { not: ShiftStatus.CANCELLED }, - date: { gte: new Date(new Date().toISOString().split('T')[0]) }, - }, - select: { - id: true, - title: true, - description: true, - date: true, - startTime: true, - endTime: true, - location: true, - maxVolunteers: true, - currentVolunteers: true, - status: true, - meeting: { select: { id: true, slug: true, isActive: true } }, - }, - orderBy: [{ date: 'asc' }, { startTime: 'asc' }], - }); + async getPublicShifts(page: number = 1, limit: number = 20) { + const where = { + isPublic: true, + status: { not: ShiftStatus.CANCELLED }, + date: { gte: new Date(new Date().toISOString().split('T')[0]) }, + }; + const skip = (page - 1) * limit; - return shifts; + const [shifts, total] = await Promise.all([ + prisma.shift.findMany({ + where, + select: { + id: true, + title: true, + description: true, + date: true, + startTime: true, + endTime: true, + location: true, + maxVolunteers: true, + currentVolunteers: true, + status: true, + meeting: { select: { id: true, slug: true, isActive: true } }, + }, + orderBy: [{ date: 'asc' }, { startTime: 'asc' }], + skip, + take: limit, + }), + prisma.shift.count({ where: { isPublic: true, status: { not: ShiftStatus.CANCELLED }, date: { gte: new Date(new Date().toISOString().split('T')[0]) } } }), + ]); + + return { + shifts, + pagination: { page, limit, total, totalPages: Math.ceil(total / limit) }, + }; }, async emailShiftDetails(shiftId: string) { diff --git a/api/src/modules/pages/pages-public.routes.ts b/api/src/modules/pages/pages-public.routes.ts index 8a02feac..e78cb4e4 100644 --- a/api/src/modules/pages/pages-public.routes.ts +++ b/api/src/modules/pages/pages-public.routes.ts @@ -4,23 +4,37 @@ import { pagesService } from './pages.service'; const router = Router(); -// GET /api/pages/listed — get published + listed pages for public index (no auth) +// GET /api/pages/listed?page=1&limit=20 — get published + listed pages for public index (no auth, paginated) router.get( '/listed', - async (_req: Request, res: Response, next: NextFunction) => { + async (req: Request, res: Response, next: NextFunction) => { try { - const pages = await prisma.landingPage.findMany({ - where: { published: true, listed: true }, - select: { - slug: true, - title: true, - description: true, - seoImage: true, - updatedAt: true, - }, - orderBy: { updatedAt: 'desc' }, + const page = Math.max(parseInt(req.query.page as string) || 1, 1); + const limit = Math.min(parseInt(req.query.limit as string) || 20, 50); + const where = { published: true, listed: true }; + const skip = (page - 1) * limit; + + const [pages, total] = await Promise.all([ + prisma.landingPage.findMany({ + where, + select: { + slug: true, + title: true, + description: true, + seoImage: true, + updatedAt: true, + }, + orderBy: { updatedAt: 'desc' }, + skip, + take: limit, + }), + prisma.landingPage.count({ where }), + ]); + + res.json({ + pages, + pagination: { page, limit, total, totalPages: Math.ceil(total / limit) }, }); - res.json(pages); } catch (err) { next(err); } diff --git a/api/src/modules/pangolin/pangolin.routes.ts b/api/src/modules/pangolin/pangolin.routes.ts index dd1cf530..5a02ddd1 100644 --- a/api/src/modules/pangolin/pangolin.routes.ts +++ b/api/src/modules/pangolin/pangolin.routes.ts @@ -172,14 +172,44 @@ const router = Router(); router.use(authenticate); router.use(requireRole('SUPER_ADMIN')); -// GET /api/pangolin/status — Health + connection info +// GET /api/pangolin/status — Health + connection info + site ID validation router.get('/status', async (_req: Request, res: Response) => { try { const configured = pangolinClient.configured; let healthy = false; + let siteIdValid: boolean | null = null; + let resolvedSiteId: string | null = null; + let siteIdMismatch = false; if (configured) { healthy = await pangolinClient.healthCheck(); + + // Validate site ID by checking if it exists in the org + // Pangolin returns siteId as a number; env stores it as a string — compare with String() + if (healthy) { + const envSiteId = env.PANGOLIN_SITE_ID; + if (envSiteId) { + try { + const sites = await pangolinClient.listSites(); + + // Match env siteId against org sites (coerce types for comparison) + const match = sites.find(s => + String(s.siteId) === envSiteId || s.niceId === envSiteId + ); + + if (match) { + siteIdValid = true; + resolvedSiteId = String(match.siteId); + } else { + siteIdValid = false; + siteIdMismatch = true; + logger.warn(`PANGOLIN_SITE_ID "${envSiteId}" not found in org (${sites.length} sites available)`); + } + } catch (err) { + logger.warn('Could not validate site ID (non-critical):', err instanceof Error ? err.message : err); + } + } + } } res.json({ @@ -189,6 +219,9 @@ router.get('/status', async (_req: Request, res: Response) => { orgId: env.PANGOLIN_ORG_ID || null, siteId: env.PANGOLIN_SITE_ID || null, newtConfigured: !!(env.PANGOLIN_NEWT_ID && env.PANGOLIN_NEWT_SECRET), + siteIdValid, + resolvedSiteId, + siteIdMismatch, }); } catch (err) { logger.error('Pangolin status check failed:', err); @@ -265,17 +298,95 @@ router.post('/newt-restart', async (_req: Request, res: Response) => { } }); -// GET /api/pangolin/sites — List sites +// GET /api/pangolin/sites — List sites (with newtId matching for site picker) router.get('/sites', async (_req: Request, res: Response) => { try { const sites = await pangolinClient.listSites(); - res.json({ sites }); + const currentNewtId = env.PANGOLIN_NEWT_ID || null; + const currentSiteId = env.PANGOLIN_SITE_ID || null; + + // Annotate each site with whether it matches current env config + // Pangolin returns siteId as a number; env stores it as a string — compare with String() + const annotatedSites = sites.map(s => ({ + ...s, + isCurrentSite: currentSiteId + ? (String(s.siteId) === currentSiteId || s.niceId === currentSiteId) + : false, + })); + + res.json({ sites: annotatedSites, currentNewtId, currentSiteId }); } catch (err) { const msg = err instanceof Error ? err.message : 'Unknown error'; res.status(500).json({ error: { message: msg, code: 'PANGOLIN_ERROR' } }); } }); +// POST /api/pangolin/connect-site — Connect to an existing site (write site ID + newt creds to .env) +const connectSiteSchema = z.object({ + siteId: z.union([z.string().min(1).max(200), z.number().int().positive()]).transform(String), +}); + +router.post('/connect-site', pangolinSetupLimiter, async (req: Request, res: Response) => { + try { + if (!pangolinClient.configured) { + res.status(400).json({ + error: { message: 'Pangolin not configured', code: 'NOT_CONFIGURED' }, + }); + return; + } + + const { siteId } = connectSiteSchema.parse(req.body); + + // Verify the site exists in the org + const sites = await pangolinClient.listSites(); + const site = sites.find(s => String(s.siteId) === siteId || s.niceId === siteId); + + if (!site) { + res.status(404).json({ + error: { message: `Site "${siteId}" not found in organization`, code: 'SITE_NOT_FOUND' }, + }); + return; + } + + // Build env updates — always write the site ID (coerce to string for .env) + const envUpdates: Record = { + PANGOLIN_SITE_ID: String(site.siteId), + }; + + // If the site has a Pangolin endpoint, write that too + if (env.PANGOLIN_API_URL) { + // Derive the endpoint from the API URL (strip /v1 path) + const endpoint = env.PANGOLIN_API_URL.replace(/\/v1\/?$/, ''); + envUpdates.PANGOLIN_ENDPOINT = endpoint; + } + + // Write to .env + const envResult = updateEnvFile(envUpdates); + + logger.info(`Connected to Pangolin site: ${site.siteId} (name: ${site.name})`); + + res.json({ + success: true, + site: { + siteId: site.siteId, + name: site.name, + niceId: site.niceId, + online: site.online, + }, + envUpdate: envResult, + message: `Connected to site "${site.name}". Restart the API container to apply the new PANGOLIN_SITE_ID.`, + }); + } catch (err) { + if (err instanceof z.ZodError) { + res.status(400).json({ error: { message: 'Invalid request body', code: 'VALIDATION_ERROR' } }); + return; + } + const msg = err instanceof Error ? err.message : 'Unknown error'; + logger.error('Connect site failed:', err); + res.status(500).json({ error: { message: msg, code: 'PANGOLIN_ERROR' } }); + } +}); + // GET /api/pangolin/exit-nodes — List available exit nodes router.get('/exit-nodes', async (_req: Request, res: Response) => { try { diff --git a/api/src/modules/payments/donation-pages-public.routes.ts b/api/src/modules/payments/donation-pages-public.routes.ts index 748331dd..07b562b3 100644 --- a/api/src/modules/payments/donation-pages-public.routes.ts +++ b/api/src/modules/payments/donation-pages-public.routes.ts @@ -8,10 +8,11 @@ import { donationPageCheckoutSchema } from './donation-pages.schemas'; const router = Router(); -// GET /api/donation-pages — list active pages (with stats) -router.get('/', async (_req: Request, res: Response, next: NextFunction) => { +// GET /api/donation-pages?limit=20 — list active pages (with stats) +router.get('/', async (req: Request, res: Response, next: NextFunction) => { try { - const pages = await donationPagesService.findActivePages(); + const limit = Math.min(parseInt(req.query.limit as string) || 20, 50); + const pages = await donationPagesService.findActivePages(limit); res.json(pages); } catch (err) { next(err); diff --git a/api/src/modules/payments/donation-pages.service.ts b/api/src/modules/payments/donation-pages.service.ts index 9031f404..aa556993 100644 --- a/api/src/modules/payments/donation-pages.service.ts +++ b/api/src/modules/payments/donation-pages.service.ts @@ -193,13 +193,14 @@ export const donationPagesService = { }, /** Public: list active donation pages with stats */ - async findActivePages() { + async findActivePages(limit: number = 20) { const pages = await prisma.donationPage.findMany({ where: { status: 'ACTIVE' }, orderBy: [ { highlightPage: 'desc' }, { createdAt: 'desc' }, ], + take: limit, }); return Promise.all( diff --git a/api/src/modules/payments/payments-public.routes.ts b/api/src/modules/payments/payments-public.routes.ts index 08ea79de..4cf4fd96 100644 --- a/api/src/modules/payments/payments-public.routes.ts +++ b/api/src/modules/payments/payments-public.routes.ts @@ -36,10 +36,11 @@ router.get('/config', async (_req: Request, res: Response, next: NextFunction) = } }); -// GET /api/payments/plans — list active subscription plans -router.get('/plans', async (_req: Request, res: Response, next: NextFunction) => { +// GET /api/payments/plans?limit=50 — list active subscription plans +router.get('/plans', async (req: Request, res: Response, next: NextFunction) => { try { - const plans = await plansService.listActivePlans(); + const limit = Math.min(parseInt(req.query.limit as string) || 50, 100); + const plans = await plansService.listActivePlans(limit); res.json(plans); } catch (err) { next(err); @@ -57,12 +58,14 @@ router.get('/plans/:slug', async (req: Request, res: Response, next: NextFunctio } }); -// GET /api/payments/products — list active products +// GET /api/payments/products?page=1&limit=20 — list active products (paginated) router.get('/products', async (req: Request, res: Response, next: NextFunction) => { try { const type = req.query.type as string | undefined; - const products = await productsService.listActive(type); - res.json(products); + const page = Math.max(parseInt(req.query.page as string) || 1, 1); + const limit = Math.min(parseInt(req.query.limit as string) || 20, 50); + const result = await productsService.listActive(type, page, limit); + res.json(result); } catch (err) { next(err); } diff --git a/api/src/modules/payments/plans.service.ts b/api/src/modules/payments/plans.service.ts index 71517cdd..e6f9fa07 100644 --- a/api/src/modules/payments/plans.service.ts +++ b/api/src/modules/payments/plans.service.ts @@ -152,13 +152,14 @@ export const plansService = { }, /** Public: list active plans for pricing page */ - async listActivePlans() { + async listActivePlans(limit: number = 50) { return prisma.subscriptionPlan.findMany({ where: { isActive: true }, orderBy: [ { highlightPlan: 'desc' }, { displayOrder: 'asc' }, ], + take: limit, }); }, diff --git a/api/src/modules/payments/products.service.ts b/api/src/modules/payments/products.service.ts index 9e10be15..195381a7 100644 --- a/api/src/modules/payments/products.service.ts +++ b/api/src/modules/payments/products.service.ts @@ -88,15 +88,26 @@ function productAdDefaults(product: { title: string; description: string | null; } export const productsService = { - /** List active products (public) */ - async listActive(type?: string) { + /** List active products (public, paginated) */ + async listActive(type?: string, page: number = 1, limit: number = 20) { const where: Prisma.ProductWhereInput = { isActive: true }; if (type) where.type = type as Prisma.EnumProductTypeFilter['equals']; - const products = await prisma.product.findMany({ - where, - orderBy: { createdAt: 'desc' }, - }); - return products.map(resolveMediaUrls); + const skip = (page - 1) * limit; + + const [products, total] = await Promise.all([ + prisma.product.findMany({ + where, + orderBy: { createdAt: 'desc' }, + skip, + take: limit, + }), + prisma.product.count({ where }), + ]); + + return { + products: products.map(resolveMediaUrls), + pagination: { page, limit, total, totalPages: Math.ceil(total / limit) }, + }; }, /** List all products (admin) */ diff --git a/mkdocs/.cache/plugin/social/assets/images/social/404.png b/mkdocs/.cache/plugin/social/assets/images/social/404.png index 34707f2936833667703f393b29b06843f6e8ddb4..469c8e22ec12390e4824219f1cbbe7e4ded2fc2b 100644 GIT binary patch literal 26255 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 I|MI=^Keo998UO$Q literal 69240 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
%)Vm-~}k)xLL>pfduB4 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 MjV$k=Zn-}Hf7$az761SM diff --git a/mkdocs/.cache/plugin/social/assets/images/social/blog/2026/03/22/introducing-changemaker-lite-v2.png b/mkdocs/.cache/plugin/social/assets/images/social/blog/2026/03/22/introducing-changemaker-lite-v2.png index 9b02bd7ed1b22702a528accd0a717f3291553c9f..4d0132724d41e07acf1d25e1c59a6e980d039c71 100644 GIT binary patch literal 35744 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

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SubdomainPurpose
app.yourdomain.orgAdmin dashboard + all public pages
api.yourdomain.orgBackend API
docs.yourdomain.orgDocumentation site
git.yourdomain.orgGit hosting (Gitea)
events.yourdomain.orgEvent calendar (Gancio)
... and 10+ moreSee Services Overview
+

You'll point your domain's DNS to wherever your tunnel or server is hosted. Wildcard DNS (*.yourdomain.org) is the simplest approach.

+

Where to get one: Any registrar — Namecheap, Cloudflare Registrar, Porkbun, etc. Budget ~$10–15/year.

+
+

2. A Reverse Tunnel or Public IP

+

Your server needs to be reachable from the internet. Most home/office networks don't have a static public IP, so you need a reverse tunnel service that gives your server a stable public address with SSL.

+

Changemaker Lite has built-in support for Pangolin — a self-hosted, open-source tunnel that handles SSL certificates, subdomain routing, and access control automatically. The admin dashboard includes a one-click Pangolin setup wizard.

+

What you need:

+
    +
  • A Pangolin server (or access to a shared one)
  • +
  • An API key and Organization ID
  • +
  • Your domain's DNS pointed at the Pangolin server
  • +
+

Alternatives: Cloudflare Tunnel (free tier available), a VPS with a public IP, or any reverse proxy with SSL termination.

+
+

3. SMTP Email Provider

+

Production deployments need a real SMTP server to send emails — campaign messages, password resets, volunteer invitations, and newsletter delivery all depend on it.

+

What you need:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
SettingExample
SMTP Hostsmtp.protonmail.ch
SMTP Port587 (STARTTLS) or 465 (TLS)
SMTP Usernameyour-account@provider.com
SMTP PasswordYour SMTP password or app-specific password
+

Popular SMTP providers:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProviderFree TierNotes
Proton MailIncluded with paid planPrivacy-focused, recommended for advocacy
Mailgun100 emails/day (FLEX)Good deliverability, easy setup
Amazon SES62,000/month (from EC2)Cheapest at scale, requires verification
Brevo (Sendinblue)300 emails/daySimple setup, good free tier
Resend100 emails/dayDeveloper-friendly, modern API
+
+

Shared hosting SMTP

+

Avoid using shared hosting SMTP (GoDaddy, Bluehost, etc.) for campaign emails — they have low sending limits and poor deliverability. Use a dedicated transactional email provider.

+
+
+

4. A Linux Server

+

Changemaker Lite runs on any Linux server with Docker. Minimum specs:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComponentMinimumRecommended
RAM2 GB (core only)4 GB (full stack)
Disk10 GB20+ GB (with media uploads)
CPU1 vCPU2+ vCPU
OSAny Linux with DockerUbuntu 22.04+ LTS
+

Options: A VPS from DigitalOcean, Hetzner, Linode, or a spare machine on your network. If using a tunnel (Pangolin), the server doesn't need a public IP.

+
+

Optional (Enhance Your Deployment)

+

These are not required but unlock additional platform features:

+

Stripe Account (Payments)

+

For accepting donations, selling merchandise, or managing membership plans. Create a free account at stripe.com. You'll enter your Stripe API keys in the admin settings page (they're stored encrypted in the database).

+

Mapbox or Google Maps API Key (Geocoding)

+

Improves address geocoding accuracy for the mapping module. The platform works without these (using free OpenStreetMap providers), but paid providers are more reliable for bulk operations.

+
    +
  • Mapbox: Free tier includes 100,000 requests/month. Sign up.
  • +
  • Google Maps: Free tier includes $200/month credit (~40,000 requests). Sign up.
  • +
+

MaxMind GeoLite2 (Analytics)

+

For geographic analytics (visitor location tracking). Free account at maxmind.com. The database auto-downloads at startup when credentials are configured.

+

Android Phone with Termux (SMS Campaigns)

+

The SMS module uses a physical Android phone as an SMS gateway via the Termux app. This is a unique feature for grassroots campaigns that want to send SMS without expensive third-party services.

+

Jitsi Meet Requirements (Video Conferencing)

+

If enabling the self-hosted video conferencing feature:

+
    +
  • Server's public IP address (for NAT traversal)
  • +
  • UDP port 10000 open in your firewall (for media traffic)
  • +
+
+

Pre-Installation Checklist

+

Use this checklist to make sure you're ready:

+
    +
  • Domain name registered and DNS accessible
  • +
  • DNS configured — wildcard *.yourdomain.org or individual subdomain records pointing to your tunnel/server
  • +
  • Tunnel or public IP — Pangolin credentials (API key + Org ID), or server with public IP + SSL
  • +
  • SMTP credentials — host, port, username, password from your email provider
  • +
  • Linux server with Docker 24+ and Docker Compose v2 installed
  • +
  • OpenSSL installed (for generating secrets during setup)
  • +
  • (Optional) Stripe account for payments
  • +
  • (Optional) Mapbox or Google Maps API key for geocoding
  • +
  • (Optional) MaxMind account for geographic analytics
  • +
+
+

Bunker Operations Can Help

+

Setting up infrastructure — domains, tunnels, SMTP, servers — can be the hardest part of self-hosting. Bunker Operations offers managed infrastructure for organizations running Changemaker Lite:

+
+
    +
  • +

    Managed Pangolin Tunnel

    +
    +

    Pre-configured tunnel with SSL, wildcard DNS, and automatic subdomain routing. Just plug in your API key and go.

    +
  • +
  • +

    SMTP Relay

    +
    +

    High-deliverability transactional email with SPF/DKIM/DMARC already configured for your domain.

    +
  • +
  • +

    Hosted Servers

    +
    +

    Pre-provisioned Linux servers with Docker, monitoring, and automatic backups — ready for a one-command install.

    +
  • +
  • +

    Setup Assistance

    +
    +

    We'll walk you through the full deployment — from domain registration to your first campaign launch.

    +
  • +
+
+
+

Built by organizers, for organizers

+

Bunker Operations exists so campaign teams can focus on building power — not wrestling with infrastructure. We provide the plumbing so you can focus on the mission.

+

Get in touch: bnkops.com or email hello@bnkops.com

+
+
+

Next Steps

+

Once you have your prerequisites ready:

+ + + + + + + + + + + + + + + + + + +
+ + + + + +
+ + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mkdocs/site/docs/getting-started/services/index.html b/mkdocs/site/docs/getting-started/services/index.html index 806c035e..e8c635da 100644 --- a/mkdocs/site/docs/getting-started/services/index.html +++ b/mkdocs/site/docs/getting-started/services/index.html @@ -25,7 +25,7 @@ - + @@ -71,67 +71,6 @@ - - - - - - - @@ -1165,7 +1104,7 @@ body.cm-search-active .md-header--cm-hidden .md-search__output {