125 lines
3.9 KiB
PHP
125 lines
3.9 KiB
PHP
<?php
|
|
|
|
/** @noinspection PhpUnhandledExceptionInspection */
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Actions\Fortify\CreateNewUser;
|
|
use App\Actions\Fortify\UpdateUserPrivileges;
|
|
use App\Actions\Fortify\UpdateUserProfileInformation;
|
|
use App\Actions\Schools\AssignUserToSchool;
|
|
use App\Actions\Schools\SetHeadDirector;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Mail\NewUserPassword;
|
|
use App\Models\AuditLogEntry;
|
|
use App\Models\School;
|
|
use App\Models\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Mail;
|
|
use Illuminate\Support\Str;
|
|
|
|
class UserController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$users = User::with('school')->with('flags')->orderBy('last_name')->orderBy('first_name')->get();
|
|
|
|
return view('admin.users.index', ['users' => $users]);
|
|
}
|
|
|
|
public function edit(User $user)
|
|
{
|
|
|
|
$schools = School::orderBy('name')->get();
|
|
$logEntries = AuditLogEntry::whereJsonContains('affected->users', $user->id)->orderBy('created_at', 'desc')->get();
|
|
$userActions = AuditLogEntry::where('user', $user->email)->orderBy('created_at', 'desc')->get();
|
|
|
|
return view('admin.users.edit', compact('user', 'schools', 'logEntries', 'userActions'));
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
|
|
$schools = School::orderBy('name')->get();
|
|
|
|
return view('admin.users.create', ['schools' => $schools]);
|
|
}
|
|
|
|
public function update(
|
|
Request $request,
|
|
User $user,
|
|
SetHeadDirector $headSetter,
|
|
UpdateUserProfileInformation $profileUpdater,
|
|
AssignUserToSchool $schoolAssigner,
|
|
UpdateUserPrivileges $privilegesUpdater
|
|
) {
|
|
// Update basic profile data
|
|
$profileData = [
|
|
'first_name' => $request->get('first_name'),
|
|
'last_name' => $request->get('last_name'),
|
|
'email' => $request->get('email'),
|
|
'cell_phone' => $request->get('cell_phone'),
|
|
'judging_preference' => $request->get('judging_preference'),
|
|
];
|
|
$profileUpdater->update($user, $profileData);
|
|
|
|
// Deal with school assignment
|
|
if ($user->school_id != $request->get('school_id')) {
|
|
$schoolAssigner($user, $request->get('school_id'));
|
|
}
|
|
|
|
// Deal with the head director flag
|
|
if ($request->has('head_director')) {
|
|
$headSetter($user);
|
|
} else {
|
|
$user->removeFlag('head_director');
|
|
}
|
|
|
|
// Deal with privileges
|
|
if ($request->has('is_admin')) {
|
|
$privilegesUpdater($user, 'grant', 'admin');
|
|
} else {
|
|
$privilegesUpdater($user, 'revoke', 'admin');
|
|
}
|
|
|
|
if ($request->has('is_tab')) {
|
|
$privilegesUpdater($user, 'grant', 'tab');
|
|
} else {
|
|
$privilegesUpdater($user, 'revoke', 'tab');
|
|
}
|
|
|
|
return redirect('/admin/users');
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$userCreator = app(CreateNewUser::class);
|
|
$randomPassword = Str::random(12);
|
|
$data = request()->all();
|
|
$data['password'] = $randomPassword;
|
|
$data['password_confirmation'] = $randomPassword;
|
|
$newDirector = $userCreator->create($data);
|
|
$newDirector->update([
|
|
'school_id' => $request->get('school_id') ?? null,
|
|
]);
|
|
|
|
Mail::to($newDirector->email)->send(new NewUserPassword($newDirector, $randomPassword));
|
|
|
|
return redirect(route('admin.users.index'))->with('success', 'Director added');
|
|
}
|
|
|
|
public function destroy(User $user)
|
|
{
|
|
$message = 'Deleted user '.$user->email;
|
|
AuditLogEntry::create([
|
|
'user' => auth()->user()->email,
|
|
'ip_address' => request()->ip(),
|
|
'message' => $message,
|
|
'affected' => ['users' => [$user->id]],
|
|
]);
|
|
$user->delete();
|
|
|
|
return redirect()->route('admin.users.index')->with('success', 'User deleted successfully');
|
|
}
|
|
}
|