Support invitations for unregistered users

When inviting an email without an InvoiceShelf account, the email now
links to a registration page (/register?invitation={token}) instead of
login. After registering, the invitation is auto-accepted.

Backend:
- InvitationRegistrationController: public details() and register()
  endpoints. Registration validates token + email match, creates account,
  auto-accepts invitation, returns Sanctum token.
- AuthController: login now accepts optional invitation_token param to
  auto-accept invitation for existing users clicking the email link.
- CompanyInvitationMail: conditional URL based on user existence.
- Web route for /invitations/{token}/decline (email decline link).

Frontend:
- RegisterWithInvitation.vue: fetches invitation details, shows company
  name + role, registration form with pre-filled email.
- Router: /register route added.

Tests: 3 new tests (invitation details, register + accept, email mismatch).
This commit is contained in:
Darko Gjorgjijoski
2026-04-03 23:26:58 +02:00
parent 6343b4a17f
commit c1994887ef
9 changed files with 425 additions and 3 deletions

View File

@@ -138,8 +138,16 @@ const AdminFileDisk = () =>
const NoCompanyView = () =>
import('@/scripts/admin/views/NoCompanyView.vue')
const RegisterWithInvitation = () =>
import('@/scripts/admin/views/auth/RegisterWithInvitation.vue')
export default [
{
path: '/register',
name: 'register',
component: RegisterWithInvitation,
meta: { requiresAuth: false },
},
{
path: '/admin/no-company',
name: 'no.company',