package model // Note represents a note attached to a contact. // Reference: Chatwoot app/models/note.rb // // Table name: notes // // id uint primaryKey autoIncrement // content string not null // account_id uint not null gorm:"index" // contact_id uint not null gorm:"index" // user_id *uint gorm:"index" (optional — nullable) // created_at time // updated_at time // deleted_at gorm.DeletedAt gorm:"index" import ( "gorm.io/gorm" ) // Note is a text note attached to a contact, similar to Chatwoot's Note model. // Notes allow agents to add internal comments/observations about a contact. // Content is required; account_id and contact_id are required; user_id is optional. type Note struct { Base Content string `gorm:"type:text;not null" json:"content" binding:"required"` AccountID uint `gorm:"not null;index" json:"account_id"` ContactID uint `gorm:"not null;index" json:"contact_id"` UserID *uint `gorm:"index" json:"user_id,omitempty"` User *User `gorm:"foreignKey:UserID" json:"user,omitempty"` Account Account `gorm:"foreignKey:AccountID" json:"-"` Contact Contact `gorm:"foreignKey:ContactID" json:"-"` } // TableName returns the database table name for Note. func (Note) TableName() string { return "notes" } // BeforeCreate hook: ensure account_id is set from contact's account_id if missing. // Reference: Chatwoot's `before_validation :ensure_account_id` func (n *Note) BeforeCreate(db *gorm.DB) error { if n.AccountID == 0 && n.ContactID != 0 { var contact Contact if err := db.First(&contact, n.ContactID).Error; err == nil { n.AccountID = contact.AccountID } } return nil }