media = MediaLibrary::instance(); } protected function setPage(Page $page): self { $this->page = $page; return $this; } public function clearAll(): void { foreach ($this->pages() as $page) { $this->setPage($page)->clear(); } } public function syncAll(): void { foreach ($this->pages() as $page) { $this->setPage($page)->sync(); } } public function pages(): Collection { return Page::where('type', $this->getType())->get(); } public function clear() { $this->page->delete(); } public function cleanOutdated(): void { if (!is_numeric(Setting::get('max_posts'))) { return; } while ($this->page->posts()->count() > 0 && $this->page->posts()->count() > Setting::get('max_posts')) { $this->page->posts()->orderBy('created_at')->first()->delete(); } } public function saveUrl(string $source, ?string $filename = null): string { $filename = $filename ?: pathinfo(parse_url($source, PHP_URL_PATH), PATHINFO_BASENAME); if (!pathinfo($filename, PATHINFO_FILENAME)) { throw new SocialException('No real filename for storage given in "'.$source.'"'); } $file = $this->page->mediaPath.$filename; if (!$this->media->exists($file)) { $this->media->put($file, file_get_contents($source)); Event::fire('media.file.upload', [null, $file, null]); } return $file; } protected function sync() { foreach ($this->posts() as $post) { $existing = $this->page->posts()->where('remote_id', $post['remote_id'])->first(); if ($existing) { $existing->update($post); } else { $existing = $this->page->posts()->create($post); } foreach ($post['attachments'] as $attachment) { $existing->attachments()->updateOrCreate(['remote_id' => $attachment['remote_id']], $attachment); } } $this->cleanOutdated(); } }