vision refactor

This commit is contained in:
alma 2026-01-15 22:33:49 +01:00
parent 4cb4cccf5d
commit 4769fa7a97

View File

@ -43,15 +43,13 @@ async function fetchTwentyTasks(): Promise<TwentyTask[]> {
today.setHours(0, 0, 0, 0); today.setHours(0, 0, 0, 0);
const todayISO = today.toISOString(); const todayISO = today.toISOString();
// GraphQL query to fetch activities (tasks) that are not completed and due before today // GraphQL query to fetch tasks from Twenty CRM
// Using findManyActivities which is the standard query for Twenty CRM // Twenty CRM uses different query structures - trying tasks query first
// Note: The exact filter syntax may vary based on your Twenty CRM version // If this doesn't work, we may need to use REST API or check the actual schema
// If this doesn't work, try using REST API or adjust the filter syntax
const query = ` const query = `
query GetOverdueTasks { query GetOverdueTasks {
findManyActivities( tasks(
filter: { where: {
type: { eq: Task }
completedAt: { is: NULL } completedAt: { is: NULL }
dueAt: { lt: "${todayISO}" } dueAt: { lt: "${todayISO}" }
} }
@ -64,7 +62,6 @@ async function fetchTwentyTasks(): Promise<TwentyTask[]> {
body body
dueAt dueAt
completedAt completedAt
type
assigneeId assigneeId
assignee { assignee {
id id
@ -121,29 +118,55 @@ async function fetchTwentyTasks(): Promise<TwentyTask[]> {
return []; return [];
} }
if (!data.data?.findManyActivities?.edges) { // Try different possible response structures
// Twenty CRM may use different field names depending on version
let activitiesData = null;
if (data.data?.tasks?.edges) {
activitiesData = data.data.tasks.edges;
} else if (data.data?.activities?.edges) {
activitiesData = data.data.activities.edges;
} else if (data.data?.findManyTasks?.edges) {
activitiesData = data.data.findManyTasks.edges;
} else if (data.data?.findManyActivities?.edges) {
activitiesData = data.data.findManyActivities.edges;
} else if (Array.isArray(data.data?.tasks)) {
// Direct array response
activitiesData = data.data.tasks.map((node: any) => ({ node }));
} else if (Array.isArray(data.data?.activities)) {
// Direct array response
activitiesData = data.data.activities.map((node: any) => ({ node }));
} else if (Array.isArray(data.data)) {
// Root level array
activitiesData = data.data.map((node: any) => ({ node }));
}
if (!activitiesData) {
logger.warn('[TWENTY_CRM_TASKS] Unexpected response format from Twenty CRM', { logger.warn('[TWENTY_CRM_TASKS] Unexpected response format from Twenty CRM', {
dataKeys: Object.keys(data.data || {}), dataKeys: Object.keys(data.data || {}),
fullData: JSON.stringify(data.data).substring(0, 1000),
}); });
return []; return [];
} }
// Transform Twenty CRM tasks to match our Task interface // Transform Twenty CRM tasks to match our Task interface
const tasks: TwentyTask[] = data.data.findManyActivities.edges.map((edge: any) => ({ const tasks: TwentyTask[] = activitiesData.map((edge: any) => {
id: edge.node.id, const node = edge.node || edge; // Handle both edge.node and direct node
title: edge.node.title || 'Untitled Task', return {
body: edge.node.body || null, id: node.id,
dueAt: edge.node.dueAt || null, title: node.title || 'Untitled Task',
completedAt: edge.node.completedAt || null, body: node.body || null,
type: edge.node.type || 'Task', dueAt: node.dueAt || null,
assigneeId: edge.node.assigneeId || null, completedAt: node.completedAt || null,
assignee: edge.node.assignee ? { type: node.type || 'Task',
id: edge.node.assignee.id, assigneeId: node.assigneeId || null,
firstName: edge.node.assignee.firstName || null, assignee: node.assignee ? {
lastName: edge.node.assignee.lastName || null, id: node.assignee.id,
email: edge.node.assignee.email || null, firstName: node.assignee.firstName || null,
} : null, lastName: node.assignee.lastName || null,
})); email: node.assignee.email || null,
} : null,
};
});
logger.debug('[TWENTY_CRM_TASKS] Successfully fetched tasks from Twenty CRM', { logger.debug('[TWENTY_CRM_TASKS] Successfully fetched tasks from Twenty CRM', {
count: tasks.length, count: tasks.length,