96 lines
3.3 KiB
JavaScript
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();
|