User management

This commit is contained in:
2026-06-21 21:56:35 +02:00
parent cfc7c7eee2
commit aebb2f9aaa
11 changed files with 717 additions and 0 deletions
@@ -0,0 +1,35 @@
<?php
namespace App\Domains\Admin\Controllers;
use App\Enumerations\UserRole;
use App\Models\Tenant;
use App\Models\User;
use App\Scopes\CommonController;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UserDetailGetController extends CommonController
{
public function __invoke(int $id, Request $request): JsonResponse
{
$user = User::findOrFail($id);
$userData = $user->toArray();
unset($userData['password'], $userData['remember_token'], $userData['activation_token'], $userData['activation_token_expires_at']);
$tenantNames = Tenant::pluck('name', 'slug');
$userData['nicename'] = $user->getNicename();
$userData['fullname'] = $user->getFullName();
$userData['local_group_name'] = $tenantNames[$user->local_group] ?? $user->local_group;
return response()->json([
'user' => $userData,
'isOwnUser' => auth()->id() === $user->id,
'isLvTenant' => $this->tenant->slug === 'lv',
'userRoles' => UserRole::all()->map(fn($role) => ['slug' => $role->slug, 'name' => $role->name]),
'localGroups' => Tenant::where('is_active_local_group', true)->get()->map(fn($t) => ['slug' => $t->slug, 'name' => $t->name]),
]);
}
}
@@ -0,0 +1,40 @@
<?php
namespace App\Domains\Admin\Controllers;
use App\Models\Tenant;
use App\Models\User;
use App\Scopes\CommonController;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UserListApiController extends CommonController
{
public function __invoke(Request $request): JsonResponse
{
$tenantNames = Tenant::pluck('name', 'slug');
$query = User::query();
if ($this->tenant->slug === 'lv') {
$query->orderBy('lastname')->orderBy('firstname');
} else {
$query->where('local_group', $this->tenant->slug)
->orderBy('lastname')->orderBy('firstname');
}
$users = $query->get()->map(function ($user) use ($tenantNames) {
return [
'id' => $user->id,
'firstname' => $user->firstname,
'lastname' => $user->lastname,
'nickname' => $user->nickname,
'local_group' => $user->local_group,
'local_group_name' => $tenantNames[$user->local_group] ?? $user->local_group,
'active' => $user->active,
];
});
return response()->json(['users' => $users]);
}
}
@@ -0,0 +1,19 @@
<?php
namespace App\Domains\Admin\Controllers;
use App\Providers\InertiaProvider;
use App\Scopes\CommonController;
use Illuminate\Http\Request;
use Inertia\Response;
class UserListPageController extends CommonController
{
public function __invoke(Request $request): Response
{
$inertiaProvider = new InertiaProvider('Admin/UserList', [
'isLvTenant' => $this->tenant->slug === 'lv',
]);
return $inertiaProvider->render();
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Domains\Admin\Controllers;
use App\Domains\UserManagement\Actions\GenerateActivationToken\GenerateActivationTokenCommand;
use App\Models\User;
use App\Scopes\CommonController;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UserResetPasswordController extends CommonController
{
public function __invoke(int $id, Request $request): JsonResponse
{
$user = User::findOrFail($id);
if (!$user->email) {
return response()->json([
'status' => 'error',
'message' => 'Benutzer*in hat keine E-Mail-Adresse hinterlegt.',
]);
}
$command = new GenerateActivationTokenCommand($user);
$command->execute();
return response()->json([
'status' => 'success',
'message' => 'Passwort-Reset-Mail wurde gesendet.',
]);
}
}
@@ -0,0 +1,33 @@
<?php
namespace App\Domains\Admin\Controllers;
use App\Models\User;
use App\Scopes\CommonController;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UserToggleActiveController extends CommonController
{
public function __invoke(int $id, Request $request): JsonResponse
{
$user = User::findOrFail($id);
if (auth()->id() === $user->id) {
return response()->json([
'status' => 'error',
'message' => 'Du kannst dich nicht selbst deaktivieren.',
]);
}
$user->update(['active' => !$user->active]);
$status = $user->active ? 'aktiviert' : 'deaktiviert';
return response()->json([
'status' => 'success',
'message' => 'Benutzer*in wurde ' . $status . '.',
'active' => $user->active,
]);
}
}
@@ -0,0 +1,42 @@
<?php
namespace App\Domains\Admin\Controllers;
use App\Models\User;
use App\Scopes\CommonController;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UserUpdateController extends CommonController
{
public function __invoke(int $id, Request $request): JsonResponse
{
$user = User::findOrFail($id);
$isOwnUser = auth()->id() === $user->id;
$isLvTenant = $this->tenant->slug === 'lv';
$allowedFields = [
'firstname', 'lastname', 'nickname', 'email', 'phone', 'birthday',
'membership_id', 'address_1', 'address_2', 'postcode', 'city',
'eating_habits', 'swimming_permission', 'first_aid_permission',
'bank_account_owner', 'bank_account_iban',
'medications', 'allergies', 'intolerances',
'user_role_local_group',
];
if ($isLvTenant) {
$allowedFields[] = 'local_group';
if (!$isOwnUser) {
$allowedFields[] = 'user_role_main';
}
}
$data = $request->only($allowedFields);
$user->update($data);
return response()->json([
'status' => 'success',
'message' => 'Benutzerdaten wurden gespeichert.',
]);
}
}