Automatically send webmentions, move the sending logic into the job

This commit is contained in:
Jonny Barnes 2016-06-21 15:53:05 +01:00
parent b9d30bf063
commit 995140bb95
3 changed files with 44 additions and 55 deletions

View file

@ -5,7 +5,6 @@ namespace App\Http\Controllers;
use App\Note; use App\Note;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Http\Response; use Illuminate\Http\Response;
use App\Jobs\SendWebMentions;
use App\Jobs\ProcessWebMention; use App\Jobs\ProcessWebMention;
use Jonnybarnes\IndieWeb\Numbers; use Jonnybarnes\IndieWeb\Numbers;
use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Database\Eloquent\ModelNotFoundException;
@ -64,37 +63,4 @@ class WebMentionsController extends Controller
break; break;
} }
} }
/**
* Send a webmention.
*
* @param \App\Note $note
* @return array An array of successful then failed URLs
*/
public function send(Note $note)
{
//grab the URLs
$urlsInReplyTo = explode(' ', $note->in_reply_to);
$urlsNote = $this->getLinks($note->note);
$urls = array_filter(array_merge($urlsInReplyTo, $urlsNote)); //filter out none URLs
foreach ($urls as $url) {
$this->dispatch(new SendWebMentions($url, $note->longurl));
}
}
/**
* Get the URLs from a note.
*/
private function getLinks($html)
{
$urls = [];
$dom = new \DOMDocument();
$dom->loadHTML($html);
$anchors = $dom->getElementsByTagName('a');
foreach ($anchors as $anchor) {
$urls[] = ($anchor->hasAttribute('href')) ? $anchor->getAttribute('href') : false;
}
return $urls;
}
} }

View file

@ -2,6 +2,7 @@
namespace App\Jobs; namespace App\Jobs;
use App\Note;
use GuzzleHttp\Client; use GuzzleHttp\Client;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
@ -11,18 +12,20 @@ class SendWebMentions extends Job implements ShouldQueue
{ {
use InteractsWithQueue, SerializesModels; use InteractsWithQueue, SerializesModels;
protected $url; protected $note;
protected $source; protected $guzzle;
/** /**
* Create a new job instance. * Create the job instance, inject dependencies.
* *
* @param User $user
* @param Note $note
* @return void * @return void
*/ */
public function __construct($url, $source) public function __construct(Note $note, Client $guzzle)
{ {
$this->url = $url; $this->note = $note;
$this->source = $source; $this->guzzle = $guzzle ?? new Client();
} }
/** /**
@ -30,16 +33,22 @@ class SendWebMentions extends Job implements ShouldQueue
* *
* @return void * @return void
*/ */
public function handle(Client $client) public function handle(Note $note)
{ {
$endpoint = $this->discoverWebmentionEndpoint($this->url, $client); //grab the URLs
$urlsInReplyTo = explode(' ', $this->note->in_reply_to);
$urlsNote = $this->getLinks($this->note->note);
$urls = array_filter(array_merge($urlsInReplyTo, $urlsNote)); //filter out none URLs
foreach ($urls as $url) {
$endpoint = $this->discoverWebmentionEndpoint($url);
if ($endpoint) { if ($endpoint) {
$client->post($endpoint, [ $this->guzzle->post($endpoint, [
'form_params' => [ 'form_params' => [
'source' => $this->source, 'source' => $this->note->longurl,
'target' => $this->url, 'target' => $url
], ]
]); ])
}
} }
} }
@ -50,11 +59,11 @@ class SendWebMentions extends Job implements ShouldQueue
* @param \GuzzleHttp\Client $client * @param \GuzzleHttp\Client $client
* @return string The webmention endpoint URL * @return string The webmention endpoint URL
*/ */
private function discoverWebmentionEndpoint($url, $client) private function discoverWebmentionEndpoint($url)
{ {
$endpoint = null; $endpoint = null;
$response = $client->get($url); $response = $this->guzzle->get($url);
//check HTTP Headers for webmention endpoint //check HTTP Headers for webmention endpoint
$links = \GuzzleHttp\Psr7\parse_header($response->getHeader('Link')); $links = \GuzzleHttp\Psr7\parse_header($response->getHeader('Link'));
foreach ($links as $link) { foreach ($links as $link) {
@ -83,4 +92,20 @@ class SendWebMentions extends Job implements ShouldQueue
return false; return false;
} }
/**
* Get the URLs from a note.
*/
private function getLinks($html)
{
$urls = [];
$dom = new \DOMDocument();
$dom->loadHTML($html);
$anchors = $dom->getElementsByTagName('a');
foreach ($anchors as $anchor) {
$urls[] = ($anchor->hasAttribute('href')) ? $anchor->getAttribute('href') : false;
}
return $urls;
}
} }

View file

@ -5,6 +5,7 @@ namespace App\Services;
use App\Note; use App\Note;
use App\Place; use App\Place;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Jobs\SendWebmentions;
use App\Jobs\SyndicateToTwitter; use App\Jobs\SyndicateToTwitter;
use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Bus\DispatchesJobs;
use App\Http\Controllers\WebMentionsController; use App\Http\Controllers\WebMentionsController;
@ -45,10 +46,7 @@ class NoteService
} }
} }
if ($request->input('webmentions')) { $this->dispatch(new SendWebmentions($note));
$wmc = new WebMentionsController();
$wmc->send($note);
}
if (//micropub request, syndication sent as array if (//micropub request, syndication sent as array
(is_array($request->input('mp-syndicate-to')) (is_array($request->input('mp-syndicate-to'))