import api from './api' export interface Photo { id: number title: string description: string originalFilename: string uniqueFilename: string fileSize: number status: 'draft' | 'published' | 'archived' | 'processing' camera?: string lens?: string iso?: number aperture?: string shutterSpeed?: string focalLength?: string takenAt?: string createdAt: string updatedAt: string categories: Category[] tags: Tag[] formats: PhotoFormat[] } export interface PhotoFormat { id: number photoId: number format: string width: number height: number quality: number fileSize: number url: string createdAt: string } export interface Category { id: number name: string slug: string description: string photoCount: number } export interface Tag { id: number name: string slug: string description: string color?: string photoCount: number } export interface PhotoListParams { page?: number limit?: number search?: string status?: string category_id?: number tags?: string[] start_date?: string end_date?: string sort_by?: string sort_order?: string } export interface PhotoListResponse { photos: Photo[] total: number page: number limit: number pages: number } export interface CreatePhotoRequest { title: string description?: string status?: string categoryIds?: number[] tagIds?: number[] camera?: string lens?: string iso?: number aperture?: string shutterSpeed?: string focalLength?: string takenAt?: string } export interface UpdatePhotoRequest { title?: string description?: string status?: string categoryIds?: number[] tagIds?: number[] camera?: string lens?: string iso?: number aperture?: string shutterSpeed?: string focalLength?: string takenAt?: string } export interface BatchUpdateRequest { status?: string categoryIds?: number[] tagIds?: number[] } export interface PhotoStats { total: number thisMonth: number today: number totalSize: number statusStats: Record } class PhotoService { async getPhotos(params: PhotoListParams = {}): Promise { const response = await api.get('/photos', { params }) return response.data } async getPhoto(id: number): Promise { const response = await api.get(`/photos/${id}`) return response.data } async createPhoto(data: CreatePhotoRequest): Promise { const response = await api.post('/photos', data) return response.data } async updatePhoto(id: number, data: UpdatePhotoRequest): Promise { const response = await api.put(`/photos/${id}`, data) return response.data } async deletePhoto(id: number): Promise { await api.delete(`/photos/${id}`) } async uploadPhoto(file: File, data: CreatePhotoRequest): Promise { const formData = new FormData() formData.append('file', file) // 添加其他字段 if (data.title) formData.append('title', data.title) if (data.description) formData.append('description', data.description) if (data.status) formData.append('status', data.status) if (data.categoryIds) formData.append('category_ids', data.categoryIds.join(',')) if (data.tagIds) formData.append('tag_ids', data.tagIds.join(',')) if (data.camera) formData.append('camera', data.camera) if (data.lens) formData.append('lens', data.lens) if (data.iso) formData.append('iso', data.iso.toString()) if (data.aperture) formData.append('aperture', data.aperture) if (data.shutterSpeed) formData.append('shutter_speed', data.shutterSpeed) if (data.focalLength) formData.append('focal_length', data.focalLength) if (data.takenAt) formData.append('taken_at', data.takenAt) const response = await api.post('/photos/upload', formData, { headers: { 'Content-Type': 'multipart/form-data', }, }) return response.data } async batchUpdate(ids: number[], data: BatchUpdateRequest): Promise { await api.post('/photos/batch/update', { ids, ...data }) } async batchDelete(ids: number[]): Promise { await api.post('/photos/batch/delete', { ids }) } async getStats(): Promise { const response = await api.get('/photos/stats') return response.data } } export const photoService = new PhotoService()