wip: article AI polish, category SEO fields, cover generator, membership plan seeder
CI / PHPUnit (PHP 8.3) (push) Failing after 4s
CI / PHPUnit (PHP 8.2) (push) Failing after 1m9s
CI / Deploy (manual gate) (push) Skipped

This commit is contained in:
2026-09-07 18:48:37 +00:00
parent 263b98b218
commit 3cec4c5e18
121 changed files with 4701 additions and 313 deletions
+37 -6
View File
@@ -14,12 +14,13 @@ use App\Models\Link;
use App\Models\Tag;
use App\Settings\BlogSettings;
use App\Settings\GeneralSettings;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class BlogController extends Controller
{
public function index(Request $request, GeneralSettings $settings, SeoPresenter $seo): View|\Illuminate\Http\RedirectResponse
public function index(Request $request, GeneralSettings $settings, SeoPresenter $seo): View|RedirectResponse
{
// /index.php is often rewritten to / by PHP built-in server / nginx try_files.
$action = $request->query('action');
@@ -70,6 +71,19 @@ class BlogController extends Controller
$articles = $query->paginate($perPage)->withQueryString();
if ($cid) {
$category = Category::query()->find($cid);
if ($category !== null) {
return view('theme::category', [
'category' => $category,
'articles' => $articles,
'categories' => Category::query()->orderBy('display_order')->get(),
'settings' => $settings,
'seo' => $seo->forCategory($category),
]);
}
}
return view('theme::home', [
'articles' => $articles,
'categories' => Category::query()->orderBy('display_order')->get(),
@@ -78,7 +92,7 @@ class BlogController extends Controller
]);
}
public function bySlug(string $slug, GeneralSettings $settings, SeoPresenter $seo): View|\Illuminate\Http\RedirectResponse
public function bySlug(string $slug, GeneralSettings $settings, SeoPresenter $seo): View|RedirectResponse
{
$article = Article::query()
->visible()
@@ -89,7 +103,7 @@ class BlogController extends Controller
return redirect('/show-'.$article->id.'.shtml', 301);
}
public function show(Request $request, int $id, GeneralSettings $settings, SeoPresenter $seo, ArticleAccess $access): View|\Illuminate\Http\RedirectResponse
public function show(Request $request, int $id, GeneralSettings $settings, SeoPresenter $seo, ArticleAccess $access): View|RedirectResponse
{
$article = Article::query()
->with(['category', 'user', 'tags', 'comments' => fn ($q) => $q->visible()->orderBy('published_at')])
@@ -151,11 +165,28 @@ class BlogController extends Controller
return $this->index($request, app(GeneralSettings::class), app(SeoPresenter::class));
}
public function category(Request $request, int $cid): View
public function category(Request $request, int $cid, GeneralSettings $settings, SeoPresenter $seo): View
{
$request->merge(['cid' => $cid]);
$category = Category::query()->findOrFail($cid);
$perPage = max(1, (int) app(BlogSettings::class)->posts_per_page);
return $this->index($request, app(GeneralSettings::class), app(SeoPresenter::class));
$articles = Article::query()
->with(['category', 'user', 'tags'])
->visible()
->published()
->where('category_id', $category->id)
->orderByDesc('stick')
->orderByDesc('published_at')
->paginate($perPage)
->withQueryString();
return view('theme::category', [
'category' => $category,
'articles' => $articles,
'categories' => Category::query()->orderBy('display_order')->get(),
'settings' => $settings,
'seo' => $seo->forCategory($category),
]);
}
public function tagsList(): View