{"id":"695823c051eccfbd24748236","title":"2025 12 02 Issue 90","path":"how-to/committee/release-notes/2025-12-02-issue-90","contentMarkdown":"# 02-Dec-2025 — Deployment, Member-admin and 1 more areas: 4 fixes [#90](https://github.com/nbarrett/ngx-ramblers/issues/90)\n\n## [build 384](https://github.com/nbarrett/ngx-ramblers/actions/runs/19859559122) — [commit cb94316](https://github.com/nbarrett/ngx-ramblers/commit/cb94316b8563976ba11c183d0568d566356fd5e2)\n\n_____\n\nThe deployment was timing out because the server waited for MongoDB\nto connect before starting to listen on port 5001. This caused Fly.io\nhealth checks to fail during the 30-second MongoDB connection timeout.\n\n### **deployment**: Further refinements to improve fly.io deployment reliability ([#90](https://github.com/nbarrett/ngx-ramblers/issues/90))\n\n- increase timeouts to handle cold start delays\n- Increase MongoDB connection timeout from 5s to 30s to handle replica set discovery during Fly.io cold starts\n- Add 600s (10 minute) wait-timeout to flyctl deploy to prevent premature deployment failures\n- Addresses issue where deployments succeeded but GitHub Actions timed out after 5 minutes\n- run migrations asynchronously after server starts\n- Move server.listen() before migration execution to ensure health checks pass immediately during fly.io deployments.\n- Migrations now run in background with proper error handling, allowing the server to respond to health checks within the 60s grace period while migrations complete.\n\n### **member-admin**: align lifecycle handling and brevo sync\n\n- Lifecycle handling: added MemberTerm enum (life/annual), ingested from bulk loads, schemas updated; life/payment-pending/newly-loaded members avoid expiry actions; Member Admin list shows “Lifetime” and modal expiry is disabled/readonly for life members.\n- UX persistence: Member Admin search/sort now persisted via kebab-cased query params (search, sort, sort-order) and local storage; lifetime display and date-picker null handling improved.\n- Deletion audit: manual member delete now records a deleted-member document (aligning with bulk delete).\n- Bulk load/back-end: member bulk-load date map aggregation typed and tested; member status/term captured from Ramblers feed; date map endpoint typed.\n- Brevo integration: always log errors; surface contact creation failures; fallback to batch update on duplicate ext_id; contact matching honors extId; checkbox label fixed.\n\n### **agm-stats**: exclude cancelled and deleted walks from leader counts in local mode\n\nThe issue: Walk leader counts only matched confirmed walks, but detail tables showed all non-cancelled, non-deleted walks. This caused discrepancies (e.g., Amanda G showing 2 walks in count but 5 in detail, then 6 after first fix).\nThe fix: For local mode, change confirmedStatusMatch to exclude both 'cancelled' and 'deleted' status, matching the logic in classifyLocalWalk (line 823-829) which filters out cancelled walks from morning/evening classifications.\nThis ensures leader walkCount matches the walks shown in detail tables.","contentHtml":"<h1>02-Dec-2025 — Deployment, Member-admin and 1 more areas: 4 fixes <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/90\">#90</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/19859559122\">build 384</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/cb94316b8563976ba11c183d0568d566356fd5e2\">commit cb94316</a></h2>\n<hr>\n<p>The deployment was timing out because the server waited for MongoDB\nto connect before starting to listen on port 5001. This caused Fly.io\nhealth checks to fail during the 30-second MongoDB connection timeout.</p>\n<h3><strong>deployment</strong>: Further refinements to improve fly.io deployment reliability (<a href=\"https://github.com/nbarrett/ngx-ramblers/issues/90\">#90</a>)</h3>\n<ul>\n<li>increase timeouts to handle cold start delays</li>\n<li>Increase MongoDB connection timeout from 5s to 30s to handle replica set discovery during Fly.io cold starts</li>\n<li>Add 600s (10 minute) wait-timeout to flyctl deploy to prevent premature deployment failures</li>\n<li>Addresses issue where deployments succeeded but GitHub Actions timed out after 5 minutes</li>\n<li>run migrations asynchronously after server starts</li>\n<li>Move server.listen() before migration execution to ensure health checks pass immediately during fly.io deployments.</li>\n<li>Migrations now run in background with proper error handling, allowing the server to respond to health checks within the 60s grace period while migrations complete.</li>\n</ul>\n<h3><strong>member-admin</strong>: align lifecycle handling and brevo sync</h3>\n<ul>\n<li>Lifecycle handling: added MemberTerm enum (life/annual), ingested from bulk loads, schemas updated; life/payment-pending/newly-loaded members avoid expiry actions; Member Admin list shows “Lifetime” and modal expiry is disabled/readonly for life members.</li>\n<li>UX persistence: Member Admin search/sort now persisted via kebab-cased query params (search, sort, sort-order) and local storage; lifetime display and date-picker null handling improved.</li>\n<li>Deletion audit: manual member delete now records a deleted-member document (aligning with bulk delete).</li>\n<li>Bulk load/back-end: member bulk-load date map aggregation typed and tested; member status/term captured from Ramblers feed; date map endpoint typed.</li>\n<li>Brevo integration: always log errors; surface contact creation failures; fallback to batch update on duplicate ext_id; contact matching honors extId; checkbox label fixed.</li>\n</ul>\n<h3><strong>agm-stats</strong>: exclude cancelled and deleted walks from leader counts in local mode</h3>\n<p>The issue: Walk leader counts only matched confirmed walks, but detail tables showed all non-cancelled, non-deleted walks. This caused discrepancies (e.g., Amanda G showing 2 walks in count but 5 in detail, then 6 after first fix).\nThe fix: For local mode, change confirmedStatusMatch to exclude both &#39;cancelled&#39; and &#39;deleted&#39; status, matching the logic in classifyLocalWalk (line 823-829) which filters out cancelled walks from morning/evening classifications.\nThis ensures leader walkCount matches the walks shown in detail tables.</p>\n"}