. */ declare(strict_types=1); namespace FireflyIII\Repositories\ExportJob; use Carbon\Carbon; use Exception; use FireflyIII\Models\ExportJob; use FireflyIII\User; use Illuminate\Contracts\Filesystem\FileNotFoundException; use Illuminate\Support\Str; use Illuminate\Support\Facades\Storage; use Log; /** * Class ExportJobRepository. */ class ExportJobRepository implements ExportJobRepositoryInterface { /** @var User */ private $user; /** * Constructor. */ public function __construct() { if ('testing' === config('app.env')) { Log::warning(sprintf('%s should not be instantiated in the TEST environment!', \get_class($this))); } } /** * @param ExportJob $job * @param string $status * * @return bool */ public function changeStatus(ExportJob $job, string $status): bool { Log::debug(sprintf('Change status of job #%d to "%s"', $job->id, $status)); $job->status = $status; $job->save(); return true; } /** * @return ExportJob|null */ public function create(): ?ExportJob { $count = 0; while ($count < 30) { $key = Str::random(12); $existing = $this->findByKey($key); if (null === $existing) { $exportJob = new ExportJob; $exportJob->user()->associate($this->user); $exportJob->key = Str::random(12); $exportJob->status = 'export_status_never_started'; $exportJob->save(); // breaks the loop: return $exportJob; } ++$count; } return null; } /** * @param ExportJob $job * * @return bool */ public function exists(ExportJob $job): bool { $disk = Storage::disk('export'); $file = $job->key . '.zip'; return $disk->exists($file); } /** * @param string $key * * @return ExportJob|null */ public function findByKey(string $key): ?ExportJob { /** @var ExportJob $result */ $result = $this->user->exportJobs()->where('key', $key)->first(['export_jobs.*']); if (null === $result) { return null; } return $result; } /** * @param ExportJob $job * * @return string */ public function getContent(ExportJob $job): string { $disk = Storage::disk('export'); $file = $job->key . '.zip'; try { $content = $disk->get($file); } catch (FileNotFoundException $e) { Log::warning(sprintf('File not found: %s', $e->getMessage())); $content = ''; } return $content; } /** * @param User $user */ public function setUser(User $user): void { $this->user = $user; } }