134 lines
5.2 KiB
TypeScript
134 lines
5.2 KiB
TypeScript
import axios from 'axios';
|
|
|
|
const api = axios.create({
|
|
baseURL: process.env.NEXT_PUBLIC_API_URL || '/api/v1',
|
|
withCredentials: true, // Send cookies with requests
|
|
});
|
|
|
|
// Request interceptor - set Content-Type based on data type
|
|
api.interceptors.request.use((config) => {
|
|
// Let axios auto-detect Content-Type for FormData
|
|
// Only set application/json for non-FormData requests
|
|
if (!(config.data instanceof FormData)) {
|
|
config.headers['Content-Type'] = 'application/json';
|
|
}
|
|
return config;
|
|
});
|
|
|
|
// Response interceptor for error handling
|
|
api.interceptors.response.use(
|
|
(response) => response,
|
|
(error) => {
|
|
if (error.response?.status === 401) {
|
|
localStorage.removeItem('token');
|
|
window.location.href = '/login';
|
|
}
|
|
return Promise.reject(error);
|
|
}
|
|
);
|
|
|
|
// Jobs API
|
|
export const jobsApi = {
|
|
create: (data: any) => api.post('/jobs/', data),
|
|
get: (id: string) => api.get(`/jobs/${id}`),
|
|
list: (params?: any) => api.get('/jobs/', { params }),
|
|
cancel: (id: string) => api.post(`/jobs/${id}/cancel`),
|
|
delete: (id: string) => api.delete(`/jobs/${id}`),
|
|
};
|
|
|
|
// Assets API
|
|
export const assetsApi = {
|
|
upload: (file: File, projectId?: string, isTemporary: boolean = false, overwrite: boolean = false) => {
|
|
const formData = new FormData();
|
|
formData.append('file', file);
|
|
if (projectId) formData.append('project_id', projectId);
|
|
formData.append('is_temporary', String(isTemporary));
|
|
formData.append('overwrite', String(overwrite));
|
|
return api.post('/assets/upload', formData, {
|
|
headers: { 'Content-Type': 'multipart/form-data' },
|
|
});
|
|
},
|
|
get: (id: string) => api.get(`/assets/${id}`),
|
|
list: (params?: any) => api.get('/assets/', { params }),
|
|
download: (id: string) => api.get(`/assets/${id}/download`, { responseType: 'blob' }),
|
|
delete: (id: string) => api.delete(`/assets/${id}`),
|
|
update: (id: string, data: any) => api.patch(`/assets/${id}`, data),
|
|
};
|
|
|
|
// Modules API
|
|
export const modulesApi = {
|
|
// Image
|
|
generateImage: (data: any) => api.post('/modules/image/generate', data),
|
|
upscaleImage: (data: any) => api.post('/modules/image/upscale', data),
|
|
removeBackground: (data: any) => api.post('/modules/image/remove-background', data),
|
|
|
|
// Video
|
|
generateVideo: (data: any) => api.post('/modules/video/generate', data),
|
|
upscaleVideo: (data: any) => api.post('/modules/video/upscale', data),
|
|
extractFrame: (data: { asset_id: string; timestamp: number }) => api.post('/modules/video/extract-frame', data),
|
|
processSubtitles: (data: any, onUploadProgress?: (progressEvent: any) => void) =>
|
|
api.post('/modules/video/subtitles', data, {
|
|
onUploadProgress,
|
|
headers: { 'Content-Type': 'multipart/form-data' }
|
|
}),
|
|
|
|
// Audio
|
|
voiceToText: (data: any) => api.post('/modules/audio/voice-to-text', data),
|
|
textToSpeech: (data: any) => api.post('/modules/audio/text-to-speech', data),
|
|
speechToSpeech: (data: any) => api.post('/modules/audio/speech-to-speech', data),
|
|
generateSoundEffect: (data: any) => api.post('/modules/audio/sound-effects', data),
|
|
getSoundEffectFormats: () => api.get('/modules/audio/sound-effects/formats'),
|
|
getVoices: () => api.get('/modules/voices'),
|
|
|
|
// Text
|
|
generateAltText: (data: any) => api.post('/modules/text/alt-text', data),
|
|
enhancePrompt: (data: any) => api.post('/modules/text/enhance-prompt', data),
|
|
getCineOptions: () => api.get('/modules/text/cine-options'),
|
|
|
|
// Mermaid
|
|
generateMermaid: (data: any) => api.post('/modules/text/mermaid/generate', data),
|
|
renderMermaid: (data: any) => api.post('/modules/text/mermaid/render', data),
|
|
getMermaidTemplates: () => api.get('/modules/text/mermaid/templates'),
|
|
getMermaidTemplate: (type: string) => api.get(`/modules/text/mermaid/templates/${type}`),
|
|
|
|
// Markdown
|
|
convertMarkdown: (data: any) => api.post('/modules/text/markdown/convert', data),
|
|
generateMarkdown: (data: any) => api.post('/modules/text/markdown/generate', data),
|
|
|
|
// Utils
|
|
getModels: (provider: string) => api.get(`/modules/models/${provider}`),
|
|
getImageProviders: () => api.get('/modules/image/providers'),
|
|
getVideoProviders: () => api.get('/modules/video/providers'),
|
|
};
|
|
|
|
// Capabilities API
|
|
export const capabilitiesApi = {
|
|
getImageProviders: () => api.get('/modules/capabilities/image'),
|
|
getVideoProviders: () => api.get('/modules/capabilities/video'),
|
|
getImageProvider: (providerId: string) => api.get(`/modules/capabilities/image/${providerId}`),
|
|
getVideoProvider: (providerId: string) => api.get(`/modules/capabilities/video/${providerId}`),
|
|
};
|
|
|
|
// Users API
|
|
export const usersApi = {
|
|
me: () => api.get('/users/me'),
|
|
updateProfile: (data: any) => api.put('/users/me', data),
|
|
getUsage: () => api.get('/users/me/usage'),
|
|
};
|
|
|
|
// Auth API
|
|
export const authApi = {
|
|
signup: (data: { email: string; password: string; display_name: string }) =>
|
|
api.post('/auth/signup', data),
|
|
login: (data: { email: string; password: string }) =>
|
|
api.post('/auth/login', data),
|
|
logout: () => api.post('/auth/logout'),
|
|
me: () => api.get('/auth/me'),
|
|
updateProfile: (data: { display_name?: string; avatar_url?: string }) =>
|
|
api.patch('/auth/me', data),
|
|
changePassword: (data: { current_password: string; new_password: string }) =>
|
|
api.post('/auth/me/change-password', data),
|
|
verify: () => api.get('/auth/verify'),
|
|
};
|
|
|
|
export default api;
|