commit b87b6b2a96de870f1782b00cfe3f393cc79b7d3b Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Dec 18 14:05:11 2017 +0000 Even more tests for this micropub refactor commit 2d967f33c3abeea8fc89f91e1764e970681dc58f Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sat Dec 16 22:19:53 2017 +0000 Fill out token endpoint tests commit 440dcbe3e53f058060c918429bea75911ddafdc1 Merge: 02a25b0 f60164f Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 15 14:32:50 2017 +0000 Merge pull request #77 from jonnybarnes/analysis-8KABW6 Apply fixes from StyleCI commit f60164fe81dbcc1d2343704145d26c6d6412579a Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 15 14:27:40 2017 +0000 Apply fixes from StyleCI commit 02a25b083a0305f73d715feb3f9d34f9de8f67d4 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 15 14:17:43 2017 +0000 phpcs fix commit 144998de0866bf11f235847d7edc076235294545 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 15 14:16:59 2017 +0000 Don’t pass the request object to service files, pass request()->all() commit dd5e52010c51a359665efa349ff8c13d4d6dbf57 Merge: 97b270a 23b145e Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Dec 10 20:01:03 2017 +0000 Merge pull request #76 from jonnybarnes/analysis-86AVg6 Apply fixes from StyleCI commit 23b145e7bf67a358b3cb894ea0793984b65ecab5 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Dec 10 19:50:53 2017 +0000 Apply fixes from StyleCI commit 97b270a89abe92e167e0d363029ae0b86608bbc9 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Dec 10 19:43:38 2017 +0000 Improve test coverage of the refactor commit 244102264559e4fb0b0614d1738c0283703a71dc Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 8 13:31:13 2017 +0000 Refactor the note creation code commit 22b4786cbd7ae508b51a47f0c8cf9a15535edbb1 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Dec 7 17:39:41 2017 +0000 Remove ununsed importsed classes in the controller
125 lines
4 KiB
PHP
125 lines
4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Tag;
|
|
use App\Bookmark;
|
|
use Ramsey\Uuid\Uuid;
|
|
use GuzzleHttp\Client;
|
|
use Illuminate\Http\Request;
|
|
use App\Jobs\ProcessBookmark;
|
|
use Spatie\Browsershot\Browsershot;
|
|
use App\Jobs\SyndicateBookmarkToTwitter;
|
|
use App\Jobs\SyndicateBookmarkToFacebook;
|
|
use GuzzleHttp\Exception\ClientException;
|
|
use App\Exceptions\InternetArchiveException;
|
|
|
|
class BookmarkService
|
|
{
|
|
/**
|
|
* Create a new Bookmark.
|
|
*
|
|
* @param array $request
|
|
* @return Bookmark $bookmark
|
|
*/
|
|
public function createBookmark(array $request): Bookmark
|
|
{
|
|
if (array_get($request, 'properties.bookmark-of.0')) {
|
|
//micropub request
|
|
$url = normalize_url(array_get($request, 'properties.bookmark-of.0'));
|
|
$name = array_get($request, 'properties.name.0');
|
|
$content = array_get($request, 'properties.content.0');
|
|
$categories = array_get($request, 'properties.category');
|
|
}
|
|
if (array_get($request, 'bookmark-of')) {
|
|
$url = normalize_url(array_get($request, 'bookmark-of'));
|
|
$name = array_get($request, 'name');
|
|
$content = array_get($request, 'content');
|
|
$categories = array_get($request, 'category');
|
|
}
|
|
|
|
if (! isset($url)) {
|
|
throw new \Exception;
|
|
}
|
|
|
|
$bookmark = Bookmark::create([
|
|
'url' => $url,
|
|
'name' => $name,
|
|
'content' => $content,
|
|
]);
|
|
|
|
foreach ((array) $categories as $category) {
|
|
$tag = Tag::firstOrCreate(['tag' => $category]);
|
|
$bookmark->tags()->save($tag);
|
|
}
|
|
|
|
$targets = array_pluck(config('syndication.targets'), 'uid', 'service.name');
|
|
$mpSyndicateTo = null;
|
|
if (array_get($request, 'mp-syndicate-to')) {
|
|
$mpSyndicateTo = array_get($request, 'mp-syndicate-to');
|
|
}
|
|
if (array_get($request, 'properties.mp-syndicate-to')) {
|
|
$mpSyndicateTo = array_get($request, 'properties.mp-syndicate-to');
|
|
}
|
|
if (is_string($mpSyndicateTo)) {
|
|
$service = array_search($mpSyndicateTo, $targets);
|
|
if ($service == 'Twitter') {
|
|
SyndicateBookmarkToTwitter::dispatch($bookmark);
|
|
}
|
|
if ($service == 'Facebook') {
|
|
SyndicateBookmarkToFacebook::dispatch($bookmark);
|
|
}
|
|
}
|
|
if (is_array($mpSyndicateTo)) {
|
|
foreach ($mpSyndicateTo as $uid) {
|
|
$service = array_search($uid, $targets);
|
|
if ($service == 'Twitter') {
|
|
SyndicateBookmarkToTwitter::dispatch($bookmark);
|
|
}
|
|
if ($service == 'Facebook') {
|
|
SyndicateBookmarkToFacebook::dispatch($bookmark);
|
|
}
|
|
}
|
|
}
|
|
|
|
ProcessBookmark::dispatch($bookmark);
|
|
|
|
return $bookmark;
|
|
}
|
|
|
|
public function saveScreenshot(string $url): string
|
|
{
|
|
$browsershot = new Browsershot();
|
|
|
|
$uuid = Uuid::uuid4();
|
|
|
|
$browsershot->url($url)
|
|
->setIncludePath('$PATH:/usr/local/bin')
|
|
->noSandbox()
|
|
->windowSize(960, 640)
|
|
->save(public_path() . '/assets/img/bookmarks/' . $uuid . '.png');
|
|
|
|
return $uuid->toString();
|
|
}
|
|
|
|
public function getArchiveLink(string $url): string
|
|
{
|
|
$client = resolve(Client::class);
|
|
try {
|
|
$response = $client->request('GET', 'https://web.archive.org/save/' . $url);
|
|
} catch (ClientException $e) {
|
|
//throw an exception to be caught
|
|
throw new InternetArchiveException;
|
|
}
|
|
if ($response->hasHeader('Content-Location')) {
|
|
if (starts_with(array_get($response->getHeader('Content-Location'), 0), '/web')) {
|
|
return $response->getHeader('Content-Location')[0];
|
|
}
|
|
}
|
|
|
|
//throw an exception to be caught
|
|
throw new InternetArchiveException;
|
|
}
|
|
}
|