3.2 KiB
3.2 KiB
Invite link limits
Goal
Allow organization admins to configure invitation link validity and usage limits when creating invite links.
This should make invite links safer to distribute by letting admins choose how long a link remains valid and how many times it may be used.
Confirmed Facts
- Invitation links are created from
modules/settings/components/OrganizationInviteDialog.tsx. - The invitation create API is
app/api/organizations/[id]/invitations/route.ts. - Invitation persistence is backed by the
organization_invitationstable inmodules/core/server/schema.ts. - Invitations already have an
expiresAtcolumn and are currently created with a fixed 7-day validity window. - Registration consumes invitation tokens through
modules/core/server/auth.ts. - The current registration flow marks an invitation as
acceptedafter one successful invitation registration, so existing invite links behave as single-use links. - Invitation rows are shown in
modules/settings/components/OrganizationDetailClient.tsx, currently with target, role, status, expiry, and copy action.
Requirements
- Admins can configure an invitation link's validity period when creating an organization invitation.
- Admins can configure the maximum usage count for an invitation link when creating an organization invitation.
- Existing behavior remains compatible by default: if the admin does not change the controls, a new invite should expire after 7 days and be usable once.
- The backend validates create-invitation inputs and rejects invalid limit values with structured API failures.
- The registration path rejects expired or exhausted invitation links.
- Invitation list data exposes enough information to show configured limits and current usage.
- The UI makes the configured validity and usage limit visible when creating and reviewing invitations.
- Maximum access count means maximum successful invitation registrations, not page loads or token preview requests.
Out of Scope
- Invitation revocation management beyond existing status behavior.
- Editing limits after an invitation has been created.
- Tracking anonymous page views unless product intent explicitly requires page-load based access counting.
Acceptance Criteria
- Creating an invitation with default form values produces a 7-day, one-use invitation.
- Creating an invitation with a custom validity period stores and displays the corresponding expiry.
- Creating an invitation with a custom maximum usage count stores and displays the configured usage limit.
- Registration with an expired invitation fails with the existing invalid/expired invitation behavior.
- Registration after the invitation has reached its maximum allowed uses fails.
- Successful invitation registration increments usage accounting and only exhausts the link when the configured maximum is reached.
- Type-check, lint, and relevant tests/build checks pass.
Notes
- Recommended interpretation: count successful invitation registrations as usage. Counting page loads would make links vulnerable to browser refreshes, previews, bots, and accidental visits, and it would require adding a separate token validation/view endpoint.