Remove short domain #34
69 changed files with 516 additions and 705 deletions
|
|
@ -60,7 +60,7 @@ class PasskeysController extends Controller
|
||||||
// RP Entity i.e. the application
|
// RP Entity i.e. the application
|
||||||
$rpEntity = PublicKeyCredentialRpEntity::create(
|
$rpEntity = PublicKeyCredentialRpEntity::create(
|
||||||
config('app.name'),
|
config('app.name'),
|
||||||
config('url.longurl'),
|
config('app.url'),
|
||||||
);
|
);
|
||||||
|
|
||||||
// User Entity
|
// User Entity
|
||||||
|
|
@ -148,7 +148,7 @@ class PasskeysController extends Controller
|
||||||
);
|
);
|
||||||
$securedRelyingPartyId = [];
|
$securedRelyingPartyId = [];
|
||||||
if (App::environment('local', 'development')) {
|
if (App::environment('local', 'development')) {
|
||||||
$securedRelyingPartyId = [config('url.longurl')];
|
$securedRelyingPartyId = [config('app.url')];
|
||||||
}
|
}
|
||||||
$ceremonyStepManagerFactory->setSecuredRelyingPartyId($securedRelyingPartyId);
|
$ceremonyStepManagerFactory->setSecuredRelyingPartyId($securedRelyingPartyId);
|
||||||
|
|
||||||
|
|
@ -165,7 +165,7 @@ class PasskeysController extends Controller
|
||||||
$publicKeyCredentialSource = $authenticatorAttestationResponseValidator->check(
|
$publicKeyCredentialSource = $authenticatorAttestationResponseValidator->check(
|
||||||
authenticatorAttestationResponse: $publicKeyCredential->response,
|
authenticatorAttestationResponse: $publicKeyCredential->response,
|
||||||
publicKeyCredentialCreationOptions: $publicKeyCredentialCreationOptions,
|
publicKeyCredentialCreationOptions: $publicKeyCredentialCreationOptions,
|
||||||
request: config('url.longurl'),
|
request: config('app.url'),
|
||||||
securedRelyingPartyId: $securedRelyingPartyId,
|
securedRelyingPartyId: $securedRelyingPartyId,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -258,7 +258,7 @@ class PasskeysController extends Controller
|
||||||
);
|
);
|
||||||
$securedRelyingPartyId = [];
|
$securedRelyingPartyId = [];
|
||||||
if (App::environment('local', 'development')) {
|
if (App::environment('local', 'development')) {
|
||||||
$securedRelyingPartyId = [config('url.longurl')];
|
$securedRelyingPartyId = [config('app.url')];
|
||||||
}
|
}
|
||||||
$ceremonyStepManagerFactory->setSecuredRelyingPartyId($securedRelyingPartyId);
|
$ceremonyStepManagerFactory->setSecuredRelyingPartyId($securedRelyingPartyId);
|
||||||
|
|
||||||
|
|
@ -277,7 +277,7 @@ class PasskeysController extends Controller
|
||||||
credentialId: $publicKeyCredentialSource,
|
credentialId: $publicKeyCredentialSource,
|
||||||
authenticatorAssertionResponse: $publicKeyCredential->response,
|
authenticatorAssertionResponse: $publicKeyCredential->response,
|
||||||
publicKeyCredentialRequestOptions: $publicKeyCredentialRequestOptions,
|
publicKeyCredentialRequestOptions: $publicKeyCredentialRequestOptions,
|
||||||
request: config('url.longurl'),
|
request: config('app.url'),
|
||||||
userHandle: null,
|
userHandle: null,
|
||||||
securedRelyingPartyId: $securedRelyingPartyId,
|
securedRelyingPartyId: $securedRelyingPartyId,
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -122,8 +122,8 @@ class FeedsController extends Controller
|
||||||
|
|
||||||
foreach ($notes as $key => $note) {
|
foreach ($notes as $key => $note) {
|
||||||
$data['items'][$key] = [
|
$data['items'][$key] = [
|
||||||
'id' => $note->longurl,
|
'id' => $note->uri,
|
||||||
'url' => $note->longurl,
|
'url' => $note->uri,
|
||||||
'content_text' => $note->content,
|
'content_text' => $note->content,
|
||||||
'date_published' => $note->created_at->tz('UTC')->toRfc3339String(),
|
'date_published' => $note->created_at->tz('UTC')->toRfc3339String(),
|
||||||
'date_modified' => $note->updated_at->tz('UTC')->toRfc3339String(),
|
'date_modified' => $note->updated_at->tz('UTC')->toRfc3339String(),
|
||||||
|
|
@ -164,7 +164,7 @@ class FeedsController extends Controller
|
||||||
'author' => [
|
'author' => [
|
||||||
'type' => 'card',
|
'type' => 'card',
|
||||||
'name' => config('user.display_name'),
|
'name' => config('user.display_name'),
|
||||||
'url' => config('url.longurl'),
|
'url' => config('app.url'),
|
||||||
],
|
],
|
||||||
'children' => $items,
|
'children' => $items,
|
||||||
], 200, [
|
], 200, [
|
||||||
|
|
@ -183,8 +183,8 @@ class FeedsController extends Controller
|
||||||
$items[] = [
|
$items[] = [
|
||||||
'type' => 'entry',
|
'type' => 'entry',
|
||||||
'published' => $note->created_at,
|
'published' => $note->created_at,
|
||||||
'uid' => $note->longurl,
|
'uid' => $note->uri,
|
||||||
'url' => $note->longurl,
|
'url' => $note->uri,
|
||||||
'content' => [
|
'content' => [
|
||||||
'text' => $note->getRawOriginal('note'),
|
'text' => $note->getRawOriginal('note'),
|
||||||
'html' => $note->note,
|
'html' => $note->note,
|
||||||
|
|
@ -200,7 +200,7 @@ class FeedsController extends Controller
|
||||||
'author' => [
|
'author' => [
|
||||||
'type' => 'card',
|
'type' => 'card',
|
||||||
'name' => config('user.display_name'),
|
'name' => config('user.display_name'),
|
||||||
'url' => config('url.longurl'),
|
'url' => config('app.url'),
|
||||||
],
|
],
|
||||||
'children' => $items,
|
'children' => $items,
|
||||||
], 200, [
|
], 200, [
|
||||||
|
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace App\Http\Controllers;
|
|
||||||
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @psalm-suppress UnusedClass
|
|
||||||
*/
|
|
||||||
class ShortURLsController extends Controller
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Short URL Controller
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| This redirects the short urls to long ones
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Redirect from '/' to the long url.
|
|
||||||
*/
|
|
||||||
public function baseURL(): RedirectResponse
|
|
||||||
{
|
|
||||||
return redirect(config('app.url'));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Redirect from '/@' to a twitter profile.
|
|
||||||
*/
|
|
||||||
public function twitter(): RedirectResponse
|
|
||||||
{
|
|
||||||
return redirect('https://twitter.com/jonnybarnes');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Redirect a short url of this site out to a long one based on post type.
|
|
||||||
*
|
|
||||||
* Further redirects may happen.
|
|
||||||
*/
|
|
||||||
public function expandType(string $type, string $postId): RedirectResponse
|
|
||||||
{
|
|
||||||
if ($type === 't') {
|
|
||||||
$type = 'notes';
|
|
||||||
}
|
|
||||||
if ($type === 'b') {
|
|
||||||
$type = 'blog/s';
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect(config('app.url') . '/' . $type . '/' . $postId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -53,7 +53,7 @@ class ProcessWebMention implements ShouldQueue
|
||||||
// check webmention still references target
|
// check webmention still references target
|
||||||
// we try each type of mention (reply/like/repost)
|
// we try each type of mention (reply/like/repost)
|
||||||
if ($webmention->type === 'in-reply-to') {
|
if ($webmention->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
|
// it doesn’t so delete
|
||||||
$webmention->delete();
|
$webmention->delete();
|
||||||
|
|
||||||
|
|
@ -67,7 +67,7 @@ class ProcessWebMention implements ShouldQueue
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($webmention->type === 'like-of') {
|
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
|
// it doesn’t so delete
|
||||||
$webmention->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
|
} // note we don’t need to do anything if it still is a like
|
||||||
}
|
}
|
||||||
if ($webmention->type === 'repost-of') {
|
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
|
// it doesn’t so delete
|
||||||
$webmention->delete();
|
$webmention->delete();
|
||||||
|
|
||||||
|
|
@ -89,7 +89,7 @@ class ProcessWebMention implements ShouldQueue
|
||||||
$type = $parser->getMentionType($microformats); // throw error here?
|
$type = $parser->getMentionType($microformats); // throw error here?
|
||||||
dispatch(new SaveProfileImage($microformats));
|
dispatch(new SaveProfileImage($microformats));
|
||||||
$webmention->source = $this->source;
|
$webmention->source = $this->source;
|
||||||
$webmention->target = $this->note->longurl;
|
$webmention->target = $this->note->uri;
|
||||||
$webmention->commentable_id = $this->note->id;
|
$webmention->commentable_id = $this->note->id;
|
||||||
$webmention->commentable_type = Note::class;
|
$webmention->commentable_type = Note::class;
|
||||||
$webmention->type = $type;
|
$webmention->type = $type;
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ class SendWebMentions implements ShouldQueue
|
||||||
$guzzle = resolve(Client::class);
|
$guzzle = resolve(Client::class);
|
||||||
$guzzle->post($endpoint, [
|
$guzzle->post($endpoint, [
|
||||||
'form_params' => [
|
'form_params' => [
|
||||||
'source' => $this->note->longurl,
|
'source' => $this->note->uri,
|
||||||
'target' => $url,
|
'target' => $url,
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
|
@ -61,7 +61,7 @@ class SendWebMentions implements ShouldQueue
|
||||||
public function discoverWebmentionEndpoint(string $url): ?string
|
public function discoverWebmentionEndpoint(string $url): ?string
|
||||||
{
|
{
|
||||||
// let’s not send webmentions to myself
|
// 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;
|
return null;
|
||||||
}
|
}
|
||||||
if (Str::startsWith($url, '/notes/tagged/')) {
|
if (Str::startsWith($url, '/notes/tagged/')) {
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ class Bookmark extends Model
|
||||||
return $this->belongsToMany('App\Models\Tag');
|
return $this->belongsToMany('App\Models\Tag');
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function longurl(): Attribute
|
protected function local_uri(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(
|
return Attribute::get(
|
||||||
get: fn () => config('app.url') . '/bookmarks/' . $this->id,
|
get: fn () => config('app.url') . '/bookmarks/' . $this->id,
|
||||||
|
|
|
||||||
|
|
@ -124,7 +124,7 @@ class Note extends Model
|
||||||
public function getNoteAttribute(?string $value): ?string
|
public function getNoteAttribute(?string $value): ?string
|
||||||
{
|
{
|
||||||
if ($value === null && $this->place !== null) {
|
if ($value === null && $this->place !== null) {
|
||||||
$value = '📍: <a href="' . $this->place->longurl . '">' . $this->place->name . '</a>';
|
$value = '📍: <a href="' . $this->place->uri . '">' . $this->place->name . '</a>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// if $value is still null, just return null
|
// if $value is still null, just return null
|
||||||
|
|
@ -172,16 +172,11 @@ class Note extends Model
|
||||||
return (string) resolve(Numbers::class)->numto60($this->id);
|
return (string) resolve(Numbers::class)->numto60($this->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLongurlAttribute(): string
|
public function getUriAttribute(): string
|
||||||
{
|
{
|
||||||
return config('app.url') . '/notes/' . $this->nb60id;
|
return config('app.url') . '/notes/' . $this->nb60id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getShorturlAttribute(): string
|
|
||||||
{
|
|
||||||
return config('url.shorturl') . '/notes/' . $this->nb60id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getIso8601Attribute(): string
|
public function getIso8601Attribute(): string
|
||||||
{
|
{
|
||||||
return $this->updated_at->toISO8601String();
|
return $this->updated_at->toISO8601String();
|
||||||
|
|
|
||||||
|
|
@ -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
|
protected function uri(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(
|
return Attribute::get(
|
||||||
get: fn () => $this->longurl,
|
get: static fn ($value, $attributes) => config('app.url') . '/places/' . $attributes['slug'],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,6 @@ class HCardService
|
||||||
$data['longitude'] = Arr::get($request, 'longitude');
|
$data['longitude'] = Arr::get($request, 'longitude');
|
||||||
}
|
}
|
||||||
|
|
||||||
return resolve(PlaceService::class)->createPlace($data)->longurl;
|
return resolve(PlaceService::class)->createPlace($data)->uri;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,17 +18,17 @@ class HEntryService
|
||||||
public function process(array $request, ?string $client = null): ?string
|
public function process(array $request, ?string $client = null): ?string
|
||||||
{
|
{
|
||||||
if (Arr::get($request, 'properties.like-of') || Arr::get($request, 'like-of')) {
|
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')) {
|
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')) {
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Here we set the long and short URLs our app shall use
|
|
||||||
* You can override these settings in the .env file
|
|
||||||
*/
|
|
||||||
|
|
||||||
return [
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Application Long URL
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| The long URL for the application
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
|
|
||||||
'longurl' => env('APP_LONGURL', 'longurl.local'),
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Application Short URL
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
|
|
|
||||||
| The short URL for the application
|
|
||||||
|
|
|
||||||
*/
|
|
||||||
|
|
||||||
'shorturl' => env('APP_SHORTURL', 'shorturl.local'),
|
|
||||||
|
|
||||||
];
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<channel>
|
<channel>
|
||||||
<title>{{ config('user.display_name') }}</title>
|
<title>{{ config('user.display_name') }}</title>
|
||||||
<atom:link href="{{ config('app.url') }}/blog/feed.rss" rel="self" type="application/rss+xml" />
|
<atom:link href="{{ config('app.url') }}/blog/feed.rss" rel="self" type="application/rss+xml" />
|
||||||
<description>An RSS feed of the blog posts found on {{ config('url.longurl') }}</description>
|
<description>An RSS feed of the blog posts found on {{ config('app.url') }}</description>
|
||||||
<link>{{ config('app.url') }}/blog</link>
|
<link>{{ config('app.url') }}/blog</link>
|
||||||
<lastBuildDate>{{ $buildDate }}</lastBuildDate>
|
<lastBuildDate>{{ $buildDate }}</lastBuildDate>
|
||||||
<ttl>1800</ttl>
|
<ttl>1800</ttl>
|
||||||
|
|
|
||||||
|
|
@ -7,15 +7,15 @@
|
||||||
@foreach($bookmarks as $bookmark)
|
@foreach($bookmarks as $bookmark)
|
||||||
<div class="h-entry">
|
<div class="h-entry">
|
||||||
<div class="bookmark-link">
|
<div class="bookmark-link">
|
||||||
<a class="u-bookmark-of<?php if ($bookmark->name !== null) { echo ' h-cite'; } ?>" href="{{ $bookmark->url }}">
|
<a class="u-bookmark-of<?php if ($bookmark->name !== null) { echo ' h-cite'; } ?>" href="{{ $bookmark->uri }}">
|
||||||
@isset($bookmark->name)
|
@isset($bookmark->name)
|
||||||
{{ $bookmark->name }}
|
{{ $bookmark->name }}
|
||||||
@endisset
|
@endisset
|
||||||
|
|
||||||
@empty($bookmark->name)
|
@empty($bookmark->name)
|
||||||
{{ $bookmark->url }}
|
{{ $bookmark->uri }}
|
||||||
@endempty
|
@endempty
|
||||||
</a> <a href="{{ $bookmark->longurl }}">🔗</a>
|
</a> <a href="{{ $bookmark->uri }}">🔗</a>
|
||||||
</div>
|
</div>
|
||||||
@isset($bookmark->content)
|
@isset($bookmark->content)
|
||||||
<p>{{ $bookmark->content }}</p>
|
<p>{{ $bookmark->content }}</p>
|
||||||
|
|
|
||||||
|
|
@ -8,15 +8,15 @@
|
||||||
@foreach($bookmarks as $bookmark)
|
@foreach($bookmarks as $bookmark)
|
||||||
<div class="h-entry">
|
<div class="h-entry">
|
||||||
<div class="bookmark-link">
|
<div class="bookmark-link">
|
||||||
<a class="u-bookmark-of<?php if ($bookmark->name !== null) { echo ' h-cite'; } ?>" href="{{ $bookmark->url }}">
|
<a class="u-bookmark-of<?php if ($bookmark->name !== null) { echo ' h-cite'; } ?>" href="{{ $bookmark->uri }}">
|
||||||
@isset($bookmark->name)
|
@isset($bookmark->name)
|
||||||
{{ $bookmark->name }}
|
{{ $bookmark->name }}
|
||||||
@endisset
|
@endisset
|
||||||
|
|
||||||
@empty($bookmark->name)
|
@empty($bookmark->name)
|
||||||
{{ $bookmark->url }}
|
{{ $bookmark->uri }}
|
||||||
@endempty
|
@endempty
|
||||||
</a> <a href="{{ $bookmark->longurl }}">🔗</a>
|
</a> <a href="{{ $bookmark->uri }}">🔗</a>
|
||||||
</div>
|
</div>
|
||||||
@isset($bookmark->content)
|
@isset($bookmark->content)
|
||||||
<p>{{ $bookmark->content }}</p>
|
<p>{{ $bookmark->content }}</p>
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@
|
||||||
@foreach($notes as $note)
|
@foreach($notes as $note)
|
||||||
<entry>
|
<entry>
|
||||||
<title>{{ strip_tags($note->note) }}</title>
|
<title>{{ strip_tags($note->note) }}</title>
|
||||||
<link href="{{ $note->longurl }}" />
|
<link href="{{ $note->uri }}" />
|
||||||
<id>{{ $note->longurl }}</id>
|
<id>{{ $note->uri }}</id>
|
||||||
<updated>{{ $note->updated_at->toAtomString() }}</updated>
|
<updated>{{ $note->updated_at->toAtomString() }}</updated>
|
||||||
<content type="html">{{ $note->note }}</content>
|
<content type="html">{{ $note->note }}</content>
|
||||||
<author>
|
<author>
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<channel>
|
<channel>
|
||||||
<title>{{ config('user.display_name') }}</title>
|
<title>{{ config('user.display_name') }}</title>
|
||||||
<atom:link href="{{ config('app.url') }}/notes/feed.rss" rel="self" type="application/rss+xml" />
|
<atom:link href="{{ config('app.url') }}/notes/feed.rss" rel="self" type="application/rss+xml" />
|
||||||
<description>An RSS feed of the notes found on {{ config('url.longurl') }}</description>
|
<description>An RSS feed of the notes found on {{ config('app.url') }}</description>
|
||||||
<link>{{ config('app.url') }}/notes</link>
|
<link>{{ config('app.url') }}/notes</link>
|
||||||
<lastBuildDate>{{ $buildDate }}</lastBuildDate>
|
<lastBuildDate>{{ $buildDate }}</lastBuildDate>
|
||||||
<ttl>1800</ttl>
|
<ttl>1800</ttl>
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
{!! $note->note !!}
|
{!! $note->note !!}
|
||||||
]]>
|
]]>
|
||||||
</description>
|
</description>
|
||||||
<link>{{ $note->longurl }}</link>
|
<link>{{ $note->uri }}</link>
|
||||||
<guid>{{ $note->longurl}}</guid>
|
<guid>{{ $note->uri}}</guid>
|
||||||
<pubDate>{{ $note->pubdate }}</pubDate>
|
<pubDate>{{ $note->pubdate }}</pubDate>
|
||||||
</item>
|
</item>
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@
|
||||||
@if($note->client) via <a class="client" href="{{ $note->client->client_url }}">{{ $note->client->client_name }}</a>@endif
|
@if($note->client) via <a class="client" href="{{ $note->client->client_url }}">{{ $note->client->client_name }}</a>@endif
|
||||||
@if($note->place)
|
@if($note->place)
|
||||||
@if($note->getOriginal('note'))
|
@if($note->getOriginal('note'))
|
||||||
in <span class="p-location h-card"><a class="p-name u-url" href="{{ $note->place->longurl }}">{{ $note->address }}</a><data class="p-latitude" value="{{ $note->place->latitude }}"></data><data class="p-longitude" value="{{ $note->place->longitude }}"></data></span>
|
in <span class="p-location h-card"><a class="p-name u-url" href="{{ $note->place->uri }}">{{ $note->address }}</a><data class="p-latitude" value="{{ $note->place->latitude }}"></data><data class="p-longitude" value="{{ $note->place->longitude }}"></data></span>
|
||||||
@endif
|
@endif
|
||||||
@elseif($note->address)
|
@elseif($note->address)
|
||||||
in <span class="p-location h-adr">{!! $note->address !!}<data class="p-latitude" value="{{ $note->latitude }}"></data><data class="p-longitude" value="{{ $note->longitude }}"></data></span>
|
in <span class="p-location h-adr">{!! $note->address !!}<data class="p-latitude" value="{{ $note->latitude }}"></data><data class="p-longitude" value="{{ $note->longitude }}"></data></span>
|
||||||
|
|
|
||||||
336
routes/web.php
336
routes/web.php
|
|
@ -23,7 +23,6 @@ use App\Http\Controllers\MicropubMediaController;
|
||||||
use App\Http\Controllers\NotesController;
|
use App\Http\Controllers\NotesController;
|
||||||
use App\Http\Controllers\PlacesController;
|
use App\Http\Controllers\PlacesController;
|
||||||
use App\Http\Controllers\SearchController;
|
use App\Http\Controllers\SearchController;
|
||||||
use App\Http\Controllers\ShortURLsController;
|
|
||||||
use App\Http\Controllers\WebMentionsController;
|
use App\Http\Controllers\WebMentionsController;
|
||||||
use App\Http\Middleware\CorsHeaders;
|
use App\Http\Middleware\CorsHeaders;
|
||||||
use App\Http\Middleware\MyAuthMiddleware;
|
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
|
// Static project page
|
||||||
Route::view('projects', 'projects');
|
Route::view('projects', 'projects');
|
||||||
|
|
||||||
// Static colophon page
|
// Static colophon page
|
||||||
Route::view('colophon', 'colophon');
|
Route::view('colophon', 'colophon');
|
||||||
|
|
||||||
// The login routes to get auth’d for admin
|
// The login routes to get auth’d for admin
|
||||||
Route::get('login', [AuthController::class, 'showLogin'])->name('login');
|
Route::get('login', [AuthController::class, 'showLogin'])->name('login');
|
||||||
Route::post('login', [AuthController::class, 'login']);
|
Route::post('login', [AuthController::class, 'login']);
|
||||||
Route::get('login/passkey', [PasskeysController::class, 'getRequestOptions']);
|
Route::get('login/passkey', [PasskeysController::class, 'getRequestOptions']);
|
||||||
Route::post('login/passkey', [PasskeysController::class, 'login']);
|
Route::post('login/passkey', [PasskeysController::class, 'login']);
|
||||||
|
|
||||||
// And the logout routes
|
// And the logout routes
|
||||||
Route::get('logout', [AuthController::class, 'showLogout'])->name('logout');
|
Route::get('logout', [AuthController::class, 'showLogout'])->name('logout');
|
||||||
Route::post('logout', [AuthController::class, 'logout']);
|
Route::post('logout', [AuthController::class, 'logout']);
|
||||||
|
|
||||||
// Admin pages grouped for filter
|
// Admin pages grouped for filter
|
||||||
Route::middleware(MyAuthMiddleware::class)->prefix('admin')->group(function () {
|
Route::middleware(MyAuthMiddleware::class)->prefix('admin')->group(function () {
|
||||||
Route::get('/', [HomeController::class, 'welcome']);
|
Route::get('/', [HomeController::class, 'welcome']);
|
||||||
|
|
||||||
// Articles
|
// 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
|
|
||||||
Route::prefix('blog')->group(function () {
|
Route::prefix('blog')->group(function () {
|
||||||
Route::get('/feed.rss', [FeedsController::class, 'blogRss']);
|
Route::get('/', [AdminArticlesController::class, 'index']);
|
||||||
Route::get('/feed.atom', [FeedsController::class, 'blogAtom']);
|
Route::get('/create', [AdminArticlesController::class, 'create']);
|
||||||
Route::get('/feed.json', [FeedsController::class, 'blogJson']);
|
Route::post('/', [AdminArticlesController::class, 'store']);
|
||||||
Route::get('/feed.jf2', [FeedsController::class, 'blogJf2']);
|
Route::get('/{article}/edit', [AdminArticlesController::class, 'edit']);
|
||||||
Route::get('/s/{id}', [ArticlesController::class, 'onlyIdInURL']);
|
Route::put('/{id}', [AdminArticlesController::class, 'update']);
|
||||||
Route::get('/{year?}/{month?}', [ArticlesController::class, 'index'])->where(['year' => '[0-9]{4}', 'month' => '[0-9]{2}']);
|
Route::delete('/{id}', [AdminArticlesController::class, 'destroy']);
|
||||||
Route::get('/{year}/{month}/{slug}', [ArticlesController::class, 'show'])->where(['year' => '[0-9]{4}', 'month' => '[0-9]{2}']);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Notes pages using NotesController
|
// Notes
|
||||||
Route::prefix('notes')->group(function () {
|
Route::prefix('notes')->group(function () {
|
||||||
Route::get('/', [NotesController::class, 'index']);
|
Route::get('/', [AdminNotesController::class, 'index']);
|
||||||
Route::get('/feed.rss', [FeedsController::class, 'notesRss']);
|
Route::get('/create', [AdminNotesController::class, 'create']);
|
||||||
Route::get('/feed.atom', [FeedsController::class, 'notesAtom']);
|
Route::post('/', [AdminNotesController::class, 'store']);
|
||||||
Route::get('/feed.json', [FeedsController::class, 'notesJson']);
|
Route::get('/{id}/edit', [AdminNotesController::class, 'edit']);
|
||||||
Route::get('/feed.jf2', [FeedsController::class, 'notesJf2']);
|
Route::put('/{id}', [AdminNotesController::class, 'update']);
|
||||||
Route::get('/new', [NotesController::class, 'create']);
|
Route::delete('/{id}', [AdminNotesController::class, 'destroy']);
|
||||||
Route::get('/{id}', [NotesController::class, 'show']);
|
});
|
||||||
Route::get('/tagged/{tag}', [NotesController::class, 'tagged']);
|
|
||||||
|
// 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
|
// Likes
|
||||||
Route::prefix('likes')->group(function () {
|
Route::prefix('likes')->group(function () {
|
||||||
Route::get('/', [LikesController::class, 'index']);
|
Route::get('/', [AdminLikesController::class, 'index']);
|
||||||
Route::get('/{like}', [LikesController::class, 'show']);
|
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
|
// Syndication Targets
|
||||||
Route::prefix('bookmarks')->group(function () {
|
Route::prefix('syndication')->group(function () {
|
||||||
Route::get('/', [BookmarksController::class, 'index']);
|
Route::get('/', [SyndicationTargetsController::class, 'index']);
|
||||||
Route::redirect('/tagged', '/bookmarks');
|
Route::get('/create', [SyndicationTargetsController::class, 'create']);
|
||||||
Route::get('/{bookmark}', [BookmarksController::class, 'show']);
|
Route::post('/', [SyndicationTargetsController::class, 'store']);
|
||||||
Route::get('/tagged/{tag}', [BookmarksController::class, 'tagged']);
|
Route::get('/{syndicationTarget}/edit', [SyndicationTargetsController::class, 'edit']);
|
||||||
|
Route::put('/{syndicationTarget}', [SyndicationTargetsController::class, 'update']);
|
||||||
|
Route::delete('/{syndicationTarget}', [SyndicationTargetsController::class, 'destroy']);
|
||||||
});
|
});
|
||||||
|
|
||||||
// IndieAuth
|
// Bio
|
||||||
Route::get('.well-known/indieauth-server', [IndieAuthController::class, 'indieAuthMetadataEndpoint'])->name('indieauth.metadata');
|
Route::prefix('bio')->group(function () {
|
||||||
Route::get('auth', [IndieAuthController::class, 'start'])->middleware(MyAuthMiddleware::class)->name('indieauth.start');
|
Route::get('/', [BioController::class, 'show'])->name('admin.bio.show');
|
||||||
Route::post('auth/confirm', [IndieAuthController::class, 'confirm'])->middleware(MyAuthMiddleware::class);
|
Route::put('/', [BioController::class, 'update']);
|
||||||
Route::post('auth', [IndieAuthController::class, 'processCodeExchange']);
|
});
|
||||||
Route::post('token', [IndieAuthController::class, 'processTokenRequest'])->name('indieauth.token');
|
|
||||||
|
|
||||||
// Micropub Endpoints
|
// Passkeys
|
||||||
Route::get('api/post', [MicropubController::class, 'get'])->middleware(VerifyMicropubToken::class);
|
Route::prefix('passkeys')->group(function () {
|
||||||
Route::post('api/post', [MicropubController::class, 'post'])->middleware(VerifyMicropubToken::class)->name('micropub-endpoint');
|
Route::get('/', [PasskeysController::class, 'index']);
|
||||||
Route::get('api/media', [MicropubMediaController::class, 'getHandler'])->middleware(VerifyMicropubToken::class);
|
Route::get('register', [PasskeysController::class, 'getCreateOptions']);
|
||||||
Route::post('api/media', [MicropubMediaController::class, 'media'])
|
Route::post('register', [PasskeysController::class, 'create']);
|
||||||
->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']);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Short URL
|
// Blog pages using ArticlesController
|
||||||
Route::domain(config('url.shorturl'))->group(function () {
|
Route::prefix('blog')->group(function () {
|
||||||
Route::get('/', [ShortURLsController::class, 'baseURL']);
|
Route::get('/feed.rss', [FeedsController::class, 'blogRss']);
|
||||||
Route::get('@', [ShortURLsController::class, 'twitter']);
|
Route::get('/feed.atom', [FeedsController::class, 'blogAtom']);
|
||||||
|
Route::get('/feed.json', [FeedsController::class, 'blogJson']);
|
||||||
Route::get('{type}/{id}', [ShortURLsController::class, 'expandType'])->where(
|
Route::get('/feed.jf2', [FeedsController::class, 'blogJf2']);
|
||||||
[
|
Route::get('/s/{id}', [ArticlesController::class, 'onlyIdInURL']);
|
||||||
'type' => '[bt]',
|
Route::get('/{year?}/{month?}', [ArticlesController::class, 'index'])->where(['year' => '[0-9]{4}', 'month' => '[0-9]{2}']);
|
||||||
'id' => '[0-9A-HJ-NP-Z_a-km-z]+',
|
Route::get('/{year}/{month}/{slug}', [ArticlesController::class, 'show'])->where(['year' => '[0-9]{4}', 'month' => '[0-9]{2}']);
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
Route::get('h/{id}', [ShortURLsController::class, 'redirect']);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 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']);
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ class AdminHomeControllerTest extends TestCase
|
||||||
use RefreshDatabase;
|
use RefreshDatabase;
|
||||||
|
|
||||||
#[Test]
|
#[Test]
|
||||||
public function adminHomepageLoads(): void
|
public function admin_homepage_loads(): void
|
||||||
{
|
{
|
||||||
$user = User::factory()->make();
|
$user = User::factory()->make();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,21 +11,21 @@ use Tests\TestCase;
|
||||||
class AdminTest extends TestCase
|
class AdminTest extends TestCase
|
||||||
{
|
{
|
||||||
#[Test]
|
#[Test]
|
||||||
public function adminPageRedirectsUnauthorisedUsersToLoginPage(): void
|
public function admin_page_redirects_unauthorised_users_to_login_page(): void
|
||||||
{
|
{
|
||||||
$response = $this->get('/admin');
|
$response = $this->get('/admin');
|
||||||
$response->assertRedirect('/login');
|
$response->assertRedirect('/login');
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Test]
|
#[Test]
|
||||||
public function loginPageLoads(): void
|
public function login_page_loads(): void
|
||||||
{
|
{
|
||||||
$response = $this->get('/login');
|
$response = $this->get('/login');
|
||||||
$response->assertViewIs('login');
|
$response->assertViewIs('login');
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Test]
|
#[Test]
|
||||||
public function loginAttemptWithBadCredentialsFails(): void
|
public function login_attempt_with_bad_credentials_fails(): void
|
||||||
{
|
{
|
||||||
$response = $this->post('/login', [
|
$response = $this->post('/login', [
|
||||||
'username' => 'bad',
|
'username' => 'bad',
|
||||||
|
|
@ -35,7 +35,7 @@ class AdminTest extends TestCase
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Test]
|
#[Test]
|
||||||
public function loginSucceeds(): void
|
public function login_succeeds(): void
|
||||||
{
|
{
|
||||||
User::factory([
|
User::factory([
|
||||||
'name' => 'admin',
|
'name' => 'admin',
|
||||||
|
|
@ -51,7 +51,7 @@ class AdminTest extends TestCase
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Test]
|
#[Test]
|
||||||
public function whenLoggedInRedirectsToAdminPage(): void
|
public function when_logged_in_redirects_to_admin_page(): void
|
||||||
{
|
{
|
||||||
$user = User::factory()->create();
|
$user = User::factory()->create();
|
||||||
$response = $this->actingAs($user)->get('/login');
|
$response = $this->actingAs($user)->get('/login');
|
||||||
|
|
@ -59,14 +59,14 @@ class AdminTest extends TestCase
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Test]
|
#[Test]
|
||||||
public function loggedOutUsersSimplyRedirected(): void
|
public function logged_out_users_simply_redirected(): void
|
||||||
{
|
{
|
||||||
$response = $this->get('/logout');
|
$response = $this->get('/logout');
|
||||||
$response->assertRedirect('/');
|
$response->assertRedirect('/');
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Test]
|
#[Test]
|
||||||
public function loggedInUsersShownLogoutForm(): void
|
public function logged_in_users_shown_logout_form(): void
|
||||||
{
|
{
|
||||||
$user = User::factory()->create();
|
$user = User::factory()->create();
|
||||||
$response = $this->actingAs($user)->get('/logout');
|
$response = $this->actingAs($user)->get('/logout');
|
||||||
|
|
@ -74,7 +74,7 @@ class AdminTest extends TestCase
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Test]
|
#[Test]
|
||||||
public function loggedInUsersCanLogout(): void
|
public function logged_in_users_can_logout(): void
|
||||||
{
|
{
|
||||||
$user = User::factory()->create();
|
$user = User::factory()->create();
|
||||||
$response = $this->actingAs($user)->post('/logout');
|
$response = $this->actingAs($user)->post('/logout');
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue