import { axiosInstance } from './client';
// ─── Types ────────────────────────────────────────────────────────────────
export interface SlackWorkspaceInfo {
team_id?: string;
team_name?: string;
url?: string;
enterprise_id?: string;
enterprise_name?: string;
}
export interface SlackChannel {
id: string;
external_id: string;
name: string;
is_private: boolean;
is_archived: boolean;
purpose: string;
topic: string;
synced_at?: string;
}
export interface SlackMessage {
id: string;
external_id: string;
channel_id: string;
channel_name: string;
user_id: string;
text: string;
ts: string;
thread_ts: string;
reactions?: unknown[];
bot_name: string;
type: string;
synced_at?: string;
}
export interface SlackAnalytics {
channel_count: number;
public_count: number;
private_count: number;
last_sync_at?: string;
message_count_24h?: number;
message_count_7d?: number;
message_count_30d?: number;
}
export interface SlackSyncResult {
message: string;
status: string;
}
// ─── API ──────────────────────────────────────────────────────────────────
const baseUrl = (companyId: string) => `/api/company/${companyId}/slack`;
export const slackApi = {
// Workspace
async getWorkspace(
companyId: string
): Promise<{
success: boolean;
data: {
workspace: SlackWorkspaceInfo;
channel_count: number;
public_count: number;
private_count: number;
last_sync_at?: string;
};
}> {
const response = await axiosInstance.get(`${baseUrl(companyId)}/workspace`);
return response.data;
},
// Channels
async getChannels(
companyId: string,
params?: { search?: string; is_private?: string; is_archived?: string }
): Promise<{
success: boolean;
data: { items: SlackChannel[]; total: number };
}> {
const response = await axiosInstance.get(`${baseUrl(companyId)}/channels`, { params });
return response.data;
},
// Messages
async getMessages(
companyId: string,
params?: { channel_id?: string; search?: string; limit?: number }
): Promise<{
success: boolean;
data: { items: SlackMessage[]; total: number };
}> {
const response = await axiosInstance.get(`${baseUrl(companyId)}/messages`, { params });
return response.data;
},
// Sync
async sync(companyId: string): Promise<{ success: boolean; data: SlackSyncResult }> {
const response = await axiosInstance.post(`${baseUrl(companyId)}/sync`);
return response.data;
},
// Send message
async sendMessage(
companyId: string,
data: { channel_id: string; text: string; thread_ts?: string }
): Promise<{
success: boolean;
data: { status: string; channel: string; ts?: string };
}> {
const response = await axiosInstance.post(`${baseUrl(companyId)}/send-message`, data);
return response.data;
},
};