feat: timeline and folder import
This commit is contained in:
186
frontend/src/services/api.ts
Normal file
186
frontend/src/services/api.ts
Normal file
@@ -0,0 +1,186 @@
|
||||
import axios from 'axios'
|
||||
|
||||
const API_BASE_URL = 'http://localhost:8001/api/v1'
|
||||
|
||||
const api = axios.create({
|
||||
baseURL: API_BASE_URL,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
})
|
||||
|
||||
// Source Folders API
|
||||
export const sourceFolders = {
|
||||
list: async () => {
|
||||
const response = await api.get('/folders')
|
||||
return response.data
|
||||
},
|
||||
|
||||
add: async (path: string, recursive: boolean = true) => {
|
||||
const response = await api.post('/folders', {
|
||||
path,
|
||||
recursive,
|
||||
watch: false, // Can be made configurable later
|
||||
})
|
||||
return response.data
|
||||
},
|
||||
|
||||
scan: async (folderId: string) => {
|
||||
const response = await api.post(`/folders/${folderId}/scan`)
|
||||
return response.data
|
||||
},
|
||||
|
||||
delete: async (folderId: string) => {
|
||||
const response = await api.delete(`/folders/${folderId}`)
|
||||
return response.data
|
||||
},
|
||||
}
|
||||
|
||||
// Photos API
|
||||
export const photos = {
|
||||
list: async (params?: {
|
||||
limit?: number
|
||||
offset?: number
|
||||
folder_id?: string
|
||||
heap_id?: string
|
||||
rating?: number
|
||||
flag?: string
|
||||
}) => {
|
||||
const response = await api.get('/photos', { params })
|
||||
return response.data
|
||||
},
|
||||
|
||||
get: async (photoId: string) => {
|
||||
const response = await api.get(`/photos/${photoId}`)
|
||||
return response.data
|
||||
},
|
||||
|
||||
update: async (photoId: string, data: {
|
||||
rating?: number
|
||||
flag?: string
|
||||
user_title?: string
|
||||
user_notes?: string
|
||||
}) => {
|
||||
const response = await api.patch(`/photos/${photoId}`, data)
|
||||
return response.data
|
||||
},
|
||||
|
||||
bulkUpdate: async (photoIds: string[], data: {
|
||||
rating?: number
|
||||
flag?: string
|
||||
heap_id?: string
|
||||
trash?: boolean
|
||||
}) => {
|
||||
const response = await api.post('/photos/bulk', {
|
||||
photo_ids: photoIds,
|
||||
...data,
|
||||
})
|
||||
return response.data
|
||||
},
|
||||
|
||||
getThumbnailUrl: (photoId: string, size: 'small' | 'medium' | 'large' = 'medium') => {
|
||||
return `${API_BASE_URL}/photos/${photoId}/thumb/${size}`
|
||||
},
|
||||
|
||||
getOriginalUrl: (photoId: string) => {
|
||||
return `${API_BASE_URL}/photos/${photoId}/original`
|
||||
},
|
||||
}
|
||||
|
||||
// Library API
|
||||
export const library = {
|
||||
scan: async () => {
|
||||
const response = await api.post('/library/scan')
|
||||
return response.data
|
||||
},
|
||||
|
||||
scanStatus: async () => {
|
||||
const response = await api.get('/library/scan/status')
|
||||
return response.data
|
||||
},
|
||||
|
||||
stats: async () => {
|
||||
const response = await api.get('/library/stats')
|
||||
return response.data
|
||||
},
|
||||
}
|
||||
|
||||
// Heaps API
|
||||
export const heaps = {
|
||||
list: async () => {
|
||||
const response = await api.get('/heaps')
|
||||
return response.data
|
||||
},
|
||||
|
||||
create: async (name: string, description?: string) => {
|
||||
const response = await api.post('/heaps', {
|
||||
name,
|
||||
description,
|
||||
})
|
||||
return response.data
|
||||
},
|
||||
|
||||
update: async (heapId: string, data: {
|
||||
name?: string
|
||||
description?: string
|
||||
}) => {
|
||||
const response = await api.patch(`/heaps/${heapId}`, data)
|
||||
return response.data
|
||||
},
|
||||
|
||||
delete: async (heapId: string) => {
|
||||
const response = await api.delete(`/heaps/${heapId}`)
|
||||
return response.data
|
||||
},
|
||||
}
|
||||
|
||||
// Tags API
|
||||
export const tags = {
|
||||
list: async () => {
|
||||
const response = await api.get('/tags')
|
||||
return response.data
|
||||
},
|
||||
|
||||
create: async (name: string, color?: string) => {
|
||||
const response = await api.post('/tags', {
|
||||
name,
|
||||
color,
|
||||
})
|
||||
return response.data
|
||||
},
|
||||
|
||||
update: async (tagId: string, data: {
|
||||
name?: string
|
||||
color?: string
|
||||
}) => {
|
||||
const response = await api.patch(`/tags/${tagId}`, data)
|
||||
return response.data
|
||||
},
|
||||
|
||||
delete: async (tagId: string) => {
|
||||
const response = await api.delete(`/tags/${tagId}`)
|
||||
return response.data
|
||||
},
|
||||
}
|
||||
|
||||
// Trash API
|
||||
export const trash = {
|
||||
list: async () => {
|
||||
const response = await api.get('/trash')
|
||||
return response.data
|
||||
},
|
||||
|
||||
restore: async (photoIds: string[]) => {
|
||||
const response = await api.post('/trash/restore', {
|
||||
photo_ids: photoIds,
|
||||
})
|
||||
return response.data
|
||||
},
|
||||
|
||||
empty: async () => {
|
||||
const response = await api.delete('/trash/empty')
|
||||
return response.data
|
||||
},
|
||||
}
|
||||
|
||||
export default api
|
||||
Reference in New Issue
Block a user