action(fn (?Model $record, array $data) => $this->handle($record, $data)); } /** * Get the underlying storage action. * * @param array $data */ abstract protected function storageAction(Model $record, array $data): BaseStorageAction; /** * Run this after the video is uploaded. * * @param array $data */ protected function afterStorageAction(?Model $record, array $data): void {} /** * @param array $data */ public function handle(?Model $record, array $data): void { $action = $this->storageAction($record, $data); $storageResults = $action->handle(); $storageResults->toLog(); $updated = $action->then($storageResults); $record ??= $updated; $actionResult = $storageResults->toActionResult(); if ($actionResult->hasFailed()) { $this->failedLog($actionResult->getMessage()); return; } $this->afterStorageAction($record, $data); } }