feat: complete i18n support, telegram webhook, and security improvements

This commit is contained in:
AyrisAI
2026-05-14 13:46:17 +03:00
parent 4c9a07e3ef
commit cc65a2bd72
23 changed files with 798 additions and 205 deletions

View File

@@ -2,11 +2,20 @@ import { auth } from "@/auth";
import { getDomains } from "@/lib/mailcow";
import { canAccessDomain } from "@/lib/users";
import { formatBytes } from "@/lib/format";
import { getDictionary, Locale } from "@/app/dictionaries";
export default async function DashboardPage(
props: {
params: Promise<{ lang: string }>;
}
) {
const params = await props.params;
export default async function DashboardPage() {
const session = await auth();
const role = session?.user?.role;
const userDomains = session?.user?.domains ?? [];
const lang = params.lang as Locale;
const dict = await getDictionary(lang);
const allDomains = await getDomains();
const visibleDomains = allDomains.filter((d) => canAccessDomain(userDomains, d.domain_name));
@@ -18,36 +27,36 @@ export default async function DashboardPage() {
<>
<div className="page-header">
<div>
<h1 className="page-title">Dashboard</h1>
<p className="page-subtitle">Hoş geldiniz, {session?.user?.name} 👋</p>
<h1 className="page-title">{dict.dashboard.title || "Dashboard"}</h1>
<p className="page-subtitle">{dict.dashboard.welcome || "Hoş geldiniz"}, {session?.user?.name} 👋</p>
</div>
</div>
<div className="page-body">
<div className="stats-grid">
<StatCard
label="Toplam Domain"
label={dict.dashboard.totalDomains || "Toplam Domain"}
value={visibleDomains.length}
color="var(--accent)"
icon={<GlobeIcon />}
/>
<StatCard
label="Mail Kutuları"
label={dict.dashboard.mailboxes || "Mail Kutuları"}
value={totalMailboxes}
color="var(--success)"
icon={<MailIcon />}
/>
<StatCard
label="Alias"
label={dict.dashboard.aliases || "Alias"}
value={totalAliases}
color="var(--warning)"
icon={<AtIcon />}
/>
{role === "SUPER_ADMIN" && (
<StatCard
label="Tanımlı Kullanıcı"
label={dict.dashboard.users || "Tanımlı Kullanıcı"}
value={"—"}
sub="Kullanıcılar .env'den yönetilir"
sub={dict.dashboard.usersSub || "Kullanıcılar .env'den yönetilir"}
color="var(--text-muted)"
icon={<UsersIcon />}
/>
@@ -59,17 +68,17 @@ export default async function DashboardPage() {
<div className="card" style={{ padding: 0, overflow: "hidden" }}>
<div style={{ padding: "16px 20px", borderBottom: "1px solid var(--border)" }}>
<h2 style={{ fontSize: 14, fontWeight: 700, color: "var(--text-primary)" }}>
Domain Durumu
{dict.dashboard.domainStatus || "Domain Durumu"}
</h2>
</div>
<div className="table-wrap" style={{ border: "none", borderRadius: 0 }}>
<table>
<thead>
<tr>
<th>Domain</th>
<th>Mail Kutuları</th>
<th>Kota Kullanımı</th>
<th>Durum</th>
<th>{dict.dashboard.domain || "Domain"}</th>
<th>{dict.dashboard.mailboxes || "Mail Kutuları"}</th>
<th>{dict.dashboard.quotaUsage || "Kota Kullanımı"}</th>
<th>{dict.dashboard.status || "Durum"}</th>
</tr>
</thead>
<tbody>
@@ -104,7 +113,7 @@ export default async function DashboardPage() {
</td>
<td>
<span className={`badge ${String(d.active) === "1" ? "badge-green" : "badge-red"}`}>
{String(d.active) === "1" ? "● Aktif" : "● Pasif"}
{String(d.active) === "1" ? `${dict.dashboard.active || "Aktif"}` : `${dict.dashboard.inactive || "Pasif"}`}
</span>
</td>
</tr>
@@ -119,31 +128,31 @@ export default async function DashboardPage() {
{/* Quick actions */}
<div className="card">
<h2 style={{ fontSize: 14, fontWeight: 700, marginBottom: 16, color: "var(--text-primary)" }}>
Hızlı İşlemler
{dict.dashboard.quickActions || "Hızlı İşlemler"}
</h2>
<div style={{ display: "flex", flexDirection: "column", gap: 10 }}>
{role === "SUPER_ADMIN" && (
<QuickItem
href="/dashboard/domains"
href={`/${lang}/dashboard/domains`}
icon={<GlobeIcon />}
title="Domain Yönetimi"
desc="Domain ekle, sil, yönet"
title={dict.dashboard.manageDomains || "Domain Yönetimi"}
desc={dict.dashboard.manageDomainsDesc || "Domain ekle, sil, yönet"}
color="var(--accent)"
/>
)}
<QuickItem
href="/dashboard/mailboxes"
href={`/${lang}/dashboard/mailboxes`}
icon={<MailIcon />}
title="Mail Hesapları"
desc="Yeni hesap oluştur, şifre değiştir, sil"
title={dict.dashboard.manageMailboxes || "Mail Hesapları"}
desc={dict.dashboard.manageMailboxesDesc || "Yeni hesap oluştur, şifre değiştir, sil"}
color="var(--success)"
/>
{role === "SUPER_ADMIN" && (
<QuickItem
href="/dashboard/users"
href={`/${lang}/dashboard/users`}
icon={<UsersIcon />}
title="Kullanıcılar"
desc=".env'den tanımlı panel kullanıcılarını görüntüle"
title={dict.dashboard.manageUsers || "Kullanıcılar"}
desc={dict.dashboard.manageUsersDesc || ".env'den tanımlı panel kullanıcılarını görüntüle"}
color="var(--warning)"
/>
)}