Reverted to commit 0091584677

This commit is contained in:
gpt-engineer-app[bot]
2025-11-01 15:22:30 +00:00
parent 26e5753807
commit 133141d474
125 changed files with 2316 additions and 9102 deletions

View File

@@ -1,55 +0,0 @@
import { useQuery } from '@tanstack/react-query';
import { supabase } from '@/integrations/supabase/client';
import { queryKeys } from '@/lib/queryKeys';
interface AuditLogFilters {
userId?: string;
action?: string;
page?: number;
pageSize?: number;
}
/**
* Hook for querying audit logs with proper caching
* Provides: paginated audit log queries with filtering
*/
export function useAuditLogs(filters: AuditLogFilters = {}) {
const { userId, action, page = 1, pageSize = 50 } = filters;
return useQuery({
queryKey: queryKeys.admin.auditLogs(userId),
queryFn: async () => {
let query = supabase
.from('profile_audit_log')
.select('*', { count: 'exact' })
.order('created_at', { ascending: false });
if (userId) {
query = query.eq('user_id', userId);
}
if (action) {
query = query.eq('action', action);
}
// Apply pagination
const startIndex = (page - 1) * pageSize;
const endIndex = startIndex + pageSize - 1;
query = query.range(startIndex, endIndex);
const { data, error, count } = await query;
if (error) throw error;
return {
logs: data || [],
total: count || 0,
page,
pageSize,
totalPages: Math.ceil((count || 0) / pageSize),
};
},
staleTime: 2 * 60 * 1000, // 2 minutes
refetchOnWindowFocus: false,
});
}

View File

@@ -1,98 +0,0 @@
import { useQuery } from '@tanstack/react-query';
import { supabase } from '@/integrations/supabase/client';
import { queryKeys } from '@/lib/queryKeys';
import { useAuth } from '@/hooks/useAuth';
import { useUserRole } from '@/hooks/useUserRole';
/**
* useVersionAudit Hook
*
* Detects suspicious entity versions without user attribution for security monitoring.
*
* Features:
* - Combines 4 count queries with Promise.all() for parallel execution
* - Caches for 5 minutes (security alert, should be relatively fresh)
* - Returns total count + breakdown by entity type
* - Only runs for moderators/admins
* - Performance monitoring with slow query warnings
*
* @returns TanStack Query result with audit data
*
* @example
* ```tsx
* const { data: auditResult, isLoading } = useVersionAudit();
*
* if (auditResult && auditResult.totalCount > 0) {
* console.warn(`Found ${auditResult.totalCount} suspicious versions`);
* }
* ```
*/
interface VersionAuditResult {
totalCount: number;
parkVersions: number;
rideVersions: number;
companyVersions: number;
modelVersions: number;
}
export function useVersionAudit() {
const { user } = useAuth();
const { isModerator } = useUserRole();
return useQuery<VersionAuditResult>({
queryKey: queryKeys.admin.versionAudit,
queryFn: async () => {
const startTime = performance.now();
const [parksResult, ridesResult, companiesResult, modelsResult] = await Promise.all([
supabase
.from('park_versions')
.select('*', { count: 'exact', head: true })
.is('created_by', null),
supabase
.from('ride_versions')
.select('*', { count: 'exact', head: true })
.is('created_by', null),
supabase
.from('company_versions')
.select('*', { count: 'exact', head: true })
.is('created_by', null),
supabase
.from('ride_model_versions')
.select('*', { count: 'exact', head: true })
.is('created_by', null),
]);
// Check for errors
if (parksResult.error) throw parksResult.error;
if (ridesResult.error) throw ridesResult.error;
if (companiesResult.error) throw companiesResult.error;
if (modelsResult.error) throw modelsResult.error;
const parkCount = parksResult.count || 0;
const rideCount = ridesResult.count || 0;
const companyCount = companiesResult.count || 0;
const modelCount = modelsResult.count || 0;
const duration = performance.now() - startTime;
// Log slow queries in development
if (import.meta.env.DEV && duration > 1000) {
console.warn(`Slow query: useVersionAudit took ${duration}ms`);
}
return {
totalCount: parkCount + rideCount + companyCount + modelCount,
parkVersions: parkCount,
rideVersions: rideCount,
companyVersions: companyCount,
modelVersions: modelCount,
};
},
enabled: !!user && isModerator(),
staleTime: 5 * 60 * 1000, // 5 minutes
gcTime: 10 * 60 * 1000, // 10 minutes
refetchOnWindowFocus: false,
});
}