[PR #7298] [CLOSED] feat(organization): add dismissInvitation endpoint for expired invitation #7207

Closed
opened 2026-03-13 13:28:01 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/better-auth/better-auth/pull/7298
Author: @ChetanReddyC
Created: 1/12/2026
Status: Closed

Base: canaryHead: feat/dismiss-expired-invitations-7291


📝 Commits (1)

  • 1f90065 feat(organization): add dismissInvitation endpoint for expired invitations

📊 Changes

7 files changed (+510 additions, -3 deletions)

View changed files

📝 packages/better-auth/src/plugins/organization/adapter.ts (+1 -1)
📝 packages/better-auth/src/plugins/organization/error-codes.ts (+4 -0)
📝 packages/better-auth/src/plugins/organization/organization.ts (+20 -0)
📝 packages/better-auth/src/plugins/organization/routes/crud-invites.ts (+122 -0)
packages/better-auth/src/plugins/organization/routes/expired-invitation.test.ts (+338 -0)
📝 packages/better-auth/src/plugins/organization/schema.ts (+7 -2)
📝 packages/better-auth/src/plugins/organization/types.ts (+18 -0)

📄 Description

Description

Fixes #7291 - Allow users to dismiss expired invitations.

Currently, expired invitations get "stuck" in a user's inbox because:

This PR introduces a new dismissInvitation endpoint specifically to handle this scenario, allowing recipients to clean up their invitation lists.

Changes

  • Added dismissInvitation endpoint in [crud-invites.ts](packages/better-auth/src/plugins/organization/routes/crud-invites.ts)
  • Updated invitationStatus enum to include "dismissed" in [schema.ts](packages/better-auth/src/plugins/organization/schema.ts)
  • Added new error codes INVITATION_NOT_EXPIRED and INVITATION_CANNOT_BE_DISMISSED in error-codes.ts
  • Added beforeDismissInvitation and afterDismissInvitation hooks in [types.ts](packages/better-auth/src/plugins/organization/types.ts)
  • Updated adapter types in adapter.ts
  • Registered new endpoint in organization.ts

Validation Logic

The endpoint ensures strict validation:

  1. Expiration: Invitation must be expired (expiresAt < now).
  2. Status: Invitation must be in 'pending' status (not already accepted/rejected).
  3. Ownership: Only the recipient can dismiss the invitation.

Testing

  • Added comprehensive tests in [expired-invitation.test.ts](packages/better-auth/src/plugins/organization/routes/expired-invitation.test.ts) covering:
    • Success: Dismissing an expired invitation
    • Failure: Dismissing a valid (non-expired) invitation
    • Failure: Dismissing an already accepted/rejected invitation
    • Failure: Dismissing an invitation for another user
  • Verified manually in a local development environment.
  • Ran full test suite (pnpm test) - All checks passed.

Summary by cubic

Adds a dismissInvitation endpoint so recipients can remove expired organization invites from their inbox. Fixes #7291 where expired invites got stuck.

  • New Features

    • POST /organization/dismiss-invitation to dismiss only expired, pending invites owned by the requester.
    • Added dismissed status to invitationStatus and adapter.updateInvitation.
    • New error codes: INVITATION_NOT_EXPIRED, INVITATION_CANNOT_BE_DISMISSED.
    • New hooks: beforeDismissInvitation and afterDismissInvitation.
    • Tests cover success, non-expired, already-processed, wrong user, and not-found cases.
  • Migration

    • If you display invitation status, handle the new dismissed state.

Written for commit 1f900654e7. Summary will update on new commits.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/better-auth/better-auth/pull/7298 **Author:** [@ChetanReddyC](https://github.com/ChetanReddyC) **Created:** 1/12/2026 **Status:** ❌ Closed **Base:** `canary` ← **Head:** `feat/dismiss-expired-invitations-7291` --- ### 📝 Commits (1) - [`1f90065`](https://github.com/better-auth/better-auth/commit/1f900654e7476a3841669c067ab2183b111d83c5) feat(organization): add dismissInvitation endpoint for expired invitations ### 📊 Changes **7 files changed** (+510 additions, -3 deletions) <details> <summary>View changed files</summary> 📝 `packages/better-auth/src/plugins/organization/adapter.ts` (+1 -1) 📝 `packages/better-auth/src/plugins/organization/error-codes.ts` (+4 -0) 📝 `packages/better-auth/src/plugins/organization/organization.ts` (+20 -0) 📝 `packages/better-auth/src/plugins/organization/routes/crud-invites.ts` (+122 -0) ➕ `packages/better-auth/src/plugins/organization/routes/expired-invitation.test.ts` (+338 -0) 📝 `packages/better-auth/src/plugins/organization/schema.ts` (+7 -2) 📝 `packages/better-auth/src/plugins/organization/types.ts` (+18 -0) </details> ### 📄 Description ### Description Fixes #7291 - Allow users to dismiss expired invitations. Currently, expired invitations get "stuck" in a user's inbox because: - [acceptInvitation](packages/better-auth/src/plugins/organization/routes/crud-invites.ts:520:0-723:3) fails (invitation expired) - [rejectInvitation](packages/better-auth/src/plugins/organization/routes/crud-invites.ts:731:0-837:3) fails (invitation expired) - [cancelInvitation](packages/better-auth/src/plugins/organization/routes/crud-invites.ts:845:0-951:3) requires sender permissions This PR introduces a new [dismissInvitation](packages/better-auth/src/plugins/organization/routes/crud-invites.ts:959:0-1073:3) endpoint specifically to handle this scenario, allowing recipients to clean up their invitation lists. ### Changes - Added [dismissInvitation](packages/better-auth/src/plugins/organization/routes/crud-invites.ts:959:0-1073:3) endpoint in [[crud-invites.ts](packages/better-auth/src/plugins/organization/routes/crud-invites.ts:0:0-0:0)](packages/better-auth/src/plugins/organization/routes/crud-invites.ts) - Updated `invitationStatus` enum to include `"dismissed"` in [[schema.ts](packages/better-auth/src/plugins/organization/schema.ts:0:0-0:0)](packages/better-auth/src/plugins/organization/schema.ts) - Added new error codes `INVITATION_NOT_EXPIRED` and `INVITATION_CANNOT_BE_DISMISSED` in [`error-codes.ts`](packages/better-auth/src/plugins/organization/error-codes.ts) - Added `beforeDismissInvitation` and `afterDismissInvitation` hooks in [[types.ts](packages/better-auth/src/plugins/organization/types.ts:0:0-0:0)](packages/better-auth/src/plugins/organization/types.ts) - Updated adapter types in [`adapter.ts`](packages/better-auth/src/plugins/organization/adapter.ts) - Registered new endpoint in [`organization.ts`](packages/better-auth/src/plugins/organization/organization.ts) ### Validation Logic The endpoint ensures strict validation: 1. **Expiration:** Invitation *must* be expired (`expiresAt < now`). 2. **Status:** Invitation must be in `'pending'` status (not already accepted/rejected). 3. **Ownership:** Only the recipient can dismiss the invitation. ### Testing - Added comprehensive tests in [[expired-invitation.test.ts](packages/better-auth/src/plugins/organization/routes/expired-invitation.test.ts:0:0-0:0)](packages/better-auth/src/plugins/organization/routes/expired-invitation.test.ts) covering: - ✅ Success: Dismissing an expired invitation - ❌ Failure: Dismissing a valid (non-expired) invitation - ❌ Failure: Dismissing an already accepted/rejected invitation - ❌ Failure: Dismissing an invitation for another user - Verified manually in a local development environment. - Ran full test suite (`pnpm test`) - All checks passed. <!-- This is an auto-generated description by cubic. --> --- ## Summary by cubic Adds a dismissInvitation endpoint so recipients can remove expired organization invites from their inbox. Fixes #7291 where expired invites got stuck. - New Features - POST /organization/dismiss-invitation to dismiss only expired, pending invites owned by the requester. - Added dismissed status to invitationStatus and adapter.updateInvitation. - New error codes: INVITATION_NOT_EXPIRED, INVITATION_CANNOT_BE_DISMISSED. - New hooks: beforeDismissInvitation and afterDismissInvitation. - Tests cover success, non-expired, already-processed, wrong user, and not-found cases. - Migration - If you display invitation status, handle the new dismissed state. <sup>Written for commit 1f900654e7476a3841669c067ab2183b111d83c5. Summary will update on new commits.</sup> <!-- End of auto-generated description by cubic. --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-03-13 13:28:01 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/better-auth#7207