oc-social-plugin/classes/SocialService.php

108 lines
2.7 KiB
PHP

<?php
namespace Zoomyboy\Social\Classes;
use Event;
use Generator;
use Illuminate\Support\Collection;
use MediaLibrary;
use Zoomyboy\Social\Exceptions\SocialException;
use Zoomyboy\Social\Models\Page;
use Zoomyboy\Social\Models\Setting;
abstract class SocialService
{
protected $page;
protected $media;
abstract public function getType(): string;
abstract public function posts(): Generator;
public function __construct()
{
$this->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.'"');
}
$filename = str_slug(pathinfo($filename, PATHINFO_FILENAME)).'.'.pathinfo($filename, PATHINFO_EXTENSION);
$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();
}
}