'use client'; import { useEffect, useState, useCallback } from 'react'; import { Shield, User, FileText, Settings, Compass, Clock, } from 'lucide-react'; import { fetchAuditLogs } from '@/lib/api'; import type { AuditLog } from '@/lib/types'; const actionIcons: Record = { create: FileText, update: Settings, delete: Shield, publish: Compass, reorder: Settings, }; const actionLabels: Record = { create: 'Создание', update: 'Изменение', delete: 'Удаление', publish: 'Публикация', reorder: 'Сортировка', }; const resourceLabels: Record = { user: 'Пользователь', post: 'Пост', settings: 'Настройки', discover_category: 'Категория Discover', discover_categories: 'Категории Discover', discover_source: 'Источник Discover', }; export default function AdminAuditPage() { const [logs, setLogs] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [actionFilter, setActionFilter] = useState(''); const [resourceFilter, setResourceFilter] = useState(''); const [loading, setLoading] = useState(true); const loadLogs = useCallback(async () => { setLoading(true); try { const data = await fetchAuditLogs( page, 50, actionFilter || undefined, resourceFilter || undefined ); setLogs(data.logs); setTotal(data.total); } catch (err) { console.error('Failed to load audit logs:', err); } finally { setLoading(false); } }, [page, actionFilter, resourceFilter]); useEffect(() => { loadLogs(); }, [loadLogs]); const totalPages = Math.ceil(total / 50); const formatDate = (dateStr: string) => { const date = new Date(dateStr); return date.toLocaleString('ru-RU', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', }); }; const getActionColor = (action: string) => { switch (action) { case 'create': return 'bg-green-500/10 text-green-400'; case 'update': return 'bg-blue-500/10 text-blue-400'; case 'delete': return 'bg-red-500/10 text-red-400'; case 'publish': return 'bg-purple-500/10 text-purple-400'; default: return 'bg-gray-500/10 text-gray-400'; } }; return (

Аудит

История действий администраторов

{loading ? (
) : logs.length === 0 ? (

Записей аудита нет

) : ( <>
{logs.map((log) => { const ActionIcon = actionIcons[log.action] || Shield; return (
{actionLabels[log.action] || log.action} {resourceLabels[log.resource] || log.resource} {log.resourceId && ( {log.resourceId.slice(0, 8)}... )}
{log.userEmail} {formatDate(log.createdAt)} {log.ipAddress && ( IP: {log.ipAddress} )}
); })}
{totalPages > 1 && (

Показано {logs.length} из {total}

{page} / {totalPages}
)} )}
); }