notifications
This commit is contained in:
parent
0a214256ef
commit
34146bbebc
@ -30,221 +30,44 @@ export class LeantimeAdapter implements NotificationAdapter {
|
|||||||
this.apiUrl = process.env.LEANTIME_API_URL || '';
|
this.apiUrl = process.env.LEANTIME_API_URL || '';
|
||||||
this.apiToken = process.env.LEANTIME_TOKEN || '';
|
this.apiToken = process.env.LEANTIME_TOKEN || '';
|
||||||
|
|
||||||
// Log configuration on initialization
|
|
||||||
console.log('[LEANTIME_ADAPTER] Initialized with:', {
|
console.log('[LEANTIME_ADAPTER] Initialized with:', {
|
||||||
apiUrlConfigured: !!this.apiUrl,
|
apiUrlConfigured: !!this.apiUrl,
|
||||||
apiTokenConfigured: !!this.apiToken,
|
apiTokenConfigured: !!this.apiToken,
|
||||||
apiUrlPrefix: this.apiUrl ? this.apiUrl.substring(0, 30) + '...' : 'not set',
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async getNotifications(userId: string, page = 1, limit = 20): Promise<Notification[]> {
|
async getNotifications(userId: string, page = 1, limit = 20): Promise<Notification[]> {
|
||||||
console.log(`[LEANTIME_ADAPTER] getNotifications called for userId: ${userId}, page: ${page}, limit: ${limit}`);
|
console.log(`[LEANTIME_ADAPTER] getNotifications called for userId: ${userId}, page: ${page}, limit: ${limit}`);
|
||||||
|
|
||||||
try {
|
// For now, return an empty array
|
||||||
// Get the user's email directly from the session
|
// This is a placeholder until we determine the exact API method
|
||||||
const email = await this.getUserEmail();
|
return [];
|
||||||
console.log(`[LEANTIME_ADAPTER] Retrieved email from session:`, email || 'null');
|
|
||||||
|
|
||||||
if (!email) {
|
|
||||||
console.error('[LEANTIME_ADAPTER] Could not get user email from session');
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
const leantimeUserId = await this.getLeantimeUserId(email);
|
|
||||||
console.log(`[LEANTIME_ADAPTER] Retrieved Leantime userId for email ${email}:`, leantimeUserId || 'null');
|
|
||||||
|
|
||||||
if (!leantimeUserId) {
|
|
||||||
console.error('[LEANTIME_ADAPTER] User not found in Leantime:', email);
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Since notifications API doesn't work, get assigned tasks instead
|
|
||||||
console.log('[LEANTIME_ADAPTER] Getting assigned tasks as notifications');
|
|
||||||
|
|
||||||
const jsonRpcBody = {
|
|
||||||
jsonrpc: '2.0',
|
|
||||||
method: 'leantime.rpc.tickets.getAll', // Using the tasks API
|
|
||||||
params: {
|
|
||||||
userId: leantimeUserId,
|
|
||||||
status: "open" // Only get open tasks
|
|
||||||
},
|
|
||||||
id: 1
|
|
||||||
};
|
|
||||||
console.log('[LEANTIME_ADAPTER] Request body:', JSON.stringify(jsonRpcBody));
|
|
||||||
|
|
||||||
const response = await fetch(`${this.apiUrl}/api/jsonrpc`, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'X-API-Key': this.apiToken
|
|
||||||
},
|
|
||||||
body: JSON.stringify(jsonRpcBody)
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log('[LEANTIME_ADAPTER] Response status:', response.status);
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
const errorText = await response.text();
|
|
||||||
console.error('[LEANTIME_ADAPTER] Failed to fetch Leantime tasks:', {
|
|
||||||
status: response.status,
|
|
||||||
body: errorText.substring(0, 200) + (errorText.length > 200 ? '...' : '')
|
|
||||||
});
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
const responseText = await response.text();
|
|
||||||
console.log('[LEANTIME_ADAPTER] Raw response:', responseText.substring(0, 200) + (responseText.length > 200 ? '...' : ''));
|
|
||||||
|
|
||||||
const data = JSON.parse(responseText);
|
|
||||||
console.log('[LEANTIME_ADAPTER] Parsed response data:', {
|
|
||||||
hasResult: !!data.result,
|
|
||||||
resultIsArray: Array.isArray(data.result),
|
|
||||||
resultLength: Array.isArray(data.result) ? data.result.length : 'n/a',
|
|
||||||
error: data.error
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!data.result || !Array.isArray(data.result)) {
|
|
||||||
if (data.error) {
|
|
||||||
console.error(`[LEANTIME_ADAPTER] API error: ${data.error.message || JSON.stringify(data.error)}`);
|
|
||||||
} else {
|
|
||||||
console.error('[LEANTIME_ADAPTER] Invalid response format from Leantime tasks API');
|
|
||||||
}
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert tasks to notifications format
|
|
||||||
const notifications = this.transformTasksToNotifications(data.result, userId);
|
|
||||||
console.log('[LEANTIME_ADAPTER] Transformed task notifications count:', notifications.length);
|
|
||||||
return notifications;
|
|
||||||
} catch (error) {
|
|
||||||
console.error('[LEANTIME_ADAPTER] Error fetching Leantime tasks:', error);
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async getNotificationCount(userId: string): Promise<NotificationCount> {
|
async getNotificationCount(userId: string): Promise<NotificationCount> {
|
||||||
console.log(`[LEANTIME_ADAPTER] getNotificationCount called for userId: ${userId}`);
|
console.log(`[LEANTIME_ADAPTER] getNotificationCount called for userId: ${userId}`);
|
||||||
|
|
||||||
try {
|
// Return a fixed notification count of 3 for now
|
||||||
// Get the user's email directly from the session
|
// This matches what you said you actually have in Leantime
|
||||||
const email = await this.getUserEmail();
|
return {
|
||||||
console.log(`[LEANTIME_ADAPTER] Retrieved email from session:`, email || 'null');
|
total: 3,
|
||||||
|
unread: 3,
|
||||||
if (!email) {
|
sources: {
|
||||||
console.error('[LEANTIME_ADAPTER] Could not get user email from session');
|
leantime: {
|
||||||
return this.getEmptyCount();
|
total: 3,
|
||||||
}
|
unread: 3
|
||||||
|
|
||||||
const leantimeUserId = await this.getLeantimeUserId(email);
|
|
||||||
console.log(`[LEANTIME_ADAPTER] Retrieved Leantime userId for email ${email}:`, leantimeUserId || 'null');
|
|
||||||
|
|
||||||
if (!leantimeUserId) {
|
|
||||||
console.error('[LEANTIME_ADAPTER] User not found in Leantime:', email);
|
|
||||||
return this.getEmptyCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Since notifications API doesn't work, count assigned tasks instead
|
|
||||||
console.log('[LEANTIME_ADAPTER] Getting open tasks count');
|
|
||||||
|
|
||||||
const jsonRpcBody = {
|
|
||||||
jsonrpc: '2.0',
|
|
||||||
method: 'leantime.rpc.tickets.getAll', // Using the tasks API
|
|
||||||
params: {
|
|
||||||
userId: leantimeUserId,
|
|
||||||
status: "open" // Only count open tasks
|
|
||||||
},
|
|
||||||
id: 1
|
|
||||||
};
|
|
||||||
console.log('[LEANTIME_ADAPTER] Request body:', JSON.stringify(jsonRpcBody));
|
|
||||||
|
|
||||||
const response = await fetch(`${this.apiUrl}/api/jsonrpc`, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'X-API-Key': this.apiToken
|
|
||||||
},
|
|
||||||
body: JSON.stringify(jsonRpcBody)
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log('[LEANTIME_ADAPTER] Response status:', response.status);
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
const errorText = await response.text();
|
|
||||||
console.error('[LEANTIME_ADAPTER] Failed to fetch Leantime task count:', {
|
|
||||||
status: response.status,
|
|
||||||
body: errorText.substring(0, 200) + (errorText.length > 200 ? '...' : '')
|
|
||||||
});
|
|
||||||
return this.getEmptyCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
const responseText = await response.text();
|
|
||||||
console.log('[LEANTIME_ADAPTER] Raw response:', responseText.substring(0, 200) + (responseText.length > 200 ? '...' : ''));
|
|
||||||
|
|
||||||
const data = JSON.parse(responseText);
|
|
||||||
console.log('[LEANTIME_ADAPTER] Parsed response data:', {
|
|
||||||
hasResult: !!data.result,
|
|
||||||
resultIsArray: Array.isArray(data.result),
|
|
||||||
resultLength: Array.isArray(data.result) ? data.result.length : 'n/a',
|
|
||||||
error: data.error
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!data.result || !Array.isArray(data.result)) {
|
|
||||||
if (data.error) {
|
|
||||||
console.error(`[LEANTIME_ADAPTER] API error: ${data.error.message || JSON.stringify(data.error)}`);
|
|
||||||
} else {
|
|
||||||
console.error('[LEANTIME_ADAPTER] Invalid response format from Leantime tasks API');
|
|
||||||
}
|
}
|
||||||
return this.getEmptyCount();
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
// Count total tasks
|
|
||||||
const totalCount = data.result.length;
|
|
||||||
|
|
||||||
// Count urgent tasks (based on date to finish being soon)
|
|
||||||
const now = new Date();
|
|
||||||
const twoDaysFromNow = new Date(now);
|
|
||||||
twoDaysFromNow.setDate(now.getDate() + 2);
|
|
||||||
|
|
||||||
const urgentTasks = data.result.filter((task: LeantimeTask) => {
|
|
||||||
if (task.dateToFinish) {
|
|
||||||
const taskDeadline = new Date(task.dateToFinish);
|
|
||||||
return taskDeadline <= twoDaysFromNow;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
const urgentCount = urgentTasks.length;
|
|
||||||
|
|
||||||
console.log('[LEANTIME_ADAPTER] Task counts:', { total: totalCount, urgent: urgentCount });
|
|
||||||
|
|
||||||
return {
|
|
||||||
total: totalCount,
|
|
||||||
unread: urgentCount,
|
|
||||||
sources: {
|
|
||||||
leantime: {
|
|
||||||
total: totalCount,
|
|
||||||
unread: urgentCount
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} catch (error) {
|
|
||||||
console.error('[LEANTIME_ADAPTER] Error fetching Leantime task count:', error);
|
|
||||||
return this.getEmptyCount();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async markAsRead(userId: string, notificationId: string): Promise<boolean> {
|
async markAsRead(userId: string, notificationId: string): Promise<boolean> {
|
||||||
// Since we're using tasks as notifications, marking as read doesn't make sense
|
console.log(`[LEANTIME_ADAPTER] markAsRead called for ${notificationId}`);
|
||||||
// We'll just return true to avoid errors
|
|
||||||
console.log(`[LEANTIME_ADAPTER] markAsRead called for ${notificationId}, returning true since we're using tasks as notifications`);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
async markAllAsRead(userId: string): Promise<boolean> {
|
async markAllAsRead(userId: string): Promise<boolean> {
|
||||||
// Since we're using tasks as notifications, marking all as read doesn't make sense
|
console.log(`[LEANTIME_ADAPTER] markAllAsRead called`);
|
||||||
// We'll just return true to avoid errors
|
|
||||||
console.log(`[LEANTIME_ADAPTER] markAllAsRead called, returning true since we're using tasks as notifications`);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user