Squashed commit of the following: commit 13ac266b79b496d62291a07f4f5f81940d217ccb Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Jan 20 17:17:25 2019 +0000 test on 7.2 and 7.3, download phpcs directly from github commit 692cc7dfe165a7ecaf9dba9498c868193b749aee Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Jan 20 17:10:16 2019 +0000 Drop code-coverage for now, PHP7.3 and Xdebug aren’t playing ball at the moment commit 03d262c47af79cfa0ce4937cc8e196e3b6f5877a Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Jan 20 17:09:48 2019 +0000 Use an excewption when generating twitter content of a note commit e2df1e5cebebd30473787c924f495a5687145fb8 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Jan 20 17:08:48 2019 +0000 Updating dependencies commit 8008eb53854eddefaa4e302f95353c626b3062ef Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Nov 25 16:09:32 2018 +0000 Fix S3 URLs to use config settings commit 941864b9d6c6cb9d87b4b95385ada67f55de837c Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sat Nov 24 21:28:19 2018 +0000 Increase code-coverage in the notes unit tests commit 4a253d3c5c1854dd8ea01d975bb8e709ae697393 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 20 18:26:59 2018 +0000 Don’t create new notes in null note test commit 9616cd2b66bc6f26b2d3266f95cf1be894aaed99 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 20 18:23:05 2018 +0000 Use Laravel’s FileSystem class to better deal with files/folders in the tearDown methods commit 294f7961ec03d26cc45845632a97b2521a58f403 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 20 18:22:28 2018 +0000 Add more unit tests for the geocoding method commit 43328e3ce249fe8df95770f1275cab97f4ca88bc Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 20 18:18:36 2018 +0000 Improve the revereseGeoCode method commit 84424e1d8274bfe62bc5f0a7556e5732bf094178 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Tue Nov 20 15:03:14 2018 +0000 Test that empty notes are saved to the DB as null commit 77fd87b81323457ce6f578ed7f359ceb6b3ce6b6 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sat Oct 13 20:20:03 2018 +0100 Increase test coverage to 100% for the WebMention model commit 4b6da595dc1efc025470279e9012c2a2a90ec3ef Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sat Oct 13 18:49:33 2018 +0100 Improving test coverage commit 895061b8dd0ddf4fbc321e4f371ea148d9b3007f Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sat Oct 13 17:19:35 2018 +0100 Improvements in Like tests and code, and WebMentions processing tests and code commit f9a8b96f2c8b1ef22e97d3dc634ee76d97c25cb5 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Oct 12 22:43:49 2018 +0100 Don’t track the coverage files in git
125 lines
4.1 KiB
PHP
125 lines
4.1 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace App\Jobs;
|
||
|
||
use Mf2;
|
||
use GuzzleHttp\Client;
|
||
use Illuminate\Bus\Queueable;
|
||
use App\Models\{Note, WebMention};
|
||
use Jonnybarnes\WebmentionsParser\Parser;
|
||
use GuzzleHttp\Exception\RequestException;
|
||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||
use App\Exceptions\RemoteContentNotFoundException;
|
||
use Illuminate\Queue\{InteractsWithQueue, SerializesModels};
|
||
|
||
class ProcessWebMention implements ShouldQueue
|
||
{
|
||
use InteractsWithQueue, Queueable, SerializesModels;
|
||
|
||
protected $note;
|
||
protected $source;
|
||
|
||
/**
|
||
* Create a new job instance.
|
||
*
|
||
* @param \App\Note $note
|
||
* @param string $source
|
||
*/
|
||
public function __construct(Note $note, $source)
|
||
{
|
||
$this->note = $note;
|
||
$this->source = $source;
|
||
}
|
||
|
||
/**
|
||
* Execute the job.
|
||
*
|
||
* @param \Jonnybarnes\WebmentionsParser\Parser $parser
|
||
* @param \GuzzleHttp\Client $guzzle
|
||
*/
|
||
public function handle(Parser $parser, Client $guzzle)
|
||
{
|
||
try {
|
||
$response = $guzzle->request('GET', $this->source);
|
||
} catch (RequestException $e) {
|
||
throw new RemoteContentNotFoundException;
|
||
}
|
||
$this->saveRemoteContent((string) $response->getBody(), $this->source);
|
||
$microformats = Mf2\parse((string) $response->getBody(), $this->source);
|
||
$webmentions = WebMention::where('source', $this->source)->get();
|
||
foreach ($webmentions as $webmention) {
|
||
// check webmention still references target
|
||
// we try each type of mention (reply/like/repost)
|
||
if ($webmention->type == 'in-reply-to') {
|
||
if ($parser->checkInReplyTo($microformats, $this->note->longurl) == false) {
|
||
// it doesn’t so delete
|
||
$webmention->delete();
|
||
|
||
return;
|
||
}
|
||
// webmenion is still a reply, so update content
|
||
dispatch(new SaveProfileImage($microformats));
|
||
$webmention->mf2 = json_encode($microformats);
|
||
$webmention->save();
|
||
|
||
return;
|
||
}
|
||
if ($webmention->type == 'like-of') {
|
||
if ($parser->checkLikeOf($microformats, $this->note->longurl) == false) {
|
||
// it doesn’t so delete
|
||
$webmention->delete();
|
||
|
||
return;
|
||
} // note we don’t need to do anything if it still is a like
|
||
}
|
||
if ($webmention->type == 'repost-of') {
|
||
if ($parser->checkRepostOf($microformats, $this->note->longurl) == false) {
|
||
// it doesn’t so delete
|
||
$webmention->delete();
|
||
|
||
return;
|
||
} // again, we don’t need to do anything if it still is a repost
|
||
}
|
||
}// foreach
|
||
|
||
// no webmention in the db so create new one
|
||
$webmention = new WebMention();
|
||
$type = $parser->getMentionType($microformats); // throw error here?
|
||
dispatch(new SaveProfileImage($microformats));
|
||
$webmention->source = $this->source;
|
||
$webmention->target = $this->note->longurl;
|
||
$webmention->commentable_id = $this->note->id;
|
||
$webmention->commentable_type = 'App\Note';
|
||
$webmention->type = $type;
|
||
$webmention->mf2 = json_encode($microformats);
|
||
$webmention->save();
|
||
}
|
||
|
||
/**
|
||
* Save the HTML of a webmention for future use.
|
||
*
|
||
* @param string $html
|
||
* @param string $url
|
||
*/
|
||
private function saveRemoteContent($html, $url)
|
||
{
|
||
$filenameFromURL = str_replace(
|
||
['https://', 'http://'],
|
||
['https/', 'http/'],
|
||
$url
|
||
);
|
||
if (substr($url, -1) == '/') {
|
||
$filenameFromURL .= 'index.html';
|
||
}
|
||
$path = storage_path() . '/HTML/' . $filenameFromURL;
|
||
$parts = explode('/', $path);
|
||
$name = array_pop($parts);
|
||
$dir = implode('/', $parts);
|
||
if (! is_dir($dir)) {
|
||
mkdir($dir, 0755, true);
|
||
}
|
||
file_put_contents("$dir/$name", $html);
|
||
}
|
||
}
|