import { api } from '../config/api'; export interface AdminPhoto { id: number; filename: string; path: string; url: string; thumbnail_url: string | null; type: string; category_id: number | null; category_name: string | null; category_slug: string | null; size: number; uploaded_at: string; view_count?: number; download_count?: number; } export interface PhotoFilters { category_id?: number | null; type?: string; search?: string; sort?: 'date' | 'name' | 'size'; order?: 'asc' | 'desc'; } class PhotosService { async getEventPhotos(eventId: number, filters?: PhotoFilters): Promise { const params = new URLSearchParams(); if (filters) { if (filters.category_id !== undefined) { params.append('category_id', filters.category_id?.toString() || ''); } if (filters.type) params.append('type', filters.type); if (filters.search) params.append('search', filters.search); if (filters.sort) params.append('sort', filters.sort); if (filters.order) params.append('order', filters.order); } const queryString = params.toString(); const url = `/admin/events/${eventId}/photos${queryString ? `?${queryString}` : ''}`; const response = await api.get(url); // Return photos as-is, URLs are already relative API paths return response.data.photos; } async deletePhoto(eventId: number, photoId: number): Promise { await api.delete(`/admin/events/${eventId}/photos/${photoId}`); } async deletePhotos(eventId: number, photoIds: number[]): Promise { await api.post(`/admin/events/${eventId}/photos/bulk-delete`, { photoIds }); } async updatePhotoCategory(eventId: number, photoId: number, categoryId: number | null): Promise { await api.patch(`/admin/events/${eventId}/photos/${photoId}`, { category_id: categoryId }); } async updatePhotosCategory(eventId: number, photoIds: number[], categoryId: number | null): Promise { await api.post(`/admin/events/${eventId}/photos/bulk-update`, { photoIds, updates: { category_id: categoryId } }); } async downloadPhoto(eventId: number, photoId: number, filename: string): Promise { const response = await api.get(`/admin/events/${eventId}/photos/${photoId}/download`, { responseType: 'blob' }); const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.download = filename; document.body.appendChild(link); link.click(); document.body.removeChild(link); window.URL.revokeObjectURL(url); } formatBytes(bytes: number): string { if (bytes === 0) return '0 Bytes'; const k = 1024; const sizes = ['Bytes', 'KB', 'MB', 'GB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; } } export const photosService = new PhotosService();