195 lines
7.0 KiB
PHP
195 lines
7.0 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
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\Auth;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Facades\Mail;
|
|
use Illuminate\Support\Str;
|
|
|
|
use function auditionLog;
|
|
|
|
class UserController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
if (! Auth::user()->is_admin) {
|
|
abort(403);
|
|
}
|
|
$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)
|
|
{
|
|
if (! Auth::user()->is_admin) {
|
|
abort(403);
|
|
}
|
|
$schools = School::orderBy('name')->get();
|
|
|
|
return view('admin.users.edit', ['user' => $user, 'schools' => $schools]);
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
if (! Auth::user()->is_admin) {
|
|
abort(403);
|
|
}
|
|
$schools = School::orderBy('name')->get();
|
|
|
|
return view('admin.users.create', ['schools' => $schools]);
|
|
}
|
|
|
|
public function update(Request $request, User $user, SetHeadDirector $headSetter)
|
|
{
|
|
if (! Auth::user()->is_admin) {
|
|
abort(403);
|
|
}
|
|
$oldEmail = $user->email;
|
|
$wasAdmin = $user->is_admin;
|
|
$wasTab = $user->is_tab;
|
|
$validData = $request->validate([
|
|
'first_name' => ['required'],
|
|
'last_name' => ['required'],
|
|
'email' => ['required', 'email'],
|
|
'cell_phone' => ['required'],
|
|
'judging_preference' => ['required'],
|
|
'school_id' => ['nullable', 'exists:schools,id'],
|
|
]);
|
|
$validData['is_admin'] = $request->get('is_admin') == 'on' ? 1 : 0;
|
|
$validData['is_tab'] = $request->get('is_tab') == 'on' ? 1 : 0;
|
|
$validData['is_head'] = $request->get('is_head') == 'on' ? 1 : 0;
|
|
$user->update([
|
|
'first_name' => $validData['first_name'],
|
|
'last_name' => $validData['last_name'],
|
|
'email' => $validData['email'],
|
|
'cell_phone' => $validData['cell_phone'],
|
|
'judging_preference' => $validData['judging_preference'],
|
|
'school_id' => $validData['school_id'],
|
|
'is_admin' => $validData['is_admin'],
|
|
'is_tab' => $validData['is_tab'],
|
|
]);
|
|
$user->refresh();
|
|
$logged_school = $user->school_id ? $user->school->name : 'No School';
|
|
$message = 'Updated user #'.$user->id.' - '.$oldEmail
|
|
.'<br>Name: '.$user->full_name()
|
|
.'<br>Email: '.$user->email
|
|
.'<br>Cell Phone: '.$user->cell_phone
|
|
.'<br>Judging Pref: '.$user->judging_preference
|
|
.'<br>School: '.$logged_school;
|
|
|
|
AuditLogEntry::create([
|
|
'user' => auth()->user()->email,
|
|
'ip_address' => request()->ip(),
|
|
'message' => $message,
|
|
'affected' => ['users' => [$user->id]],
|
|
]);
|
|
if ($user->is_admin != $wasAdmin) {
|
|
$messageStart = $user->is_admin ? 'Granted admin privileges to ' : 'Revoked admin privileges from ';
|
|
AuditLogEntry::create([
|
|
'user' => auth()->user()->email,
|
|
'ip_address' => request()->ip(),
|
|
'message' => $messageStart.$user->full_name().' - '.$user->email,
|
|
'affected' => ['users' => [$user->id]],
|
|
]);
|
|
}
|
|
if ($user->is_tab != $wasTab) {
|
|
$messageStart = $user->is_tab ? 'Granted tabulation privileges to ' : 'Revoked tabulation privileges from ';
|
|
AuditLogEntry::create([
|
|
'user' => auth()->user()->email,
|
|
'ip_address' => request()->ip(),
|
|
'message' => $messageStart.$user->full_name().' - '.$user->email,
|
|
'affected' => ['users' => [$user->id]],
|
|
]);
|
|
}
|
|
if ($user->hasFlag('head_director') != $validData['is_head'] && ! is_null($user->school_id)) {
|
|
if ($validData['is_head']) {
|
|
$headSetter->setHeadDirector($user);
|
|
} else {
|
|
$user->removeFlag('head_director');
|
|
$logMessage = 'Removed '.$user->full_name().' as head director at '.$user->school->name;
|
|
$logAffected = ['users' => [$user->id], 'schools' => [$user->school_id]];
|
|
auditionLog($logMessage, $logAffected);
|
|
}
|
|
}
|
|
|
|
return redirect('/admin/users');
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$request->validate([
|
|
'first_name' => ['required'],
|
|
'last_name' => ['required'],
|
|
'email' => ['required', 'email', 'unique:users'],
|
|
]);
|
|
|
|
// Generate a random password
|
|
$randomPassword = Str::random(12);
|
|
|
|
$user = User::make([
|
|
'first_name' => request('first_name'),
|
|
'last_name' => request('last_name'),
|
|
'email' => request('email'),
|
|
'cell_phone' => request('cell_phone'),
|
|
'judging_preference' => request('judging_preference'),
|
|
'password' => Hash::make($randomPassword),
|
|
]);
|
|
|
|
if (! is_null(request('school_id'))) {
|
|
$request->validate([
|
|
'school_id' => ['exists:schools,id'],
|
|
]);
|
|
}
|
|
$user->school_id = request('school_id');
|
|
$user->save();
|
|
$message = 'Created user '.$user->email.' - '.$user->full_name().'<br>Cell Phone: '.$user->cell_phone.'<br>Judging Pref: '.$user->judging_preference;
|
|
AuditLogEntry::create([
|
|
'user' => auth()->user()->email,
|
|
'ip_address' => request()->ip(),
|
|
'message' => $message,
|
|
'affected' => ['users' => [$user->id]],
|
|
]);
|
|
if ($user->school_id) {
|
|
$message = 'Set user '.$user->full_name().' ('.$user->email.') as a director at '.$user->school->name.'(#'.$user->school->id.')';
|
|
AuditLogEntry::create([
|
|
'user' => auth()->user()->email,
|
|
'ip_address' => request()->ip(),
|
|
'message' => $message,
|
|
'affected' => [
|
|
'users' => [$user->id],
|
|
'schools' => [$user->id],
|
|
],
|
|
]);
|
|
}
|
|
Mail::to($user->email)->send(new NewUserPassword($user, $randomPassword));
|
|
|
|
return redirect('/admin/users');
|
|
}
|
|
|
|
public function destroy(User $user)
|
|
{
|
|
if (! Auth::user()->is_admin) {
|
|
abort(403);
|
|
}
|
|
$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');
|
|
}
|
|
}
|