diff --git a/app/Http/Controllers/App/Settings/ProfileController.php b/app/Http/Controllers/App/Settings/ProfileController.php index 0d7273be..880927ab 100644 --- a/app/Http/Controllers/App/Settings/ProfileController.php +++ b/app/Http/Controllers/App/Settings/ProfileController.php @@ -94,15 +94,7 @@ public function destroy(ProfileDeleteRequest $request): RedirectResponse $user->update(['current_workspace_id' => null]); $account = $user->account; - - // Cancel account subscription if exists - if ($account && $account->subscribed(Account::SUBSCRIPTION_NAME)) { - $account->subscription(Account::SUBSCRIPTION_NAME)->cancelNow(); - } - - if ($account) { - $account->subscriptions()->delete(); - } + $isOwner = $user->isAccountOwner(); $ownedWorkspaces = Workspace::where('user_id', $user->id)->get(); @@ -126,7 +118,12 @@ public function destroy(ProfileDeleteRequest $request): RedirectResponse $user->workspaces()->detach(); - if ($account) { + if ($account && $isOwner) { + if ($account->subscribed(Account::SUBSCRIPTION_NAME)) { + $account->subscription(Account::SUBSCRIPTION_NAME)->cancelNow(); + } + + $account->subscriptions()->delete(); $account->delete(); } }); diff --git a/app/Http/Controllers/Auth/RegisteredUserController.php b/app/Http/Controllers/Auth/RegisteredUserController.php index b030065a..dd13f0f5 100644 --- a/app/Http/Controllers/Auth/RegisteredUserController.php +++ b/app/Http/Controllers/Auth/RegisteredUserController.php @@ -57,6 +57,8 @@ public function store(Request $request): RedirectResponse Auth::login($user); + $request->session()->forget('pending_invite_id'); + if ($redirect = $request->input('redirect')) { if (str_starts_with($redirect, '/') && ! str_starts_with($redirect, '//')) { return redirect($redirect); diff --git a/app/Http/Middleware/App/EnsureRegistrationEnabled.php b/app/Http/Middleware/App/EnsureRegistrationEnabled.php new file mode 100644 index 00000000..82d04c4c --- /dev/null +++ b/app/Http/Middleware/App/EnsureRegistrationEnabled.php @@ -0,0 +1,27 @@ +query('invite') ?? $request->session()->get('pending_invite_id')) { + $request->session()->put('pending_invite_id', $inviteId); + + return $next($request); + } + + throw new NotFoundHttpException; + } +} diff --git a/bootstrap/app.php b/bootstrap/app.php index 12e6c57c..03691e8c 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,6 +1,7 @@ alias([ 'workspace.token' => LoadWorkspaceFromToken::class, + 'registration.enabled' => EnsureRegistrationEnabled::class, ]); $middleware->preventRequestForgery(except: [ diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 00000000..a3a28b5d --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,36 @@ +exists()) { + $this->command->info('UserSeeder: a user already exists, skipping.'); + + return; + } + + $user = CreateUser::execute([ + 'name' => 'Admin', + 'email' => 'admin@trypost.it', + 'password' => 'password', + 'email_verified_at' => now(), + 'timezone' => 'UTC', + ]); + + CreateWorkspace::execute($user, ['name' => 'My Workspace']); + + $this->command->info('Admin account created — change the password on first login:'); + $this->command->line(' email: admin@trypost.it'); + $this->command->line(' password: password'); + } +} diff --git a/resources/js/pages/auth/AcceptInvite.vue b/resources/js/pages/auth/AcceptInvite.vue index 278ee462..d168ef32 100644 --- a/resources/js/pages/auth/AcceptInvite.vue +++ b/resources/js/pages/auth/AcceptInvite.vue @@ -96,7 +96,7 @@ const inviteUrl = computed(() => `/invites/${props.invite.id}`); diff --git a/resources/js/pages/auth/Login.vue b/resources/js/pages/auth/Login.vue index 6a3376f7..3b25e1d9 100644 --- a/resources/js/pages/auth/Login.vue +++ b/resources/js/pages/auth/Login.vue @@ -1,5 +1,6 @@