Automatically send webmentions, move the sending logic into the job
This commit is contained in:
parent
b9d30bf063
commit
995140bb95
3 changed files with 44 additions and 55 deletions
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
if ($endpoint) {
|
$urlsInReplyTo = explode(' ', $this->note->in_reply_to);
|
||||||
$client->post($endpoint, [
|
$urlsNote = $this->getLinks($this->note->note);
|
||||||
'form_params' => [
|
$urls = array_filter(array_merge($urlsInReplyTo, $urlsNote)); //filter out none URLs
|
||||||
'source' => $this->source,
|
foreach ($urls as $url) {
|
||||||
'target' => $this->url,
|
$endpoint = $this->discoverWebmentionEndpoint($url);
|
||||||
],
|
if ($endpoint) {
|
||||||
]);
|
$this->guzzle->post($endpoint, [
|
||||||
|
'form_params' => [
|
||||||
|
'source' => $this->note->longurl,
|
||||||
|
'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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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'))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue