f833d429fc
Backend altyapısı: - 4 yeni Appwrite tablosu: blog_posts, testimonials, seo_pages, seo_settings - Appwrite Storage bucket: kovak-yazilim-media (görsel yüklemeleri) - Appwrite Auth ile session cookie tabanlı koruma Admin paneli (/admin): - Login akışı (email/password) + protected layout - Dashboard: sayım kartları + hızlı aksiyonlar - Blog CRUD: markdown content, kapak görseli, draft/published, SEO alanları - Services CRUD: lucide ikon seçici - Projects CRUD: teknoloji etiketleri, live URL - Testimonials CRUD: puanlama - SEO yöneticisi: global ayarlar + sayfa bazlı override - Mesaj inbox: status filtreleme + güncelleme - Medya kütüphanesi: Appwrite Storage upload/delete Public: - /blog ve /blog/[slug] sayfaları (markdown render) - Anasayfaya Testimonials bölümü - Tüm public sayfalarda generateMetadata + seo_pages override - Header'a Blog linki Route yapısı: - app/(site)/ — public site, Header/Footer ortak - app/admin/login — auth dışı - app/admin/(protected)/ — requireUser() korumalı 23 route üretiliyor, public static, admin dynamic.
26 lines
669 B
TypeScript
26 lines
669 B
TypeScript
import "server-only";
|
|
import { cookies } from "next/headers";
|
|
import { redirect } from "next/navigation";
|
|
import { Account } from "node-appwrite";
|
|
import { sessionClient } from "@/lib/appwrite-server";
|
|
|
|
export const SESSION_COOKIE = "kovak_session";
|
|
|
|
export async function getCurrentUser() {
|
|
const store = await cookies();
|
|
const secret = store.get(SESSION_COOKIE)?.value;
|
|
if (!secret) return null;
|
|
try {
|
|
const account = new Account(sessionClient(secret));
|
|
return await account.get();
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export async function requireUser() {
|
|
const user = await getCurrentUser();
|
|
if (!user) redirect("/admin/login");
|
|
return user;
|
|
}
|