Replace all mock data with real backend integration

- Add database tables for email configs, settings, and activity logs
- Create backend endpoints for dashboard stats, analytics, archives, email config, and settings
- Create frontend service layer (admin, archive, email, settings services)
- Update AdminDashboard to use real statistics and activity data
- Update AnalyticsPage to fetch real analytics from backend
- Update ArchivesPage with pagination and real archive operations
- Update EmailConfigPage to manage real SMTP config and templates
- Remove all mock data and replace with API calls throughout admin interface

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
This commit is contained in:
2025-07-06 22:46:24 +02:00
co-authored by Claude
parent 3470120a0d
commit 932e5e137c
15 changed files with 1998 additions and 356 deletions
+97
View File
@@ -0,0 +1,97 @@
import { api } from '../config/api';
export interface BrandingSettings {
company_name: string;
company_tagline: string;
support_email: string;
footer_text: string;
watermark_enabled: boolean;
logo_url?: string;
}
export interface ThemeSettings {
name?: string;
primaryColor?: string;
accentColor?: string;
backgroundColor?: string;
textColor?: string;
fontFamily?: string;
borderRadius?: 'none' | 'sm' | 'md' | 'lg';
customCss?: string;
}
export interface StorageInfo {
total_used: number;
archive_storage: number;
storage_by_event: Array<{
event_name: string;
id: number;
size: number;
}>;
storage_limit: number;
}
export const settingsService = {
// Get all settings
async getAllSettings(): Promise<Record<string, any>> {
const response = await api.get<Record<string, any>>('/api/admin/settings');
return response.data;
},
// Get settings by type
async getSettingsByType(type: 'branding' | 'theme' | 'general'): Promise<Record<string, any>> {
const response = await api.get<Record<string, any>>(`/api/admin/settings/${type}`);
return response.data;
},
// Update branding settings
async updateBranding(settings: BrandingSettings): Promise<void> {
await api.put('/api/admin/settings/branding', settings);
},
// Upload logo
async uploadLogo(file: File): Promise<{ logo_url: string }> {
const formData = new FormData();
formData.append('logo', file);
const response = await api.post<{ message: string; logo_url: string }>(
'/api/admin/settings/logo',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
}
}
);
return { logo_url: response.data.logo_url };
},
// Update theme settings
async updateTheme(settings: ThemeSettings): Promise<void> {
await api.put('/api/admin/settings/theme', settings);
},
// Get storage information
async getStorageInfo(): Promise<StorageInfo> {
const response = await api.get<StorageInfo>('/api/admin/settings/storage/info');
return response.data;
},
// Format branding settings from raw data
formatBrandingSettings(rawSettings: Record<string, any>): BrandingSettings {
return {
company_name: rawSettings.branding_company_name || '',
company_tagline: rawSettings.branding_company_tagline || '',
support_email: rawSettings.branding_support_email || '',
footer_text: rawSettings.branding_footer_text || '',
watermark_enabled: rawSettings.branding_watermark_enabled || false,
logo_url: rawSettings.branding_logo_url || undefined
};
},
// Format theme settings from raw data
formatThemeSettings(rawSettings: Record<string, any>): ThemeSettings {
return rawSettings.theme_config || {};
}
};