Auth: convert auth views and verification email to Nova layout

This commit is contained in:
2026-02-21 07:37:08 +01:00
parent 93b009d42a
commit 795c7a835f
117 changed files with 5385 additions and 1291 deletions

View File

@@ -38,12 +38,16 @@ Route::prefix('v1')->name('api.v1.')->group(function () {
->name('feed');
});
Route::middleware(['web', 'auth'])->prefix('artworks')->name('api.artworks.')->group(function () {
Route::middleware(['web', 'normalize.username', 'throttle:30,1'])
->get('username/availability', \App\Http\Controllers\Api\UsernameAvailabilityController::class)
->name('api.username.availability');
Route::middleware(['web', 'auth', 'normalize.username'])->prefix('artworks')->name('api.artworks.')->group(function () {
Route::post('/', [\App\Http\Controllers\Api\ArtworkController::class, 'store'])
->name('store');
});
Route::middleware(['web', 'auth'])->prefix('uploads')->name('api.uploads.')->group(function () {
Route::middleware(['web', 'auth', 'normalize.username'])->prefix('uploads')->name('api.uploads.')->group(function () {
Route::post('init', [\App\Http\Controllers\Api\UploadController::class, 'init'])
->middleware('throttle:uploads-init')
->name('init');
@@ -102,6 +106,19 @@ Route::middleware(['web', 'auth', 'admin.moderation'])->prefix('admin/reports')-
->name('feed-performance');
});
Route::middleware(['web', 'auth', 'admin.moderation'])->prefix('admin/usernames')->name('api.admin.usernames.')->group(function () {
Route::get('pending', [\App\Http\Controllers\Api\Admin\UsernameApprovalController::class, 'pending'])
->name('pending');
Route::post('{id}/approve', [\App\Http\Controllers\Api\Admin\UsernameApprovalController::class, 'approve'])
->whereNumber('id')
->name('approve');
Route::post('{id}/reject', [\App\Http\Controllers\Api\Admin\UsernameApprovalController::class, 'reject'])
->whereNumber('id')
->name('reject');
});
Route::post('analytics/similar-artworks', [\App\Http\Controllers\Api\SimilarArtworkAnalyticsController::class, 'store'])
->middleware('throttle:uploads-status')
->name('api.analytics.similar-artworks.store');
@@ -110,19 +127,19 @@ Route::middleware(['web', 'auth'])->post('analytics/feed', [\App\Http\Controller
->middleware('throttle:uploads-status')
->name('api.analytics.feed.store');
Route::middleware(['web', 'auth'])->prefix('discovery')->name('api.discovery.')->group(function () {
Route::middleware(['web', 'auth', 'normalize.username'])->prefix('discovery')->name('api.discovery.')->group(function () {
Route::post('events', [\App\Http\Controllers\Api\DiscoveryEventController::class, 'store'])
->middleware('throttle:uploads-status')
->name('events.store');
});
// Tag system (auth-protected; 404-only ownership checks handled in requests/controllers)
Route::middleware(['web', 'auth'])->prefix('tags')->name('api.tags.')->group(function () {
Route::middleware(['web', 'auth', 'normalize.username'])->prefix('tags')->name('api.tags.')->group(function () {
Route::get('search', [\App\Http\Controllers\Api\TagController::class, 'search'])->name('search');
Route::get('popular', [\App\Http\Controllers\Api\TagController::class, 'popular'])->name('popular');
});
Route::middleware(['web', 'auth'])->prefix('artworks')->name('api.artworks.tags.')->group(function () {
Route::middleware(['web', 'auth', 'normalize.username'])->prefix('artworks')->name('api.artworks.tags.')->group(function () {
Route::get('{id}/tags', [\App\Http\Controllers\Api\ArtworkTagController::class, 'index'])->whereNumber('id')->name('index');
Route::post('{id}/tags', [\App\Http\Controllers\Api\ArtworkTagController::class, 'store'])->whereNumber('id')->name('store');
Route::put('{id}/tags', [\App\Http\Controllers\Api\ArtworkTagController::class, 'update'])->whereNumber('id')->name('update');

View File

@@ -8,14 +8,28 @@ use App\Http\Controllers\Auth\NewPasswordController;
use App\Http\Controllers\Auth\PasswordController;
use App\Http\Controllers\Auth\PasswordResetLinkController;
use App\Http\Controllers\Auth\RegisteredUserController;
use App\Http\Controllers\Auth\RegistrationVerificationController;
use App\Http\Controllers\Auth\SetupPasswordController;
use App\Http\Controllers\Auth\SetupUsernameController;
use App\Http\Controllers\Auth\VerifyEmailController;
use Illuminate\Support\Facades\Route;
Route::middleware('guest')->group(function () {
Route::middleware(['guest', 'normalize.username'])->group(function () {
Route::get('register', [RegisteredUserController::class, 'create'])
->name('register');
Route::post('register', [RegisteredUserController::class, 'store']);
Route::get('register/notice', [RegisteredUserController::class, 'notice'])
->name('register.notice');
Route::post('register', [RegisteredUserController::class, 'store'])
->middleware('throttle:register');
Route::post('register/resend-verification', [RegisteredUserController::class, 'resendVerification'])
->middleware('throttle:register')
->name('register.resend');
Route::get('verify/{token}', RegistrationVerificationController::class)
->name('registration.verify');
Route::get('login', [AuthenticatedSessionController::class, 'create'])
->name('login');
@@ -36,6 +50,18 @@ Route::middleware('guest')->group(function () {
});
Route::middleware('auth')->group(function () {
Route::get('setup/password', [SetupPasswordController::class, 'create'])
->name('setup.password.create');
Route::post('setup/password', [SetupPasswordController::class, 'store'])
->name('setup.password.store');
Route::get('setup/username', [SetupUsernameController::class, 'create'])
->name('setup.username.create');
Route::post('setup/username', [SetupUsernameController::class, 'store'])
->name('setup.username.store');
Route::get('verify-email', EmailVerificationPromptController::class)
->name('verification.notice');

View File

@@ -9,7 +9,7 @@ use App\Http\Controllers\Dashboard\ArtworkController as DashboardArtworkControll
use App\Http\Controllers\Web\HomeController;
use App\Http\Controllers\Web\ArtController;
use App\Http\Controllers\Misc\AvatarController as LegacyAvatarController;
use App\Http\Controllers\Community\ForumController;
use App\Http\Controllers\Forum\ForumController;
use App\Http\Controllers\Community\NewsController;
use App\Http\Controllers\Web\CategoryController;
use App\Http\Controllers\Web\FeaturedArtworksController;
@@ -42,8 +42,39 @@ Route::match(['get','post'], '/art/{id}/comment', [ArtController::class, 'show']
Route::get('/avatar/{id}/{name?}', [LegacyAvatarController::class, 'show'])->where('id', '\\d+')->name('legacy.avatar');
Route::get('/forum', [ForumController::class, 'index'])->name('legacy.forum.index');
Route::get('/forum/{topic_id}/{slug?}', [ForumController::class, 'topic'])->where('topic_id', '\\d+')->name('legacy.forum.topic');
Route::middleware('ensure.onboarding.complete')->prefix('forum')->name('forum.')->group(function () {
Route::get('/', [ForumController::class, 'index'])->name('index');
Route::get('/thread/{thread}-{slug?}', [ForumController::class, 'showThread'])->name('thread.show');
Route::get('/{category:slug}', [ForumController::class, 'showCategory'])->name('category.show');
Route::middleware('auth')->group(function () {
Route::get('/{category:slug}/new', [ForumController::class, 'createThreadForm'])->name('thread.create');
Route::post('/{category:slug}/new', [ForumController::class, 'storeThread'])->name('thread.store');
Route::post('/thread/{thread}/reply', [ForumController::class, 'reply'])->name('thread.reply');
Route::post('/post/{post}/report', [ForumController::class, 'reportPost'])->name('post.report');
Route::get('/post/{post}/edit', [ForumController::class, 'editPostForm'])->name('post.edit');
Route::put('/post/{post}', [ForumController::class, 'updatePost'])->name('post.update');
});
Route::middleware(['auth', 'can:moderate-forum'])->group(function () {
Route::post('/thread/{thread}/lock', [ForumController::class, 'lockThread'])->name('thread.lock');
Route::post('/thread/{thread}/unlock', [ForumController::class, 'unlockThread'])->name('thread.unlock');
Route::post('/thread/{thread}/pin', [ForumController::class, 'pinThread'])->name('thread.pin');
Route::post('/thread/{thread}/unpin', [ForumController::class, 'unpinThread'])->name('thread.unpin');
});
});
Route::middleware('ensure.onboarding.complete')->get('/forum.php', function (\Illuminate\Http\Request $request) {
$threadId = (int) ($request->query('topic') ?? $request->query('tid') ?? 0);
if ($threadId < 1) {
return redirect()->route('forum.index', [], 301);
}
$thread = \App\Models\ForumThread::query()->find($threadId);
$slug = $thread?->slug ?: ('thread-' . $threadId);
return redirect()->route('forum.thread.show', ['thread' => $threadId, 'slug' => $slug], 301);
})->name('forum.legacy.redirect');
Route::get('/news/{id}/{slug?}', [NewsController::class, 'show'])->where('id', '\\d+')->name('legacy.news.show');
@@ -59,11 +90,21 @@ Route::post('/chat_post', [ChatController::class, 'post'])->name('legacy.chat.po
Route::get('/browse-categories', [BrowseCategoriesController::class, 'index'])->name('browse.categories');
Route::get('/profile/{id}/{username?}', [ProfileController::class, 'show'])
Route::get('/@{username}', [ProfileController::class, 'showByUsername'])
->where('username', '[A-Za-z0-9_-]{3,20}')
->name('profile.show');
Route::get('/user/{username}', [ProfileController::class, 'legacyByUsername'])
->where('username', '[A-Za-z0-9_-]{3,20}')
->name('legacy.user.profile');
Route::get('/profile/{id}/{username?}', [ProfileController::class, 'legacyById'])
->where('id', '\\d+')
->name('legacy.profile.id');
Route::get('/profile/{username?}', [ProfileController::class, 'show'])->name('legacy.profile');
Route::get('/profile/{username}', [ProfileController::class, 'legacyByUsername'])
->where('username', '[A-Za-z0-9_-]{3,20}')
->name('legacy.profile');
Route::get('/top-favourites', [TopFavouritesController::class, 'index'])->name('legacy.top_favourites');
Route::get('/top-authors', [TopAuthorsController::class, 'index'])->name('legacy.top_authors');
@@ -78,7 +119,7 @@ Route::middleware('auth')->get('/buddies', [\App\Http\Controllers\User\BuddiesCo
Route::get('/favourites/{id?}/{username?}', [FavouritesController::class, 'index'])->name('legacy.favourites');
Route::post('/favourites/{userId}/delete/{artworkId}', [FavouritesController::class, 'destroy'])->name('legacy.favourites.delete');
Route::get('/gallery/{id}/{username?}', [GalleryController::class, 'show'])->name('legacy.gallery');
Route::middleware('ensure.onboarding.complete')->get('/gallery/{id}/{username?}', [GalleryController::class, 'show'])->name('legacy.gallery');
Route::middleware('auth')->get('/recieved-comments', [ReceivedCommentsController::class, 'index'])->name('legacy.received_comments');
@@ -108,7 +149,7 @@ Route::middleware(['auth'])->prefix('dashboard')->name('dashboard.')->group(func
Route::delete('/artworks/{id}', [DashboardArtworkController::class, 'destroy'])->whereNumber('id')->name('artworks.destroy');
});
Route::middleware('auth')->group(function () {
Route::middleware(['auth', 'normalize.username', 'ensure.onboarding.complete'])->group(function () {
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
// Backwards-compatible settings path used by some layouts/links
Route::get('/settings', [ProfileController::class, 'edit'])->name('settings');
@@ -120,7 +161,7 @@ Route::middleware('auth')->group(function () {
Route::post('/avatar/upload', [AvatarController::class, 'upload'])->middleware('throttle:20,1')->name('avatar.upload');
});
Route::middleware(['auth'])->group(function () {
Route::middleware(['auth', 'ensure.onboarding.complete'])->group(function () {
Route::get('/upload', function () {
$contentTypes = ContentType::with(['rootCategories.children'])->get()->map(function ($ct) {
return [
@@ -227,5 +268,9 @@ Route::middleware(['auth'])->prefix('admin')->name('admin.')->group(function ()
return Inertia::render('Admin/UploadQueue');
})->middleware('admin.moderation')->name('uploads.moderation');
Route::get('usernames/moderation', function () {
return Inertia::render('Admin/UsernameQueue');
})->middleware('admin.moderation')->name('usernames.moderation');
Route::resource('artworks', \App\Http\Controllers\Admin\ArtworkController::class)->except(['show']);
});