Extra
-
-
- Auditoría
-
{
+ if (!value) return '—';
+ return new Date(value).toLocaleString('es-EC');
+};
+
+const renderMetadata = (metadata) => {
+ if (!metadata) return '—';
+ if (metadata.documents?.length) {
+ return metadata.documents.map((item) => item.title || item.slug).join(', ');
+ }
+ if (metadata.path || metadata.method || metadata.message) {
+ return [metadata.method, metadata.path, metadata.message].filter(Boolean).join(' · ');
+ }
+ if (metadata.alias || metadata.subject) {
+ return [metadata.alias, metadata.subject].filter(Boolean).join(' · ');
+ }
+ return Object.entries(metadata)
+ .slice(0, 3)
+ .map(([key, value]) => `${key}: ${typeof value === 'object' ? JSON.stringify(value) : value}`)
+ .join(' · ');
+};
+
+export default function AuditPage() {
+ const { user } = useAuth();
+ const [items, setItems] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [page, setPage] = useState(1);
+ const [limit, setLimit] = useState(15);
+ const [pagination, setPagination] = useState({ page: 1, totalPages: 1, total: 0 });
+ const [showPurgeModal, setShowPurgeModal] = useState(false);
+ const [certPassword, setCertPassword] = useState('');
+ const [purging, setPurging] = useState(false);
+
+ const loadEvents = () => {
+ setLoading(true);
+ return listMyAuditEvents({ page, limit })
+ .then(({ data }) => {
+ setItems(data.data.rows || []);
+ setPagination(data.data.pagination || { page: 1, totalPages: 1, total: 0 });
+ })
+ .catch(() => toast.error('No se pudieron cargar tus logs'))
+ .finally(() => setLoading(false));
+ };
+
+ useEffect(() => {
+ loadEvents();
+ }, [page, limit]);
+
+ const handlePurgeLogs = async (event) => {
+ event.preventDefault();
+ setPurging(true);
+ try {
+ const { data } = await purgeMyAuditEvents(certPassword);
+ toast.success(`Se eliminaron ${data.data.deletedCount} logs de tu cuenta.`);
+ setCertPassword('');
+ setShowPurgeModal(false);
+ setPage(1);
+ await loadEvents();
+ } catch (error) {
+ toast.error(error.response?.data?.error || 'No se pudieron eliminar tus logs.');
+ } finally {
+ setPurging(false);
+ }
+ };
+
+ return (
+
+ {showPurgeModal && (
+
setShowPurgeModal(false)}>
+
event.stopPropagation()}>
+
+
+
+ Eliminar mis logs
+
+
setShowPurgeModal(false)}>
+
+
+
+
+ Para eliminar tus logs debes validar la contraseña de tu firma registrada. Esta acción dejará un rastro mínimo visible solo para administración.
+
+
+
+
+ )}
+
+
+
+
Auditoría
+
+ {user?.role === 'admin'
+ ? 'Aquí se conservan únicamente los rastros administrativos de purga de logs.'
+ : 'Tus eventos del sistema, del más nuevo al más antiguo, con IP, fecha y detalle técnico relevante.'}
+
+
+
+
+
+
+ Total de eventos:
+ {pagination.total}
+
+
+ Mostrar
+ {
+ setPage(1);
+ setLimit(Number(event.target.value));
+ }}
+ >
+ {PAGE_SIZE_OPTIONS.map((option) => (
+ {option}
+ ))}
+
+
+ {user?.role !== 'admin' && (
+
setShowPurgeModal(true)}>
+
+ Eliminar mis logs
+
+ )}
+
+
+
+
+ Evento
+ Fecha
+ IP
+ Detalle
+
+
+ {loading ? (
+
+ ) : items.length === 0 ? (
+
+
+
Aún no hay eventos de auditoría para mostrar.
+
+ ) : (
+ items.map((item) => {
+ const Icon = EVENT_ICONS[item.type] || CheckCircle2;
+ return (
+
+
+
+
+
+
+
{EVENT_LABELS[item.type] || item.type}
+
{item.type}
+
+
+
{formatDateTime(item.created_at)}
+
{item.ip || '—'}
+
{renderMetadata(item.metadata)}
+
+ );
+ })
+ )}
+
+
+
+ setPage((current) => Math.max(1, current - 1))}
+ >
+
+ Anterior
+
+ Página {pagination.page} de {pagination.totalPages}
+ = pagination.totalPages}
+ onClick={() => setPage((current) => Math.min(pagination.totalPages, current + 1))}
+ >
+ Siguiente
+
+
+
+
+ );
+}