mirror of
https://github.com/pixelfed/pixelfed.git
synced 2025-02-25 07:22:47 +00:00
170 lines
5.5 KiB
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;
|
|
}
|
|
}
|
|
}
|