| import apiClient from './apiClient'; |
|
|
| class PostService { |
| |
| |
| |
| |
| |
| |
| async getAll(params = {}) { |
| try { |
| const response = await apiClient.get('/posts', { params }); |
| |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.log('π [Post] Retrieved posts:', response.data); |
| } |
| |
| return response; |
| } catch (error) { |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.error('π [Post] Get posts error:', error.response?.data || error.message); |
| } |
| throw error; |
| } |
| } |
|
|
| |
| |
| |
| |
| async generate() { |
| try { |
| |
| const startResponse = await apiClient.post('/posts/generate', {}); |
| |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.log('π [Post] AI post generation started:', startResponse.data); |
| } |
| |
| const jobId = startResponse.data.job_id; |
| |
| |
| const generatedContent = await this.pollForJobResult(jobId); |
| |
| |
| const finalContent = generatedContent !== undefined && generatedContent !== null ? generatedContent : "Generated content will appear here..."; |
| |
| return { data: { success: true, content: finalContent } }; |
| } catch (error) { |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.error('π [Post] Generate post error:', error.response?.data || error.message); |
| } |
| throw error; |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| async pollForJobResult(jobId) { |
| const pollInterval = 6000; |
| const maxAttempts = 60; |
| |
| for (let attempt = 1; attempt <= maxAttempts; attempt++) { |
| try { |
| const response = await apiClient.get(`/posts/jobs/${jobId}`); |
| const jobData = response.data; |
| |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.log(`π [Post] Job status check ${attempt}/${maxAttempts}:`, jobData); |
| } |
| |
| switch (jobData.status) { |
| case 'completed': |
| |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.log('π [Post] Raw job data:', jobData); |
| } |
| |
| |
| let content = jobData.content; |
| |
| |
| if (Array.isArray(content)) { |
| content = content[0] || ''; |
| } |
| |
| |
| return content !== undefined ? content : ''; |
| case 'failed': |
| throw new Error(jobData.error || 'Job failed'); |
| case 'processing': |
| case 'pending': |
| |
| await new Promise(resolve => setTimeout(resolve, pollInterval)); |
| break; |
| default: |
| throw new Error(`Unknown job status: ${jobData.status}`); |
| } |
| } catch (error) { |
| if (error.response?.status === 404) { |
| throw new Error('Job not found'); |
| } |
| throw error; |
| } |
| } |
| |
| |
| throw new Error('Job polling timed out after 6 minutes. Please check back later.'); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| async create(postData) { |
| try { |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.log('π [Post] Creating post with data:', postData); |
| } |
| |
| const response = await apiClient.post('/posts', { |
| social_account_id: postData.social_account_id, |
| text_content: postData.text_content, |
| image_content_url: postData.image_content_url, |
| scheduled_at: postData.scheduled_at |
| }); |
| |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.log('π [Post] Post created:', response.data); |
| } |
| |
| return response; |
| } catch (error) { |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.error('π [Post] Create post error:', error.response?.data || error.message); |
| console.error('π [Post] Error details:', { |
| status: error.response?.status, |
| statusText: error.response?.statusText, |
| headers: error.response?.headers, |
| data: error.response?.data |
| }); |
| } |
| throw error; |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| async publishDirect(publishData) { |
| try { |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.log('π [Post] Publishing post directly to social media with data:', publishData); |
| } |
| |
| const response = await apiClient.post('/posts/publish-direct', publishData); |
| |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.log('π [Post] Post published directly:', response.data); |
| } |
| |
| return response; |
| } catch (error) { |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.error('π [Post] Publish post directly error:', error.response?.data || error.message); |
| console.error('π [Post] Error details:', { |
| status: error.response?.status, |
| statusText: error.response?.statusText, |
| headers: error.response?.headers, |
| data: error.response?.data |
| }); |
| } |
| throw error; |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| async delete(postId) { |
| try { |
| const response = await apiClient.delete(`/posts/${postId}`); |
| |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.log('π [Post] Post deleted:', response.data); |
| } |
| |
| return response; |
| } catch (error) { |
| if (import.meta.env.VITE_NODE_ENV === 'development') { |
| console.error('π [Post] Delete post error:', error.response?.data || error.message); |
| } |
| throw error; |
| } |
| } |
| } |
|
|
| export default new PostService(); |