From f007b24065392e6d643494625e40f14a9647fc06 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Fri, 13 Oct 2017 13:45:57 +0100 Subject: [PATCH] Syndicate bookmarks via jobs --- app/Bookmark.php | 8 +++ app/Jobs/SyndicateBookmarkToFacebook.php | 54 +++++++++++++++++++ app/Jobs/SyndicateBookmarkToTwitter.php | 54 +++++++++++++++++++ ...cebook.php => SyndicateNoteToFacebook.php} | 2 +- ...Twitter.php => SyndicateNoteToTwitter.php} | 2 +- app/Services/BookmarkService.php | 31 +++++++++++ app/Services/NoteService.php | 4 +- ...17_10_07_163425_create_bookmarks_table.php | 1 + resources/views/bookmarks/show.blade.php | 15 +++--- 9 files changed, 161 insertions(+), 10 deletions(-) create mode 100644 app/Jobs/SyndicateBookmarkToFacebook.php create mode 100644 app/Jobs/SyndicateBookmarkToTwitter.php rename app/Jobs/{SyndicateToFacebook.php => SyndicateNoteToFacebook.php} (95%) rename app/Jobs/{SyndicateToTwitter.php => SyndicateNoteToTwitter.php} (96%) diff --git a/app/Bookmark.php b/app/Bookmark.php index 1c4a5e02..51bfdc8e 100644 --- a/app/Bookmark.php +++ b/app/Bookmark.php @@ -20,4 +20,12 @@ class Bookmark extends Model { return $this->belongsToMany('App\Tag'); } + + /** + * The full url of a bookmark + */ + public function getLongurlAttribute() + { + return config('app.url') . '/bookmarks/' . $this->id; + } } diff --git a/app/Jobs/SyndicateBookmarkToFacebook.php b/app/Jobs/SyndicateBookmarkToFacebook.php new file mode 100644 index 00000000..4dbc1641 --- /dev/null +++ b/app/Jobs/SyndicateBookmarkToFacebook.php @@ -0,0 +1,54 @@ +bookmark = $bookmark; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle(Client $guzzle) + { + //send webmention + $response = $guzzle->request( + 'POST', + 'https://brid.gy/publish/webmention', + [ + 'form_params' => [ + 'source' => $this->bookmark->longurl, + 'target' => 'https://brid.gy/publish/facebook', + 'bridgy_omit_link' => 'maybe', + ], + ] + ); + //parse for syndication URL + if ($response->getStatusCode() == 201) { + $json = json_decode((string) $response->getBody()); + $this->bookmark->update(['syndicates->facebook' => $json->url]); + $this->bookmark->save(); + } + } +} diff --git a/app/Jobs/SyndicateBookmarkToTwitter.php b/app/Jobs/SyndicateBookmarkToTwitter.php new file mode 100644 index 00000000..3d46d160 --- /dev/null +++ b/app/Jobs/SyndicateBookmarkToTwitter.php @@ -0,0 +1,54 @@ +bookmark = $bookmark; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle(Client $guzzle) + { + //send webmention + $response = $guzzle->request( + 'POST', + 'https://brid.gy/publish/webmention', + [ + 'form_params' => [ + 'source' => $this->bookmark->longurl, + 'target' => 'https://brid.gy/publish/twitter', + 'bridgy_omit_link' => 'maybe', + ], + ] + ); + //parse for syndication URL + if ($response->getStatusCode() == 201) { + $json = json_decode((string) $response->getBody()); + $this->bookmark->update(['syndicates->twitter' => $json->url]); + $this->bookmark->save(); + } + } +} diff --git a/app/Jobs/SyndicateToFacebook.php b/app/Jobs/SyndicateNoteToFacebook.php similarity index 95% rename from app/Jobs/SyndicateToFacebook.php rename to app/Jobs/SyndicateNoteToFacebook.php index c117ae13..34a2e3a2 100644 --- a/app/Jobs/SyndicateToFacebook.php +++ b/app/Jobs/SyndicateNoteToFacebook.php @@ -9,7 +9,7 @@ use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; -class SyndicateToFacebook implements ShouldQueue +class SyndicateNoteToFacebook implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; diff --git a/app/Jobs/SyndicateToTwitter.php b/app/Jobs/SyndicateNoteToTwitter.php similarity index 96% rename from app/Jobs/SyndicateToTwitter.php rename to app/Jobs/SyndicateNoteToTwitter.php index 1d50f904..97fa4cb5 100644 --- a/app/Jobs/SyndicateToTwitter.php +++ b/app/Jobs/SyndicateNoteToTwitter.php @@ -9,7 +9,7 @@ use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; -class SyndicateToTwitter implements ShouldQueue +class SyndicateNoteToTwitter implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; diff --git a/app/Services/BookmarkService.php b/app/Services/BookmarkService.php index a76ac28d..c560e6ad 100644 --- a/app/Services/BookmarkService.php +++ b/app/Services/BookmarkService.php @@ -8,6 +8,8 @@ use App\Tag; use App\Bookmark; use Illuminate\Http\Request; use App\Jobs\ProcessBookmark; +use App\Jobs\SyndicateBookmarkToTwitter; +use App\Jobs\SyndicateBookmarkToFacebook; class BookmarkService { @@ -47,6 +49,35 @@ class BookmarkService $bookmark->tags()->save($tag); } + $targets = array_pluck(config('syndication.targets'), 'uid', 'service.name'); + $mpSyndicateTo = null; + if ($request->has('mp-syndicate-to')) { + $mpSyndicateTo = $request->input('mp-syndicate-to'); + } + if ($request->has('properties.mp-syndicate-to')) { + $mpSyndicateTo = $request->input('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; diff --git a/app/Services/NoteService.php b/app/Services/NoteService.php index a858089f..722c6ac2 100644 --- a/app/Services/NoteService.php +++ b/app/Services/NoteService.php @@ -105,10 +105,10 @@ class NoteService //syndication targets if (in_array('twitter', $data['syndicate'])) { - dispatch(new SyndicateToTwitter($note)); + dispatch(new SyndicateNoteToTwitter($note)); } if (in_array('facebook', $data['syndicate'])) { - dispatch(new SyndicateToFacebook($note)); + dispatch(new SyndicateNoteToFacebook($note)); } return $note; diff --git a/database/migrations/2017_10_07_163425_create_bookmarks_table.php b/database/migrations/2017_10_07_163425_create_bookmarks_table.php index 7b5b3bdb..0fad25a7 100644 --- a/database/migrations/2017_10_07_163425_create_bookmarks_table.php +++ b/database/migrations/2017_10_07_163425_create_bookmarks_table.php @@ -20,6 +20,7 @@ class CreateBookmarksTable extends Migration $table->text('content')->nullable(); $table->uuid('screenshot')->nullable(); $table->string('archive')->nullable(); + $table->jsonb('syndicates')->nullable(); $table->timestamps(); }); } diff --git a/resources/views/bookmarks/show.blade.php b/resources/views/bookmarks/show.blade.php index 151fa8d7..4f111bef 100644 --- a/resources/views/bookmarks/show.blade.php +++ b/resources/views/bookmarks/show.blade.php @@ -25,11 +25,14 @@ Bookmark «

Internet Archive backup

@endisset @if(count($bookmark->tags) > 0) - - @endif + + @endif + + + @stop