mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-11 17:29:37 +02:00
78 lines
3.0 KiB
JavaScript
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();
|