Files
igny8/frontend/src/services/integration.api.ts
IGNY8 VPS (Salman) b293856ef2 1
2025-11-21 03:58:29 +00:00

156 lines
4.1 KiB
TypeScript

/**
* Integration API Service
* Handles all integration-related API calls
*/
import { fetchAPI } from './api';
export interface SiteIntegration {
id: number;
site: number;
platform: 'wordpress' | 'shopify' | 'custom';
platform_type: 'cms' | 'ecommerce' | 'custom_api';
config_json: Record<string, any>;
credentials_json?: Record<string, any>;
is_active: boolean;
sync_enabled: boolean;
last_sync_at?: string;
sync_status: 'success' | 'failed' | 'pending';
created_at: string;
updated_at: string;
}
export interface CreateIntegrationData {
site: number;
platform: 'wordpress' | 'shopify' | 'custom';
platform_type?: 'cms' | 'ecommerce' | 'custom_api';
config_json: Record<string, any>;
credentials_json?: Record<string, string>;
is_active?: boolean;
sync_enabled?: boolean;
}
export const integrationApi = {
/**
* Get all integrations for a site
*/
async getSiteIntegrations(siteId: number): Promise<SiteIntegration[]> {
const response = await fetchAPI(`/v1/integration/integrations/?site=${siteId}`);
return response?.results || response || [];
},
/**
* Get integration by ID
*/
async getIntegration(integrationId: number): Promise<SiteIntegration> {
return await fetchAPI(`/v1/integration/integrations/${integrationId}/`);
},
/**
* Create new integration
*/
async createIntegration(data: CreateIntegrationData): Promise<SiteIntegration> {
return await fetchAPI('/v1/integration/integrations/', {
method: 'POST',
body: JSON.stringify(data),
});
},
/**
* Update integration
*/
async updateIntegration(
integrationId: number,
data: Partial<CreateIntegrationData>
): Promise<SiteIntegration> {
return await fetchAPI(`/v1/integration/integrations/${integrationId}/`, {
method: 'PATCH',
body: JSON.stringify(data),
});
},
/**
* Delete integration
*/
async deleteIntegration(integrationId: number): Promise<void> {
await fetchAPI(`/v1/integration/integrations/${integrationId}/`, {
method: 'DELETE',
});
},
/**
* Test integration connection
*/
async testIntegration(integrationId: number): Promise<{ success: boolean; message: string }> {
return await fetchAPI(`/v1/integration/integrations/${integrationId}/test/`, {
method: 'POST',
});
},
/**
* Sync content from integration
*/
async syncIntegration(
integrationId: number,
syncType: 'full' | 'incremental' = 'incremental'
): Promise<{ success: boolean; message: string; synced_count?: number }> {
return await fetchAPI(`/v1/integration/integrations/${integrationId}/sync/`, {
method: 'POST',
body: JSON.stringify({ sync_type: syncType }),
});
},
/**
* Get WordPress integration for a site
*/
async getWordPressIntegration(siteId: number): Promise<SiteIntegration | null> {
const integrations = await this.getSiteIntegrations(siteId);
return integrations.find((i) => i.platform === 'wordpress') || null;
},
/**
* Create or update WordPress integration
*/
async saveWordPressIntegration(
siteId: number,
data: {
url: string;
username: string;
app_password: string;
api_key?: string;
is_active?: boolean;
sync_enabled?: boolean;
}
): Promise<SiteIntegration> {
const existing = await this.getWordPressIntegration(siteId);
const credentials: Record<string, string> = {
username: data.username,
app_password: data.app_password,
};
// Include API key if provided
if (data.api_key) {
credentials.api_key = data.api_key;
}
const integrationData: CreateIntegrationData = {
site: siteId,
platform: 'wordpress',
platform_type: 'cms',
config_json: {
site_url: data.url,
},
credentials_json: credentials,
is_active: data.is_active ?? true,
sync_enabled: data.sync_enabled ?? true,
};
if (existing) {
return await this.updateIntegration(existing.id, integrationData);
} else {
return await this.createIntegration(integrationData);
}
},
};