jonnybarnes.uk/app/Jobs/ProcessWebMention.php
Jonny Barnes ffa9756cb7 Improve tests feature
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
2019-01-20 17:35:58 +00:00

125 lines
4.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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 doesnt 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 doesnt so delete
$webmention->delete();
return;
} // note we dont need to do anything if it still is a like
}
if ($webmention->type == 'repost-of') {
if ($parser->checkRepostOf($microformats, $this->note->longurl) == false) {
// it doesnt so delete
$webmention->delete();
return;
} // again, we dont 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);
}
}