ca2533d4df
Replace generic string types with strongly-typed value objects throughout the application layer. This change ensures compile-time type checking and automatic validation during JSON deserialization. Changes: - Add JSON marshaling/unmarshaling to HabitType and Frequency value objects - Update all DTOs to use typed fields instead of strings - Update commands and queries to use proper types - Remove unnecessary string conversions - Add comprehensive JSON serialization tests - Fix existing tests to work with typed fields Benefits: - Type safety: compiler catches invalid usage - Automatic validation: invalid values rejected during JSON parsing - Better code documentation and self-explanatory APIs - Reduced runtime errors
86 lines
3.2 KiB
Go
86 lines
3.2 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"`
|
|
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"`
|
|
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"`
|
|
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"`
|
|
}
|
|
|
|
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"`
|
|
}
|