1
0
Fork 1
mirror of https://github.com/pixelfed/pixelfed.git synced 2025-02-25 07:22:47 +00:00
pixelfed/app/Console/Commands/CuratedOnboardingCommand.php

170 lines
5.5 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Mail\CuratedRegisterConfirmEmail;
use App\Models\CuratedRegister;
use App\Models\CuratedRegisterActivity;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use function Laravel\Prompts\confirm;
use function Laravel\Prompts\search;
use function Laravel\Prompts\select;
use function Laravel\Prompts\table;
class CuratedOnboardingCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:curated-onboarding';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Manage curated onboarding applications';
/**
* Execute the console command.
*/
public function handle()
{
$this->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;
}
}
}