|
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(); |