tududi/backend/modules/habits/service.js
Chris 542be2c1e9
Fix bug 366 (#764)
* Optimize DB

* Clean up names

* fixup! Clean up names

* fixup! fixup! Clean up names
2026-01-07 18:18:07 +02:00

96 lines
3.3 KiB
JavaScript

'use strict';
const habitsRepository = require('./repository');
const habitService = require('./habitService');
const { NotFoundError } = require('../../shared/errors');
class HabitsService {
async getAll(userId) {
const habits = await habitsRepository.findAllByUser(userId);
return { habits };
}
async create(userId, data) {
const habit = await habitsRepository.createHabit(userId, data);
return { habit };
}
async logCompletion(userId, uid, completedAt) {
const habit = await habitsRepository.findByUidAndUser(uid, userId);
if (!habit || !habit.habit_mode) {
throw new NotFoundError('Habit not found');
}
const result = await habitService.logCompletion(
habit,
completedAt ? new Date(completedAt) : new Date()
);
return result;
}
async getCompletions(userId, uid, startDate, endDate) {
const habit = await habitsRepository.findByUidAndUser(uid, userId);
if (!habit || !habit.habit_mode) {
throw new NotFoundError('Habit not found');
}
const start = startDate
? new Date(startDate)
: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
const end = endDate ? new Date(endDate) : new Date();
const completions = await habitsRepository.findCompletions(
habit.id,
start,
end
);
return { completions };
}
async deleteCompletion(userId, uid, completionId) {
const habit = await habitsRepository.findByUidAndUser(uid, userId);
if (!habit || !habit.habit_mode) {
throw new NotFoundError('Habit not found');
}
const completion = await habitsRepository.findCompletionById(
completionId,
habit.id
);
if (!completion) {
throw new NotFoundError('Completion not found');
}
await completion.destroy();
const updates = await habitService.recalculateStreaks(habit);
await habitsRepository.update(habit, updates);
return { message: 'Completion deleted', task: habit };
}
async getStats(userId, uid, startDate, endDate) {
const habit = await habitsRepository.findByUidAndUser(uid, userId);
if (!habit || !habit.habit_mode) {
throw new NotFoundError('Habit not found');
}
const start = startDate
? new Date(startDate)
: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
const end = endDate ? new Date(endDate) : new Date();
return habitService.getHabitStats(habit, start, end);
}
async update(userId, uid, data) {
const habit = await habitsRepository.findByUidAndUser(uid, userId);
if (!habit || !habit.habit_mode) {
throw new NotFoundError('Habit not found');
}
await habitsRepository.update(habit, data);
return { habit };
}
async delete(userId, uid) {
const habit = await habitsRepository.findByUidAndUser(uid, userId);
if (!habit || !habit.habit_mode) {
throw new NotFoundError('Habit not found');
}
await habitsRepository.destroy(habit);
return { message: 'Habit deleted' };
}
}
module.exports = new HabitsService();