commit b87b6b2a96de870f1782b00cfe3f393cc79b7d3b Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Mon Dec 18 14:05:11 2017 +0000 Even more tests for this micropub refactor commit 2d967f33c3abeea8fc89f91e1764e970681dc58f Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sat Dec 16 22:19:53 2017 +0000 Fill out token endpoint tests commit 440dcbe3e53f058060c918429bea75911ddafdc1 Merge: 02a25b0 f60164f Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 15 14:32:50 2017 +0000 Merge pull request #77 from jonnybarnes/analysis-8KABW6 Apply fixes from StyleCI commit f60164fe81dbcc1d2343704145d26c6d6412579a Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 15 14:27:40 2017 +0000 Apply fixes from StyleCI commit 02a25b083a0305f73d715feb3f9d34f9de8f67d4 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 15 14:17:43 2017 +0000 phpcs fix commit 144998de0866bf11f235847d7edc076235294545 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 15 14:16:59 2017 +0000 Don’t pass the request object to service files, pass request()->all() commit dd5e52010c51a359665efa349ff8c13d4d6dbf57 Merge: 97b270a 23b145e Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Dec 10 20:01:03 2017 +0000 Merge pull request #76 from jonnybarnes/analysis-86AVg6 Apply fixes from StyleCI commit 23b145e7bf67a358b3cb894ea0793984b65ecab5 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Dec 10 19:50:53 2017 +0000 Apply fixes from StyleCI commit 97b270a89abe92e167e0d363029ae0b86608bbc9 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Sun Dec 10 19:43:38 2017 +0000 Improve test coverage of the refactor commit 244102264559e4fb0b0614d1738c0283703a71dc Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Fri Dec 8 13:31:13 2017 +0000 Refactor the note creation code commit 22b4786cbd7ae508b51a47f0c8cf9a15535edbb1 Author: Jonny Barnes <jonny@jonnybarnes.uk> Date: Thu Dec 7 17:39:41 2017 +0000 Remove ununsed importsed classes in the controller
225 lines
7 KiB
PHP
225 lines
7 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace App\Services;
|
||
|
||
use App\{Media, Note, Place};
|
||
use App\Jobs\{SendWebMentions, SyndicateNoteToFacebook, SyndicateNoteToTwitter};
|
||
|
||
class NoteService
|
||
{
|
||
/**
|
||
* Create a new note.
|
||
*
|
||
* @param array $request
|
||
* @param string $client
|
||
* @return \App\Note $note
|
||
*/
|
||
public function createNote(array $request, string $client = null): Note
|
||
{
|
||
$note = Note::create(
|
||
[
|
||
'note' => $this->getContent($request),
|
||
'in_reply_to' => $this->getInReplyTo($request),
|
||
'client_id' => $client,
|
||
]
|
||
);
|
||
|
||
if ($this->getPublished($request)) {
|
||
$note->created_at = $note->updated_at = $this->getPublished($request);
|
||
}
|
||
|
||
$note->location = $this->getLocation($request);
|
||
|
||
if ($this->getCheckin($request)) {
|
||
$note->place()->associate($this->getCheckin($request));
|
||
$note->swarm_url = $this->getSwarmUrl($request);
|
||
if ($note->note === null || $note->note == '') {
|
||
$note->note = 'I’ve just checked in with Swarm';
|
||
}
|
||
}
|
||
|
||
$note->instagram_url = $this->getInstagramUrl($request);
|
||
|
||
foreach ($this->getMedia($request) as $media) {
|
||
$note->media()->save($media);
|
||
}
|
||
|
||
$note->save();
|
||
|
||
dispatch(new SendWebMentions($note));
|
||
|
||
//syndication targets
|
||
if (count($this->getSyndicationTargets($request)) > 0) {
|
||
if (in_array('twitter', $this->getSyndicationTargets($request))) {
|
||
dispatch(new SyndicateNoteToTwitter($note));
|
||
}
|
||
if (in_array('facebook', $this->getSyndicationTargets($request))) {
|
||
dispatch(new SyndicateNoteToFacebook($note));
|
||
}
|
||
}
|
||
|
||
return $note;
|
||
}
|
||
|
||
private function getContent(array $request): ?string
|
||
{
|
||
if (array_get($request, 'properties.content.0.html')) {
|
||
return array_get($request, 'properties.content.0.html');
|
||
}
|
||
if (is_string(array_get($request, 'properties.content.0'))) {
|
||
return array_get($request, 'properties.content.0');
|
||
}
|
||
|
||
return array_get($request, 'content');
|
||
}
|
||
|
||
private function getInReplyTo(array $request): ?string
|
||
{
|
||
if (array_get($request, 'properties.in-reply-to.0')) {
|
||
return array_get($request, 'properties.in-reply-to.0');
|
||
}
|
||
|
||
return array_get($request, 'in-reply-to');
|
||
}
|
||
|
||
private function getPublished(array $request): ?string
|
||
{
|
||
if (array_get($request, 'properties.published.0')) {
|
||
return carbon(array_get($request, 'properties.published.0'))
|
||
->toDateTimeString();
|
||
}
|
||
if (array_get($request, 'published')) {
|
||
return carbon(array_get($request, 'published'))->toDateTimeString();
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
private function getLocation(array $request): ?string
|
||
{
|
||
$location = array_get($request, 'properties.location.0') ?? array_get($request, 'location');
|
||
if (is_string($location) && substr($location, 0, 4) == 'geo:') {
|
||
preg_match_all(
|
||
'/([0-9\.\-]+)/',
|
||
$location,
|
||
$matches
|
||
);
|
||
|
||
return $matches[0][0] . ', ' . $matches[0][1];
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
private function getCheckin(array $request): ?Place
|
||
{
|
||
if (array_get($request, 'properties.location.0.type.0') === 'h-card') {
|
||
try {
|
||
$place = resolve(PlaceService::class)->createPlaceFromCheckin(
|
||
array_get($request, 'properties.location.0')
|
||
);
|
||
} catch (\InvalidArgumentException $e) {
|
||
return null;
|
||
}
|
||
|
||
return $place;
|
||
}
|
||
if (starts_with(array_get($request, 'properties.location.0'), config('app.url'))) {
|
||
return Place::where(
|
||
'slug',
|
||
basename(
|
||
parse_url(
|
||
array_get($request, 'properties.location.0'),
|
||
PHP_URL_PATH
|
||
)
|
||
)
|
||
)->first();
|
||
}
|
||
if (array_get($request, 'properties.checkin')) {
|
||
try {
|
||
$place = resolve(PlaceService::class)->createPlaceFromCheckin(
|
||
array_get($request, 'properties.checkin.0')
|
||
);
|
||
} catch (\InvalidArgumentException $e) {
|
||
return null;
|
||
}
|
||
|
||
return $place;
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
private function getSwarmUrl(array $request): ?string
|
||
{
|
||
if (stristr(array_get($request, 'properties.syndication.0', ''), 'swarmapp')) {
|
||
return array_get($request, 'properties.syndication.0');
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
private function getSyndicationTargets(array $request): array
|
||
{
|
||
$syndication = [];
|
||
$targets = array_pluck(config('syndication.targets'), 'uid', 'service.name');
|
||
$mpSyndicateTo = array_get($request, 'mp-syndicate-to') ?? array_get($request, 'properties.mp-syndicate-to');
|
||
if (is_string($mpSyndicateTo)) {
|
||
$service = array_search($mpSyndicateTo, $targets);
|
||
if ($service == 'Twitter') {
|
||
$syndication[] = 'twitter';
|
||
}
|
||
if ($service == 'Facebook') {
|
||
$syndication[] = 'facebook';
|
||
}
|
||
}
|
||
if (is_array($mpSyndicateTo)) {
|
||
foreach ($mpSyndicateTo as $uid) {
|
||
$service = array_search($uid, $targets);
|
||
if ($service == 'Twitter') {
|
||
$syndication[] = 'twitter';
|
||
}
|
||
if ($service == 'Facebook') {
|
||
$syndication[] = 'facebook';
|
||
}
|
||
}
|
||
}
|
||
|
||
return $syndication;
|
||
}
|
||
|
||
private function getMedia(array $request): array
|
||
{
|
||
$media = [];
|
||
$photos = array_get($request, 'photo') ?? array_get($request, 'properties.photo');
|
||
|
||
if (isset($photos)) {
|
||
foreach ((array) $photos as $photo) {
|
||
// check the media was uploaded to my endpoint, and use path
|
||
if (starts_with($photo, config('filesystems.disks.s3.url'))) {
|
||
$path = substr($photo, strlen(config('filesystems.disks.s3.url')));
|
||
$media[] = Media::where('path', ltrim($path, '/'))->firstOrFail();
|
||
} else {
|
||
$newMedia = Media::firstOrNew(['path' => $photo]);
|
||
// currently assuming this is a photo from Swarm or OwnYourGram
|
||
$newMedia->type = 'image';
|
||
$newMedia->save();
|
||
$media[] = $newMedia;
|
||
}
|
||
}
|
||
}
|
||
|
||
return $media;
|
||
}
|
||
|
||
private function getInstagramUrl(array $request): ?string
|
||
{
|
||
if (starts_with(array_get($request, 'properties.syndication.0'), 'https://www.instagram.com')) {
|
||
return array_get($request, 'properties.syndication.0');
|
||
}
|
||
|
||
return null;
|
||
}
|
||
}
|