package storage import ( "strings" "time" "gardomatic.kleiax.de/internal/platform/validate" ) // GardenModelInterface persists gardens and their initial owner membership. type GardenModelInterface interface { Insert(garden Garden, ownerID int) (Garden, error) Get(id int) (Garden, error) GetAllForUser(userID int) ([]Garden, error) Update(garden Garden) (Garden, error) Delete(id int) error } // Garden is the tenant boundary for garden-specific resources. type Garden struct { ID int `json:"id"` Name string `json:"name"` Description string `json:"description"` ImageData string `json:"image_data,omitempty"` ImageID *int `json:"image_id,omitempty"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` Version int `json:"version"` Role GardenRole `json:"role,omitempty"` Permissions []GardenPermission `json:"permissions"` } // ValidateGarden applies persistence-independent garden validation rules. func ValidateGarden(v *validate.Validator, garden Garden) { v.Check(strings.TrimSpace(garden.Name) != "", "name", "must be provided") v.Check(len(garden.Name) <= 500, "name", "must not be more than 500 bytes long") v.Check(len(garden.Description) <= 5000, "description", "must not be more than 5000 bytes long") }