line(' '); $this->info(' Welcome to the Curated Onboarding manager'); $this->line(' '); $action = select( label: 'Select an action:', options: ['Stats', 'Edit'], default: 'Stats', hint: 'You can manage this via the admin dashboard.' ); switch ($action) { case 'Stats': return $this->stats(); break; case 'Edit': return $this->edit(); break; default: exit; break; } } protected function stats() { $total = CuratedRegister::count(); $approved = CuratedRegister::whereIsApproved(true)->whereIsRejected(false)->whereNotNull('email_verified_at')->count(); $awaitingMoreInfo = CuratedRegister::whereIsAwaitingMoreInfo(true)->whereIsRejected(false)->whereIsClosed(false)->whereNotNull('email_verified_at')->count(); $open = CuratedRegister::whereIsApproved(false)->whereIsRejected(false)->whereIsClosed(false)->whereNotNull('email_verified_at')->whereIsAwaitingMoreInfo(false)->count(); $nonVerified = CuratedRegister::whereIsApproved(false)->whereIsRejected(false)->whereIsClosed(false)->whereNull('email_verified_at')->whereIsAwaitingMoreInfo(false)->count(); table( ['Total', 'Approved', 'Open', 'Awaiting More Info', 'Unverified Emails'], [ [$total, $approved, $open, $awaitingMoreInfo, $nonVerified], ] ); } protected function edit() { $id = search( label: 'Search for a username or email', options: fn (string $value) => strlen($value) > 0 ? CuratedRegister::where(function ($query) use ($value) { $query->whereLike('username', "%{$value}%") ->orWhereLike('email', "%{$value}%"); })->get() ->mapWithKeys(fn ($user) => [ $user->id => "{$user->username} ({$user->email})", ]) ->all() : [] ); $register = CuratedRegister::findOrFail($id); if ($register->is_approved) { $status = 'Approved'; } elseif ($register->is_rejected) { $status = 'Rejected'; } elseif ($register->is_closed) { $status = 'Closed'; } elseif ($register->is_awaiting_more_info) { $status = 'Awaiting more info'; } elseif ($register->user_has_responded) { $status = 'Awaiting Admin Response'; } else { $status = 'Unknown'; } table( ['Field', 'Value'], [ ['ID', $register->id], ['Username', $register->username], ['Email', $register->email], ['Status', $status], ['Created At', $register->created_at->format('Y-m-d H:i')], ['Updated At', $register->updated_at->format('Y-m-d H:i')], ] ); if (in_array($status, ['Approved', 'Rejected', 'Closed'])) { return; } $options = ['Cancel', 'Delete']; if ($register->email_verified_at == null) { $options[] = 'Resend Email Verification'; } $action = select( label: 'Select an action:', options: $options, default: 'Cancel', ); if ($action === 'Resend Email Verification') { $confirmed = confirm('Are you sure you want to send another email to '.$register->email.' ?'); if (! $confirmed) { $this->error('Aborting...'); exit; } DB::transaction(function () use ($register) { $register->verify_code = Str::random(40); $register->created_at = now(); $register->save(); Mail::to($register->email)->send(new CuratedRegisterConfirmEmail($register)); $this->info('Mail sent!'); }); } elseif ($action === 'Delete') { $confirmed = confirm('Are you sure you want to delete the application from '.$register->email.' ?'); if (! $confirmed) { $this->error('Aborting...'); exit; } DB::transaction(function () use ($register) { CuratedRegisterActivity::whereRegisterId($register->id)->delete(); $register->delete(); $this->info('Successfully deleted!'); }); } else { $this->info('Cancelled.'); exit; } } }