feat(tools): add maintenance and meal planning tools with CRUD operations
- Implement maintenance tool for adding, logging, and retrieving tasks - Create meals tool for managing recipes, meal plans, and shopping lists - Introduce reparse metadata tool for updating thought metadata - Add household knowledge, home maintenance, family calendar, meal planning, and professional CRM database migrations - Grant necessary permissions for new database tables
This commit is contained in:
215
internal/types/extensions.go
Normal file
215
internal/types/extensions.go
Normal file
@@ -0,0 +1,215 @@
|
||||
package types
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
// Household Knowledge
|
||||
|
||||
type HouseholdItem struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Category string `json:"category,omitempty"`
|
||||
Location string `json:"location,omitempty"`
|
||||
Details map[string]any `json:"details"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
type HouseholdVendor struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
ServiceType string `json:"service_type,omitempty"`
|
||||
Phone string `json:"phone,omitempty"`
|
||||
Email string `json:"email,omitempty"`
|
||||
Website string `json:"website,omitempty"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
Rating *int `json:"rating,omitempty"`
|
||||
LastUsed *time.Time `json:"last_used,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
}
|
||||
|
||||
// Home Maintenance
|
||||
|
||||
type MaintenanceTask struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Category string `json:"category,omitempty"`
|
||||
FrequencyDays *int `json:"frequency_days,omitempty"`
|
||||
LastCompleted *time.Time `json:"last_completed,omitempty"`
|
||||
NextDue *time.Time `json:"next_due,omitempty"`
|
||||
Priority string `json:"priority"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
type MaintenanceLog struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
TaskID uuid.UUID `json:"task_id"`
|
||||
CompletedAt time.Time `json:"completed_at"`
|
||||
PerformedBy string `json:"performed_by,omitempty"`
|
||||
Cost *float64 `json:"cost,omitempty"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
NextAction string `json:"next_action,omitempty"`
|
||||
}
|
||||
|
||||
type MaintenanceLogWithTask struct {
|
||||
MaintenanceLog
|
||||
TaskName string `json:"task_name"`
|
||||
TaskCategory string `json:"task_category,omitempty"`
|
||||
}
|
||||
|
||||
// Family Calendar
|
||||
|
||||
type FamilyMember struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Relationship string `json:"relationship,omitempty"`
|
||||
BirthDate *time.Time `json:"birth_date,omitempty"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
}
|
||||
|
||||
type Activity struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
FamilyMemberID *uuid.UUID `json:"family_member_id,omitempty"`
|
||||
MemberName string `json:"member_name,omitempty"`
|
||||
Title string `json:"title"`
|
||||
ActivityType string `json:"activity_type,omitempty"`
|
||||
DayOfWeek string `json:"day_of_week,omitempty"`
|
||||
StartTime string `json:"start_time,omitempty"`
|
||||
EndTime string `json:"end_time,omitempty"`
|
||||
StartDate *time.Time `json:"start_date,omitempty"`
|
||||
EndDate *time.Time `json:"end_date,omitempty"`
|
||||
Location string `json:"location,omitempty"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
}
|
||||
|
||||
type ImportantDate struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
FamilyMemberID *uuid.UUID `json:"family_member_id,omitempty"`
|
||||
MemberName string `json:"member_name,omitempty"`
|
||||
Title string `json:"title"`
|
||||
DateValue time.Time `json:"date_value"`
|
||||
RecurringYearly bool `json:"recurring_yearly"`
|
||||
ReminderDaysBefore int `json:"reminder_days_before"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
}
|
||||
|
||||
// Meal Planning
|
||||
|
||||
type Ingredient struct {
|
||||
Name string `json:"name"`
|
||||
Quantity string `json:"quantity,omitempty"`
|
||||
Unit string `json:"unit,omitempty"`
|
||||
}
|
||||
|
||||
type Recipe struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Cuisine string `json:"cuisine,omitempty"`
|
||||
PrepTimeMinutes *int `json:"prep_time_minutes,omitempty"`
|
||||
CookTimeMinutes *int `json:"cook_time_minutes,omitempty"`
|
||||
Servings *int `json:"servings,omitempty"`
|
||||
Ingredients []Ingredient `json:"ingredients"`
|
||||
Instructions []string `json:"instructions"`
|
||||
Tags []string `json:"tags"`
|
||||
Rating *int `json:"rating,omitempty"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
type MealPlanEntry struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
WeekStart time.Time `json:"week_start"`
|
||||
DayOfWeek string `json:"day_of_week"`
|
||||
MealType string `json:"meal_type"`
|
||||
RecipeID *uuid.UUID `json:"recipe_id,omitempty"`
|
||||
RecipeName string `json:"recipe_name,omitempty"`
|
||||
CustomMeal string `json:"custom_meal,omitempty"`
|
||||
Servings *int `json:"servings,omitempty"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
}
|
||||
|
||||
type MealPlanInput struct {
|
||||
DayOfWeek string `json:"day_of_week" jsonschema:"day of week (monday-sunday)"`
|
||||
MealType string `json:"meal_type" jsonschema:"one of: breakfast, lunch, dinner, snack"`
|
||||
RecipeID *uuid.UUID `json:"recipe_id,omitempty" jsonschema:"optional recipe id"`
|
||||
CustomMeal string `json:"custom_meal,omitempty" jsonschema:"optional free-text meal description when no recipe"`
|
||||
Servings *int `json:"servings,omitempty"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
}
|
||||
|
||||
type ShoppingItem struct {
|
||||
Name string `json:"name"`
|
||||
Quantity string `json:"quantity,omitempty"`
|
||||
Unit string `json:"unit,omitempty"`
|
||||
Purchased bool `json:"purchased"`
|
||||
RecipeID *uuid.UUID `json:"recipe_id,omitempty"`
|
||||
}
|
||||
|
||||
type ShoppingList struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
WeekStart time.Time `json:"week_start"`
|
||||
Items []ShoppingItem `json:"items"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// Professional CRM
|
||||
|
||||
type ProfessionalContact struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Company string `json:"company,omitempty"`
|
||||
Title string `json:"title,omitempty"`
|
||||
Email string `json:"email,omitempty"`
|
||||
Phone string `json:"phone,omitempty"`
|
||||
LinkedInURL string `json:"linkedin_url,omitempty"`
|
||||
HowWeMet string `json:"how_we_met,omitempty"`
|
||||
Tags []string `json:"tags"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
LastContacted *time.Time `json:"last_contacted,omitempty"`
|
||||
FollowUpDate *time.Time `json:"follow_up_date,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
type ContactInteraction struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
ContactID uuid.UUID `json:"contact_id"`
|
||||
InteractionType string `json:"interaction_type"`
|
||||
OccurredAt time.Time `json:"occurred_at"`
|
||||
Summary string `json:"summary"`
|
||||
FollowUpNeeded bool `json:"follow_up_needed"`
|
||||
FollowUpNotes string `json:"follow_up_notes,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
}
|
||||
|
||||
type Opportunity struct {
|
||||
ID uuid.UUID `json:"id"`
|
||||
ContactID *uuid.UUID `json:"contact_id,omitempty"`
|
||||
Title string `json:"title"`
|
||||
Description string `json:"description,omitempty"`
|
||||
Stage string `json:"stage"`
|
||||
Value *float64 `json:"value,omitempty"`
|
||||
ExpectedCloseDate *time.Time `json:"expected_close_date,omitempty"`
|
||||
Notes string `json:"notes,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
type ContactHistory struct {
|
||||
Contact ProfessionalContact `json:"contact"`
|
||||
Interactions []ContactInteraction `json:"interactions"`
|
||||
Opportunities []Opportunity `json:"opportunities"`
|
||||
}
|
||||
Reference in New Issue
Block a user