Files
2025-11-03 12:24:01 +02:00

57 lines
1.8 KiB
Go

package models
import (
"time"
)
func (Todo) TableName() string {
return "todos"
}
type Todo struct {
BaseModel
UserID ULID `json:"userId" db:"user_id" gorm:"not null"`
Title string `json:"title" db:"title" gorm:"not null"`
Description string `json:"description" db:"description"`
Color string `json:"color" db:"color" gorm:"default:'#3B82F6'"` // Default blue color
IsActive bool `json:"isActive" db:"is_active" gorm:"default:true"`
// Relationships
User User `json:"user" gorm:"foreignKey:UserID"`
Completions []TodoCompletion `json:"completions" gorm:"foreignKey:TodoID"`
}
func (TodoCompletion) TableName() string {
return "todo_completions"
}
type TodoCompletion struct {
BaseModel
TodoID ULID `json:"todoId" db:"todo_id" gorm:"not null"`
UserID ULID `json:"userId" db:"user_id" gorm:"not null"`
CompletedAt time.Time `json:"completedAt" db:"completed_at" gorm:"not null"`
Description string `json:"description" db:"description"` // User's notes about how they completed it
// Relationships
Todo Todo `json:"todo" gorm:"foreignKey:TodoID"`
User User `json:"user" gorm:"foreignKey:UserID"`
}
// TodoWithStats represents a todo with completion statistics
type TodoWithStats struct {
Todo
CurrentStreak int `json:"currentStreak"`
LongestStreak int `json:"longestStreak"`
TotalCompletions int `json:"totalCompletions"`
LastCompletedAt *time.Time `json:"lastCompletedAt"`
CompletedToday bool `json:"completedToday"`
}
// DailyTodoSummary represents todos for a specific day
type DailyTodoSummary struct {
Date time.Time `json:"date"`
Todos []TodoWithStats `json:"todos"`
CompletedCount int `json:"completedCount"`
TotalCount int `json:"totalCount"`
}