Questify

2.23.0

Released

Features

  • A guild owner is emailed when someone joins their guild — after an emailed invitation is accepted or a claim code is redeemed — naming the member and the guild, saying when the join took over an accountless roster place, and linking to the roster. Before this, nobody told the owner; they found out by reopening the roster. The email goes through the same path as the Party Quest and feedback emails, so an unconfirmed or opted-out owner is never emailed, its unsubscribe link turns off only the new "Guild membership emails" category, and a toggle for it joins the profile's Email preferences while NEXT_PUBLIC_FEATURE_GUILD_INVITES is on — the email rides that flag rather than one of its own. Pressing an already-accepted link again — or two accepts racing — sends one email, and a failed send never fails the join. Other members are not told, and neither is the owner when someone leaves or declines. (#671)

Technical changes· 3 entries for database, tooling, CI, tests and docs

Database

  • 20260927120000_guild_join_owner_emails.sql adds notification_preferences.guild_emails (default on) and teaches the three preference functions the guild category: prepare_notification_email() accepts it, update_my_notification_preferences() takes guild_emails, and set_notification_category_by_token() turns it off from a one-click link. It also adds guild_invitations.owner_notified_at and claim_guild_join_notification(token), one conditional UPDATE by which the accepting account claims the single owner email for that acceptance — the database, not a read before the accept, decides who sends, so a pressed-again link or two concurrent accepts email the owner once. pgTAP covers the accept, deny and claim cases in guild_join_owner_emails.sql, and rls.sql checks the column is not client-writable and the claim is function-only. (#671)

Tests

  • notification-preferences.spec.ts's "every email feature off" case now also skips when both guild flags are enabled and asserts the guild membership checkbox is absent when they are off; a new authenticated test saves and reloads the guild checkbox alongside the existing Party Quest and deadline reminder flows, and the anonymous unsubscribe-link loop gained the guild category. (#676)

Documentation

  • docs/notifications.md gains a Guild membership section covering the new category, the repeat-accept guard and what the email deliberately does not cover. (#671)