Track reason for which a geolocation db download was attempted

This commit is contained in:
Alejandro Celaya
2024-12-16 09:23:30 +01:00
parent 72a962ec6d
commit e715a0fb6f
4 changed files with 23 additions and 7 deletions

View File

@@ -46,6 +46,11 @@ return static function (ClassMetadata $metadata, array $emConfig): void {
->nullable()
->build();
fieldWithUtf8Charset($builder->createField('reason', Types::STRING), $emConfig)
->columnName('reason')
->length(1024)
->build();
fieldWithUtf8Charset($builder->createField('filesystemId', Types::STRING), $emConfig)
->columnName('filesystem_id')
->length(512)

View File

@@ -38,6 +38,7 @@ final class Version20241212131058 extends AbstractMigration
]);
$table->addColumn('filesystem_id', Types::STRING, ['length' => 512]);
$table->addColumn('reason', Types::STRING, ['length' => 1024]);
$table->addColumn('error', Types::STRING, [
'length' => 1024,
'default' => null,

View File

@@ -13,6 +13,7 @@ class GeolocationDbUpdate extends AbstractEntity
{
private function __construct(
private readonly string $filesystemId,
private readonly string $reason,
private GeolocationDbUpdateStatus $status = GeolocationDbUpdateStatus::IN_PROGRESS,
private readonly Chronos $dateCreated = new Chronos(),
private Chronos $dateUpdated = new Chronos(),
@@ -20,9 +21,9 @@ class GeolocationDbUpdate extends AbstractEntity
) {
}
public static function forFilesystemId(string|null $filesystemId = null): self
public static function withReason(string $reason, string|null $filesystemId = null): self
{
return new self($filesystemId ?? self::currentFilesystemId());
return new self($reason, $filesystemId ?? self::currentFilesystemId());
}
public static function currentFilesystemId(): string

View File

@@ -89,12 +89,20 @@ readonly class GeolocationDbUpdater implements GeolocationDbUpdaterInterface
}
// Try to download if:
// - There are no attempts or the database file does not exist
// - There are no attempts tracked
// - The database file does not exist
// - Last update errored (and implicitly, the max amount of consecutive errors has not been reached)
// - Most recent attempt is older than 30 days (and implicitly, successful)
$olderDbExists = $mostRecentDownload !== null && $this->dbUpdater->databaseFileExists();
if (! $olderDbExists || $lastAttemptIsError || $mostRecentDownload->isOlderThan(days: 30)) {
return $this->downloadAndTrackUpdate($downloadProgressHandler, $olderDbExists);
$reasonMatch = match (true) {
$mostRecentDownload === null => [false, 'No download attempts tracked for this instance'],
$this->dbUpdater->databaseFileExists() => [false, 'Geolocation db file does not exist'],
$lastAttemptIsError => [true, 'Max consecutive errors not reached'],
$mostRecentDownload->isOlderThan(days: 30) => [true, 'Last successful attempt'],
default => null,
};
if ($reasonMatch !== null) {
[$olderDbExists, $reason] = $reasonMatch;
return $this->downloadAndTrackUpdate($downloadProgressHandler, $olderDbExists, $reason);
}
return GeolocationResult::DB_IS_UP_TO_DATE;
@@ -106,8 +114,9 @@ readonly class GeolocationDbUpdater implements GeolocationDbUpdaterInterface
private function downloadAndTrackUpdate(
GeolocationDownloadProgressHandlerInterface|null $downloadProgressHandler,
bool $olderDbExists,
string $reason,
): GeolocationResult {
$dbUpdate = GeolocationDbUpdate::forFilesystemId();
$dbUpdate = GeolocationDbUpdate::withReason($reason);
$this->em->persist($dbUpdate);
$this->em->flush();