14 new optional residence fields (heating, cooling, water heater, roof, pool, sprinkler, septic, fireplace, garage, basement, attic, exterior, flooring, landscaping) with JSONB conditions on templates. Suggestion engine scores templates against home profile: string match +0.25, bool +0.3, property type +0.15, universal base 0.3. Graceful degradation from minimal to full profile info. GET /api/tasks/suggestions/?residence_id=X returns ranked templates. 54 template conditions across 44 templates in seed data. 8 suggestion service tests.
92 lines
5.5 KiB
Go
92 lines
5.5 KiB
Go
package requests
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/shopspring/decimal"
|
|
)
|
|
|
|
// CreateResidenceRequest represents the request to create a residence
|
|
type CreateResidenceRequest struct {
|
|
Name string `json:"name" validate:"required,min=1,max=200"`
|
|
PropertyTypeID *uint `json:"property_type_id"`
|
|
StreetAddress string `json:"street_address" validate:"max=255"`
|
|
ApartmentUnit string `json:"apartment_unit" validate:"max=50"`
|
|
City string `json:"city" validate:"max=100"`
|
|
StateProvince string `json:"state_province" validate:"max=100"`
|
|
PostalCode string `json:"postal_code" validate:"max=20"`
|
|
Country string `json:"country" validate:"max=100"`
|
|
Bedrooms *int `json:"bedrooms" validate:"omitempty,min=0"`
|
|
Bathrooms *decimal.Decimal `json:"bathrooms"`
|
|
SquareFootage *int `json:"square_footage" validate:"omitempty,min=0"`
|
|
LotSize *decimal.Decimal `json:"lot_size"`
|
|
YearBuilt *int `json:"year_built"`
|
|
Description string `json:"description" validate:"max=10000"`
|
|
PurchaseDate *time.Time `json:"purchase_date"`
|
|
PurchasePrice *decimal.Decimal `json:"purchase_price"`
|
|
IsPrimary *bool `json:"is_primary"`
|
|
|
|
// Home Profile
|
|
HeatingType *string `json:"heating_type" validate:"omitempty,oneof=gas_furnace electric_furnace heat_pump boiler radiant other"`
|
|
CoolingType *string `json:"cooling_type" validate:"omitempty,oneof=central_ac window_ac heat_pump evaporative none other"`
|
|
WaterHeaterType *string `json:"water_heater_type" validate:"omitempty,oneof=tank_gas tank_electric tankless_gas tankless_electric heat_pump solar other"`
|
|
RoofType *string `json:"roof_type" validate:"omitempty,oneof=asphalt_shingle metal tile slate wood_shake flat other"`
|
|
HasPool *bool `json:"has_pool"`
|
|
HasSprinklerSystem *bool `json:"has_sprinkler_system"`
|
|
HasSeptic *bool `json:"has_septic"`
|
|
HasFireplace *bool `json:"has_fireplace"`
|
|
HasGarage *bool `json:"has_garage"`
|
|
HasBasement *bool `json:"has_basement"`
|
|
HasAttic *bool `json:"has_attic"`
|
|
ExteriorType *string `json:"exterior_type" validate:"omitempty,oneof=brick vinyl_siding wood_siding stucco stone fiber_cement other"`
|
|
FlooringPrimary *string `json:"flooring_primary" validate:"omitempty,oneof=hardwood laminate tile carpet vinyl concrete other"`
|
|
LandscapingType *string `json:"landscaping_type" validate:"omitempty,oneof=lawn desert xeriscape garden mixed none other"`
|
|
}
|
|
|
|
// UpdateResidenceRequest represents the request to update a residence
|
|
type UpdateResidenceRequest struct {
|
|
Name *string `json:"name" validate:"omitempty,min=1,max=200"`
|
|
PropertyTypeID *uint `json:"property_type_id"`
|
|
StreetAddress *string `json:"street_address" validate:"omitempty,max=255"`
|
|
ApartmentUnit *string `json:"apartment_unit" validate:"omitempty,max=50"`
|
|
City *string `json:"city" validate:"omitempty,max=100"`
|
|
StateProvince *string `json:"state_province" validate:"omitempty,max=100"`
|
|
PostalCode *string `json:"postal_code" validate:"omitempty,max=20"`
|
|
Country *string `json:"country" validate:"omitempty,max=100"`
|
|
Bedrooms *int `json:"bedrooms" validate:"omitempty,min=0"`
|
|
Bathrooms *decimal.Decimal `json:"bathrooms"`
|
|
SquareFootage *int `json:"square_footage" validate:"omitempty,min=0"`
|
|
LotSize *decimal.Decimal `json:"lot_size"`
|
|
YearBuilt *int `json:"year_built"`
|
|
Description *string `json:"description" validate:"omitempty,max=10000"`
|
|
PurchaseDate *time.Time `json:"purchase_date"`
|
|
PurchasePrice *decimal.Decimal `json:"purchase_price"`
|
|
IsPrimary *bool `json:"is_primary"`
|
|
|
|
// Home Profile
|
|
HeatingType *string `json:"heating_type" validate:"omitempty,oneof=gas_furnace electric_furnace heat_pump boiler radiant other"`
|
|
CoolingType *string `json:"cooling_type" validate:"omitempty,oneof=central_ac window_ac heat_pump evaporative none other"`
|
|
WaterHeaterType *string `json:"water_heater_type" validate:"omitempty,oneof=tank_gas tank_electric tankless_gas tankless_electric heat_pump solar other"`
|
|
RoofType *string `json:"roof_type" validate:"omitempty,oneof=asphalt_shingle metal tile slate wood_shake flat other"`
|
|
HasPool *bool `json:"has_pool"`
|
|
HasSprinklerSystem *bool `json:"has_sprinkler_system"`
|
|
HasSeptic *bool `json:"has_septic"`
|
|
HasFireplace *bool `json:"has_fireplace"`
|
|
HasGarage *bool `json:"has_garage"`
|
|
HasBasement *bool `json:"has_basement"`
|
|
HasAttic *bool `json:"has_attic"`
|
|
ExteriorType *string `json:"exterior_type" validate:"omitempty,oneof=brick vinyl_siding wood_siding stucco stone fiber_cement other"`
|
|
FlooringPrimary *string `json:"flooring_primary" validate:"omitempty,oneof=hardwood laminate tile carpet vinyl concrete other"`
|
|
LandscapingType *string `json:"landscaping_type" validate:"omitempty,oneof=lawn desert xeriscape garden mixed none other"`
|
|
}
|
|
|
|
// JoinWithCodeRequest represents the request to join a residence via share code
|
|
type JoinWithCodeRequest struct {
|
|
Code string `json:"code" validate:"required,len=6"`
|
|
}
|
|
|
|
// GenerateShareCodeRequest represents the request to generate a share code
|
|
type GenerateShareCodeRequest struct {
|
|
ExpiresInHours int `json:"expires_in_hours" validate:"omitempty,min=1"` // Default: 24 hours
|
|
}
|