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 . '
' . PHP_EOL;
+'.PHP_EOL;
Contact::factory()->create([
'nick' => 'tantek',
'name' => 'Tantek Çelik',
@@ -98,7 +98,7 @@ class NotesTest extends TestCase
Facebook
-' . PHP_EOL;
+'.PHP_EOL;
$this->assertEquals($expected, $note->note);
}
@@ -108,7 +108,7 @@ class NotesTest extends TestCase
#[Test]
public function twitter_link_is_created_when_no_contact_found(): void
{
- $expected = 'Hi @bob
' . PHP_EOL;
+ $expected = 'Hi @bob
'.PHP_EOL;
$note = Note::factory()->create([
'note' => 'Hi @bob',
]);
@@ -312,7 +312,7 @@ class NotesTest extends TestCase
$note->media()->save($media);
$expected = 'A nice image
-
';
+
';
$this->assertEquals($expected, $note->content);
}
@@ -329,7 +329,7 @@ class NotesTest extends TestCase
$note->media()->save($media);
$expected = 'A nice video
-