Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
68.75% covered (warning)
68.75%
11 / 16
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
CleanupApiLogsTask
73.33% covered (warning)
73.33%
11 / 15
66.67% covered (warning)
66.67%
2 / 3
4.30
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 run
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
2
 resolveLogger
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3declare(strict_types=1);
4
5/** @license For full copyright and license information, please see the LICENSE.md file. */
6
7namespace App\Core\Cron;
8
9defined('AMMONLY_APP') || exit('Direct script access is forbidden.');
10
11use App\Core\Api\Domain\Repository\ApiLoggerInterface;
12use App\Core\Api\Infrastructure\Repository\SqlApiLoggerRepository;
13use App\Core\Database\MultiDbRouter;
14use App\Shared\Infrastructure\Config\InstallerConfigLoader;
15use PDO;
16
17/**
18 * Cleanup Old API Access Logs Background Task.
19 *
20 * Implements CronTaskInterface to purge aged API request and detail logs (NIST AU-9 / AU-11).
21 *
22 * @package App\Core\Cron
23 */
24final readonly class CleanupApiLogsTask implements CronTaskInterface
25{
26    /**
27     * CleanupApiLogsTask constructor.
28     *
29     * @param ApiLoggerInterface|PDO|null $logger                  API logger repository or PDO instance.
30     * @param int                         $standardRetentionDays   Days to retain standard fast success logs.
31     * @param int                         $errorRetentionDays      Days to retain error and slow request logs.
32     */
33    public function __construct(
34        private ApiLoggerInterface|PDO|null $logger = null,
35        private int                         $standardRetentionDays = 14,
36        private int                         $errorRetentionDays = 90,
37    ) {
38    }
39
40    /**
41     * {@inheritdoc}
42     */
43    public function run(): string
44    {
45        $logger = $this->logger ?? $this->resolveLogger();
46
47        if ($logger instanceof PDO) {
48            $logger = new SqlApiLoggerRepository($logger);
49        }
50
51        $deleted = $logger->purgeExpiredLogs($this->standardRetentionDays, $this->errorRetentionDays);
52
53        return sprintf(
54            'Cleaned up %d expired API request log(s) (Standard retention: %dd, Error retention: %dd).',
55            $deleted,
56            $this->standardRetentionDays,
57            $this->errorRetentionDays
58        );
59    }
60
61    /**
62     * Resolves default PDO connection when none provided.
63     *
64     * @return PDO Initialized PDO instance.
65     */
66    private function resolveLogger(): PDO
67    {
68        $config = InstallerConfigLoader::load();
69        $dbParams = $config['db'] ?? [];
70        $router = new MultiDbRouter(['default' => $dbParams]);
71        return $router->getConnection('default');
72    }
73}