Documentation
¶
Index ¶
- Constants
- Variables
- func ComputeNextDue(last *time.Time, intervalMonths int) *time.Time
- func DefaultDBPath() (string, error)
- func FormatCents(cents int64) string
- func FormatCompactCents(cents int64) string
- func FormatCompactOptionalCents(cents *int64) string
- func FormatDate(value *time.Time) string
- func FormatOptionalCents(cents *int64) string
- func ParseOptionalCents(input string) (*int64, error)
- func ParseOptionalDate(input string) (*time.Time, error)
- func ParseOptionalFloat(input string) (float64, error)
- func ParseOptionalInt(input string) (int, error)
- func ParseRequiredCents(input string) (int64, error)
- func ParseRequiredDate(input string) (time.Time, error)
- func ParseRequiredFloat(input string) (float64, error)
- func ParseRequiredInt(input string) (int, error)
- func ProjectStatuses() []string
- func ValidateDBPath(path string) error
- type Appliance
- type ChatInput
- type DeletionRecord
- type HouseProfile
- type MaintenanceCategory
- type MaintenanceItem
- type PragmaColumn
- type Project
- type ProjectType
- type Quote
- type ServiceLogEntry
- type Setting
- type Store
- func (s *Store) AppendChatInput(input string) error
- func (s *Store) AutoMigrate() error
- func (s *Store) Close() error
- func (s *Store) ColumnHints() string
- func (s *Store) CountMaintenanceByAppliance(applianceIDs []uint) (map[uint]int, error)
- func (s *Store) CountQuotesByProject(projectIDs []uint) (map[uint]int, error)
- func (s *Store) CountQuotesByVendor(vendorIDs []uint) (map[uint]int, error)
- func (s *Store) CountServiceLogs(itemIDs []uint) (map[uint]int, error)
- func (s *Store) CountServiceLogsByVendor(vendorIDs []uint) (map[uint]int, error)
- func (s *Store) CreateAppliance(item Appliance) error
- func (s *Store) CreateHouseProfile(profile HouseProfile) error
- func (s *Store) CreateMaintenance(item MaintenanceItem) error
- func (s *Store) CreateProject(project Project) error
- func (s *Store) CreateQuote(quote Quote, vendor Vendor) error
- func (s *Store) CreateServiceLog(entry ServiceLogEntry, vendor Vendor) error
- func (s *Store) CreateVendor(vendor Vendor) error
- func (s *Store) DataDump() string
- func (s *Store) DeleteAppliance(id uint) error
- func (s *Store) DeleteMaintenance(id uint) error
- func (s *Store) DeleteProject(id uint) error
- func (s *Store) DeleteQuote(id uint) error
- func (s *Store) DeleteServiceLog(id uint) error
- func (s *Store) DeleteVendor(id uint) error
- func (s *Store) GetAppliance(id uint) (Appliance, error)
- func (s *Store) GetLastModel() (string, error)
- func (s *Store) GetMaintenance(id uint) (MaintenanceItem, error)
- func (s *Store) GetProject(id uint) (Project, error)
- func (s *Store) GetQuote(id uint) (Quote, error)
- func (s *Store) GetServiceLog(id uint) (ServiceLogEntry, error)
- func (s *Store) GetSetting(key string) (string, error)
- func (s *Store) GetShowDashboard() (bool, error)
- func (s *Store) GetVendor(id uint) (Vendor, error)
- func (s *Store) HouseProfile() (HouseProfile, error)
- func (s *Store) LastDeletion(entity string) (DeletionRecord, error)
- func (s *Store) ListActiveProjects() ([]Project, error)
- func (s *Store) ListAppliances(includeDeleted bool) ([]Appliance, error)
- func (s *Store) ListExpiringWarranties(now time.Time, lookBack, horizon time.Duration) ([]Appliance, error)
- func (s *Store) ListMaintenance(includeDeleted bool) ([]MaintenanceItem, error)
- func (s *Store) ListMaintenanceByAppliance(applianceID uint, includeDeleted bool) ([]MaintenanceItem, error)
- func (s *Store) ListMaintenanceWithSchedule() ([]MaintenanceItem, error)
- func (s *Store) ListProjects(includeDeleted bool) ([]Project, error)
- func (s *Store) ListQuotes(includeDeleted bool) ([]Quote, error)
- func (s *Store) ListQuotesByProject(projectID uint, includeDeleted bool) ([]Quote, error)
- func (s *Store) ListQuotesByVendor(vendorID uint, includeDeleted bool) ([]Quote, error)
- func (s *Store) ListRecentServiceLogs(limit int) ([]ServiceLogEntry, error)
- func (s *Store) ListServiceLog(maintenanceItemID uint, includeDeleted bool) ([]ServiceLogEntry, error)
- func (s *Store) ListServiceLogsByVendor(vendorID uint, includeDeleted bool) ([]ServiceLogEntry, error)
- func (s *Store) ListVendors(includeDeleted bool) ([]Vendor, error)
- func (s *Store) LoadChatHistory() ([]string, error)
- func (s *Store) MaintenanceCategories() ([]MaintenanceCategory, error)
- func (s *Store) ProjectTypes() ([]ProjectType, error)
- func (s *Store) PutLastModel(model string) error
- func (s *Store) PutSetting(key, value string) error
- func (s *Store) PutShowDashboard(show bool) error
- func (s *Store) ReadOnlyQuery(query string) (columns []string, rows [][]string, err error)
- func (s *Store) RestoreAppliance(id uint) error
- func (s *Store) RestoreMaintenance(id uint) error
- func (s *Store) RestoreProject(id uint) error
- func (s *Store) RestoreQuote(id uint) error
- func (s *Store) RestoreServiceLog(id uint) error
- func (s *Store) RestoreVendor(id uint) error
- func (s *Store) SeedDefaults() error
- func (s *Store) SeedDemoData() error
- func (s *Store) SeedDemoDataFrom(h *fake.HomeFaker) error
- func (s *Store) TableColumns(table string) ([]PragmaColumn, error)
- func (s *Store) TableNames() ([]string, error)
- func (s *Store) UpdateAppliance(item Appliance) error
- func (s *Store) UpdateHouseProfile(profile HouseProfile) error
- func (s *Store) UpdateMaintenance(item MaintenanceItem) error
- func (s *Store) UpdateProject(project Project) error
- func (s *Store) UpdateQuote(quote Quote, vendor Vendor) error
- func (s *Store) UpdateServiceLog(entry ServiceLogEntry, vendor Vendor) error
- func (s *Store) UpdateVendor(vendor Vendor) error
- func (s *Store) YTDProjectSpendCents() (int64, error)
- func (s *Store) YTDServiceSpendCents(yearStart time.Time) (int64, error)
- type Vendor
Constants ¶
const ( ProjectStatusIdeating = "ideating" ProjectStatusPlanned = "planned" ProjectStatusQuoted = "quoted" ProjectStatusInProgress = "underway" ProjectStatusDelayed = "delayed" ProjectStatusCompleted = "completed" ProjectStatusAbandoned = "abandoned" )
const ( DeletionEntityProject = "project" DeletionEntityQuote = "quote" DeletionEntityMaintenance = "maintenance" DeletionEntityAppliance = "appliance" DeletionEntityServiceLog = "service_log" DeletionEntityVendor = "vendor" )
const ( ColID = "id" ColName = "name" ColCreatedAt = "created_at" ColUpdatedAt = "updated_at" ColDeletedAt = "deleted_at" ColStatus = "status" ColActualCents = "actual_cents" ColBudgetCents = "budget_cents" ColCostCents = "cost_cents" ColTotalCents = "total_cents" ColIntervalMonths = "interval_months" ColLastServicedAt = "last_serviced_at" ColWarrantyExpiry = "warranty_expiry" ColServicedAt = "serviced_at" ColReceivedDate = "received_date" ColRestoredAt = "restored_at" ColVendorID = "vendor_id" ColProjectID = "project_id" ColProjectTypeID = "project_type_id" ColApplianceID = "appliance_id" ColMaintenanceItemID = "maintenance_item_id" ColEntity = "entity" ColTargetID = "target_id" ColContactName = "contact_name" ColEmail = "email" ColPhone = "phone" ColWebsite = "website" ColNotes = "notes" )
Column name constants for use in raw SQL queries. Centralising these prevents drift between struct fields and hand-written SQL fragments.
const AppName = "micasa"
const DateLayout = "2006-01-02"
Variables ¶
var ( // ErrParentDeleted indicates the parent record exists but is soft-deleted. ErrParentDeleted = errors.New("parent record is deleted") // ErrParentNotFound indicates the parent record doesn't exist at all. ErrParentNotFound = errors.New("parent record not found") )
Functions ¶
func DefaultDBPath ¶
func FormatCents ¶
func FormatCompactCents ¶ added in v1.17.0
FormatCompactCents formats cents using abbreviated notation for large values: $1.2k, $45k, $1.3M. Values under $1,000 use full precision. Uses go-humanize for SI prefix formatting.
func FormatCompactOptionalCents ¶ added in v1.17.0
FormatCompactOptionalCents formats optional cents compactly.
func FormatDate ¶
func FormatOptionalCents ¶
func ParseOptionalCents ¶
func ParseOptionalFloat ¶
func ParseOptionalInt ¶
func ParseRequiredCents ¶
func ParseRequiredFloat ¶
func ParseRequiredInt ¶
func ProjectStatuses ¶
func ProjectStatuses() []string
func ValidateDBPath ¶ added in v1.10.1
ValidateDBPath rejects paths that could be interpreted as URIs by the SQLite driver. The underlying go-sqlite driver passes query strings through net/url.ParseQuery (subject to CVE GO-2026-4341) and enables SQLITE_OPEN_URI, so both file:// URIs and scheme://... URLs must be blocked. Only plain filesystem paths and the special ":memory:" value are accepted.
Types ¶
type Appliance ¶
type Appliance struct {
ID uint `gorm:"primaryKey"`
Name string
Brand string
ModelNumber string
SerialNumber string
PurchaseDate *time.Time
WarrantyExpiry *time.Time `gorm:"index"`
Location string
CostCents *int64
Notes string
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
type ChatInput ¶ added in v1.22.0
type ChatInput struct {
ID uint `gorm:"primaryKey"`
Input string `gorm:"not null"`
CreatedAt time.Time
}
ChatInput stores a single chat prompt for cross-session history. Ordered by creation time, newest last.
type DeletionRecord ¶
type HouseProfile ¶
type HouseProfile struct {
ID uint `gorm:"primaryKey"`
Nickname string
AddressLine1 string
AddressLine2 string
City string
State string
PostalCode string
YearBuilt int
SquareFeet int
LotSquareFeet int
Bedrooms int
Bathrooms float64
FoundationType string
WiringType string
RoofType string
ExteriorType string
HeatingType string
CoolingType string
WaterSource string
SewerType string
ParkingType string
BasementType string
InsuranceCarrier string
InsurancePolicy string
InsuranceRenewal *time.Time
PropertyTaxCents *int64
HOAName string
HOAFeeCents *int64
CreatedAt time.Time
UpdatedAt time.Time
}
type MaintenanceCategory ¶
type MaintenanceItem ¶
type MaintenanceItem struct {
ID uint `gorm:"primaryKey"`
Name string
CategoryID uint `gorm:"index"`
Category MaintenanceCategory `gorm:"constraint:OnDelete:RESTRICT;"`
ApplianceID *uint `gorm:"index"`
Appliance Appliance `gorm:"constraint:OnDelete:SET NULL;"`
LastServicedAt *time.Time
IntervalMonths int
ManualURL string
ManualText string
Notes string
CostCents *int64
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
type PragmaColumn ¶ added in v1.22.0
type PragmaColumn struct {
CID int `gorm:"column:cid"`
Name string `gorm:"column:name"`
Type string `gorm:"column:type"`
NotNull bool `gorm:"column:notnull"`
DfltValue *string `gorm:"column:dflt_value"`
PK int `gorm:"column:pk"`
}
PragmaColumn mirrors the output of PRAGMA table_info.
type Project ¶
type Project struct {
ID uint `gorm:"primaryKey"`
Title string
ProjectTypeID uint
ProjectType ProjectType `gorm:"constraint:OnDelete:RESTRICT;"`
Status string
Description string
StartDate *time.Time
EndDate *time.Time
BudgetCents *int64
ActualCents *int64
PreferredVendorID *uint
PreferredVendor Vendor `gorm:"constraint:OnDelete:SET NULL;"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
type ProjectType ¶
type Quote ¶
type Quote struct {
ID uint `gorm:"primaryKey"`
ProjectID uint `gorm:"index"`
Project Project `gorm:"constraint:OnDelete:RESTRICT;"`
VendorID uint `gorm:"index"`
Vendor Vendor `gorm:"constraint:OnDelete:RESTRICT;"`
TotalCents int64
LaborCents *int64
MaterialsCents *int64
OtherCents *int64
ReceivedDate *time.Time
Notes string
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
type ServiceLogEntry ¶
type ServiceLogEntry struct {
ID uint `gorm:"primaryKey"`
MaintenanceItemID uint `gorm:"index"`
MaintenanceItem MaintenanceItem `gorm:"constraint:OnDelete:CASCADE;"`
ServicedAt time.Time
VendorID *uint `gorm:"index"`
Vendor Vendor `gorm:"constraint:OnDelete:SET NULL;"`
CostCents *int64
Notes string
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
type Setting ¶ added in v1.22.0
Setting is a simple key-value store for app preferences that persist across sessions (e.g. last-used LLM model). Stored in SQLite so a single "cp micasa.db backup.db" captures everything.
type Store ¶
type Store struct {
// contains filtered or unexported fields
}
func (*Store) AppendChatInput ¶ added in v1.22.0
AppendChatInput adds a prompt to the persistent history, deduplicating consecutive repeats. Trims old entries beyond chatHistoryMax.
func (*Store) AutoMigrate ¶
func (*Store) ColumnHints ¶ added in v1.22.0
ColumnHints queries the database for distinct values in key columns and returns them as a formatted string suitable for inclusion in an LLM prompt. Returns empty string if no hints are available.
func (*Store) CountMaintenanceByAppliance ¶
CountMaintenanceByAppliance returns the count of non-deleted maintenance items for each appliance ID.
func (*Store) CountQuotesByProject ¶ added in v1.18.0
CountQuotesByProject returns the number of non-deleted quotes per project ID.
func (*Store) CountQuotesByVendor ¶ added in v1.6.0
CountQuotesByVendor returns the number of non-deleted quotes per vendor ID.
func (*Store) CountServiceLogs ¶
CountServiceLogs returns the number of non-deleted service log entries per maintenance item ID for the given set of IDs.
func (*Store) CountServiceLogsByVendor ¶ added in v1.6.0
CountServiceLogsByVendor returns the number of non-deleted service log entries per vendor ID.
func (*Store) CreateAppliance ¶
func (*Store) CreateHouseProfile ¶
func (s *Store) CreateHouseProfile(profile HouseProfile) error
func (*Store) CreateMaintenance ¶
func (s *Store) CreateMaintenance(item MaintenanceItem) error
func (*Store) CreateProject ¶
func (*Store) CreateServiceLog ¶
func (s *Store) CreateServiceLog(entry ServiceLogEntry, vendor Vendor) error
func (*Store) CreateVendor ¶ added in v1.6.0
func (*Store) DataDump ¶ added in v1.22.0
DataDump exports every row of every user table as readable text, suitable for stuffing into an LLM context window. For a home-scale database this is small enough to fit comfortably.
Unlike ReadOnlyQuery this bypasses the row cap and keyword filter -- table names come from sqlite_master so the queries are fully trusted.
The output is optimized for small LLMs: null/empty values are omitted, money columns (ending in "_ct") are formatted as dollars, and internal columns (id, created_at, updated_at, deleted_at) are excluded to reduce noise.
func (*Store) DeleteAppliance ¶
func (*Store) DeleteMaintenance ¶
func (*Store) DeleteProject ¶
func (*Store) DeleteQuote ¶
func (*Store) DeleteServiceLog ¶
func (*Store) DeleteVendor ¶ added in v1.11.0
func (*Store) GetLastModel ¶ added in v1.22.0
GetLastModel returns the persisted LLM model name, or "" if none.
func (*Store) GetMaintenance ¶
func (s *Store) GetMaintenance(id uint) (MaintenanceItem, error)
func (*Store) GetServiceLog ¶
func (s *Store) GetServiceLog(id uint) (ServiceLogEntry, error)
func (*Store) GetSetting ¶ added in v1.22.0
GetSetting retrieves a setting by key. Returns ("", nil) if not found.
func (*Store) GetShowDashboard ¶ added in v1.24.0
GetShowDashboard returns whether the dashboard should be shown on startup. Defaults to true when no preference has been saved.
func (*Store) HouseProfile ¶
func (s *Store) HouseProfile() (HouseProfile, error)
func (*Store) LastDeletion ¶
func (s *Store) LastDeletion(entity string) (DeletionRecord, error)
func (*Store) ListActiveProjects ¶
ListActiveProjects returns non-deleted projects with status "underway" or "delayed", preloading ProjectType.
func (*Store) ListAppliances ¶
func (*Store) ListExpiringWarranties ¶
func (s *Store) ListExpiringWarranties( now time.Time, lookBack, horizon time.Duration, ) ([]Appliance, error)
ListExpiringWarranties returns non-deleted appliances whose warranty expires between (now - lookBack) and (now + horizon).
func (*Store) ListMaintenance ¶
func (s *Store) ListMaintenance(includeDeleted bool) ([]MaintenanceItem, error)
func (*Store) ListMaintenanceByAppliance ¶
func (s *Store) ListMaintenanceByAppliance( applianceID uint, includeDeleted bool, ) ([]MaintenanceItem, error)
func (*Store) ListMaintenanceWithSchedule ¶
func (s *Store) ListMaintenanceWithSchedule() ([]MaintenanceItem, error)
ListMaintenanceWithSchedule returns all non-deleted maintenance items that have a positive interval, preloading Category and Appliance. These are the items eligible for overdue/upcoming computation.
func (*Store) ListQuotesByProject ¶ added in v1.18.0
ListQuotesByProject returns all quotes for a specific project.
func (*Store) ListQuotesByVendor ¶ added in v1.18.0
ListQuotesByVendor returns all quotes for a specific vendor.
func (*Store) ListRecentServiceLogs ¶
func (s *Store) ListRecentServiceLogs(limit int) ([]ServiceLogEntry, error)
ListRecentServiceLogs returns the most recent service log entries across all maintenance items, preloading MaintenanceItem and Vendor.
func (*Store) ListServiceLog ¶
func (s *Store) ListServiceLog( maintenanceItemID uint, includeDeleted bool, ) ([]ServiceLogEntry, error)
func (*Store) ListServiceLogsByVendor ¶ added in v1.18.0
func (s *Store) ListServiceLogsByVendor( vendorID uint, includeDeleted bool, ) ([]ServiceLogEntry, error)
ListServiceLogsByVendor returns all service log entries for a specific vendor.
func (*Store) LoadChatHistory ¶ added in v1.22.0
LoadChatHistory returns all persisted chat inputs, oldest first.
func (*Store) MaintenanceCategories ¶
func (s *Store) MaintenanceCategories() ([]MaintenanceCategory, error)
func (*Store) ProjectTypes ¶
func (s *Store) ProjectTypes() ([]ProjectType, error)
func (*Store) PutLastModel ¶ added in v1.22.0
PutLastModel persists the LLM model name.
func (*Store) PutSetting ¶ added in v1.22.0
PutSetting upserts a setting.
func (*Store) PutShowDashboard ¶ added in v1.24.0
PutShowDashboard persists the user's dashboard visibility preference.
func (*Store) ReadOnlyQuery ¶ added in v1.22.0
ReadOnlyQuery executes a validated SELECT query and returns the results as string slices. Only SELECT statements are allowed; result rows are capped at maxQueryRows.
func (*Store) RestoreAppliance ¶
func (*Store) RestoreMaintenance ¶
func (*Store) RestoreProject ¶
func (*Store) RestoreQuote ¶
func (*Store) RestoreServiceLog ¶
func (*Store) RestoreVendor ¶ added in v1.11.0
func (*Store) SeedDefaults ¶
func (*Store) SeedDemoData ¶
SeedDemoData populates the database with realistic demo data using a fixed seed so the demo always looks the same. Skips if data already exists.
func (*Store) SeedDemoDataFrom ¶ added in v1.10.0
SeedDemoDataFrom populates the database with demo data generated by the given HomeFaker. Callers can pass different seeds for varied test data.
func (*Store) TableColumns ¶ added in v1.22.0
func (s *Store) TableColumns(table string) ([]PragmaColumn, error)
TableColumns returns column metadata for the named table via PRAGMA. The table name is validated to contain only safe characters.
func (*Store) TableNames ¶ added in v1.22.0
TableNames returns the names of all non-internal tables in the database.
func (*Store) UpdateAppliance ¶
func (*Store) UpdateHouseProfile ¶
func (s *Store) UpdateHouseProfile(profile HouseProfile) error
func (*Store) UpdateMaintenance ¶
func (s *Store) UpdateMaintenance(item MaintenanceItem) error
func (*Store) UpdateProject ¶
func (*Store) UpdateServiceLog ¶
func (s *Store) UpdateServiceLog(entry ServiceLogEntry, vendor Vendor) error
func (*Store) UpdateVendor ¶ added in v1.6.0
func (*Store) YTDProjectSpendCents ¶
YTDProjectSpendCents returns the total actual spend across all non-deleted projects.