Feat: Add Audit Logs page

This commit is contained in:
2025-12-03 22:33:16 +03:00
parent 9538107a13
commit 8e3cb406af
2 changed files with 120 additions and 1 deletions

View File

@@ -0,0 +1,106 @@
import { createClient } from "@/lib/supabase/server"
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from "@/components/ui/table"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { Badge } from "@/components/ui/badge"
import { format } from "date-fns"
import { tr } from "date-fns/locale"
export default async function AuditLogsPage() {
const supabase = await createClient()
const { data: logs } = await supabase
.from('audit_logs')
.select(`
*,
profiles:user_id (full_name, role)
`)
.order('created_at', { ascending: false })
.limit(50)
const getActionBadge = (action: string) => {
if (action.includes('create')) return <Badge variant="default">Oluşturma</Badge>
if (action.includes('update')) return <Badge variant="secondary">Güncelleme</Badge>
if (action.includes('delete')) return <Badge variant="destructive">Silme</Badge>
if (action.includes('payment')) return <Badge className="bg-green-600">Ödeme</Badge>
return <Badge variant="outline">{action}</Badge>
}
const formatActionText = (action: string, entityType: string) => {
switch (action) {
case 'create_reservation': return 'Yeni rezervasyon oluşturdu'
case 'update_reservation_status': return 'Rezervasyon durumunu güncelledi'
case 'add_payment': return 'Ödeme ekledi'
default: return `${entityType} üzerinde ${action} işlemi`
}
}
return (
<div className="space-y-6">
<div>
<h2 className="text-3xl font-bold tracking-tight">İşlem Geçmişi</h2>
<p className="text-muted-foreground">Sistem üzerindeki son aktiviteler.</p>
</div>
<Card>
<CardHeader>
<CardTitle>Son İşlemler</CardTitle>
</CardHeader>
<CardContent>
<Table>
<TableHeader>
<TableRow>
<TableHead>Kullanıcı</TableHead>
<TableHead>İşlem</TableHead>
<TableHead>Detay</TableHead>
<TableHead>Tarih</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{logs?.length === 0 ? (
<TableRow>
<TableCell colSpan={4} className="text-center h-24 text-muted-foreground">
Kayıt bulunamadı.
</TableCell>
</TableRow>
) : (
logs?.map((log) => (
<TableRow key={log.id}>
<TableCell className="font-medium">
<div className="flex items-center gap-2">
<div className="h-6 w-6 rounded-full bg-primary/10 flex items-center justify-center text-primary font-bold text-xs">
{log.profiles?.full_name?.substring(0, 2).toUpperCase() || 'US'}
</div>
{log.profiles?.full_name || 'Bilinmeyen Kullanıcı'}
</div>
</TableCell>
<TableCell>
<div className="flex items-center gap-2">
{getActionBadge(log.action)}
<span className="text-sm text-muted-foreground">
{formatActionText(log.action, log.entity_type)}
</span>
</div>
</TableCell>
<TableCell className="max-w-xs truncate text-muted-foreground text-xs font-mono">
{JSON.stringify(log.details)}
</TableCell>
<TableCell className="text-muted-foreground text-sm">
{format(new Date(log.created_at), 'd MMM yyyy HH:mm', { locale: tr })}
</TableCell>
</TableRow>
))
)}
</TableBody>
</Table>
</CardContent>
</Card>
</div>
)
}

View File

@@ -1,7 +1,7 @@
import Link from "next/link"
import { Button } from "@/components/ui/button"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
import { Utensils, Users } from "lucide-react"
import { Utensils, Users, Activity } from "lucide-react"
export default function SettingsPage() {
return (
@@ -33,6 +33,19 @@ export default function SettingsPage() {
</CardHeader>
</Card>
</Link>
<Link href="/dashboard/settings/logs">
<Card className="hover:bg-muted/50 transition-colors cursor-pointer">
<CardHeader>
<CardTitle className="flex items-center gap-2">
<Activity className="h-5 w-5" /> İşlem Geçmişi
</CardTitle>
<CardDescription>
Sistem üzerindeki tüm aktiviteleri görüntüleyin.
</CardDescription>
</CardHeader>
</Card>
</Link>
</div>
</div>
)