import React, { useState } from "react"; import { Shield, Refresh, InfoCircle, TickCircle, CloseCircle } from "iconsax-react"; import Button from "../../components/Button"; import Pagination from "../../components/Pagination"; import TitleLine from "../../components/TitleLine"; import PageLoading from "../../components/PageLoading"; import FilterPanel from "./components/FilterPanel"; import AccessLogsTable from "./components/AccessLogsTable"; import LogDetailsModal from "./components/LogDetailsModal"; import { useErrorLogs, useAccessLogDetail } from "./hooks/useAccessLogs"; import { AccessLog } from "./types/AccessLogTypes"; const PermissionLogs: React.FC = () => { const { errorLogs, loading, error, total, filters, updateFilters, refetch, } = useErrorLogs(); const { log: selectedLog, fetchLog, clearLog } = useAccessLogDetail(); const [isDetailsModalOpen, setIsDetailsModalOpen] = useState(false); const handleViewDetails = async (log: AccessLog) => { await fetchLog(log.id); setIsDetailsModalOpen(true); }; const handleCloseDetailsModal = () => { setIsDetailsModalOpen(false); clearLog(); }; const handleSort = (field: string, order: "ASC" | "DESC") => { updateFilters({ sortBy: field, sortOrder: order }); }; const handlePageChange = (page: number) => { updateFilters({ page }); }; const resetFilters = () => { updateFilters({ page: 1, limit: 20, sortBy: "createdAt", sortOrder: "DESC", operationType: undefined, userType: undefined, entityName: "", entityId: "", userId: "", ipAddress: "", endpoint: "", httpMethod: undefined, statusCode: undefined, startDate: "", endDate: "", search: "", minExecutionTime: undefined, maxExecutionTime: undefined, }); }; // Filter permission-related logs (assuming they have specific operation types or endpoints) const permissionLogs = (errorLogs || []).filter((log: AccessLog) => { return log.operationType?.includes('permission') || log.endpoint?.includes('permission') || log.entityName?.includes('role') || log.entityName?.includes('permission'); }); // Count permission actions const permissionStats = permissionLogs.reduce((acc: Record, log: AccessLog) => { const action = log.operationType || 'unknown'; acc[action] = (acc[action] || 0) + 1; return acc; }, {} as Record); // Count recent permission changes (last 24 hours) const recentPermissions = permissionLogs.filter((log: AccessLog) => { const logDate = new Date(log.createdAt); const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000); return logDate > oneDayAgo; }).length; if (error) { return (

{error}

); } return (
{/* Header */}

مشاهده و تحلیل تغییرات مجوزها و نقش‌های کاربری

{/* Permission Stats */}

کل تغییرات مجوز

{permissionLogs.length.toLocaleString('fa-IR')}

مجوزهای اعطا شده

{(permissionStats['grant'] || 0).toLocaleString('fa-IR')}

مجوزهای لغو شده

{(permissionStats['revoke'] || 0).toLocaleString('fa-IR')}

24 ساعت گذشته

{recentPermissions.toLocaleString('fa-IR')}

{/* Security Alert */} {recentPermissions > 5 && (

تغییرات زیاد مجوز

{recentPermissions} تغییر مجوز در 24 ساعت گذشته رخ داده است. لطفاً این تغییرات را بررسی کنید.

)} {/* Filter Panel */} {/* Loading State */} {loading && } {/* Table */} {!loading && ( <> {/* Pagination */} {total > (filters.limit || 20) && (
)} )} {/* Details Modal */} {/* Empty State Info */} {!loading && (!permissionLogs || permissionLogs.length === 0) && !error && (

هیچ تغییر مجوزی یافت نشد

در بازه زمانی و فیلترهای انتخاب شده، هیچ تغییر مجوزی ثبت نشده است.

)} {/* Permission Analysis Tips */} {!loading && permissionLogs && permissionLogs.length > 0 && (

راهنمای تحلیل مجوزها

تغییرات نقش: بررسی تغییرات نقش‌های کاربری و مجوزهای مربوطه

دسترسی‌های حساس: نظارت بر دسترسی‌های مهم و حساس سیستم

الگوهای دسترسی: شناسایی الگوهای غیرعادی در دسترسی‌ها

زمان‌بندی: توجه به زمان تغییرات مجوزها

کاربران: شناسایی کاربرانی که تغییرات مجوز زیادی دارند

)}
); }; export default PermissionLogs;