10d45fc34e
COUNTER type: - Only accepts integer values (rejects decimals) - Auto-increment behavior: each mark adds to existing value - Supports decrement via negative values (e.g., -2) - Enforces minimum value of 0 (never negative) - Default increment is 1 if no value provided VALUE type: - Accepts decimal values - Replaces value (no auto-increment) IsNegative field: - New boolean field on Habit entity - Persisted in database (is_negative column) - Available in all DTOs and HTTP responses - Marks habits as "negative" (e.g., candy consumption) Examples: - COUNTER: 5 + (-2) = 3, 2 + (-3) = 0, 0 + (-1) = 0 - VALUE: 5000 → 12000 = 12000 (replacement)
90 lines
3.4 KiB
Go
90 lines
3.4 KiB
Go
package http
|
|
|
|
import (
|
|
"time"
|
|
|
|
"apocapoc-api/internal/domain/value_objects"
|
|
)
|
|
|
|
type CreateHabitRequest struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
Type value_objects.HabitType `json:"type"`
|
|
Frequency value_objects.Frequency `json:"frequency"`
|
|
SpecificDays []int `json:"specific_days,omitempty"`
|
|
SpecificDates []int `json:"specific_dates,omitempty"`
|
|
CarryOver bool `json:"carry_over"`
|
|
IsNegative bool `json:"is_negative"`
|
|
TargetValue *float64 `json:"target_value,omitempty"`
|
|
}
|
|
|
|
type UpdateHabitRequest struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
SpecificDays []int `json:"specific_days,omitempty"`
|
|
SpecificDates []int `json:"specific_dates,omitempty"`
|
|
CarryOver bool `json:"carry_over"`
|
|
TargetValue *float64 `json:"target_value,omitempty"`
|
|
}
|
|
|
|
type HabitResponse struct {
|
|
ID string `json:"id"`
|
|
UserID string `json:"user_id"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
Type value_objects.HabitType `json:"type"`
|
|
Frequency value_objects.Frequency `json:"frequency"`
|
|
SpecificDays []int `json:"specific_days,omitempty"`
|
|
SpecificDates []int `json:"specific_dates,omitempty"`
|
|
CarryOver bool `json:"carry_over"`
|
|
IsNegative bool `json:"is_negative"`
|
|
TargetValue *float64 `json:"target_value,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
ArchivedAt *time.Time `json:"archived_at,omitempty"`
|
|
}
|
|
|
|
type MarkHabitRequest struct {
|
|
ScheduledDate string `json:"scheduled_date"`
|
|
Value *float64 `json:"value,omitempty"`
|
|
}
|
|
|
|
type TodaysHabitResponse struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Type value_objects.HabitType `json:"type"`
|
|
TargetValue *float64 `json:"target_value,omitempty"`
|
|
IsNegative bool `json:"is_negative"`
|
|
ScheduledDate time.Time `json:"scheduled_date"`
|
|
IsCarriedOver bool `json:"is_carried_over"`
|
|
}
|
|
|
|
type UserHabitResponse struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
Type value_objects.HabitType `json:"type"`
|
|
Frequency value_objects.Frequency `json:"frequency"`
|
|
SpecificDays []int `json:"specific_days,omitempty"`
|
|
TargetValue *float64 `json:"target_value,omitempty"`
|
|
CarryOver bool `json:"carry_over"`
|
|
IsNegative bool `json:"is_negative"`
|
|
}
|
|
|
|
type HabitEntryResponse struct {
|
|
ID string `json:"id"`
|
|
HabitID string `json:"habit_id"`
|
|
ScheduledDate time.Time `json:"scheduled_date"`
|
|
CompletedAt time.Time `json:"completed_at"`
|
|
Value *float64 `json:"value,omitempty"`
|
|
}
|
|
|
|
type HabitEntriesResponse struct {
|
|
Entries []HabitEntryResponse `json:"entries"`
|
|
Total int `json:"total"`
|
|
Page int `json:"page"`
|
|
Limit int `json:"limit"`
|
|
}
|
|
|
|
type ErrorResponse struct {
|
|
Error string `json:"error"`
|
|
}
|