Skip to content

feat: SGA Spaces email destination for Leadership (#109), v1.14.3 - #110

Merged
pataniaeli merged 3 commits into
devfrom
feat/issue-109-spaces-email-destination
Sep 15, 2026
Merged

pataniaeli merged 3 commits into
devfrom
feat/issue-109-spaces-email-destination

Conversation

@pataniaeli

Copy link
Copy Markdown
Collaborator

Closes #109.

What changes

Leadership can now choose where their SGA Spaces confirmation and cancellation emails go, from Settings → Send SGA Spaces Confirmations To:

  • My personal email (default, what everyone got before)
  • My SGA email: one of the shared inboxes of a body they lead
  • Both

The choice applies to confirmations, cancellations by the creator, and cancellations caused by an admin blackout, so an invite and its cancellation always reach the same inbox. The creator and each attendee are sent to the address they chose, and no address gets the same email twice.

Where the inboxes come from

bodies.sga_emails (new text[] column), filled in from the issue's list and editable by Management in the Bodies tab (@northeastern.edu only). I used a column instead of a division map in code because the mapping doesn't follow division cleanly: Finance Board has its own inbox separate from Student Involvement's, and each Office of the President board has its own. Matching on body names is also what #95 moved away from.

  • Executive Board has two inboxes (President, EVP), offered as separate choices.
  • SGA General, Governmental Relations Team and Student-Designed NU Merch Team have no inbox, so their Leadership only see personal email.

Stepping down

The allowed inboxes are recalculated from current Leadership roles both when Settings saves and every time an email is sent (lib/spaces-email.ts). Someone who steps down falls back to personal email instead of keeping a body's shared inbox, and Settings tells them so.

Migration

supabase/migrations/20260914010000_spaces_email_destination.sql, with a rollback script. Already applied to production. 28 bodies got inboxes, 3 got none, and all 33 users are on the personal default.

The branch also includes a follow-up commit that renames the migration from 20260914000000 to 20260914010000, because alternate_room_and_time_status had already taken that timestamp on dev.

Version

Bumped to 1.14.3: package.json, the lockfile's two root entries, the sidebar label, and a new FAQ entry.

Testing

  • tsc --noEmit passes.
  • Scratch-script checks of the routing rules pass: the choice falls back to personal once the user no longer leads the body (or picked an inbox that isn't theirs), inbox matching ignores case, cancellations send one copy per address (creator in To, attendees in Bcc), and only northeastern.edu inboxes are accepted.
  • Previewed the fill-in against live bodies before applying, then confirmed the result afterwards.
  • Dev server compiles with no errors, and the FAQ renders the new entry.
  • Not checked in the browser: the Settings modal and Bodies tab, which need a logged-in session. Worth a quick look before merging.
  • ESLint shows two errors in settings-modal.tsx and bodies-tab.tsx, both in useEffect code this PR doesn't change.

🤖 Generated with Claude Code

pataniaeli and others added 3 commits September 14, 2026 20:57
SGA Spaces confirmation and cancellation emails only ever went to the address
someone signed up with. Leadership can now send them to their personal email,
one of their body's shared SGA inboxes, or both, from Settings.

The inboxes live on bodies.sga_emails rather than in a map keyed on division
and name. The mapping mostly follows division but not entirely -- Finance Board
carves out of Student Involvement and the Office of the President boards each
have their own -- and name-matching is what #95 moved body types away from.
The migration backfills the list in the issue, and Management can edit it in
the Bodies tab. Executive Board's two inboxes are offered as separate choices.

What someone may choose is recomputed from live Leadership both when Settings
saves it and when an email is sent, so a person who steps down falls back to
their personal email instead of keeping a body's shared inbox indefinitely.

Applies to confirmations, cancellations by the creator, and blackout
cascade cancellations, so an invite and its cancellation reach the same inbox.
Every recipient -- creator and attendees -- is addressed by their own choice,
and an address never receives the same email twice.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ime_status took

Both landed on 20260914000000 once this branch was rebased onto dev. Supabase
orders migrations by that prefix, so two files sharing it would apply in
filename order by accident rather than by intent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
package.json, the lockfile's two root entries, and the sidebar label.

A patch release carrying one addition: Leadership choosing where their SGA
Spaces confirmation and cancellation emails go (#109).

The FAQ entry is written for members: what changed for someone using Chambers.
The v1.15.0 placeholder stays where it is and keeps pointing forward.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
chambers Ready Ready Preview Sep 15, 2026 1:00am UTC

@pataniaeli pataniaeli self-assigned this Sep 15, 2026
@pataniaeli pataniaeli added the enhancement New feature or request label Sep 15, 2026
@pataniaeli pataniaeli linked an issue Sep 15, 2026 that may be closed by this pull request
@pataniaeli
pataniaeli merged commit d9349e4 into dev Sep 15, 2026
4 checks passed
@pataniaeli
pataniaeli deleted the feat/issue-109-spaces-email-destination branch September 15, 2026 01:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The Benedikt Option (TM)

1 participant