load(); foreach ($this->manager->get('files', []) as $ref => $data) { $this->repairKnownSound($ref, $data); } $this->save(); } /** * Repair a single sound. Move it to appropriate directory */ private function repairKnownSound(string $ref, array $data) { if (!empty($data['url'])) { $data['filename'] = $data['url']; unset($data['url']); $this->manager->set(sprintf('files.%s', $ref), $data); } $extension = pathinfo($data['filename'], PATHINFO_EXTENSION); $currentFullPath = sprintf('%s%s', $this->bundle->getDataDir(), $data['filename']); $expectedFullPath = sprintf( '%s%s/%s/%s/original.%s', $this->bundle->getDataDir(), $this->attachmentsDir, $this->kind, $ref, $extension ); if (!$this->disk->exists($currentFullPath)) { $this->deleteAttachment($ref); return; } if (empty($data['last_modified'])) { $data['last_modified'] = Carbon::parse($this->disk->lastModified($currentFullPath))->toIso8601String(); } if ($currentFullPath !== $expectedFullPath) { $this->disk->move($currentFullPath, $expectedFullPath); $data['last_modified'] = Carbon::parse($this->disk->lastModified($expectedFullPath))->toIso8601String(); $data['filename'] = sprintf( '%s/%s/%s/original.%s', $this->attachmentsDir, $this->kind, $ref, $extension ); $parentDir = dirname($currentFullPath); if (empty($this->disk->listContents($parentDir, true))) { $this->disk->delete($parentDir); } } $checksum = $this->disk->checksum($expectedFullPath); if (!empty($data['checksum']) && $data['checksum'] !== $checksum) { Log::warning('File checksum has changed', [ 'file' => $expectedFullPath, 'oldChecsum' => $data['checksum'], 'newChecksum' => $checksum, ]); } $data['checksum'] = $checksum; $this->manager->set(sprintf('files.%s', $ref), $data); } }