forge/frontend/lib/api.ts

127 lines
4.9 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`),
};
// 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}`),
};
// 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) => api.post('/modules/video/subtitles', 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),
// 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;