From 7a58287b34c7ae6026c93690b646040eb1ecfa84 Mon Sep 17 00:00:00 2001 From: Jonny Barnes Date: Sun, 6 Apr 2025 17:22:36 +0100 Subject: [PATCH] Remove references to short domain --- .../Controllers/Admin/PasskeysController.php | 10 +- app/Http/Controllers/FeedsController.php | 12 +- app/Http/Controllers/ShortURLsController.php | 55 --- app/Jobs/ProcessWebMention.php | 8 +- app/Jobs/SendWebMentions.php | 4 +- app/Models/Bookmark.php | 2 +- app/Models/Note.php | 9 +- app/Models/Place.php | 16 +- app/Services/Micropub/HCardService.php | 2 +- app/Services/Micropub/HEntryService.php | 8 +- config/url.php | 32 -- resources/views/articles/rss.blade.php | 2 +- resources/views/bookmarks/index.blade.php | 6 +- resources/views/bookmarks/tagged.blade.php | 6 +- resources/views/notes/atom.blade.php | 4 +- resources/views/notes/rss.blade.php | 6 +- resources/views/templates/note.blade.php | 2 +- routes/web.php | 336 +++++++++--------- tests/Feature/FeedsTest.php | 4 +- tests/Feature/MicropubControllerTest.php | 12 +- tests/Feature/NotesControllerTest.php | 4 +- tests/Feature/PlacesTest.php | 2 +- tests/Feature/ShortURLsControllerTest.php | 39 -- tests/Feature/WebMentionsControllerTest.php | 2 +- tests/Unit/Jobs/ProcessWebMentionJobTest.php | 6 +- tests/Unit/NotesTest.php | 12 +- tests/Unit/PlacesTest.php | 18 - 27 files changed, 215 insertions(+), 404 deletions(-) delete mode 100644 app/Http/Controllers/ShortURLsController.php delete mode 100644 config/url.php delete mode 100644 tests/Feature/ShortURLsControllerTest.php diff --git a/app/Http/Controllers/Admin/PasskeysController.php b/app/Http/Controllers/Admin/PasskeysController.php index 8325a59e..b9a67f64 100644 --- a/app/Http/Controllers/Admin/PasskeysController.php +++ b/app/Http/Controllers/Admin/PasskeysController.php @@ -60,7 +60,7 @@ class PasskeysController extends Controller // RP Entity i.e. the application $rpEntity = PublicKeyCredentialRpEntity::create( config('app.name'), - config('url.longurl'), + config('app.url'), ); // User Entity @@ -148,7 +148,7 @@ class PasskeysController extends Controller ); $securedRelyingPartyId = []; if (App::environment('local', 'development')) { - $securedRelyingPartyId = [config('url.longurl')]; + $securedRelyingPartyId = [config('app.url')]; } $ceremonyStepManagerFactory->setSecuredRelyingPartyId($securedRelyingPartyId); @@ -165,7 +165,7 @@ class PasskeysController extends Controller $publicKeyCredentialSource = $authenticatorAttestationResponseValidator->check( authenticatorAttestationResponse: $publicKeyCredential->response, publicKeyCredentialCreationOptions: $publicKeyCredentialCreationOptions, - request: config('url.longurl'), + request: config('app.url'), securedRelyingPartyId: $securedRelyingPartyId, ); @@ -258,7 +258,7 @@ class PasskeysController extends Controller ); $securedRelyingPartyId = []; if (App::environment('local', 'development')) { - $securedRelyingPartyId = [config('url.longurl')]; + $securedRelyingPartyId = [config('app.url')]; } $ceremonyStepManagerFactory->setSecuredRelyingPartyId($securedRelyingPartyId); @@ -277,7 +277,7 @@ class PasskeysController extends Controller credentialId: $publicKeyCredentialSource, authenticatorAssertionResponse: $publicKeyCredential->response, publicKeyCredentialRequestOptions: $publicKeyCredentialRequestOptions, - request: config('url.longurl'), + request: config('app.url'), userHandle: null, securedRelyingPartyId: $securedRelyingPartyId, ); diff --git a/app/Http/Controllers/FeedsController.php b/app/Http/Controllers/FeedsController.php index 4e887105..bf74dadf 100644 --- a/app/Http/Controllers/FeedsController.php +++ b/app/Http/Controllers/FeedsController.php @@ -122,8 +122,8 @@ class FeedsController extends Controller foreach ($notes as $key => $note) { $data['items'][$key] = [ - 'id' => $note->longurl, - 'url' => $note->longurl, + 'id' => $note->uri, + 'url' => $note->uri, 'content_text' => $note->content, 'date_published' => $note->created_at->tz('UTC')->toRfc3339String(), 'date_modified' => $note->updated_at->tz('UTC')->toRfc3339String(), @@ -164,7 +164,7 @@ class FeedsController extends Controller 'author' => [ 'type' => 'card', 'name' => config('user.display_name'), - 'url' => config('url.longurl'), + 'url' => config('app.url'), ], 'children' => $items, ], 200, [ @@ -183,8 +183,8 @@ class FeedsController extends Controller $items[] = [ 'type' => 'entry', 'published' => $note->created_at, - 'uid' => $note->longurl, - 'url' => $note->longurl, + 'uid' => $note->uri, + 'url' => $note->uri, 'content' => [ 'text' => $note->getRawOriginal('note'), 'html' => $note->note, @@ -200,7 +200,7 @@ class FeedsController extends Controller 'author' => [ 'type' => 'card', 'name' => config('user.display_name'), - 'url' => config('url.longurl'), + 'url' => config('app.url'), ], 'children' => $items, ], 200, [ diff --git a/app/Http/Controllers/ShortURLsController.php b/app/Http/Controllers/ShortURLsController.php deleted file mode 100644 index a232fcdb..00000000 --- a/app/Http/Controllers/ShortURLsController.php +++ /dev/null @@ -1,55 +0,0 @@ -type === 'in-reply-to') { - if ($parser->checkInReplyTo($microformats, $this->note->longurl) === false) { + if ($parser->checkInReplyTo($microformats, $this->note->uri) === false) { // it doesn’t so delete $webmention->delete(); @@ -67,7 +67,7 @@ class ProcessWebMention implements ShouldQueue return; } if ($webmention->type === 'like-of') { - if ($parser->checkLikeOf($microformats, $this->note->longurl) === false) { + if ($parser->checkLikeOf($microformats, $this->note->uri) === false) { // it doesn’t so delete $webmention->delete(); @@ -75,7 +75,7 @@ class ProcessWebMention implements ShouldQueue } // 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) { + if ($parser->checkRepostOf($microformats, $this->note->uri) === false) { // it doesn’t so delete $webmention->delete(); @@ -89,7 +89,7 @@ class ProcessWebMention implements ShouldQueue $type = $parser->getMentionType($microformats); // throw error here? dispatch(new SaveProfileImage($microformats)); $webmention->source = $this->source; - $webmention->target = $this->note->longurl; + $webmention->target = $this->note->uri; $webmention->commentable_id = $this->note->id; $webmention->commentable_type = Note::class; $webmention->type = $type; diff --git a/app/Jobs/SendWebMentions.php b/app/Jobs/SendWebMentions.php index 51e5f162..2ff5f2c6 100644 --- a/app/Jobs/SendWebMentions.php +++ b/app/Jobs/SendWebMentions.php @@ -45,7 +45,7 @@ class SendWebMentions implements ShouldQueue $guzzle = resolve(Client::class); $guzzle->post($endpoint, [ 'form_params' => [ - 'source' => $this->note->longurl, + 'source' => $this->note->uri, 'target' => $url, ], ]); @@ -61,7 +61,7 @@ class SendWebMentions implements ShouldQueue public function discoverWebmentionEndpoint(string $url): ?string { // let’s not send webmentions to myself - if (parse_url($url, PHP_URL_HOST) === config('url.longurl')) { + if (parse_url($url, PHP_URL_HOST) === parse_url(config('app.url'), PHP_URL_HOST)) { return null; } if (Str::startsWith($url, '/notes/tagged/')) { diff --git a/app/Models/Bookmark.php b/app/Models/Bookmark.php index 29bd25ad..37027e40 100644 --- a/app/Models/Bookmark.php +++ b/app/Models/Bookmark.php @@ -26,7 +26,7 @@ class Bookmark extends Model return $this->belongsToMany('App\Models\Tag'); } - protected function longurl(): Attribute + protected function local_uri(): Attribute { return Attribute::get( get: fn () => config('app.url') . '/bookmarks/' . $this->id, diff --git a/app/Models/Note.php b/app/Models/Note.php index 62b9fcea..74533443 100644 --- a/app/Models/Note.php +++ b/app/Models/Note.php @@ -124,7 +124,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 @@ -172,16 +172,11 @@ class Note extends Model return (string) resolve(Numbers::class)->numto60($this->id); } - public function getLongurlAttribute(): string + public function getUriAttribute(): string { return config('app.url') . '/notes/' . $this->nb60id; } - public function getShorturlAttribute(): string - { - return config('url.shorturl') . '/notes/' . $this->nb60id; - } - public function getIso8601Attribute(): string { return $this->updated_at->toISO8601String(); diff --git a/app/Models/Place.php b/app/Models/Place.php index 62c826ad..550f234d 100644 --- a/app/Models/Place.php +++ b/app/Models/Place.php @@ -74,24 +74,10 @@ class Place extends Model ])); } - protected function longurl(): Attribute - { - return Attribute::get( - get: fn ($value, $attributes) => config('app.url') . '/places/' . $attributes['slug'], - ); - } - - protected function shorturl(): Attribute - { - return Attribute::get( - get: fn ($value, $attributes) => config('url.shorturl') . '/places/' . $attributes['slug'], - ); - } - protected function uri(): Attribute { return Attribute::get( - get: fn () => $this->longurl, + get: static fn ($value, $attributes) => config('app.url') . '/places/' . $attributes['slug'], ); } diff --git a/app/Services/Micropub/HCardService.php b/app/Services/Micropub/HCardService.php index 7ab57a4e..ead22a5b 100644 --- a/app/Services/Micropub/HCardService.php +++ b/app/Services/Micropub/HCardService.php @@ -27,6 +27,6 @@ class HCardService $data['longitude'] = Arr::get($request, 'longitude'); } - return resolve(PlaceService::class)->createPlace($data)->longurl; + return resolve(PlaceService::class)->createPlace($data)->uri; } } diff --git a/app/Services/Micropub/HEntryService.php b/app/Services/Micropub/HEntryService.php index 807e6327..5f19156c 100644 --- a/app/Services/Micropub/HEntryService.php +++ b/app/Services/Micropub/HEntryService.php @@ -18,17 +18,17 @@ class HEntryService public function process(array $request, ?string $client = null): ?string { if (Arr::get($request, 'properties.like-of') || Arr::get($request, 'like-of')) { - return resolve(LikeService::class)->create($request)->longurl; + return resolve(LikeService::class)->create($request)->url; } if (Arr::get($request, 'properties.bookmark-of') || Arr::get($request, 'bookmark-of')) { - return resolve(BookmarkService::class)->create($request)->longurl; + return resolve(BookmarkService::class)->create($request)->uri; } if (Arr::get($request, 'properties.name') || Arr::get($request, 'name')) { - return resolve(ArticleService::class)->create($request)->longurl; + return resolve(ArticleService::class)->create($request)->link; } - return resolve(NoteService::class)->create($request, $client)->longurl; + return resolve(NoteService::class)->create($request, $client)->uri; } } diff --git a/config/url.php b/config/url.php deleted file mode 100644 index dfdffe6b..00000000 --- a/config/url.php +++ /dev/null @@ -1,32 +0,0 @@ - env('APP_LONGURL', 'longurl.local'), - - /* - |-------------------------------------------------------------------------- - | Application Short URL - |-------------------------------------------------------------------------- - | - | The short URL for the application - | - */ - - 'shorturl' => env('APP_SHORTURL', 'shorturl.local'), - -]; diff --git a/resources/views/articles/rss.blade.php b/resources/views/articles/rss.blade.php index 1f5f13d6..00268681 100644 --- a/resources/views/articles/rss.blade.php +++ b/resources/views/articles/rss.blade.php @@ -3,7 +3,7 @@ {{ config('user.display_name') }} - An RSS feed of the blog posts found on {{ config('url.longurl') }} + An RSS feed of the blog posts found on {{ config('app.url') }} {{ config('app.url') }}/blog {{ $buildDate }} 1800 diff --git a/resources/views/bookmarks/index.blade.php b/resources/views/bookmarks/index.blade.php index d489d273..886b940d 100644 --- a/resources/views/bookmarks/index.blade.php +++ b/resources/views/bookmarks/index.blade.php @@ -7,15 +7,15 @@ @foreach($bookmarks as $bookmark)
@isset($bookmark->content)

{{ $bookmark->content }}

diff --git a/resources/views/bookmarks/tagged.blade.php b/resources/views/bookmarks/tagged.blade.php index 4e7b59ea..d18fdf60 100644 --- a/resources/views/bookmarks/tagged.blade.php +++ b/resources/views/bookmarks/tagged.blade.php @@ -8,15 +8,15 @@ @foreach($bookmarks as $bookmark)
@isset($bookmark->content)

{{ $bookmark->content }}

diff --git a/resources/views/notes/atom.blade.php b/resources/views/notes/atom.blade.php index bcb60147..c84a4a93 100644 --- a/resources/views/notes/atom.blade.php +++ b/resources/views/notes/atom.blade.php @@ -8,8 +8,8 @@ @foreach($notes as $note) {{ strip_tags($note->note) }} - - {{ $note->longurl }} + + {{ $note->uri }} {{ $note->updated_at->toAtomString() }} {{ $note->note }} diff --git a/resources/views/notes/rss.blade.php b/resources/views/notes/rss.blade.php index 7d1b35d5..9146ebe0 100644 --- a/resources/views/notes/rss.blade.php +++ b/resources/views/notes/rss.blade.php @@ -3,7 +3,7 @@ {{ config('user.display_name') }} - An RSS feed of the notes found on {{ config('url.longurl') }} + An RSS feed of the notes found on {{ config('app.url') }} {{ config('app.url') }}/notes {{ $buildDate }} 1800 @@ -16,8 +16,8 @@ {!! $note->note !!} ]]> - {{ $note->longurl }} - {{ $note->longurl}} + {{ $note->uri }} + {{ $note->uri}} {{ $note->pubdate }} @endforeach diff --git a/resources/views/templates/note.blade.php b/resources/views/templates/note.blade.php index fb4bb58f..3a1bd11c 100644 --- a/resources/views/templates/note.blade.php +++ b/resources/views/templates/note.blade.php @@ -34,7 +34,7 @@ @if($note->client) via {{ $note->client->client_name }}@endif @if($note->place) @if($note->getOriginal('note')) - in {{ $note->address }} + in {{ $note->address }} @endif @elseif($note->address) in {!! $note->address !!} diff --git a/routes/web.php b/routes/web.php index 5c8e989d..21f5848e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -23,7 +23,6 @@ use App\Http\Controllers\MicropubMediaController; use App\Http\Controllers\NotesController; use App\Http\Controllers\PlacesController; use App\Http\Controllers\SearchController; -use App\Http\Controllers\ShortURLsController; use App\Http\Controllers\WebMentionsController; use App\Http\Middleware\CorsHeaders; use App\Http\Middleware\MyAuthMiddleware; @@ -41,201 +40,184 @@ use Illuminate\Support\Facades\Route; | */ -Route::domain(config('url.longurl'))->group(function () { - Route::get('/', [FrontPageController::class, 'index']); +Route::get('/', [FrontPageController::class, 'index']); - // Static project page - Route::view('projects', 'projects'); +// Static project page +Route::view('projects', 'projects'); - // Static colophon page - Route::view('colophon', 'colophon'); +// Static colophon page +Route::view('colophon', 'colophon'); - // The login routes to get auth’d for admin - Route::get('login', [AuthController::class, 'showLogin'])->name('login'); - Route::post('login', [AuthController::class, 'login']); - Route::get('login/passkey', [PasskeysController::class, 'getRequestOptions']); - Route::post('login/passkey', [PasskeysController::class, 'login']); +// The login routes to get auth’d for admin +Route::get('login', [AuthController::class, 'showLogin'])->name('login'); +Route::post('login', [AuthController::class, 'login']); +Route::get('login/passkey', [PasskeysController::class, 'getRequestOptions']); +Route::post('login/passkey', [PasskeysController::class, 'login']); - // And the logout routes - Route::get('logout', [AuthController::class, 'showLogout'])->name('logout'); - Route::post('logout', [AuthController::class, 'logout']); +// And the logout routes +Route::get('logout', [AuthController::class, 'showLogout'])->name('logout'); +Route::post('logout', [AuthController::class, 'logout']); - // Admin pages grouped for filter - Route::middleware(MyAuthMiddleware::class)->prefix('admin')->group(function () { - Route::get('/', [HomeController::class, 'welcome']); +// Admin pages grouped for filter +Route::middleware(MyAuthMiddleware::class)->prefix('admin')->group(function () { + Route::get('/', [HomeController::class, 'welcome']); - // Articles - Route::prefix('blog')->group(function () { - Route::get('/', [AdminArticlesController::class, 'index']); - Route::get('/create', [AdminArticlesController::class, 'create']); - Route::post('/', [AdminArticlesController::class, 'store']); - Route::get('/{article}/edit', [AdminArticlesController::class, 'edit']); - Route::put('/{id}', [AdminArticlesController::class, 'update']); - Route::delete('/{id}', [AdminArticlesController::class, 'destroy']); - }); - - // Notes - Route::prefix('notes')->group(function () { - Route::get('/', [AdminNotesController::class, 'index']); - Route::get('/create', [AdminNotesController::class, 'create']); - Route::post('/', [AdminNotesController::class, 'store']); - Route::get('/{id}/edit', [AdminNotesController::class, 'edit']); - Route::put('/{id}', [AdminNotesController::class, 'update']); - Route::delete('/{id}', [AdminNotesController::class, 'destroy']); - }); - - // Micropub Clients - Route::prefix('clients')->group(function () { - Route::get('/', [ClientsController::class, 'index']); - Route::get('/create', [ClientsController::class, 'create']); - Route::post('/', [ClientsController::class, 'store']); - Route::get('/{id}/edit', [ClientsController::class, 'edit']); - Route::put('/{id}', [ClientsController::class, 'update']); - Route::delete('/{id}', [ClientsController::class, 'destroy']); - }); - - // Contacts - Route::prefix('contacts')->group(function () { - Route::get('/', [AdminContactsController::class, 'index']); - Route::get('/create', [AdminContactsController::class, 'create']); - Route::post('/', [AdminContactsController::class, 'store']); - Route::get('/{id}/edit', [AdminContactsController::class, 'edit']); - Route::put('/{id}', [AdminContactsController::class, 'update']); - Route::delete('/{id}', [AdminContactsController::class, 'destroy']); - Route::get('/{id}/getavatar', [AdminContactsController::class, 'getAvatar']); - }); - - // Places - Route::prefix('places')->group(function () { - Route::get('/', [AdminPlacesController::class, 'index']); - Route::get('/create', [AdminPlacesController::class, 'create']); - Route::post('/', [AdminPlacesController::class, 'store']); - Route::get('/{id}/edit', [AdminPlacesController::class, 'edit']); - Route::put('/{id}', [AdminPlacesController::class, 'update']); - Route::get('/{id}/merge', [AdminPlacesController::class, 'mergeIndex']); - Route::get('/{place1_id}/merge/{place2_id}', [AdminPlacesController::class, 'mergeEdit']); - Route::post('/merge', [AdminPlacesController::class, 'mergeStore']); - Route::delete('/{id}', [AdminPlacesController::class, 'destroy']); - }); - - // Likes - Route::prefix('likes')->group(function () { - Route::get('/', [AdminLikesController::class, 'index']); - Route::get('/create', [AdminLikesController::class, 'create']); - Route::post('/', [AdminLikesController::class, 'store']); - Route::get('/{id}/edit', [AdminLikesController::class, 'edit']); - Route::put('/{id}', [AdminLikesController::class, 'update']); - Route::delete('/{id}', [AdminLikesController::class, 'destroy']); - }); - - // Syndication Targets - Route::prefix('syndication')->group(function () { - Route::get('/', [SyndicationTargetsController::class, 'index']); - Route::get('/create', [SyndicationTargetsController::class, 'create']); - Route::post('/', [SyndicationTargetsController::class, 'store']); - Route::get('/{syndicationTarget}/edit', [SyndicationTargetsController::class, 'edit']); - Route::put('/{syndicationTarget}', [SyndicationTargetsController::class, 'update']); - Route::delete('/{syndicationTarget}', [SyndicationTargetsController::class, 'destroy']); - }); - - // Bio - Route::prefix('bio')->group(function () { - Route::get('/', [BioController::class, 'show'])->name('admin.bio.show'); - Route::put('/', [BioController::class, 'update']); - }); - - // Passkeys - Route::prefix('passkeys')->group(function () { - Route::get('/', [PasskeysController::class, 'index']); - Route::get('register', [PasskeysController::class, 'getCreateOptions']); - Route::post('register', [PasskeysController::class, 'create']); - }); - }); - - // Blog pages using ArticlesController + // Articles Route::prefix('blog')->group(function () { - Route::get('/feed.rss', [FeedsController::class, 'blogRss']); - Route::get('/feed.atom', [FeedsController::class, 'blogAtom']); - Route::get('/feed.json', [FeedsController::class, 'blogJson']); - Route::get('/feed.jf2', [FeedsController::class, 'blogJf2']); - Route::get('/s/{id}', [ArticlesController::class, 'onlyIdInURL']); - Route::get('/{year?}/{month?}', [ArticlesController::class, 'index'])->where(['year' => '[0-9]{4}', 'month' => '[0-9]{2}']); - Route::get('/{year}/{month}/{slug}', [ArticlesController::class, 'show'])->where(['year' => '[0-9]{4}', 'month' => '[0-9]{2}']); + Route::get('/', [AdminArticlesController::class, 'index']); + Route::get('/create', [AdminArticlesController::class, 'create']); + Route::post('/', [AdminArticlesController::class, 'store']); + Route::get('/{article}/edit', [AdminArticlesController::class, 'edit']); + Route::put('/{id}', [AdminArticlesController::class, 'update']); + Route::delete('/{id}', [AdminArticlesController::class, 'destroy']); }); - // Notes pages using NotesController + // Notes Route::prefix('notes')->group(function () { - Route::get('/', [NotesController::class, 'index']); - Route::get('/feed.rss', [FeedsController::class, 'notesRss']); - Route::get('/feed.atom', [FeedsController::class, 'notesAtom']); - Route::get('/feed.json', [FeedsController::class, 'notesJson']); - Route::get('/feed.jf2', [FeedsController::class, 'notesJf2']); - Route::get('/new', [NotesController::class, 'create']); - Route::get('/{id}', [NotesController::class, 'show']); - Route::get('/tagged/{tag}', [NotesController::class, 'tagged']); + Route::get('/', [AdminNotesController::class, 'index']); + Route::get('/create', [AdminNotesController::class, 'create']); + Route::post('/', [AdminNotesController::class, 'store']); + Route::get('/{id}/edit', [AdminNotesController::class, 'edit']); + Route::put('/{id}', [AdminNotesController::class, 'update']); + Route::delete('/{id}', [AdminNotesController::class, 'destroy']); + }); + + // Micropub Clients + Route::prefix('clients')->group(function () { + Route::get('/', [ClientsController::class, 'index']); + Route::get('/create', [ClientsController::class, 'create']); + Route::post('/', [ClientsController::class, 'store']); + Route::get('/{id}/edit', [ClientsController::class, 'edit']); + Route::put('/{id}', [ClientsController::class, 'update']); + Route::delete('/{id}', [ClientsController::class, 'destroy']); + }); + + // Contacts + Route::prefix('contacts')->group(function () { + Route::get('/', [AdminContactsController::class, 'index']); + Route::get('/create', [AdminContactsController::class, 'create']); + Route::post('/', [AdminContactsController::class, 'store']); + Route::get('/{id}/edit', [AdminContactsController::class, 'edit']); + Route::put('/{id}', [AdminContactsController::class, 'update']); + Route::delete('/{id}', [AdminContactsController::class, 'destroy']); + Route::get('/{id}/getavatar', [AdminContactsController::class, 'getAvatar']); + }); + + // Places + Route::prefix('places')->group(function () { + Route::get('/', [AdminPlacesController::class, 'index']); + Route::get('/create', [AdminPlacesController::class, 'create']); + Route::post('/', [AdminPlacesController::class, 'store']); + Route::get('/{id}/edit', [AdminPlacesController::class, 'edit']); + Route::put('/{id}', [AdminPlacesController::class, 'update']); + Route::get('/{id}/merge', [AdminPlacesController::class, 'mergeIndex']); + Route::get('/{place1_id}/merge/{place2_id}', [AdminPlacesController::class, 'mergeEdit']); + Route::post('/merge', [AdminPlacesController::class, 'mergeStore']); + Route::delete('/{id}', [AdminPlacesController::class, 'destroy']); }); - Route::get('note/{id}', [NotesController::class, 'redirect']); // for legacy note URLs // Likes Route::prefix('likes')->group(function () { - Route::get('/', [LikesController::class, 'index']); - Route::get('/{like}', [LikesController::class, 'show']); + Route::get('/', [AdminLikesController::class, 'index']); + Route::get('/create', [AdminLikesController::class, 'create']); + Route::post('/', [AdminLikesController::class, 'store']); + Route::get('/{id}/edit', [AdminLikesController::class, 'edit']); + Route::put('/{id}', [AdminLikesController::class, 'update']); + Route::delete('/{id}', [AdminLikesController::class, 'destroy']); }); - // Bookmarks - Route::prefix('bookmarks')->group(function () { - Route::get('/', [BookmarksController::class, 'index']); - Route::redirect('/tagged', '/bookmarks'); - Route::get('/{bookmark}', [BookmarksController::class, 'show']); - Route::get('/tagged/{tag}', [BookmarksController::class, 'tagged']); + // Syndication Targets + Route::prefix('syndication')->group(function () { + Route::get('/', [SyndicationTargetsController::class, 'index']); + Route::get('/create', [SyndicationTargetsController::class, 'create']); + Route::post('/', [SyndicationTargetsController::class, 'store']); + Route::get('/{syndicationTarget}/edit', [SyndicationTargetsController::class, 'edit']); + Route::put('/{syndicationTarget}', [SyndicationTargetsController::class, 'update']); + Route::delete('/{syndicationTarget}', [SyndicationTargetsController::class, 'destroy']); }); - // IndieAuth - Route::get('.well-known/indieauth-server', [IndieAuthController::class, 'indieAuthMetadataEndpoint'])->name('indieauth.metadata'); - Route::get('auth', [IndieAuthController::class, 'start'])->middleware(MyAuthMiddleware::class)->name('indieauth.start'); - Route::post('auth/confirm', [IndieAuthController::class, 'confirm'])->middleware(MyAuthMiddleware::class); - Route::post('auth', [IndieAuthController::class, 'processCodeExchange']); - Route::post('token', [IndieAuthController::class, 'processTokenRequest'])->name('indieauth.token'); + // Bio + Route::prefix('bio')->group(function () { + Route::get('/', [BioController::class, 'show'])->name('admin.bio.show'); + Route::put('/', [BioController::class, 'update']); + }); - // Micropub Endpoints - Route::get('api/post', [MicropubController::class, 'get'])->middleware(VerifyMicropubToken::class); - Route::post('api/post', [MicropubController::class, 'post'])->middleware(VerifyMicropubToken::class)->name('micropub-endpoint'); - Route::get('api/media', [MicropubMediaController::class, 'getHandler'])->middleware(VerifyMicropubToken::class); - Route::post('api/media', [MicropubMediaController::class, 'media']) - ->middleware([VerifyMicropubToken::class, CorsHeaders::class]) - ->name('media-endpoint'); - Route::options('/api/media', [MicropubMediaController::class, 'mediaOptionsResponse'])->middleware(CorsHeaders::class); - - // Webmention - Route::get('webmention', [WebMentionsController::class, 'get'])->name('webmention-endpoint'); - Route::post('webmention', [WebMentionsController::class, 'receive']); - - // Contacts - Route::get('contacts', [ContactsController::class, 'index']); - Route::get('contacts/{contact:nick}', [ContactsController::class, 'show']); - - // Places - Route::get('places', [PlacesController::class, 'index']); - Route::get('places/{place}', [PlacesController::class, 'show']); - - // Micropub - Route::redirect('/micropub/create', '/notes/new'); - - // Search - Route::get('search', [SearchController::class, 'search']); + // Passkeys + Route::prefix('passkeys')->group(function () { + Route::get('/', [PasskeysController::class, 'index']); + Route::get('register', [PasskeysController::class, 'getCreateOptions']); + Route::post('register', [PasskeysController::class, 'create']); + }); }); -// Short URL -Route::domain(config('url.shorturl'))->group(function () { - Route::get('/', [ShortURLsController::class, 'baseURL']); - Route::get('@', [ShortURLsController::class, 'twitter']); - - Route::get('{type}/{id}', [ShortURLsController::class, 'expandType'])->where( - [ - 'type' => '[bt]', - 'id' => '[0-9A-HJ-NP-Z_a-km-z]+', - ] - ); - - Route::get('h/{id}', [ShortURLsController::class, 'redirect']); +// Blog pages using ArticlesController +Route::prefix('blog')->group(function () { + Route::get('/feed.rss', [FeedsController::class, 'blogRss']); + Route::get('/feed.atom', [FeedsController::class, 'blogAtom']); + Route::get('/feed.json', [FeedsController::class, 'blogJson']); + Route::get('/feed.jf2', [FeedsController::class, 'blogJf2']); + Route::get('/s/{id}', [ArticlesController::class, 'onlyIdInURL']); + Route::get('/{year?}/{month?}', [ArticlesController::class, 'index'])->where(['year' => '[0-9]{4}', 'month' => '[0-9]{2}']); + Route::get('/{year}/{month}/{slug}', [ArticlesController::class, 'show'])->where(['year' => '[0-9]{4}', 'month' => '[0-9]{2}']); }); + +// Notes pages using NotesController +Route::prefix('notes')->group(function () { + Route::get('/', [NotesController::class, 'index']); + Route::get('/feed.rss', [FeedsController::class, 'notesRss']); + Route::get('/feed.atom', [FeedsController::class, 'notesAtom']); + Route::get('/feed.json', [FeedsController::class, 'notesJson']); + Route::get('/feed.jf2', [FeedsController::class, 'notesJf2']); + Route::get('/new', [NotesController::class, 'create']); + Route::get('/{id}', [NotesController::class, 'show']); + Route::get('/tagged/{tag}', [NotesController::class, 'tagged']); +}); +Route::get('note/{id}', [NotesController::class, 'redirect']); // for legacy note URLs + +// Likes +Route::prefix('likes')->group(function () { + Route::get('/', [LikesController::class, 'index']); + Route::get('/{like}', [LikesController::class, 'show']); +}); + +// Bookmarks +Route::prefix('bookmarks')->group(function () { + Route::get('/', [BookmarksController::class, 'index']); + Route::redirect('/tagged', '/bookmarks'); + Route::get('/{bookmark}', [BookmarksController::class, 'show']); + Route::get('/tagged/{tag}', [BookmarksController::class, 'tagged']); +}); + +// IndieAuth +Route::get('.well-known/indieauth-server', [IndieAuthController::class, 'indieAuthMetadataEndpoint'])->name('indieauth.metadata'); +Route::get('auth', [IndieAuthController::class, 'start'])->middleware(MyAuthMiddleware::class)->name('indieauth.start'); +Route::post('auth/confirm', [IndieAuthController::class, 'confirm'])->middleware(MyAuthMiddleware::class); +Route::post('auth', [IndieAuthController::class, 'processCodeExchange']); +Route::post('token', [IndieAuthController::class, 'processTokenRequest'])->name('indieauth.token'); + +// Micropub Endpoints +Route::get('api/post', [MicropubController::class, 'get'])->middleware(VerifyMicropubToken::class); +Route::post('api/post', [MicropubController::class, 'post'])->middleware(VerifyMicropubToken::class)->name('micropub-endpoint'); +Route::get('api/media', [MicropubMediaController::class, 'getHandler'])->middleware(VerifyMicropubToken::class); +Route::post('api/media', [MicropubMediaController::class, 'media']) + ->middleware([VerifyMicropubToken::class, CorsHeaders::class]) + ->name('media-endpoint'); +Route::options('/api/media', [MicropubMediaController::class, 'mediaOptionsResponse'])->middleware(CorsHeaders::class); + +// Webmention +Route::get('webmention', [WebMentionsController::class, 'get'])->name('webmention-endpoint'); +Route::post('webmention', [WebMentionsController::class, 'receive']); + +// Contacts +Route::get('contacts', [ContactsController::class, 'index']); +Route::get('contacts/{contact:nick}', [ContactsController::class, 'show']); + +// Places +Route::get('places', [PlacesController::class, 'index']); +Route::get('places/{place}', [PlacesController::class, 'show']); + +// Micropub +Route::redirect('/micropub/create', '/notes/new'); + +// Search +Route::get('search', [SearchController::class, 'search']); diff --git a/tests/Feature/FeedsTest.php b/tests/Feature/FeedsTest.php index a0704b90..1ed6741a 100644 --- a/tests/Feature/FeedsTest.php +++ b/tests/Feature/FeedsTest.php @@ -64,7 +64,7 @@ class FeedsTest extends TestCase 'author' => [ 'type' => 'card', 'name' => config('user.display_name'), - 'url' => config('url.longurl'), + 'url' => config('app.url'), ], 'children' => [[ 'type' => 'entry', @@ -122,7 +122,7 @@ class FeedsTest extends TestCase 'author' => [ 'type' => 'card', 'name' => config('user.display_name'), - 'url' => config('url.longurl'), + 'url' => config('app.url'), ], 'children' => [[ 'type' => 'entry', diff --git a/tests/Feature/MicropubControllerTest.php b/tests/Feature/MicropubControllerTest.php index 2cd75fc3..f3a7bace 100644 --- a/tests/Feature/MicropubControllerTest.php +++ b/tests/Feature/MicropubControllerTest.php @@ -299,7 +299,7 @@ class MicropubControllerTest extends TestCase 'type' => ['h-entry'], 'properties' => [ 'content' => [$note], - 'location' => [$place->longurl], + 'location' => [$place->uri], ], ], ['HTTP_Authorization' => 'Bearer ' . $this->getToken()] @@ -499,7 +499,7 @@ class MicropubControllerTest extends TestCase '/api/post', [ 'action' => 'update', - 'url' => $note->longurl, + 'url' => $note->uri, 'replace' => [ 'content' => ['replaced content'], ], @@ -519,7 +519,7 @@ class MicropubControllerTest extends TestCase '/api/post', [ 'action' => 'update', - 'url' => $note->longurl, + 'url' => $note->uri, 'add' => [ 'syndication' => [ 'https://www.swarmapp.com/checkin/123', @@ -546,7 +546,7 @@ class MicropubControllerTest extends TestCase '/api/post', [ 'action' => 'update', - 'url' => $note->longurl, + 'url' => $note->uri, 'add' => [ 'photo' => ['https://example.org/photo.jpg'], ], @@ -607,7 +607,7 @@ class MicropubControllerTest extends TestCase '/api/post', [ 'action' => 'update', - 'url' => $note->longurl, + 'url' => $note->uri, 'morph' => [ // or any other unsupported update type 'syndication' => ['https://www.swarmapp.com/checkin/123'], ], @@ -646,7 +646,7 @@ class MicropubControllerTest extends TestCase '/api/post', [ 'action' => 'update', - 'url' => $note->longurl, + 'url' => $note->uri, 'replace' => [ 'syndication' => [ 'https://www.swarmapp.com/checkin/the-id', diff --git a/tests/Feature/NotesControllerTest.php b/tests/Feature/NotesControllerTest.php index 43e5a050..90ccd553 100644 --- a/tests/Feature/NotesControllerTest.php +++ b/tests/Feature/NotesControllerTest.php @@ -31,7 +31,7 @@ class NotesControllerTest extends TestCase public function specificNotePageLoads(): void { $note = Note::factory()->create(); - $response = $this->get($note->longurl); + $response = $this->get($note->uri); $response->assertViewHas('note'); } @@ -51,7 +51,7 @@ class NotesControllerTest extends TestCase { $note = Note::factory()->create(); $response = $this->get('/note/' . $note->id); - $response->assertRedirect($note->longurl); + $response->assertRedirect($note->uri); } /** diff --git a/tests/Feature/PlacesTest.php b/tests/Feature/PlacesTest.php index 82a3e280..c37e4239 100644 --- a/tests/Feature/PlacesTest.php +++ b/tests/Feature/PlacesTest.php @@ -30,7 +30,7 @@ class PlacesTest extends TestCase public function singlePlacePageLoads(): void { $place = Place::factory()->create(); - $response = $this->get($place->longurl); + $response = $this->get($place->uri); $response->assertViewHas('place', $place); } diff --git a/tests/Feature/ShortURLsControllerTest.php b/tests/Feature/ShortURLsControllerTest.php deleted file mode 100644 index 989f3b5b..00000000 --- a/tests/Feature/ShortURLsControllerTest.php +++ /dev/null @@ -1,39 +0,0 @@ -get('https://' . config('url.shorturl')); - $response->assertRedirect(config('app.url')); - } - - #[Test] - public function shortDomainSlashAtRedirectsToTwitter(): void - { - $response = $this->get('https://' . config('url.shorturl') . '/@'); - $response->assertRedirect('https://twitter.com/jonnybarnes'); - } - - #[Test] - public function shortDomainSlashTRedirectsToLongDomainSlashNotes(): void - { - $response = $this->get('https://' . config('url.shorturl') . '/t/E'); - $response->assertRedirect(config('app.url') . '/notes/E'); - } - - #[Test] - public function shortDomainSlashBRedirectsToLongDomainSlashBlog(): void - { - $response = $this->get('https://' . config('url.shorturl') . '/b/1'); - $response->assertRedirect(config('app.url') . '/blog/s/1'); - } -} diff --git a/tests/Feature/WebMentionsControllerTest.php b/tests/Feature/WebMentionsControllerTest.php index d9482450..5d2908cc 100644 --- a/tests/Feature/WebMentionsControllerTest.php +++ b/tests/Feature/WebMentionsControllerTest.php @@ -82,7 +82,7 @@ class WebMentionsControllerTest extends TestCase $response = $this->call('POST', '/webmention', [ 'source' => 'https://example.org/post/123', - 'target' => $note->longurl, + 'target' => $note->uri, ]); $response->assertStatus(202); diff --git a/tests/Unit/Jobs/ProcessWebMentionJobTest.php b/tests/Unit/Jobs/ProcessWebMentionJobTest.php index 1bf56621..a67ef15e 100644 --- a/tests/Unit/Jobs/ProcessWebMentionJobTest.php +++ b/tests/Unit/Jobs/ProcessWebMentionJobTest.php @@ -94,12 +94,12 @@ class ProcessWebMentionJobTest extends TestCase $source = 'https://aaronpk.localhost/reply/1'; WebMention::factory()->create([ 'source' => $source, - 'target' => $note->longurl, + 'target' => $note->uri, ]); $html = << -

In reply to a note

+

In reply to a note

Updated reply
HTML; @@ -117,7 +117,7 @@ class ProcessWebMentionJobTest extends TestCase 'source' => $source, 'type' => 'in-reply-to', // phpcs:ignore Generic.Files.LineLength.TooLong - 'mf2' => '{"rels": [], "items": [{"type": ["h-entry"], "properties": {"content": [{"html": "Updated reply", "value": "Updated reply"}], "in-reply-to": ["' . $note->longurl . '"]}}], "rel-urls": []}', + 'mf2' => '{"rels": [], "items": [{"type": ["h-entry"], "properties": {"content": [{"html": "Updated reply", "value": "Updated reply"}], "in-reply-to": ["' . $note->uri . '"]}}], "rel-urls": []}', ]); } diff --git a/tests/Unit/NotesTest.php b/tests/Unit/NotesTest.php index 2f157c8a..6cf0b5e5 100644 --- a/tests/Unit/NotesTest.php +++ b/tests/Unit/NotesTest.php @@ -115,14 +115,6 @@ class NotesTest extends TestCase $this->assertEquals($expected, $note->note); } - #[Test] - public function shorturlMethodReturnsExpectedValue(): void - { - $note = Note::factory()->make(); - $note->id = 14; - $this->assertEquals(config('url.shorturl') . '/notes/E', $note->shorturl); - } - #[Test] public function weGetLatitudeLongitudeValuesOfAssociatedPlaceOfNote(): void { @@ -382,11 +374,11 @@ class NotesTest extends TestCase public function markdown_content_gets_converted(): void { $note = Note::factory()->create([ - 'note' => 'The best search engine? https://duckduckgo.com', + 'note' => 'The best search engine? https://kagi.com', ]); $this->assertSame( - '

The best search engine? https://duckduckgo.com

' . PHP_EOL, + '

The best search engine? https://kagi.com

' . PHP_EOL, $note->note ); } diff --git a/tests/Unit/PlacesTest.php b/tests/Unit/PlacesTest.php index b3f0ed37..470cc869 100644 --- a/tests/Unit/PlacesTest.php +++ b/tests/Unit/PlacesTest.php @@ -40,24 +40,6 @@ class PlacesTest extends TestCase $this->assertEquals('the-bridgewater-pub', $nearby[0]->slug); } - #[Test] - public function getLongurl(): void - { - $place = Place::factory()->create([ - 'name' => 'The Bridgewater Pub', - ]); - $this->assertEquals(config('app.url') . '/places/the-bridgewater-pub', $place->longurl); - } - - #[Test] - public function getShorturl() - { - $place = Place::factory()->create([ - 'name' => 'The Bridgewater Pub', - ]); - $this->assertEquals(config('url.shorturl') . '/places/the-bridgewater-pub', $place->shorturl); - } - #[Test] public function getUri(): void {