diff --git a/.env.example b/.env.example index 4eb61db5..4235fe34 100644 --- a/.env.example +++ b/.env.example @@ -70,11 +70,6 @@ ADMIN_USER=admin# pick something better, this is used for `/admin` ADMIN_PASS=password DISPLAY_NAME='Joe Bloggs'# This is used for example in the header and titles -TWITTER_CONSUMER_KEY= -TWITTER_CONSUMER_SECRET= -TWITTER_ACCESS_TOKEN= -TWITTER_ACCESS_TOKEN_SECRET= - SCOUT_DRIVER=database SCOUT_QUEUE=false diff --git a/app/CommonMark/Renderers/MentionRenderer.php b/app/CommonMark/Renderers/MentionRenderer.php index d970fac8..2803a822 100644 --- a/app/CommonMark/Renderers/MentionRenderer.php +++ b/app/CommonMark/Renderers/MentionRenderer.php @@ -28,10 +28,10 @@ class MentionRenderer implements NodeRendererInterface // This is not [@]handle@instance, so return a Twitter link if (count($parts) === 1) { - return new HtmlElement('a', ['href' => 'https://twitter.com/' . $parts[0]], '@' . $mentionText); + return new HtmlElement('a', ['href' => 'https://twitter.com/'.$parts[0]], '@'.$mentionText); } // Render the Mastodon profile link - return new HtmlElement('a', ['href' => 'https://' . $parts[1] . '/@' . $parts[0]], '@' . $mentionText); + return new HtmlElement('a', ['href' => 'https://'.$parts[1].'/@'.$parts[0]], '@'.$mentionText); } } diff --git a/app/Console/Commands/CopyMediaToLocal.php b/app/Console/Commands/CopyMediaToLocal.php index 2e8d2bce..90a0bd39 100644 --- a/app/Console/Commands/CopyMediaToLocal.php +++ b/app/Console/Commands/CopyMediaToLocal.php @@ -34,10 +34,10 @@ class CopyMediaToLocal extends Command foreach ($media as $mediaItem) { $filename = $mediaItem->path; - $this->info('Processing: ' . $filename); + $this->info('Processing: '.$filename); // If the file is already saved locally skip to next one - if (Storage::disk('local')->exists('public/' . $filename)) { + if (Storage::disk('local')->exists('public/'.$filename)) { $this->info('File already exists locally, skipping'); continue; @@ -50,19 +50,19 @@ class CopyMediaToLocal extends Command continue; } $contents = Storage::disk('s3')->get($filename); - Storage::disk('local')->put('public/' . $filename, $contents); + Storage::disk('local')->put('public/'.$filename, $contents); // Copy -medium and -small versions if they exist $filenameParts = explode('.', $filename); $extension = array_pop($filenameParts); $basename = trim(implode('.', $filenameParts), '.'); - $mediumFilename = $basename . '-medium.' . $extension; - $smallFilename = $basename . '-small.' . $extension; + $mediumFilename = $basename.'-medium.'.$extension; + $smallFilename = $basename.'-small.'.$extension; if (Storage::disk('s3')->exists($mediumFilename)) { - Storage::disk('local')->put('public/' . $mediumFilename, Storage::disk('s3')->get($mediumFilename)); + Storage::disk('local')->put('public/'.$mediumFilename, Storage::disk('s3')->get($mediumFilename)); } if (Storage::disk('s3')->exists($smallFilename)) { - Storage::disk('local')->put('public/' . $smallFilename, Storage::disk('s3')->get($smallFilename)); + Storage::disk('local')->put('public/'.$smallFilename, Storage::disk('s3')->get($smallFilename)); } } } diff --git a/app/Console/Commands/MigratePlaceDataFromPostgis.php b/app/Console/Commands/MigratePlaceDataFromPostgis.php index 8d5d2c92..4e7c58c0 100644 --- a/app/Console/Commands/MigratePlaceDataFromPostgis.php +++ b/app/Console/Commands/MigratePlaceDataFromPostgis.php @@ -63,7 +63,7 @@ class MigratePlaceDataFromPostgis extends Command $places = Place::all(); $places->each(function ($place) { - $this->info('Extracting Postgis data for place: ' . $place->name); + $this->info('Extracting Postgis data for place: '.$place->name); $place->latitude = $place->location->getLat(); $place->longitude = $place->location->getLng(); diff --git a/app/Console/Commands/ParseCachedWebMentions.php b/app/Console/Commands/ParseCachedWebMentions.php index a6b29176..a27e2738 100644 --- a/app/Console/Commands/ParseCachedWebMentions.php +++ b/app/Console/Commands/ParseCachedWebMentions.php @@ -32,11 +32,11 @@ class ParseCachedWebMentions extends Command */ public function handle(FileSystem $filesystem): void { - $htmlFiles = $filesystem->allFiles(storage_path() . '/HTML'); + $htmlFiles = $filesystem->allFiles(storage_path().'/HTML'); foreach ($htmlFiles as $file) { if ($file->getExtension() !== 'backup') { // we don’t want to parse `.backup` files $filepath = $file->getPathname(); - $this->info('Loading HTML from: ' . $filepath); + $this->info('Loading HTML from: '.$filepath); $html = $filesystem->get($filepath); $url = $this->urlFromFilename($filepath); $webmention = WebMention::where('source', $url)->firstOrFail(); @@ -53,7 +53,7 @@ class ParseCachedWebMentions extends Command */ private function urlFromFilename(string $filepath): string { - $dir = mb_substr($filepath, mb_strlen(storage_path() . '/HTML/')); + $dir = mb_substr($filepath, mb_strlen(storage_path().'/HTML/')); $url = str_replace(['http/', 'https/'], ['http://', 'https://'], $dir); if (mb_substr($url, -10) === 'index.html') { $url = mb_substr($url, 0, -10); diff --git a/app/Console/Commands/ReDownloadWebMentions.php b/app/Console/Commands/ReDownloadWebMentions.php index c6452ba9..c43a52bd 100644 --- a/app/Console/Commands/ReDownloadWebMentions.php +++ b/app/Console/Commands/ReDownloadWebMentions.php @@ -31,7 +31,7 @@ class ReDownloadWebMentions extends Command { $webmentions = WebMention::all(); foreach ($webmentions as $webmention) { - $this->info('Initiation re-download of ' . $webmention->source); + $this->info('Initiation re-download of '.$webmention->source); dispatch(new DownloadWebMention($webmention->source)); } } diff --git a/app/Http/Controllers/Admin/ContactsController.php b/app/Http/Controllers/Admin/ContactsController.php index eb45320c..17e4a8a7 100644 --- a/app/Http/Controllers/Admin/ContactsController.php +++ b/app/Http/Controllers/Admin/ContactsController.php @@ -7,6 +7,7 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Models\Contact; use GuzzleHttp\Client; +use GuzzleHttp\Exception\BadResponseException; use Illuminate\Filesystem\Filesystem; use Illuminate\Http\RedirectResponse; use Illuminate\Support\Arr; @@ -75,7 +76,7 @@ class ContactsController extends Controller if (request()->hasFile('avatar') && (request()->input('homepage') != '')) { $dir = parse_url(request()->input('homepage'), PHP_URL_HOST); - $destination = public_path() . '/assets/profile-images/' . $dir; + $destination = public_path().'/assets/profile-images/'.$dir; $filesystem = new Filesystem; if ($filesystem->isDirectory($destination) === false) { $filesystem->makeDirectory($destination); @@ -103,7 +104,7 @@ class ContactsController extends Controller * This method attempts to find the microformat marked-up profile image * from a given homepage and save it accordingly * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View + * @return RedirectResponse|View */ public function getAvatar(int $contactId) { @@ -115,8 +116,8 @@ class ContactsController extends Controller $client = resolve(Client::class); try { $response = $client->get($contact->homepage); - } catch (\GuzzleHttp\Exception\BadResponseException $e) { - return redirect('/admin/contacts/' . $contactId . '/edit') + } catch (BadResponseException $e) { + return redirect('/admin/contacts/'.$contactId.'/edit') ->with('error', 'Bad resposne from contact’s homepage'); } $mf2 = \Mf2\parse((string) $response->getBody(), $contact->homepage); @@ -129,18 +130,18 @@ class ContactsController extends Controller if ($avatarURL !== null) { try { $avatar = $client->get($avatarURL); - } catch (\GuzzleHttp\Exception\BadResponseException $e) { - return redirect('/admin/contacts/' . $contactId . '/edit') + } catch (BadResponseException $e) { + return redirect('/admin/contacts/'.$contactId.'/edit') ->with('error', 'Unable to download avatar'); } } if ($avatar !== null) { - $directory = public_path() . '/assets/profile-images/' . parse_url($contact->homepage, PHP_URL_HOST); + $directory = public_path().'/assets/profile-images/'.parse_url($contact->homepage, PHP_URL_HOST); $filesystem = new Filesystem; if ($filesystem->isDirectory($directory) === false) { $filesystem->makeDirectory($directory); } - $filesystem->put($directory . '/image', $avatar->getBody()); + $filesystem->put($directory.'/image', $avatar->getBody()); return view('admin.contacts.getavatarsuccess', [ 'homepage' => parse_url($contact->homepage, PHP_URL_HOST), @@ -148,6 +149,6 @@ class ContactsController extends Controller } } - return redirect('/admin/contacts/' . $contactId . '/edit'); + return redirect('/admin/contacts/'.$contactId.'/edit'); } } diff --git a/app/Http/Controllers/Admin/PasskeysController.php b/app/Http/Controllers/Admin/PasskeysController.php index 9f635f10..8012f9b8 100644 --- a/app/Http/Controllers/Admin/PasskeysController.php +++ b/app/Http/Controllers/Admin/PasskeysController.php @@ -128,7 +128,7 @@ class PasskeysController extends Controller // Unset session data to mitigate replay attacks $request->session()->forget('create_options'); if (empty($publicKeyCredentialCreationOptionsData)) { - throw new WebAuthnException('No public key credential request options found'); + throw new WebauthnException('No public key credential request options found'); } $attestationStatementSupportManager = new AttestationStatementSupportManager; @@ -145,7 +145,7 @@ class PasskeysController extends Controller ); if (! $publicKeyCredential->response instanceof AuthenticatorAttestationResponse) { - throw new WebAuthnException('Invalid response type'); + throw new WebauthnException('Invalid response type'); } $algorithmManager = new Manager; diff --git a/app/Http/Controllers/Admin/PlacesController.php b/app/Http/Controllers/Admin/PlacesController.php index e5e82bcd..26f47b79 100644 --- a/app/Http/Controllers/Admin/PlacesController.php +++ b/app/Http/Controllers/Admin/PlacesController.php @@ -120,6 +120,7 @@ class PlacesController extends Controller foreach ($place1->notes as $note) { $note->place()->dissociate(); $note->place()->associate($place2->id); + $note->save(); } $place1->delete(); } @@ -127,6 +128,7 @@ class PlacesController extends Controller foreach ($place2->notes as $note) { $note->place()->dissociate(); $note->place()->associate($place1->id); + $note->save(); } $place2->delete(); } diff --git a/app/Http/Controllers/ArticlesController.php b/app/Http/Controllers/ArticlesController.php index 9ab860d7..ff28fd50 100644 --- a/app/Http/Controllers/ArticlesController.php +++ b/app/Http/Controllers/ArticlesController.php @@ -38,9 +38,9 @@ class ArticlesController extends Controller if ($article->updated_at->year != $year || $article->updated_at->month != $month) { return redirect('/blog/' - . $article->updated_at->year - . '/' . $article->updated_at->format('m') - . '/' . $slug); + .$article->updated_at->year + .'/'.$article->updated_at->format('m') + .'/'.$slug); } return view('articles.show', compact('article')); diff --git a/app/Http/Controllers/ContactsController.php b/app/Http/Controllers/ContactsController.php index 280cc3ed..13989eac 100644 --- a/app/Http/Controllers/ContactsController.php +++ b/app/Http/Controllers/ContactsController.php @@ -19,9 +19,9 @@ class ContactsController extends Controller $contacts = Contact::all(); foreach ($contacts as $contact) { $contact->homepageHost = parse_url($contact->homepage, PHP_URL_HOST); - $file = public_path() . '/assets/profile-images/' . $contact->homepageHost . '/image'; + $file = public_path().'/assets/profile-images/'.$contact->homepageHost.'/image'; $contact->image = ($filesystem->exists($file)) ? - '/assets/profile-images/' . $contact->homepageHost . '/image' + '/assets/profile-images/'.$contact->homepageHost.'/image' : '/assets/profile-images/default-image'; } @@ -35,11 +35,11 @@ class ContactsController extends Controller public function show(Contact $contact): View { $contact->homepageHost = parse_url($contact->homepage, PHP_URL_HOST); - $file = public_path() . '/assets/profile-images/' . $contact->homepageHost . '/image'; + $file = public_path().'/assets/profile-images/'.$contact->homepageHost.'/image'; $filesystem = new Filesystem; $image = ($filesystem->exists($file)) ? - '/assets/profile-images/' . $contact->homepageHost . '/image' + '/assets/profile-images/'.$contact->homepageHost.'/image' : '/assets/profile-images/default-image'; diff --git a/app/Http/Controllers/FeedsController.php b/app/Http/Controllers/FeedsController.php index eb0847a3..a30c89dc 100644 --- a/app/Http/Controllers/FeedsController.php +++ b/app/Http/Controllers/FeedsController.php @@ -71,9 +71,9 @@ class FeedsController extends Controller $articles = Article::where('published', '1')->latest('updated_at')->take(20)->get(); $data = [ 'version' => 'https://jsonfeed.org/version/1.1', - 'title' => 'The JSON Feed for ' . config('user.display_name') . '’s blog', - 'home_page_url' => config('app.url') . '/blog', - 'feed_url' => config('app.url') . '/blog/feed.json', + 'title' => 'The JSON Feed for '.config('user.display_name').'’s blog', + 'home_page_url' => config('app.url').'/blog', + 'feed_url' => config('app.url').'/blog/feed.json', 'authors' => [ [ 'name' => config('user.display_name'), @@ -85,9 +85,9 @@ class FeedsController extends Controller foreach ($articles as $key => $article) { $data['items'][$key] = [ - 'id' => config('app.url') . $article->link, + 'id' => config('app.url').$article->link, 'title' => $article->title, - 'url' => config('app.url') . $article->link, + 'url' => config('app.url').$article->link, 'content_html' => $article->main, 'date_published' => $article->created_at->tz('UTC')->toRfc3339String(), 'date_modified' => $article->updated_at->tz('UTC')->toRfc3339String(), @@ -105,9 +105,9 @@ class FeedsController extends Controller $notes = Note::latest()->with('media', 'place', 'tags')->take(20)->get(); $data = [ 'version' => 'https://jsonfeed.org/version/1.1', - 'title' => 'The JSON Feed for ' . config('user.display_name') . '’s notes', - 'home_page_url' => config('app.url') . '/notes', - 'feed_url' => config('app.url') . '/notes/feed.json', + 'title' => 'The JSON Feed for '.config('user.display_name').'’s notes', + 'home_page_url' => config('app.url').'/notes', + 'feed_url' => config('app.url').'/notes/feed.json', 'authors' => [ [ 'name' => config('user.display_name'), @@ -144,8 +144,8 @@ class FeedsController extends Controller $items[] = [ 'type' => 'entry', 'published' => $article->created_at, - 'uid' => config('app.url') . $article->link, - 'url' => config('app.url') . $article->link, + 'uid' => config('app.url').$article->link, + 'url' => config('app.url').$article->link, 'content' => [ 'text' => $article->main, 'html' => $article->html, @@ -156,7 +156,7 @@ class FeedsController extends Controller return response()->json([ 'type' => 'feed', - 'name' => 'Blog feed for ' . config('app.name'), + 'name' => 'Blog feed for '.config('app.name'), 'url' => url('/blog'), 'author' => [ 'type' => 'card', @@ -192,7 +192,7 @@ class FeedsController extends Controller return response()->json([ 'type' => 'feed', - 'name' => 'Notes feed for ' . config('app.name'), + 'name' => 'Notes feed for '.config('app.name'), 'url' => url('/notes'), 'author' => [ 'type' => 'card', diff --git a/app/Http/Controllers/MicropubMediaController.php b/app/Http/Controllers/MicropubMediaController.php index fc804ea2..1cca74b3 100644 --- a/app/Http/Controllers/MicropubMediaController.php +++ b/app/Http/Controllers/MicropubMediaController.php @@ -193,7 +193,7 @@ class MicropubMediaController extends Controller */ private function saveFileToLocal(UploadedFile $file): string { - $filename = Uuid::uuid4()->toString() . '.' . $file->extension(); + $filename = Uuid::uuid4()->toString().'.'.$file->extension(); Storage::disk('local')->putFileAs('', $file, $filename); return $filename; diff --git a/app/Http/Controllers/NotesController.php b/app/Http/Controllers/NotesController.php index e20b67a1..ab81002b 100644 --- a/app/Http/Controllers/NotesController.php +++ b/app/Http/Controllers/NotesController.php @@ -64,7 +64,7 @@ class NotesController extends Controller */ public function redirect(int $decId): RedirectResponse { - return redirect(config('app.url') . '/notes/' . (new Numbers)->numto60($decId)); + return redirect(config('app.url').'/notes/'.(new Numbers)->numto60($decId)); } /** diff --git a/app/Http/Middleware/LinkHeadersMiddleware.php b/app/Http/Middleware/LinkHeadersMiddleware.php index 467283db..b9e55139 100644 --- a/app/Http/Middleware/LinkHeadersMiddleware.php +++ b/app/Http/Middleware/LinkHeadersMiddleware.php @@ -14,11 +14,11 @@ class LinkHeadersMiddleware public function handle(Request $request, Closure $next): Response { $response = $next($request); - $response->header('Link', '<' . route('indieauth.metadata') . '>; rel="indieauth-metadata"', false); - $response->header('Link', '<' . route('indieauth.start') . '>; rel="authorization_endpoint"', false); - $response->header('Link', '<' . route('indieauth.token') . '>; rel="token_endpoint"', false); - $response->header('Link', '<' . route('micropub-endpoint') . '>; rel="micropub"', false); - $response->header('Link', '<' . route('webmention-endpoint') . '>; rel="webmention"', false); + $response->header('Link', '<'.route('indieauth.metadata').'>; rel="indieauth-metadata"', false); + $response->header('Link', '<'.route('indieauth.start').'>; rel="authorization_endpoint"', false); + $response->header('Link', '<'.route('indieauth.token').'>; rel="token_endpoint"', false); + $response->header('Link', '<'.route('micropub-endpoint').'>; rel="micropub"', false); + $response->header('Link', '<'.route('webmention-endpoint').'>; rel="webmention"', false); return $response; } diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index a6a6c8c4..1e06ab05 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -16,7 +16,7 @@ class RedirectIfAuthenticated /** * Handle an incoming request. * - * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next + * @param Closure(Request): (Response) $next */ public function handle(Request $request, Closure $next, string ...$guards): Response { diff --git a/app/Jobs/DownloadWebMention.php b/app/Jobs/DownloadWebMention.php index 3c187dd4..341c35c8 100644 --- a/app/Jobs/DownloadWebMention.php +++ b/app/Jobs/DownloadWebMention.php @@ -39,9 +39,9 @@ class DownloadWebMention implements ShouldQueue // Laravel should catch and retry these automatically. if ($response->getStatusCode() === 200) { $filesystem = new FileSystem; - $filename = storage_path('HTML') . '/' . $this->createFilenameFromURL($this->source); + $filename = storage_path('HTML').'/'.$this->createFilenameFromURL($this->source); // backup file first - $filenameBackup = $filename . '.' . date('Y-m-d') . '.backup'; + $filenameBackup = $filename.'.'.date('Y-m-d').'.backup'; if ($filesystem->exists($filename)) { $filesystem->copy($filename, $filenameBackup); } diff --git a/app/Jobs/ProcessLike.php b/app/Jobs/ProcessLike.php index 3c6028a9..49302885 100644 --- a/app/Jobs/ProcessLike.php +++ b/app/Jobs/ProcessLike.php @@ -5,10 +5,8 @@ declare(strict_types=1); namespace App\Jobs; use App\Models\Like; -use Codebird\Codebird; use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; -use GuzzleHttp\Exception\RequestException; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; @@ -39,35 +37,6 @@ class ProcessLike implements ShouldQueue */ public function handle(Client $client, Authorship $authorship): int { - if ($this->isTweet($this->like->url)) { - $codebird = resolve(Codebird::class); - - $tweet = $codebird->statuses_oembed(['url' => $this->like->url]); - - $this->like->author_name = $tweet->author_name; - $this->like->author_url = $tweet->author_url; - $this->like->content = $tweet->html; - $this->like->save(); - - // POSSE like - try { - $client->request( - 'POST', - 'https://brid.gy/publish/webmention', - [ - 'form_params' => [ - 'source' => $this->like->url, - 'target' => 'https://brid.gy/publish/twitter', - ], - ] - ); - } catch (RequestException) { - return 0; - } - - return 0; - } - $response = $client->request('GET', $this->like->url); $mf2 = \Mf2\parse((string) $response->getBody(), $this->like->url); if (Arr::has($mf2, 'items.0.properties.content')) { @@ -91,15 +60,4 @@ class ProcessLike implements ShouldQueue return 0; } - - /** - * Determine if a given URL is that of a Tweet. - */ - private function isTweet(string $url): bool - { - $host = parse_url($url, PHP_URL_HOST); - $parts = array_reverse(explode('.', $host)); - - return $parts[0] === 'com' && $parts[1] === 'twitter'; - } } diff --git a/app/Jobs/ProcessMedia.php b/app/Jobs/ProcessMedia.php index a693a821..e9e291a6 100644 --- a/app/Jobs/ProcessMedia.php +++ b/app/Jobs/ProcessMedia.php @@ -57,10 +57,10 @@ class ProcessMedia implements ShouldQueue $basename = trim(implode('.', $filenameParts), '.'); $medium = $image->resize(width: 1000); - Storage::disk('public')->put($basename . '-medium.' . $extension, (string) $medium->encode()); + Storage::disk('public')->put($basename.'-medium.'.$extension, (string) $medium->encode()); $small = $image->resize(width: 500); - Storage::disk('public')->put($basename . '-small.' . $extension, (string) $small->encode()); + Storage::disk('public')->put($basename.'-small.'.$extension, (string) $small->encode()); } // Now we can delete the locally saved image diff --git a/app/Jobs/ProcessWebMention.php b/app/Jobs/ProcessWebMention.php index d92dfa18..6677b285 100644 --- a/app/Jobs/ProcessWebMention.php +++ b/app/Jobs/ProcessWebMention.php @@ -110,7 +110,7 @@ class ProcessWebMention implements ShouldQueue if (str_ends_with($url, '/')) { $filenameFromURL .= 'index.html'; } - $path = storage_path() . '/HTML/' . $filenameFromURL; + $path = storage_path().'/HTML/'.$filenameFromURL; $parts = explode('/', $path); $name = array_pop($parts); $dir = implode('/', $parts); diff --git a/app/Jobs/SaveProfileImage.php b/app/Jobs/SaveProfileImage.php index 08152d5b..0bcbd4e7 100644 --- a/app/Jobs/SaveProfileImage.php +++ b/app/Jobs/SaveProfileImage.php @@ -62,13 +62,13 @@ class SaveProfileImage implements ShouldQueue $image = $response->getBody(); } catch (RequestException) { // we are opening and reading the default image so that - $default = public_path() . '/assets/profile-images/default-image'; + $default = public_path().'/assets/profile-images/default-image'; $handle = fopen($default, 'rb'); $image = fread($handle, filesize($default)); fclose($handle); } - $path = public_path() . '/assets/profile-images/' . parse_url($home, PHP_URL_HOST) . '/image'; + $path = public_path().'/assets/profile-images/'.parse_url($home, PHP_URL_HOST).'/image'; $parts = explode('/', $path); $name = array_pop($parts); $dir = implode('/', $parts); diff --git a/app/Jobs/SaveScreenshot.php b/app/Jobs/SaveScreenshot.php index 0e07efbd..4661ccfe 100755 --- a/app/Jobs/SaveScreenshot.php +++ b/app/Jobs/SaveScreenshot.php @@ -41,7 +41,7 @@ class SaveScreenshot implements ShouldQueue // First request that CloudConvert takes a screenshot of the URL $takeScreenshotJobResponse = $client->request('POST', 'https://api.cloudconvert.com/v2/capture-website', [ 'headers' => [ - 'Authorization' => 'Bearer ' . config('services.cloudconvert.token'), + 'Authorization' => 'Bearer '.config('services.cloudconvert.token'), ], 'json' => [ 'url' => $this->bookmark->url, @@ -56,9 +56,9 @@ class SaveScreenshot implements ShouldQueue $taskId = json_decode($takeScreenshotJobResponse->getBody()->getContents(), false, 512, JSON_THROW_ON_ERROR)->data->id; // Now wait till the status job is finished - $screenshotJobStatusResponse = $retryClient->request('GET', 'https://api.cloudconvert.com/v2/tasks/' . $taskId, [ + $screenshotJobStatusResponse = $retryClient->request('GET', 'https://api.cloudconvert.com/v2/tasks/'.$taskId, [ 'headers' => [ - 'Authorization' => 'Bearer ' . config('services.cloudconvert.token'), + 'Authorization' => 'Bearer '.config('services.cloudconvert.token'), ], 'query' => [ 'include' => 'payload', @@ -70,7 +70,7 @@ class SaveScreenshot implements ShouldQueue // Now we can create a new job to request thst the screenshot is exported to a temporary URL we can download the screenshot from $exportImageJob = $client->request('POST', 'https://api.cloudconvert.com/v2/export/url', [ 'headers' => [ - 'Authorization' => 'Bearer ' . config('services.cloudconvert.token'), + 'Authorization' => 'Bearer '.config('services.cloudconvert.token'), ], 'json' => [ 'input' => $finishedCaptureId, @@ -81,9 +81,9 @@ class SaveScreenshot implements ShouldQueue $exportImageJobId = json_decode($exportImageJob->getBody()->getContents(), false, 512, JSON_THROW_ON_ERROR)->data->id; // Again, wait till the status of this export job is finished - $finalImageUrlResponse = $retryClient->request('GET', 'https://api.cloudconvert.com/v2/tasks/' . $exportImageJobId, [ + $finalImageUrlResponse = $retryClient->request('GET', 'https://api.cloudconvert.com/v2/tasks/'.$exportImageJobId, [ 'headers' => [ - 'Authorization' => 'Bearer ' . config('services.cloudconvert.token'), + 'Authorization' => 'Bearer '.config('services.cloudconvert.token'), ], 'query' => [ 'include' => 'payload', @@ -95,7 +95,7 @@ class SaveScreenshot implements ShouldQueue $finalImageUrlContent = $client->request('GET', $finalImageUrl); - Storage::disk('public')->put('/assets/img/bookmarks/' . $taskId . '.png', $finalImageUrlContent->getBody()->getContents()); + Storage::disk('public')->put('/assets/img/bookmarks/'.$taskId.'.png', $finalImageUrlContent->getBody()->getContents()); $this->bookmark->screenshot = $taskId; $this->bookmark->save(); diff --git a/app/Jobs/SendWebMentions.php b/app/Jobs/SendWebMentions.php index 2ff5f2c6..827aaf0a 100644 --- a/app/Jobs/SendWebMentions.php +++ b/app/Jobs/SendWebMentions.php @@ -15,6 +15,7 @@ use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Str; +use Mf2\Parser; class SendWebMentions implements ShouldQueue { @@ -83,7 +84,11 @@ class SendWebMentions implements ShouldQueue // failed to find a header so parse HTML $html = (string) $response->getBody(); - $mf2 = new \Mf2\Parser($html, $url); + if ($html === '') { + return null; + } + + $mf2 = new Parser($html, $url); $rels = $mf2->parseRelsAndAlternates(); if (array_key_exists('webmention', $rels[0])) { $endpoint = $rels[0]['webmention'][0]; diff --git a/app/Jobs/SyndicateNoteToBluesky.php b/app/Jobs/SyndicateNoteToBluesky.php index e815be34..f9f2486b 100644 --- a/app/Jobs/SyndicateNoteToBluesky.php +++ b/app/Jobs/SyndicateNoteToBluesky.php @@ -42,7 +42,7 @@ class SyndicateNoteToBluesky implements ShouldQueue 'https://brid.gy/micropub', [ 'headers' => [ - 'Authorization' => 'Bearer ' . config('bridgy.bluesky_token'), + 'Authorization' => 'Bearer '.config('bridgy.bluesky_token'), ], 'json' => [ 'type' => ['h-entry'], diff --git a/app/Jobs/SyndicateNoteToMastodon.php b/app/Jobs/SyndicateNoteToMastodon.php index b79c092c..07ea3b71 100644 --- a/app/Jobs/SyndicateNoteToMastodon.php +++ b/app/Jobs/SyndicateNoteToMastodon.php @@ -42,7 +42,7 @@ class SyndicateNoteToMastodon implements ShouldQueue 'https://brid.gy/micropub', [ 'headers' => [ - 'Authorization' => 'Bearer ' . config('bridgy.mastodon_token'), + 'Authorization' => 'Bearer '.config('bridgy.mastodon_token'), ], 'json' => [ 'type' => ['h-entry'], diff --git a/app/Models/Article.php b/app/Models/Article.php index bfbd5d51..ea215757 100644 --- a/app/Models/Article.php +++ b/app/Models/Article.php @@ -5,6 +5,8 @@ declare(strict_types=1); namespace App\Models; use Cviebrock\EloquentSluggable\Sluggable; +use Illuminate\Database\Eloquent\Attributes\Fillable; +use Illuminate\Database\Eloquent\Attributes\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -18,23 +20,14 @@ use League\CommonMark\MarkdownConverter; use Spatie\CommonMarkHighlighter\FencedCodeRenderer; use Spatie\CommonMarkHighlighter\IndentedCodeRenderer; +#[Table('articles')] +#[Fillable(['url', 'title', 'main', 'published'])] class Article extends Model { use HasFactory; use Sluggable; use SoftDeletes; - /** @var string */ - protected $table = 'articles'; - - /** @var array */ - protected $fillable = [ - 'url', - 'title', - 'main', - 'published', - ]; - /** @var array */ protected $casts = [ 'created_at' => 'datetime', @@ -100,7 +93,7 @@ class Article extends Model protected function link(): Attribute { return Attribute::get( - get: fn () => '/blog/' . $this->updated_at->year . '/' . $this->updated_at->format('m') . '/' . $this->titleurl, + get: fn () => '/blog/'.$this->updated_at->year.'/'.$this->updated_at->format('m').'/'.$this->titleurl, ); } @@ -112,15 +105,15 @@ class Article extends Model if ($year === null) { return $query; } - $start = $year . '-01-01 00:00:00'; - $end = ($year + 1) . '-01-01 00:00:00'; + $start = $year.'-01-01 00:00:00'; + $end = ($year + 1).'-01-01 00:00:00'; if (($month !== null) && ($month !== 12)) { - $start = $year . '-' . $month . '-01 00:00:00'; - $end = $year . '-' . ($month + 1) . '-01 00:00:00'; + $start = $year.'-'.$month.'-01 00:00:00'; + $end = $year.'-'.($month + 1).'-01 00:00:00'; } if ($month === 12) { - $start = $year . '-12-01 00:00:00'; - $end = ($year + 1) . '-01-01 00:00:00'; + $start = $year.'-12-01 00:00:00'; + $end = ($year + 1).'-01-01 00:00:00'; } return $query->where([ diff --git a/app/Models/Bookmark.php b/app/Models/Bookmark.php index 37027e40..1c5ae6e4 100644 --- a/app/Models/Bookmark.php +++ b/app/Models/Bookmark.php @@ -4,18 +4,17 @@ declare(strict_types=1); namespace App\Models; +use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; +#[Fillable(['url', 'name', 'content'])] class Bookmark extends Model { use HasFactory; - /** @var array */ - protected $fillable = ['url', 'name', 'content']; - /** @var array */ protected $casts = [ 'syndicates' => 'array', @@ -26,10 +25,10 @@ class Bookmark extends Model return $this->belongsToMany('App\Models\Tag'); } - protected function local_uri(): Attribute + protected function localUri(): Attribute { return Attribute::get( - get: fn () => config('app.url') . '/bookmarks/' . $this->id, + get: fn () => config('app.url').'/bookmarks/'.$this->id, ); } } diff --git a/app/Models/Contact.php b/app/Models/Contact.php index 6f193f41..55ec12a8 100644 --- a/app/Models/Contact.php +++ b/app/Models/Contact.php @@ -4,28 +4,26 @@ declare(strict_types=1); namespace App\Models; +use Illuminate\Database\Eloquent\Attributes\Fillable; +use Illuminate\Database\Eloquent\Attributes\Table; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +#[Table('contacts')] +#[Fillable(['nick', 'name', 'homepage', 'twitter', 'facebook'])] class Contact extends Model { use HasFactory; - /** @var string */ - protected $table = 'contacts'; - - /** @var array */ - protected $fillable = ['nick', 'name', 'homepage', 'twitter', 'facebook']; - protected function photo(): Attribute { $photo = '/assets/profile-images/default-image'; if (array_key_exists('homepage', $this->attributes) && ! empty($this->attributes['homepage'])) { $host = parse_url($this->attributes['homepage'], PHP_URL_HOST); - if (file_exists(public_path() . '/assets/profile-images/' . $host . '/image')) { - $photo = '/assets/profile-images/' . $host . '/image'; + if (file_exists(public_path().'/assets/profile-images/'.$host.'/image')) { + $photo = '/assets/profile-images/'.$host.'/image'; } } diff --git a/app/Models/Like.php b/app/Models/Like.php index f9ac3bcb..44f25b91 100644 --- a/app/Models/Like.php +++ b/app/Models/Like.php @@ -5,20 +5,19 @@ declare(strict_types=1); namespace App\Models; use App\Traits\FilterHtml; +use Illuminate\Database\Eloquent\Attributes\Fillable; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Arr; use Mf2; +#[Fillable(['url'])] class Like extends Model { use FilterHtml; use HasFactory; - /** @var array */ - protected $fillable = ['url']; - protected function url(): Attribute { return Attribute::set( diff --git a/app/Models/Media.php b/app/Models/Media.php index b25e889a..f6c237d2 100644 --- a/app/Models/Media.php +++ b/app/Models/Media.php @@ -4,22 +4,20 @@ declare(strict_types=1); namespace App\Models; +use Illuminate\Database\Eloquent\Attributes\Fillable; +use Illuminate\Database\Eloquent\Attributes\Table; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Support\Str; +#[Table('media_endpoint')] +#[Fillable(['token', 'path', 'type', 'image_widths'])] class Media extends Model { use HasFactory; - /** @var string */ - protected $table = 'media_endpoint'; - - /** @var array */ - protected $fillable = ['token', 'path', 'type', 'image_widths']; - public function notes(): BelongsToMany { return $this->belongsToMany(Note::class) @@ -35,7 +33,7 @@ class Media extends Model return $attributes['path']; } - return config('app.url') . '/storage/' . $attributes['path']; + return config('app.url').'/storage/'.$attributes['path']; } ); } @@ -80,7 +78,7 @@ class Media extends Model $basename = $this->getBasename($path); $extension = $this->getExtension($path); - return config('app.url') . '/storage/' . $basename . '-' . $size . '.' . $extension; + return config('app.url').'/storage/'.$basename.'-'.$size.'.'.$extension; } private function getBasename(string $path): string @@ -91,7 +89,7 @@ class Media extends Model array_pop($filenameParts); return ltrim(array_reduce($filenameParts, static function ($carry, $item) { - return $carry . '.' . $item; + return $carry.'.'.$item; }, ''), '.'); } diff --git a/app/Models/MicropubClient.php b/app/Models/MicropubClient.php index 669c7284..f6c70ac2 100644 --- a/app/Models/MicropubClient.php +++ b/app/Models/MicropubClient.php @@ -4,20 +4,18 @@ declare(strict_types=1); namespace App\Models; +use Illuminate\Database\Eloquent\Attributes\Fillable; +use Illuminate\Database\Eloquent\Attributes\Table; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; +#[Table('clients')] +#[Fillable(['client_url', 'client_name'])] class MicropubClient extends Model { use HasFactory; - /** @var string */ - protected $table = 'clients'; - - /** @var array */ - protected $fillable = ['client_url', 'client_name']; - public function notes(): HasMany { return $this->hasMany('App\Models\Note', 'client_id', 'client_url'); diff --git a/app/Models/Note.php b/app/Models/Note.php index 91f4b8a1..5bf2ad71 100644 --- a/app/Models/Note.php +++ b/app/Models/Note.php @@ -6,9 +6,12 @@ namespace App\Models; use App\CommonMark\Generators\MentionGenerator; use App\CommonMark\Renderers\MentionRenderer; -use Codebird\Codebird; -use Exception; +use App\Observers\NoteObserver; use GuzzleHttp\Client; +use Illuminate\Database\Eloquent\Attributes\Fillable; +use Illuminate\Database\Eloquent\Attributes\Hidden; +use Illuminate\Database\Eloquent\Attributes\ObservedBy; +use Illuminate\Database\Eloquent\Attributes\Table; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -31,6 +34,10 @@ use Normalizer; use Spatie\CommonMarkHighlighter\FencedCodeRenderer; use Spatie\CommonMarkHighlighter\IndentedCodeRenderer; +#[Table('notes')] +#[Fillable(['note', 'in_reply_to', 'client_id'])] +#[Hidden(['searchable'])] +#[ObservedBy(NoteObserver::class)] class Note extends Model { use HasFactory; @@ -61,16 +68,6 @@ class Note extends Model /** @var string */ protected $table = 'notes'; - /** @var array */ - protected $fillable = [ - 'note', - 'in_reply_to', - 'client_id', - ]; - - /** @var array */ - protected $hidden = ['searchable']; - public function tags(): BelongsToMany { return $this->belongsToMany(Tag::class); @@ -126,7 +123,7 @@ class Note extends Model public function getNoteAttribute(?string $value): ?string { if ($value === null && $this->place !== null) { - $value = '📍: ' . $this->place->name . ''; + $value = '📍: '.$this->place->name.''; } // if $value is still null, just return null @@ -150,13 +147,13 @@ class Note extends Model foreach ($this->media as $media) { if ($media->type === 'image') { - $note .= PHP_EOL . ''; + $note .= PHP_EOL.''; } if ($media->type === 'audio') { - $note .= PHP_EOL . '