update
This commit is contained in:
@@ -12,6 +12,21 @@ Route::middleware(['web', 'auth'])->prefix('dashboard')->name('api.dashboard.')-
|
||||
Route::get('analytics', [DashboardController::class, 'analytics'])->name('analytics');
|
||||
Route::get('trending-artworks', [DashboardController::class, 'trendingArtworks'])->name('trending-artworks');
|
||||
Route::get('recommended-creators', [DashboardController::class, 'recommendedCreators'])->name('recommended-creators');
|
||||
Route::put('preferences/shortcuts', [\App\Http\Controllers\Dashboard\DashboardPreferenceController::class, 'updateShortcuts'])->name('preferences.shortcuts');
|
||||
});
|
||||
|
||||
Route::middleware(['web', 'auth'])
|
||||
->get('user/xp', \App\Http\Controllers\Api\UserXpController::class)
|
||||
->name('api.user.xp');
|
||||
|
||||
Route::middleware(['web', 'auth'])
|
||||
->get('user/achievements', \App\Http\Controllers\Api\UserAchievementsController::class)
|
||||
->name('api.user.achievements');
|
||||
|
||||
Route::middleware(['web', 'throttle:60,1'])->prefix('leaderboard')->name('api.leaderboard.')->group(function () {
|
||||
Route::get('creators', [\App\Http\Controllers\Api\LeaderboardController::class, 'creators'])->name('creators');
|
||||
Route::get('artworks', [\App\Http\Controllers\Api\LeaderboardController::class, 'artworks'])->name('artworks');
|
||||
Route::get('stories', [\App\Http\Controllers\Api\LeaderboardController::class, 'stories'])->name('stories');
|
||||
});
|
||||
|
||||
Route::middleware(['web', 'auth', 'creator.access'])->prefix('stories')->name('api.stories.')->group(function () {
|
||||
@@ -56,6 +71,14 @@ Route::middleware(['web', 'throttle:reactions-read'])
|
||||
->get('community/activity', [\App\Http\Controllers\Api\CommunityActivityController::class, 'index'])
|
||||
->name('api.community.activity');
|
||||
|
||||
Route::middleware(['web', 'throttle:social-read'])
|
||||
->get('activity', [\App\Http\Controllers\Api\SocialActivityController::class, 'index'])
|
||||
->name('api.activity');
|
||||
|
||||
Route::middleware(['web', 'throttle:social-read'])
|
||||
->get('comments', [\App\Http\Controllers\Api\SocialCompatibilityController::class, 'comments'])
|
||||
->name('api.social.comments.index');
|
||||
|
||||
// ── Ranking lists (public, throttled, Redis-cached) ─────────────────────────
|
||||
// GET /api/rank/global?type=trending|new_hot|best
|
||||
// GET /api/rank/category/{id}?type=trending|new_hot|best
|
||||
@@ -308,6 +331,22 @@ Route::middleware(['web'])
|
||||
});
|
||||
|
||||
Route::middleware(['web', 'auth', 'normalize.username'])->group(function () {
|
||||
Route::match(['post', 'delete'], 'like', [\App\Http\Controllers\Api\SocialCompatibilityController::class, 'like'])
|
||||
->name('api.social.like');
|
||||
|
||||
Route::post('comments', [\App\Http\Controllers\Api\SocialCompatibilityController::class, 'comments'])
|
||||
->name('api.social.comments.store');
|
||||
|
||||
Route::match(['post', 'delete'], 'bookmark', [\App\Http\Controllers\Api\SocialCompatibilityController::class, 'bookmark'])
|
||||
->name('api.social.bookmark');
|
||||
|
||||
Route::get('bookmarks', [\App\Http\Controllers\Api\SocialCompatibilityController::class, 'bookmarks'])
|
||||
->name('api.social.bookmarks');
|
||||
|
||||
Route::match(['post', 'delete'], 'artworks/{id}/bookmark', [\App\Http\Controllers\Api\ArtworkInteractionController::class, 'bookmark'])
|
||||
->whereNumber('id')
|
||||
->name('api.artworks.bookmark');
|
||||
|
||||
Route::post('artworks/{id}/favorite', [\App\Http\Controllers\Api\ArtworkInteractionController::class, 'favorite'])
|
||||
->whereNumber('id')
|
||||
->name('api.artworks.favorite');
|
||||
@@ -320,9 +359,13 @@ Route::middleware(['web', 'auth', 'normalize.username'])->group(function () {
|
||||
->whereNumber('id')
|
||||
->name('api.artworks.report');
|
||||
|
||||
Route::post('users/{id}/follow', [\App\Http\Controllers\Api\ArtworkInteractionController::class, 'follow'])
|
||||
Route::match(['post', 'delete'], 'users/{id}/follow', [\App\Http\Controllers\Api\ArtworkInteractionController::class, 'follow'])
|
||||
->whereNumber('id')
|
||||
->name('api.users.follow');
|
||||
|
||||
Route::match(['post', 'delete'], 'follow/{id}', [\App\Http\Controllers\Api\ArtworkInteractionController::class, 'follow'])
|
||||
->whereNumber('id')
|
||||
->name('api.follow.alias');
|
||||
});
|
||||
|
||||
// ── Share tracking (public, throttled) ────────────────────────────────────────
|
||||
@@ -615,6 +658,38 @@ Route::middleware(['web', 'auth'])
|
||||
Route::post('{id}/read', [\App\Http\Controllers\Api\NotificationController::class, 'markRead'])->name('mark-read');
|
||||
});
|
||||
|
||||
Route::middleware(['web', 'throttle:social-read'])
|
||||
->prefix('stories')
|
||||
->name('api.stories.comments.')
|
||||
->group(function () {
|
||||
Route::get('{id}/comments', [\App\Http\Controllers\Api\StoryCommentController::class, 'index'])
|
||||
->whereNumber('id')
|
||||
->name('index');
|
||||
});
|
||||
|
||||
Route::middleware(['web', 'auth'])
|
||||
->prefix('stories')
|
||||
->name('api.stories.social.')
|
||||
->group(function () {
|
||||
Route::post('{id}/like', [\App\Http\Controllers\Api\StoryInteractionController::class, 'like'])
|
||||
->whereNumber('id')
|
||||
->middleware(['throttle:social-write', 'forum.bot.protection:api_write'])
|
||||
->name('like');
|
||||
Route::post('{id}/bookmark', [\App\Http\Controllers\Api\StoryInteractionController::class, 'bookmark'])
|
||||
->whereNumber('id')
|
||||
->middleware(['throttle:social-write', 'forum.bot.protection:api_write'])
|
||||
->name('bookmark');
|
||||
Route::post('{id}/comments', [\App\Http\Controllers\Api\StoryCommentController::class, 'store'])
|
||||
->whereNumber('id')
|
||||
->middleware(['throttle:social-write', 'forum.bot.protection:api_write'])
|
||||
->name('comments.store');
|
||||
Route::delete('{id}/comments/{commentId}', [\App\Http\Controllers\Api\StoryCommentController::class, 'destroy'])
|
||||
->whereNumber('id')
|
||||
->whereNumber('commentId')
|
||||
->middleware('throttle:social-write')
|
||||
->name('comments.destroy');
|
||||
});
|
||||
|
||||
// ── Artwork search for share modal (public, throttled) ────────────────────────
|
||||
// GET /api/search/artworks?q=...&shareable=1 → reuses existing ArtworkSearchController
|
||||
|
||||
|
||||
@@ -12,31 +12,15 @@
|
||||
*/
|
||||
|
||||
use Illuminate\Support\Facades\Route;
|
||||
//use App\Http\Controllers\Web\ArtController;
|
||||
use App\Http\Controllers\Legacy\AvatarController;
|
||||
use App\Http\Controllers\Web\FeaturedArtworksController;
|
||||
use App\Http\Controllers\Web\DailyUploadsController;
|
||||
use App\Http\Controllers\Community\ChatController;
|
||||
use App\Http\Controllers\Community\LatestController;
|
||||
use App\Http\Controllers\User\TopFavouritesController;
|
||||
use App\Http\Controllers\Legacy\CategoryRedirectController;
|
||||
use App\Http\Controllers\User\FavouritesController;
|
||||
use App\Http\Controllers\User\TopAuthorsController;
|
||||
use App\Http\Controllers\User\TodayInHistoryController;
|
||||
use App\Http\Controllers\User\TodayDownloadsController;
|
||||
use App\Http\Controllers\User\MonthlyCommentatorsController;
|
||||
use App\Http\Controllers\User\MembersController;
|
||||
use App\Http\Controllers\User\StatisticsController;
|
||||
use App\Http\Controllers\User\ProfileController;
|
||||
use App\Http\Controllers\Web\BrowseGalleryController;
|
||||
use App\Http\Controllers\Web\GalleryController;
|
||||
use App\Http\Controllers\Web\RssFeedController;
|
||||
//use App\Http\Controllers\Dashboard\ManageController;
|
||||
use App\Http\Controllers\Legacy\ReceivedCommentsController;
|
||||
|
||||
// ── AVATARS ───────────────────────────────────────────────────────────────────
|
||||
Route::get('/avatar/{id}/{name?}', [AvatarController::class, 'show'])
|
||||
->where('id', '\d+')
|
||||
->name('legacy.avatar');
|
||||
Route::get('/avatar/{id}/{name?}', [AvatarController::class, 'show'])->where('id', '\d+')->name('legacy.avatar');
|
||||
|
||||
// ── ARTWORK (legacy comment URL) ──────────────────────────────────────────────
|
||||
//Route::match(['get','post'], '/art/{id}/comment', [ArtController::class, 'show'])->where('id', '\d+');
|
||||
@@ -45,41 +29,45 @@ Route::get('/avatar/{id}/{name?}', [AvatarController::class, 'show'])
|
||||
Route::redirect('/sections', '/categories', 301)->name('sections');
|
||||
Route::redirect('/browse-categories', '/categories', 301)->name('browse.categories');
|
||||
|
||||
// Legacy mixed-case category URL patterns:
|
||||
// /Skins/BrowserBob/210
|
||||
// /Skins/BrowserBob/sdsdsdsd/210
|
||||
Route::get('/{group}/{slug}/{id}', CategoryRedirectController::class)
|
||||
->where('group', '(?i:skins|wallpapers|photography|other|members)')
|
||||
->where('slug', '[^/]+(?:/[^/]+)*')
|
||||
->whereNumber('id')
|
||||
->name('legacy.category.short');
|
||||
|
||||
// Legacy category URL pattern: /category/group/slug/id
|
||||
Route::get('/category/{group}/{slug?}/{id?}', [BrowseGalleryController::class, 'legacyCategory'])
|
||||
->name('legacy.category');
|
||||
Route::get('/category/{group}/{slug?}/{id?}', CategoryRedirectController::class)->name('legacy.category');
|
||||
|
||||
// ── BROWSE / FEATURED / DAILY ─────────────────────────────────────────────────
|
||||
//Route::get('/browse', [BrowseGalleryController::class, 'browse'])->name('legacy.browse');
|
||||
Route::get('/browse', fn () => redirect('/explore', 301))->name('legacy.browse');
|
||||
Route::get('/featured', [FeaturedArtworksController::class, 'index'])->name('legacy.featured');
|
||||
Route::get('/featured-artworks',[FeaturedArtworksController::class, 'index'])->name('legacy.featured_artworks');
|
||||
Route::get('/daily-uploads', [DailyUploadsController::class, 'index'])->name('legacy.daily_uploads');
|
||||
Route::get('/featured-artworks', fn () => redirect('/featured', 301))->name('legacy.featured_artworks');
|
||||
Route::get('/daily-uploads', fn () => redirect()->route('uploads.daily', request()->query(), 301))->name('legacy.daily_uploads');
|
||||
|
||||
// ── CHAT ──────────────────────────────────────────────────────────────────────
|
||||
Route::get('/chat', fn () => redirect()->route('community.chat', [], 301))->name('legacy.chat');
|
||||
Route::post('/chat_post', [ChatController::class, 'post'])->name('legacy.chat.post');
|
||||
Route::match(['get', 'post'], '/chat', fn () => redirect('/messages', 301));
|
||||
Route::match(['get', 'post'], '/community/chat', fn () => redirect('/messages', 301))->name('community.chat');
|
||||
|
||||
// ── UPLOADS / COMMENTS / DOWNLOADS (SEO alias pages) ─────────────────────────
|
||||
Route::get('/uploads/latest', [LatestController::class, 'index'])->name('uploads.latest');
|
||||
Route::get('/uploads/daily', [DailyUploadsController::class, 'index'])->name('uploads.daily');
|
||||
Route::get('/members/photos', [MembersController::class, 'photos'])->name('members.photos');
|
||||
Route::get('/authors/top', [TopAuthorsController::class, 'index'])->name('authors.top');
|
||||
Route::get('/comments/latest', function () {
|
||||
return redirect()->route('community.activity', request()->query(), 301);
|
||||
})->name('comments.latest');
|
||||
Route::get('/comments/monthly', [MonthlyCommentatorsController::class, 'index'])->name('comments.monthly');
|
||||
Route::get('/downloads/today', [TodayDownloadsController::class, 'index'])->name('downloads.today');
|
||||
Route::get('/latest', fn () => redirect('/uploads/latest', 301))->name('legacy.latest');
|
||||
|
||||
Route::get('/latest', [LatestController::class, 'index'])->name('legacy.latest');
|
||||
Route::get('/latest-comments', function () {
|
||||
return redirect()->route('community.activity', request()->query(), 301);
|
||||
})->name('legacy.latest_comments');
|
||||
Route::get('/today-in-history', [TodayInHistoryController::class, 'index'])->name('legacy.today_in_history');
|
||||
Route::get('/today-downloads', [TodayDownloadsController::class, 'index'])->name('legacy.today_downloads');
|
||||
Route::get('/monthly-commentators', [MonthlyCommentatorsController::class, 'index'])->name('legacy.monthly_commentators');
|
||||
Route::get('/members', [MembersController::class, 'index'])->name('legacy.members');
|
||||
Route::get('/top-favourites', [TopFavouritesController::class, 'index'])->name('legacy.top_favourites');
|
||||
Route::get('/authors/top', fn () => redirect('/creators/top', 301))->name('authors.top');
|
||||
Route::get('/latest-artworks', fn () => redirect()->route('discover.fresh', request()->query(), 301))->name('legacy.latest_artworks');
|
||||
|
||||
Route::get('/latest-comments', fn () => redirect()->route('community.activity', request()->query(), 301))->name('legacy.latest_comments');
|
||||
Route::get('/comments/latest', fn () => redirect()->route('community.activity', request()->query(), 301))->name('comments.latest');
|
||||
|
||||
Route::get('/today-in-history', fn () => redirect()->route('discover.on-this-day', request()->query(), 301))->name('legacy.today_in_history');
|
||||
|
||||
Route::get('/today-downloads', fn () => redirect()->route('downloads.today', request()->query(), 301))->name('legacy.today_downloads');
|
||||
|
||||
Route::get('/monthly-commentators', fn () => redirect()->route('comments.monthly', request()->query(), 301))->name('legacy.monthly_commentators');
|
||||
|
||||
Route::get('/members', fn () => redirect()->route('creators.top', request()->query(), 301))->name('legacy.members');
|
||||
Route::get('/top-favourites', fn () => redirect()->route('discover.top-rated', request()->query(), 301))->name('legacy.top_favourites');
|
||||
|
||||
// ── REDIRECTS: top-authors, interviews, apply, bug-report ────────────────────
|
||||
Route::get('/top-authors', fn () => redirect('/creators/top', 301))->name('legacy.top_authors');
|
||||
@@ -88,12 +76,12 @@ Route::get('/apply', fn () => redirect('/contact', 301))->name('legacy.app
|
||||
Route::match(['get','post'], '/bug-report', fn () => redirect('/contact', 301))->name('bug-report.redirect');
|
||||
|
||||
// ── BUDDIES / MYBUDDIES ───────────────────────────────────────────────────────
|
||||
Route::middleware('auth')->get('/mybuddies.php', [\App\Http\Controllers\User\MyBuddiesController::class, 'index'])->name('legacy.mybuddies.php');
|
||||
Route::middleware('auth')->get('/mybuddies', [\App\Http\Controllers\User\MyBuddiesController::class, 'index'])->name('legacy.mybuddies');
|
||||
Route::middleware('auth')->delete('/mybuddies/{id}', [\App\Http\Controllers\User\MyBuddiesController::class, 'destroy'])->name('legacy.mybuddies.delete');
|
||||
Route::middleware('auth')->get('/mybuddies.php', fn () => redirect()->route('dashboard.following', [], 301))->name('legacy.mybuddies.php');
|
||||
Route::middleware('auth')->get('/mybuddies', fn () => redirect()->route('dashboard.following', [], 301))->name('legacy.mybuddies');
|
||||
Route::middleware('auth')->delete('/mybuddies/{id}', fn () => redirect()->route('dashboard.following'))->name('legacy.mybuddies.delete');
|
||||
|
||||
Route::middleware('auth')->get('/buddies.php', [\App\Http\Controllers\User\BuddiesController::class, 'index'])->name('legacy.buddies.php');
|
||||
Route::middleware('auth')->get('/buddies', [\App\Http\Controllers\User\BuddiesController::class, 'index'])->name('legacy.buddies');
|
||||
Route::middleware('auth')->get('/buddies.php', fn () => redirect()->route('dashboard.followers', [], 301))->name('legacy.buddies.php');
|
||||
Route::middleware('auth')->get('/buddies', fn () => redirect()->route('dashboard.followers', [], 301))->name('legacy.buddies');
|
||||
|
||||
// ── FAVOURITES / GALLERY ──────────────────────────────────────────────────────
|
||||
Route::get('/favourites/{id?}/{username?}', [FavouritesController::class, 'index'])->name('legacy.favourites');
|
||||
@@ -104,57 +92,17 @@ Route::middleware('ensure.onboarding.complete')
|
||||
->name('legacy.gallery'); // We need to fix to a new gallery
|
||||
|
||||
// ── PROFILE (legacy URL patterns) ────────────────────────────────────────────
|
||||
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, 'legacyByUsername'])
|
||||
->where('username', '[A-Za-z0-9_-]{3,20}')
|
||||
->name('legacy.profile');
|
||||
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, 'legacyByUsername'])->where('username', '[A-Za-z0-9_-]{3,20}')->name('legacy.profile');
|
||||
|
||||
// Keep legacy `/user` as a permanent redirect to the canonical dashboard path.
|
||||
Route::middleware(['auth'])->match(['get','post'], '/user', function () {
|
||||
return redirect()->route('dashboard.profile', [], 301);
|
||||
})->name('legacy.user.redirect');
|
||||
Route::middleware(['auth'])->match(['get','post'], '/user', function () {return redirect()->route('dashboard.profile', [], 301);})->name('legacy.user.redirect');
|
||||
|
||||
// ── COMMENTS / STATISTICS ─────────────────────────────────────────────────────
|
||||
Route::middleware('auth')->get('/recieved-comments', [ReceivedCommentsController::class, 'index'])->name('legacy.received_comments');
|
||||
Route::middleware('auth')->get('/recieved-comments', fn () => redirect()->route('dashboard.comments.received', request()->query(), 301))->name('legacy.received_comments');
|
||||
Route::middleware('auth')->get('/received-comments', fn () => redirect()->route('dashboard.comments.received', request()->query(), 301))->name('legacy.received_comments.corrected');
|
||||
|
||||
Route::middleware(['auth'])->group(function () {
|
||||
Route::get('/statistics', [StatisticsController::class, 'index'])->name('legacy.statistics');
|
||||
});
|
||||
|
||||
// ── MANAGE (old artwork management pages) ─────────────────────────────────────
|
||||
/*
|
||||
Route::middleware(['auth'])->group(function () {
|
||||
Route::get('/manage', [ManageController::class, 'index'])->name('manage');
|
||||
Route::get('/manage/edit/{id}', [ManageController::class, 'edit'])->name('manage.edit');
|
||||
Route::post('/manage/update/{id}', [ManageController::class, 'update'])->name('manage.update');
|
||||
Route::post('/manage/delete/{id}', [ManageController::class, 'destroy'])->name('manage.destroy');
|
||||
});
|
||||
*/
|
||||
|
||||
// ── LEGACY FORUM REDIRECT (/forum.php?topic=X) ───────────────────────────────
|
||||
/*
|
||||
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');
|
||||
*/
|
||||
// ── LEGACY RSS (.xml feeds — old site compatibility) ──────────────────────────
|
||||
Route::get('/rss/latest-uploads.xml', [RssFeedController::class, 'latestUploads'])->name('rss.uploads');
|
||||
Route::get('/rss/latest-skins.xml', [RssFeedController::class, 'latestSkins'])->name('rss.skins');
|
||||
Route::get('/rss/latest-wallpapers.xml', [RssFeedController::class, 'latestWallpapers'])->name('rss.wallpapers');
|
||||
Route::get('/rss/latest-photos.xml', [RssFeedController::class, 'latestPhotos'])->name('rss.photos');
|
||||
|
||||
@@ -8,6 +8,8 @@ use App\Http\Controllers\Dashboard\ArtworkController as DashboardArtworkControll
|
||||
use App\Http\Controllers\Web\ArtworkPageController;
|
||||
use App\Http\Controllers\ArtworkDownloadController;
|
||||
use App\Http\Controllers\Web\BrowseGalleryController;
|
||||
use App\Http\Controllers\Web\FeaturedArtworksController;
|
||||
use App\Http\Controllers\Web\DailyUploadsController;
|
||||
use App\Http\Controllers\Web\DiscoverController;
|
||||
use App\Http\Controllers\Web\ExploreController;
|
||||
use App\Http\Controllers\Web\BlogController;
|
||||
@@ -27,15 +29,26 @@ use App\Http\Controllers\RSS\ExploreFeedController;
|
||||
use App\Http\Controllers\RSS\TagFeedController;
|
||||
use App\Http\Controllers\RSS\CreatorFeedController;
|
||||
use App\Http\Controllers\RSS\BlogFeedController;
|
||||
use App\Http\Controllers\Web\StaffApplicationAdminController;
|
||||
use App\Http\Controllers\Studio\StudioController;
|
||||
use App\Http\Controllers\DashboardController;
|
||||
use App\Http\Controllers\Community\LatestController;
|
||||
use App\Http\Controllers\User\MembersController;
|
||||
use App\Http\Controllers\User\TodayDownloadsController;
|
||||
use App\Http\Controllers\User\MonthlyCommentatorsController;
|
||||
use App\Models\Artwork;
|
||||
use Inertia\Inertia;
|
||||
|
||||
Route::get('/', [HomeController::class, 'index'])->name('index');
|
||||
Route::get('/home', [HomeController::class, 'index']);
|
||||
|
||||
// ── PUBLIC GALLERIES / LISTS ─────────────────────────────────────────────────
|
||||
Route::get('/featured', [FeaturedArtworksController::class, 'index'])->name('featured');
|
||||
Route::get('/uploads/latest', [LatestController::class, 'index'])->name('uploads.latest');
|
||||
Route::get('/uploads/daily', [DailyUploadsController::class, 'index'])->name('uploads.daily');
|
||||
Route::get('/members/photos', [MembersController::class, 'photos'])->name('members.photos');
|
||||
Route::get('/downloads/today', [TodayDownloadsController::class, 'index'])->name('downloads.today');
|
||||
Route::get('/comments/monthly', [MonthlyCommentatorsController::class, 'index'])->name('comments.monthly');
|
||||
|
||||
// ── DISCOVER (/discover/*) ────────────────────────────────────────────────────
|
||||
Route::prefix('discover')->name('discover.')->group(function () {
|
||||
Route::get('/', fn () => redirect('/discover/trending', 301));
|
||||
@@ -54,8 +67,8 @@ Route::prefix('discover')->name('discover.')->group(function () {
|
||||
// ── EXPLORE (/explore/*) ──────────────────────────────────────────────────────
|
||||
Route::prefix('explore')->name('explore.')->group(function () {
|
||||
Route::get('/', [ExploreController::class, 'index'])->name('index');
|
||||
Route::get('/members', fn () => redirect('/members', 301))->name('members.redirect');
|
||||
Route::get('/memebers', fn () => redirect('/members', 301))->name('memebers.redirect');
|
||||
Route::get('/members', fn () => redirect()->route('creators.top', request()->query(), 301))->name('members.redirect');
|
||||
Route::get('/memebers', fn () => redirect()->route('creators.top', request()->query(), 301))->name('memebers.redirect');
|
||||
Route::get('/{type}', [ExploreController::class, 'byType'])
|
||||
->where('type', 'artworks|wallpapers|skins|photography|other')
|
||||
->name('type');
|
||||
@@ -95,11 +108,13 @@ Route::get('/staff', [StaffController::class, 'index'])->name('st
|
||||
Route::get('/contact', [ApplicationController::class, 'show'])->name('contact.show');
|
||||
Route::post('/contact', [ApplicationController::class, 'submit'])->middleware('throttle:6,1')->name('contact.submit');
|
||||
|
||||
// ── ADMIN: Staff applications ─────────────────────────────────────────────────
|
||||
Route::middleware(['auth'])->prefix('admin')->name('admin.')->group(function () {
|
||||
Route::get('/applications', [StaffApplicationAdminController::class, 'index'])->name('applications.index');
|
||||
Route::get('/applications/{staffApplication}', [StaffApplicationAdminController::class, 'show'])->name('applications.show');
|
||||
});
|
||||
$cpPrefix = trim((string) config('cpad.webroot', config('cp.webroot', 'cp')), '/');
|
||||
|
||||
// ── LEGACY RSS (.xml feeds — old site compatibility) ──────────────────────────
|
||||
Route::get('/rss/latest-uploads.xml', [RssFeedController::class, 'latestUploads'])->name('rss.uploads');
|
||||
Route::get('/rss/latest-skins.xml', [RssFeedController::class, 'latestSkins'])->name('rss.skins');
|
||||
Route::get('/rss/latest-wallpapers.xml', [RssFeedController::class, 'latestWallpapers'])->name('rss.wallpapers');
|
||||
Route::get('/rss/latest-photos.xml', [RssFeedController::class, 'latestPhotos'])->name('rss.photos');
|
||||
|
||||
// ── RSS 2.0 feeds (/rss/*) ────────────────────────────────────────────────────
|
||||
Route::middleware('throttle:60,1')->group(function () {
|
||||
@@ -139,6 +154,9 @@ Route::prefix('creators')->name('creators.')->group(function () {
|
||||
Route::get('/rising', [DiscoverController::class, 'risingCreators'])->name('rising');
|
||||
});
|
||||
|
||||
Route::get('/leaderboard', \App\Http\Controllers\Web\LeaderboardPageController::class)
|
||||
->name('leaderboard');
|
||||
|
||||
// ── STORIES (/stories/*) ──────────────────────────────────────────────────────
|
||||
Route::prefix('stories')->name('stories.')->group(function () {
|
||||
Route::get('/', [StoryController::class, 'index'])->name('index');
|
||||
@@ -214,6 +232,10 @@ Route::prefix('news')->name('news.')->group(function () {
|
||||
Route::get('/rss/news', [NewsRssController::class, 'feed'])->name('news.rss');
|
||||
|
||||
// ── PROFILES (@username) ──────────────────────────────────────────────────────
|
||||
Route::get('/@{username}/gallery', [ProfileController::class, 'showGalleryByUsername'])
|
||||
->where('username', '[A-Za-z0-9_-]{3,20}')
|
||||
->name('profile.gallery');
|
||||
|
||||
Route::get('/@{username}', [ProfileController::class, 'showByUsername'])
|
||||
->where('username', '[A-Za-z0-9_-]{3,20}')
|
||||
->name('profile.show');
|
||||
@@ -247,7 +269,9 @@ Route::middleware(['auth', \App\Http\Middleware\NoIndexDashboard::class])->prefi
|
||||
|
||||
Route::get('/followers', [\App\Http\Controllers\Dashboard\FollowerController::class, 'index'])->name('followers');
|
||||
Route::get('/following', [\App\Http\Controllers\Dashboard\FollowingController::class, 'index'])->name('following');
|
||||
Route::get('/comments', [\App\Http\Controllers\Dashboard\CommentController::class, 'index'])->name('comments');
|
||||
Route::get('/comments', fn () => redirect()->route('dashboard.comments.received', request()->query(), 302))->name('comments');
|
||||
Route::get('/comments/received', [\App\Http\Controllers\Dashboard\CommentController::class, 'received'])->name('comments.received');
|
||||
Route::get('/notifications', [\App\Http\Controllers\Dashboard\NotificationController::class, 'index'])->name('notifications');
|
||||
Route::get('/gallery', [\App\Http\Controllers\Dashboard\DashboardGalleryController::class, 'index'])->name('gallery');
|
||||
Route::get('/awards', [\App\Http\Controllers\Dashboard\DashboardAwardsController::class, 'index'])->name('awards');
|
||||
});
|
||||
@@ -270,8 +294,8 @@ Route::middleware(['auth', 'ensure.onboarding.complete'])->prefix('studio')->nam
|
||||
// ── SETTINGS / PROFILE EDIT ───────────────────────────────────────────────────
|
||||
Route::middleware(['auth', 'normalize.username', 'ensure.onboarding.complete'])->group(function () {
|
||||
Route::get('/profile', fn () => redirect()->route('dashboard.profile', [], 301))->name('legacy.profile.redirect');
|
||||
Route::get('/settings', [ProfileController::class, 'edit'])->name('settings');
|
||||
Route::get('/profile/edit', [ProfileController::class, 'edit'])->name('profile.edit');
|
||||
Route::get('/settings', fn () => redirect()->route('dashboard.profile', [], 302))->name('settings');
|
||||
Route::get('/profile/edit', fn () => redirect()->route('dashboard.profile', [], 302))->name('profile.edit');
|
||||
Route::match(['post','put','patch'], '/profile', [ProfileController::class, 'update'])->name('profile.update');
|
||||
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
|
||||
Route::match(['post', 'put'], '/profile/password', [ProfileController::class, 'password'])->name('profile.password');
|
||||
@@ -365,48 +389,6 @@ Route::get('/search', [\App\Http\Controllers\Web\SearchController::class, 'index
|
||||
Route::view('/data-deletion', 'privacy.data-deletion')->name('privacy.data_deletion');
|
||||
Route::view('/blank', 'blank')->name('blank');
|
||||
|
||||
// ── ADMIN ─────────────────────────────────────────────────────────────────────
|
||||
Route::middleware(['auth'])->prefix('admin')->name('admin.')->group(function () {
|
||||
Route::get('uploads/moderation', fn () => Inertia::render('Admin/UploadQueue'))
|
||||
->middleware('admin.moderation')
|
||||
->name('uploads.moderation');
|
||||
|
||||
Route::get('usernames/moderation', fn () => Inertia::render('Admin/UsernameQueue'))
|
||||
->middleware('admin.moderation')
|
||||
->name('usernames.moderation');
|
||||
|
||||
Route::resource('artworks', \App\Http\Controllers\Admin\ArtworkController::class)->except(['show']);
|
||||
|
||||
Route::get('reports', fn () => view('admin.reports.queue'))
|
||||
->middleware('admin.moderation')
|
||||
->name('reports.queue');
|
||||
|
||||
Route::get('reports/tags', [\App\Http\Controllers\Admin\TagInteractionReportController::class, 'index'])
|
||||
->middleware('admin.moderation')
|
||||
->name('reports.tags');
|
||||
|
||||
Route::middleware('admin.moderation')->prefix('early-growth')->name('early-growth.')->group(function () {
|
||||
Route::get('/', [\App\Http\Controllers\Admin\EarlyGrowthAdminController::class, 'index'])->name('index');
|
||||
Route::delete('/cache', [\App\Http\Controllers\Admin\EarlyGrowthAdminController::class, 'flushCache'])->name('cache.flush');
|
||||
Route::get('/status', [\App\Http\Controllers\Admin\EarlyGrowthAdminController::class, 'status'])->name('status');
|
||||
});
|
||||
|
||||
Route::middleware('admin.moderation')->prefix('stories')->name('stories.')->group(function () {
|
||||
Route::get('/review', [\App\Http\Controllers\Admin\StoryAdminController::class, 'review'])->name('review');
|
||||
Route::get('/', [\App\Http\Controllers\Admin\StoryAdminController::class, 'index'])->name('index');
|
||||
Route::get('/create', [\App\Http\Controllers\Admin\StoryAdminController::class, 'create'])->name('create');
|
||||
Route::post('/', [\App\Http\Controllers\Admin\StoryAdminController::class, 'store'])->name('store');
|
||||
Route::get('/{story}', [\App\Http\Controllers\Admin\StoryAdminController::class, 'show'])->name('show');
|
||||
Route::post('/{story}/approve', [\App\Http\Controllers\Admin\StoryAdminController::class, 'approve'])->name('approve');
|
||||
Route::post('/{story}/reject', [\App\Http\Controllers\Admin\StoryAdminController::class, 'reject'])->name('reject');
|
||||
Route::get('/{story}/edit', [\App\Http\Controllers\Admin\StoryAdminController::class, 'edit'])->name('edit');
|
||||
Route::put('/{story}', [\App\Http\Controllers\Admin\StoryAdminController::class, 'update'])->name('update');
|
||||
Route::delete('/{story}', [\App\Http\Controllers\Admin\StoryAdminController::class, 'destroy'])->name('destroy');
|
||||
Route::post('/{story}/publish', [\App\Http\Controllers\Admin\StoryAdminController::class, 'publish'])->name('publish');
|
||||
Route::get('/moderation/comments', [\App\Http\Controllers\Admin\StoryAdminController::class, 'moderateComments'])->name('comments.moderation');
|
||||
});
|
||||
});
|
||||
|
||||
// ── MESSAGES ──────────────────────────────────────────────────────────────────
|
||||
Route::middleware(['auth', 'ensure.onboarding.complete'])
|
||||
->get('/messages/attachments/{id}', [\App\Http\Controllers\Api\Messaging\AttachmentController::class, 'show'])
|
||||
@@ -419,8 +401,6 @@ Route::middleware(['auth', 'ensure.onboarding.complete'])->prefix('messages')->n
|
||||
});
|
||||
|
||||
// ── COMMUNITY ACTIVITY ────────────────────────────────────────────────────────
|
||||
Route::match(['get', 'post'], '/community/chat', [\App\Http\Controllers\Community\ChatController::class, 'index'])
|
||||
->name('community.chat');
|
||||
|
||||
Route::get('/community/activity', [\App\Http\Controllers\Web\CommunityActivityController::class, 'index'])
|
||||
->name('community.activity');
|
||||
|
||||
Reference in New Issue
Block a user