70 lines
2.2 KiB
PHP
70 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Command;
|
|
|
|
use App\Repository\UserRepository;
|
|
use Symfony\Component\Console\Attribute\AsCommand;
|
|
use Symfony\Component\Console\Command\Command;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Input\InputOption;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
use Symfony\Component\Console\Style\SymfonyStyle;
|
|
|
|
#[AsCommand(
|
|
name: 'cron:run',
|
|
description: 'Cleanup stale avatars',
|
|
)]
|
|
class CronRunCommand extends Command
|
|
{
|
|
public function __construct(private readonly UserRepository $userRepository)
|
|
{
|
|
parent::__construct();
|
|
}
|
|
|
|
protected function configure(): void
|
|
{
|
|
//$this->addOption(name: 'verbose', shortcut: null, mode: InputOption::VALUE_NONE, description: 'Option description');
|
|
// ->addArgument('arg1', InputArgument::OPTIONAL, 'Argument description')
|
|
}
|
|
|
|
public function execute(InputInterface $input, OutputInterface $output): int
|
|
{
|
|
$io = new SymfonyStyle(input: $input, output: $output);
|
|
|
|
$verbose = $input->getOption(name: 'verbose');
|
|
|
|
$staleCount = $this->deleteStaleAvatars();
|
|
|
|
if ($verbose) {
|
|
if ($staleCount > 0) {
|
|
$io->writeln(messages: "There were " . $staleCount . " stale avatars.");
|
|
} else {
|
|
$io->writeln(messages: "There were no stale avatars younger than 24 hours.");
|
|
}
|
|
}
|
|
|
|
return Command::SUCCESS;
|
|
}
|
|
|
|
private function deleteStaleAvatars(): int
|
|
{
|
|
$avatarDir = dirname(path: __DIR__, levels: 2) . '/public/uploads/avatars';
|
|
$keepTime = 86400; // 24 hours
|
|
$deletedFiles = 0;
|
|
|
|
foreach (glob(pattern: $avatarDir . '/*') as $entry) {
|
|
$filectime = filectime(filename: $entry);
|
|
if ($filectime && $filectime + $keepTime < time()) {
|
|
// check if it in use
|
|
if ($user = $this->userRepository->findOneBy(['avatar' => basename(path: $entry)])) {
|
|
echo basename(path: $entry) . " is in use by: " . $user->getUserIdentifier() . PHP_EOL;
|
|
}
|
|
unlink(filename: $entry);
|
|
$deletedFiles++;
|
|
}
|
|
|
|
}
|
|
return $deletedFiles;
|
|
}
|
|
}
|