Files
noteflow/services/recurring-todos.service.js

78 lines
3.0 KiB
JavaScript

const { getAll, runQuery } = require('../config/database');
const logger = require('../config/logger');
class RecurringTodosService {
/**
* Génère les tâches à partir des modèles récurrents.
* @param {number|null} userId - ID de l'utilisateur pour filtrer (optionnel). Si null, traite tous les utilisateurs.
* @returns {Promise<{generated: number}>} Nombre de tâches générées
*/
async generateTodos(userId = null) {
try {
const today = new Date().toISOString().split('T')[0];
let recurringTodos;
if (userId) {
recurringTodos = await getAll(
`SELECT * FROM recurring_todos
WHERE enabled = true AND next_occurrence <= $1 AND user_id = $2`,
[today, userId]
);
} else {
recurringTodos = await getAll(
`SELECT * FROM recurring_todos
WHERE enabled = true AND next_occurrence <= $1`,
[today]
);
}
let generatedCount = 0;
for (const recurring of recurringTodos) {
// Créer le todo global
await runQuery(
`INSERT INTO global_todos (user_id, text, priority, completed)
VALUES ($1, $2, $3, false)`,
[recurring.user_id, recurring.text, recurring.priority]
);
// Calculer la prochaine occurrence
let nextDate = new Date(recurring.next_occurrence);
switch (recurring.recurrence_type) {
case 'daily':
nextDate.setDate(nextDate.getDate() + recurring.recurrence_interval);
break;
case 'weekly':
nextDate.setDate(nextDate.getDate() + (7 * recurring.recurrence_interval));
break;
case 'biweekly':
nextDate.setDate(nextDate.getDate() + 14);
break;
case 'monthly':
nextDate.setMonth(nextDate.getMonth() + recurring.recurrence_interval);
break;
case 'yearly':
nextDate.setFullYear(nextDate.getFullYear() + recurring.recurrence_interval);
break;
}
// Mettre à jour la tâche récurrente
await runQuery(
`UPDATE recurring_todos SET next_occurrence = $1, last_generated = $2 WHERE id = $3`,
[nextDate.toISOString().split('T')[0], today, recurring.id]
);
generatedCount++;
}
return { generated: generatedCount };
} catch (error) {
logger.error('Erreur dans RecurringTodosService.generateTodos:', error);
throw error;
}
}
}
module.exports = new RecurringTodosService();