52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
import type { GetHabitProgressHistoryRepository } from "@/domain/repositories/GetHabitProgressHistory"
|
|
import { SupabaseRepository } from "./_SupabaseRepository"
|
|
import { HabitProgress } from "@/domain/entities/HabitProgress"
|
|
import type { GoalProgress } from "@/domain/entities/Goal"
|
|
import {
|
|
GoalBooleanProgress,
|
|
GoalNumericProgress,
|
|
} from "@/domain/entities/Goal"
|
|
|
|
export class GetHabitProgressHistorySupabaseRepository
|
|
extends SupabaseRepository
|
|
implements GetHabitProgressHistoryRepository
|
|
{
|
|
public execute: GetHabitProgressHistoryRepository["execute"] = async (
|
|
options,
|
|
) => {
|
|
const { habit } = options
|
|
const { data, error } = await this.supabaseClient
|
|
.from("habits_progresses")
|
|
.select("*")
|
|
.eq("habit_id", habit.id)
|
|
if (error != null) {
|
|
throw new Error(error.message)
|
|
}
|
|
const habitProgressHistory = data.map((item) => {
|
|
let goalProgress: GoalProgress | null = null
|
|
if (habit.goal.isNumeric()) {
|
|
goalProgress = new GoalNumericProgress({
|
|
goal: habit.goal,
|
|
progress: item.goal_progress,
|
|
})
|
|
} else if (habit.goal.isBoolean()) {
|
|
goalProgress = new GoalBooleanProgress({
|
|
goal: habit.goal,
|
|
progress: item.goal_progress === 1,
|
|
})
|
|
}
|
|
if (goalProgress == null) {
|
|
throw new Error("Goal progress is null.")
|
|
}
|
|
const habitProgress = new HabitProgress({
|
|
id: item.id.toString(),
|
|
habitId: item.habit_id.toString(),
|
|
goalProgress,
|
|
date: new Date(item.date),
|
|
})
|
|
return habitProgress
|
|
})
|
|
return habitProgressHistory
|
|
}
|
|
}
|