package sqlite import ( "fmt" "github.com/charmbracelet/lipgloss/tree" "gorm.io/gorm" ) // HunterDomainSearchResult represents the response from Hunter.io domain search API type HunterDomainSearchResult struct { Data HunterDomainData `json:"data" gorm:"embedded;embeddedPrefix:data_"` Meta HunterMeta `json:"meta" gorm:"embedded;embeddedPrefix:meta_"` } // HunterDomainData contains the main domain information type HunterDomainData struct { IString gorm.Model Domain string `json:"domain" gorm:"unique"` Disposable bool `json:"disposable"` Webmail bool `json:"webmail"` AcceptAll bool `json:"accept_all"` Pattern string `json:"pattern"` Organization string `json:"organization"` Description string `json:"description"` Industry string `json:"industry"` Twitter string `json:"twitter"` Facebook string `json:"facebook"` Linkedin string `json:"linkedin"` Instagram string `json:"instagram"` Youtube string `json:"youtube"` Technologies []string `json:"technologies" gorm:"serializer:json"` Country string `json:"country"` State string `json:"state"` City string `json:"city"` PostalCode string `json:"postal_code"` Street string `json:"street"` Headcount string `json:"headcount"` CompanyType string `json:"company_type"` Emails []HunterEmail `json:"emails" gorm:"serializer:json"` LinkedDomains []string `json:"linked_domains" gorm:"serializer:json"` } func (h HunterDomainData) String() string { return fmt.Sprintf("Domain: %s\nDisposable: %t\nWebmail: %t\nAcceptAll: %t\nPattern: %s\nOrganization: %s\nDescription: %s\nIndustry: %s\nTwitter: %s\nFacebook: %s\nLinkedin: %s\nInstagram: %s\nYoutube: %s\nTechnologies: %v\nCountry: %s\nState: %s\nCity: %s\nPostalCode: %s\nStreet: %s\nHeadcount: %s\nCompanyType: %s\nEmails: %v\nLinkedDomains: %v\n", h.Domain, h.Disposable, h.Webmail, h.AcceptAll, h.Pattern, h.Organization, h.Description, h.Industry, h.Twitter, h.Facebook, h.Linkedin, h.Instagram, h.Youtube, h.Technologies, h.Country, h.State, h.City, h.PostalCode, h.Street, h.Headcount, h.CompanyType, h.Emails, h.LinkedDomains) } func (HunterDomainData) TableName() string { return "hunter_domain" } // HunterEmail represents an email found for the domain type HunterEmail struct { gorm.Model Domain string `json:"domain,omitempty"` Value string `json:"value" gorm:"unique"` Type string `json:"type"` Confidence int `json:"confidence"` Sources []HunterSource `json:"sources" gorm:"serializer:json"` FirstName string `json:"first_name"` LastName string `json:"last_name"` Position string `json:"position"` PositionRaw string `json:"position_raw"` Seniority string `json:"seniority"` Department string `json:"department"` Linkedin string `json:"linkedin"` Twitter string `json:"twitter"` PhoneNumber string `json:"phone_number"` Verification HunterVerification `json:"verification" gorm:"embedded;embeddedPrefix:verification_"` } func (he *HunterEmail) ToTree() *tree.Tree { emailTree := tree.Root(he.Value) emailTree.Child("Type: " + he.Type) emailTree.Child("Confidence: " + fmt.Sprintf("%d", he.Confidence)) emailTree.Child("FirstName: " + he.FirstName) emailTree.Child("LastName: " + he.LastName) emailTree.Child("Position: " + he.Position) emailTree.Child("PositionRaw: " + he.PositionRaw) emailTree.Child("Seniority: " + he.Seniority) emailTree.Child("Department: " + he.Department) emailTree.Child("Linkedin: " + he.Linkedin) emailTree.Child("Twitter: " + he.Twitter) emailTree.Child("PhoneNumber: " + he.PhoneNumber) emailTree.Child(he.Verification.ToTree()) return emailTree } func (he *HunterEmail) String() string { return fmt.Sprintf("Value: %s\nType: %s\nConfidence: %d\nSources: %v\nFirstName: %s\nLastName: %s\nPosition: %s\nPositionRaw: %s\nSeniority: %s\nDepartment: %s\nLinkedin: %s\nTwitter: %s\nPhoneNumber: %s\nVerification: %v\n", he.Value, he.Type, he.Confidence, he.Sources, he.FirstName, he.LastName, he.Position, he.PositionRaw, he.Seniority, he.Department, he.Linkedin, he.Twitter, he.PhoneNumber, he.Verification) } func (HunterEmail) TableName() string { return "hunter_email" } // HunterSource represents where an email was found type HunterSource struct { Domain string `json:"domain"` URI string `json:"uri"` ExtractedOn string `json:"extracted_on"` LastSeenOn string `json:"last_seen_on"` StillOnPage bool `json:"still_on_page"` } // HunterVerification represents the verification status of an email type HunterVerification struct { Date string `json:"date"` Status string `json:"status"` } func (hv *HunterVerification) ToTree() *tree.Tree { verificationTree := tree.Root("Verification") verificationTree.Child("Date: " + hv.Date) verificationTree.Child("Status: " + hv.Status) return verificationTree } // HunterMeta contains metadata about the API response type HunterMeta struct { Results int `json:"results"` Limit int `json:"limit"` Offset int `json:"offset"` Params HunterSearchParams `json:"params" gorm:"embedded;embeddedPrefix:params_"` } // HunterSearchParams contains the parameters used in the search type HunterSearchParams struct { Domain string `json:"domain"` Company string `json:"company"` Type string `json:"type"` Seniority string `json:"seniority"` Department string `json:"department"` } // HunterEmailFinderResponse represents the response from Hunter.io email finder API type HunterEmailFinderResponse struct { Data HunterEmailFinderData `json:"data" gorm:"embedded;embeddedPrefix:data_"` Meta EmailFinderMeta `json:"meta" gorm:"embedded;embeddedPrefix:meta_"` } // HunterEmailFinderData contains the main email information type HunterEmailFinderData struct { IString FirstName string `json:"first_name"` LastName string `json:"last_name"` Email string `json:"email"` Score int `json:"score"` Domain string `json:"domain"` AcceptAll bool `json:"accept_all"` Position string `json:"position"` Twitter string `json:"twitter"` LinkedinURL string `json:"linkedin_url"` PhoneNumber string `json:"phone_number"` Company string `json:"company"` Sources []HunterSource `json:"sources" gorm:"serializer:json"` Verification HunterVerification `json:"verification" gorm:"embedded;embeddedPrefix:verification_"` } func (he HunterEmailFinderData) String() string { return fmt.Sprintf("FirstName: %s\nLastName: %s\nEmail: %s\nScore: %d\nDomain: %s\nAcceptAll: %t\nPosition: %s\nTwitter: %s\nLinkedinURL: %s\nPhoneNumber: %s\nCompany: %s\nSources: %v\nVerification: %v\n", he.FirstName, he.LastName, he.Email, he.Score, he.Domain, he.AcceptAll, he.Position, he.Twitter, he.LinkedinURL, he.PhoneNumber, he.Company, he.Sources, he.Verification) } // EmailFinderMeta contains metadata about the API response type EmailFinderMeta struct { Params EmailFinderParams `json:"params" gorm:"embedded;embeddedPrefix:params_"` } // EmailFinderParams contains the parameters used in the search type EmailFinderParams struct { FirstName string `json:"first_name"` LastName string `json:"last_name"` FullName string `json:"full_name"` Domain string `json:"domain"` Company string `json:"company"` MaxDuration string `json:"max_duration"` } func (HunterEmailFinderResponse) TableName() string { return "hunter_email_finder" } // HunterEmailVerifyResponse represents the response from Hunter.io email verification API type HunterEmailVerifyResponse struct { Data HunterEmailVerifyData `json:"data" gorm:"embedded;embeddedPrefix:data_"` Meta EmailVerifyMeta `json:"meta" gorm:"embedded;embeddedPrefix:meta_"` } // HunterEmailVerifyData contains the email verification information type HunterEmailVerifyData struct { IString Status string `json:"status"` Result string `json:"result"` DeprecationNotice string `json:"_deprecation_notice"` Score int `json:"score"` Email string `json:"email"` Regexp bool `json:"regexp"` Gibberish bool `json:"gibberish"` Disposable bool `json:"disposable"` Webmail bool `json:"webmail"` MXRecords bool `json:"mx_records"` SMTPServer bool `json:"smtp_server"` SMTPCheck bool `json:"smtp_check"` AcceptAll bool `json:"accept_all"` Block bool `json:"block"` Sources []HunterSource `json:"sources" gorm:"serializer:json"` } func (ev HunterEmailVerifyData) String() string { return fmt.Sprintf("Status: %s\nResult: %s\nDeprecationNotice: %s\nScore: %d\nEmail: %s\nRegexp: %t\nGibberish: %t\nDisposable: %t\nWebmail: %t\nMXRecords: %t\nSMTPServer: %t\nSMTPCheck: %t\nAcceptAll: %t\nBlock: %t\nSources: %v\n", ev.Status, ev.Result, ev.DeprecationNotice, ev.Score, ev.Email, ev.Regexp, ev.Gibberish, ev.Disposable, ev.Webmail, ev.MXRecords, ev.SMTPServer, ev.SMTPCheck, ev.AcceptAll, ev.Block, ev.Sources) } // EmailVerifyMeta contains metadata about the API response type EmailVerifyMeta struct { Params EmailVerifyParams `json:"params" gorm:"embedded;embeddedPrefix:params_"` } // EmailVerifyParams contains the parameters used in the verification type EmailVerifyParams struct { Email string `json:"email"` } // HunterCompanyEnrichmentResponse represents the response from Hunter.io company enrichment API type HunterCompanyEnrichmentResponse struct { Data CompanyData `json:"data" gorm:"embedded;embeddedPrefix:data_"` Meta CompanyMeta `json:"meta" gorm:"embedded;embeddedPrefix:meta_"` } // CompanyData contains the detailed company information type CompanyData struct { IString ID string `json:"id"` Name string `json:"name"` LegalName string `json:"legalName"` Domain string `json:"domain"` DomainAliases []string `json:"domainAliases" gorm:"serializer:json"` Site CompanySite `json:"site" gorm:"embedded;embeddedPrefix:site_"` Category Category `json:"category" gorm:"embedded;embeddedPrefix:category_"` Tags []string `json:"tags" gorm:"serializer:json"` Description string `json:"description"` FoundedYear int `json:"foundedYear"` Location string `json:"location"` TimeZone string `json:"timeZone"` UTCOffset int `json:"utcOffset"` Geo Geography `json:"geo" gorm:"embedded;embeddedPrefix:geo_"` Logo string `json:"logo"` Facebook Facebook `json:"facebook" gorm:"embedded;embeddedPrefix:facebook_"` LinkedIn LinkedIn `json:"linkedin" gorm:"embedded;embeddedPrefix:linkedin_"` Twitter Twitter `json:"twitter" gorm:"embedded;embeddedPrefix:twitter_"` Crunchbase Crunchbase `json:"crunchbase" gorm:"embedded;embeddedPrefix:crunchbase_"` YouTube YouTube `json:"youtube" gorm:"embedded;embeddedPrefix:youtube_"` EmailProvider string `json:"emailProvider"` Type string `json:"type"` Ticker string `json:"ticker"` Identifiers Identifiers `json:"identifiers" gorm:"embedded;embeddedPrefix:identifiers_"` Phone string `json:"phone"` Metrics Metrics `json:"metrics" gorm:"embedded;embeddedPrefix:metrics_"` IndexedAt string `json:"indexedAt"` Tech []string `json:"tech" gorm:"serializer:json"` TechCategories []string `json:"techCategories" gorm:"serializer:json"` Parent ParentCompany `json:"parent" gorm:"embedded;embeddedPrefix:parent_"` UltimateParent ParentCompany `json:"ultimateParent" gorm:"embedded;embeddedPrefix:ultimate_parent_"` } func (cd CompanyData) String() string { return fmt.Sprintf("ID: %s\nName: %s\nLegalName: %s\nDomain: %s\nDomainAliases: %v\nSite: %v\nCategory: %v\nTags: %v\nDescription: %s\nFoundedYear: %d\nLocation: %s\nTimeZone: %s\nUTCOffset: %d\nGeo: %v\nLogo: %s\nFacebook: %v\nLinkedIn: %v\nTwitter: %v\nCrunchbase: %v\nYouTube: %v\nEmailProvider: %s\nType: %s\nTicker: %s\nIdentifiers: %v\nPhone: %s\nMetrics: %v\nIndexedAt: %s\nTech: %v\nTechCategories: %v\nParent: %v\nUltimateParent: %v\n", cd.ID, cd.Name, cd.LegalName, cd.Domain, cd.DomainAliases, cd.Site, cd.Category, cd.Tags, cd.Description, cd.FoundedYear, cd.Location, cd.TimeZone, cd.UTCOffset, cd.Geo, cd.Logo, cd.Facebook, cd.LinkedIn, cd.Twitter, cd.Crunchbase, cd.YouTube, cd.EmailProvider, cd.Type, cd.Ticker, cd.Identifiers, cd.Phone, cd.Metrics, cd.IndexedAt, cd.Tech, cd.TechCategories, cd.Parent, cd.UltimateParent) } func (cd *CompanyData) DomainAliasesTree() *tree.Tree { domainAliasesTree := tree.Root("Domain Aliases") for _, domainAlias := range cd.DomainAliases { domainAliasesTree.Child(domainAlias) } return domainAliasesTree } func (cd *CompanyData) SiteTree() *tree.Tree { siteTree := tree.Root("Site") phoneTree := tree.Root("Phone Numbers") for _, phoneNumber := range cd.Site.PhoneNumbers { phoneTree.Child(phoneNumber) } emailTree := tree.Root("Email Addresses") for _, emailAddress := range cd.Site.EmailAddresses { emailTree.Child(emailAddress) } siteTree.Child(phoneTree) siteTree.Child(emailTree) return siteTree } func (cd *CompanyData) CategoryTree() *tree.Tree { categoryTree := tree.Root("Category") categoryTree.Child("Sector: " + cd.Category.Sector) categoryTree.Child("Industry Group: " + cd.Category.IndustryGroup) categoryTree.Child("Industry: " + cd.Category.Industry) categoryTree.Child("Sub Industry: " + cd.Category.SubIndustry) categoryTree.Child("GICS Code: " + cd.Category.GICSCode) categoryTree.Child("SIC Code: " + cd.Category.SICCode) sic4CodesTree := tree.Root("SIC 4 Codes") for _, sic4Code := range cd.Category.SIC4Codes { sic4CodesTree.Child(sic4Code) } categoryTree.Child(sic4CodesTree) categoryTree.Child("NAICS Code: " + cd.Category.NAICSCode) naics6CodesTree := tree.Root("NAICS 6 Codes") for _, naics6Code := range cd.Category.NAICS6Codes { naics6CodesTree.Child(naics6Code) } categoryTree.Child(naics6CodesTree) naics6Codes2022Tree := tree.Root("NAICS 6 Codes 2022") for _, naics6Code2022 := range cd.Category.NAICS6Codes2022 { naics6Codes2022Tree.Child(naics6Code2022) } categoryTree.Child(naics6Codes2022Tree) return categoryTree } func (cd *CompanyData) GeoTree() *tree.Tree { geoTree := tree.Root("Geo") geoTree.Child("Street Number: " + cd.Geo.StreetNumber) geoTree.Child("Street Name: " + cd.Geo.StreetName) geoTree.Child("Sub Premise: " + cd.Geo.SubPremise) geoTree.Child("Street Address: " + cd.Geo.StreetAddress) geoTree.Child("City: " + cd.Geo.City) geoTree.Child("Postal Code: " + cd.Geo.PostalCode) geoTree.Child("State: " + cd.Geo.State) geoTree.Child("State Code: " + cd.Geo.StateCode) geoTree.Child("Country: " + cd.Geo.Country) geoTree.Child("Country Code: " + cd.Geo.CountryCode) geoTree.Child("Latitude: " + fmt.Sprintf("%f", cd.Geo.Lat)) geoTree.Child("Longitude: " + fmt.Sprintf("%f", cd.Geo.Lng)) return geoTree } func (cd *CompanyData) FacebookTree() *tree.Tree { facebookTree := tree.Root("Facebook") facebookTree.Child("Handle: " + cd.Facebook.Handle) facebookTree.Child("Likes: " + fmt.Sprintf("%d", cd.Facebook.Likes)) return facebookTree } func (cd *CompanyData) LinkedInTree() *tree.Tree { linkedinTree := tree.Root("LinkedIn") linkedinTree.Child("Handle: " + cd.LinkedIn.Handle) return linkedinTree } func (cd *CompanyData) TwitterTree() *tree.Tree { twitterTree := tree.Root("Twitter") twitterTree.Child("Handle: " + cd.Twitter.Handle) twitterTree.Child("ID: " + cd.Twitter.ID) twitterTree.Child("Bio: " + cd.Twitter.Bio) twitterTree.Child("Followers: " + fmt.Sprintf("%d", cd.Twitter.Followers)) twitterTree.Child("Following: " + fmt.Sprintf("%d", cd.Twitter.Following)) twitterTree.Child("Location: " + cd.Twitter.Location) twitterTree.Child("Site: " + cd.Twitter.Site) twitterTree.Child("Avatar" + cd.Twitter.Avatar) return twitterTree } func (cd *CompanyData) CrunchbaseTree() *tree.Tree { crunchbaseTree := tree.Root("Crunchbase") crunchbaseTree.Child("Handle: " + cd.Crunchbase.Handle) return crunchbaseTree } func (cd *CompanyData) YouTubeTree() *tree.Tree { youtubeTree := tree.Root("YouTube") youtubeTree.Child("Handle: " + cd.YouTube.Handle) return youtubeTree } func (cd *CompanyData) IdentifiersTree() *tree.Tree { identifiersTree := tree.Root("Identifiers") identifiersTree.Child("UsEIN: " + cd.Identifiers.UsEIN) return identifiersTree } func (cd *CompanyData) MetricsTree() *tree.Tree { metricsTree := tree.Root("Metrics") metricsTree.Child("Alexa Us Rank: " + fmt.Sprintf("%d", cd.Metrics.AlexaUsRank)) metricsTree.Child("Alexa Global Rank: " + fmt.Sprintf("%d", cd.Metrics.AlexaGlobalRank)) metricsTree.Child("Traffic Rank: " + cd.Metrics.TrafficRank) metricsTree.Child("Employees: " + cd.Metrics.Employees) metricsTree.Child("Market Cap: " + cd.Metrics.MarketCap) metricsTree.Child("Raised: " + cd.Metrics.Raised) metricsTree.Child("Annual Revenue: " + cd.Metrics.AnnualRevenue) metricsTree.Child("Estimated Annual Revenue: " + cd.Metrics.EstimatedAnnualRevenue) metricsTree.Child("Fiscal Year End: " + cd.Metrics.FiscalYearEnd) return metricsTree } func (cd *CompanyData) TagsTree() *tree.Tree { tagsTree := tree.Root("Tags") for _, tag := range cd.Tags { tagsTree.Child(tag) } return tagsTree } func (cd *CompanyData) TechTree() *tree.Tree { techTree := tree.Root("Tech") for _, tech := range cd.Tech { techTree.Child(tech) } return techTree } func (cd *CompanyData) TechCategoriesTree() *tree.Tree { techCategoriesTree := tree.Root("Tech Categories") for _, techCategory := range cd.TechCategories { techCategoriesTree.Child(techCategory) } return techCategoriesTree } func (cd *CompanyData) ParentTree() *tree.Tree { parentTree := tree.Root("Parent") parentTree.Child("Domain: " + cd.Parent.Domain) return parentTree } func (cd *CompanyData) UltimateParentTree() *tree.Tree { ultimateParentTree := tree.Root("Ultimate Parent") ultimateParentTree.Child("Domain: " + cd.UltimateParent.Domain) return ultimateParentTree } // CompanySite contains contact information from the company website type CompanySite struct { PhoneNumbers []string `json:"phoneNumbers" gorm:"serializer:json"` EmailAddresses []string `json:"emailAddresses" gorm:"serializer:json"` } // Category contains industry classification information type Category struct { Sector string `json:"sector"` IndustryGroup string `json:"industryGroup"` Industry string `json:"industry"` SubIndustry string `json:"subIndustry"` GICSCode string `json:"gicsCode"` SICCode string `json:"sicCode"` SIC4Codes []string `json:"sic4Codes" gorm:"serializer:json"` NAICSCode string `json:"naicsCode"` NAICS6Codes []string `json:"naics6Codes" gorm:"serializer:json"` NAICS6Codes2022 []string `json:"naics6Codes2022" gorm:"serializer:json"` } // Geography contains location information type Geography struct { StreetNumber string `json:"streetNumber"` StreetName string `json:"streetName"` SubPremise string `json:"subPremise"` StreetAddress string `json:"streetAddress"` City string `json:"city"` PostalCode string `json:"postalCode"` State string `json:"state"` StateCode string `json:"stateCode"` Country string `json:"country"` CountryCode string `json:"countryCode"` Lat float64 `json:"lat"` Lng float64 `json:"lng"` } // Identifiers contains company identification numbers type Identifiers struct { UsEIN string `json:"usEIN"` } // Metrics contains company performance metrics type Metrics struct { AlexaUsRank int `json:"alexaUsRank"` AlexaGlobalRank int `json:"alexaGlobalRank"` TrafficRank string `json:"trafficRank"` Employees string `json:"employees"` MarketCap string `json:"marketCap"` Raised string `json:"raised"` AnnualRevenue string `json:"annualRevenue"` EstimatedAnnualRevenue string `json:"estimatedAnnualRevenue"` FiscalYearEnd string `json:"fiscalYearEnd"` } // ParentCompany contains information about parent companies type ParentCompany struct { Domain string `json:"domain"` } // CompanyMeta contains metadata about the API response type CompanyMeta struct { Domain string `json:"domain"` } func (HunterCompanyEnrichmentResponse) TableName() string { return "hunter_company_enrichment" } // HunterPersonEnrichmentResponse represents the response from Hunter.io person enrichment API type HunterPersonEnrichmentResponse struct { Data PersonData `json:"data" gorm:"embedded;embeddedPrefix:data_"` Meta PersonMeta `json:"meta" gorm:"embedded;embeddedPrefix:meta_"` } // PersonData contains the detailed person information type PersonData struct { IString gorm.Model ID string `json:"id"` Name PersonName `json:"name" gorm:"embedded;embeddedPrefix:name_"` Email string `json:"email" gorm:"unique"` Location string `json:"location"` TimeZone string `json:"timeZone"` UTCOffset int `json:"utcOffset"` Geo PersonGeo `json:"geo" gorm:"embedded;embeddedPrefix:geo_"` Bio string `json:"bio"` Site string `json:"site"` Avatar string `json:"avatar"` Employment Employment `json:"employment" gorm:"embedded;embeddedPrefix:employment_"` Facebook Facebook `json:"facebook" gorm:"embedded;embeddedPrefix:facebook_"` GitHub GitHub `json:"github" gorm:"embedded;embeddedPrefix:github_"` Twitter Twitter `json:"twitter" gorm:"embedded;embeddedPrefix:twitter_"` LinkedIn LinkedIn `json:"linkedin" gorm:"embedded;embeddedPrefix:linkedin_"` GooglePlus GooglePlus `json:"googleplus" gorm:"embedded;embeddedPrefix:googleplus_"` Gravatar Gravatar `json:"gravatar" gorm:"embedded;embeddedPrefix:gravatar_"` Fuzzy bool `json:"fuzzy"` EmailProvider string `json:"emailProvider"` IndexedAt string `json:"indexedAt"` Phone string `json:"phone"` ActiveAt string `json:"activeAt"` InactiveAt string `json:"inactiveAt"` } func (pd PersonData) String() string { return fmt.Sprintf("ID: %s\nName: %v\nEmail: %s\nLocation: %s\nTimeZone: %s\nUTCOffset: %d\nGeo: %v\nBio: %s\nSite: %s\nAvatar: %s\nEmployment: %v\nFacebook: %v\nGitHub: %v\nTwitter: %v\nLinkedIn: %v\nGooglePlus: %v\nGravatar: %v\nFuzzy: %t\nEmailProvider: %s\nIndexedAt: %s\nPhone: %s\nActiveAt: %s\nInactiveAt: %s\n", pd.ID, pd.Name, pd.Email, pd.Location, pd.TimeZone, pd.UTCOffset, pd.Geo, pd.Bio, pd.Site, pd.Avatar, pd.Employment, pd.Facebook, pd.GitHub, pd.Twitter, pd.LinkedIn, pd.GooglePlus, pd.Gravatar, pd.Fuzzy, pd.EmailProvider, pd.IndexedAt, pd.Phone, pd.ActiveAt, pd.InactiveAt) } func (pd *PersonData) NameTree() *tree.Tree { nameTree := tree.Root("Name") nameTree.Child("Full Name: " + pd.Name.FullName) nameTree.Child("Given Name: " + pd.Name.GivenName) nameTree.Child("Family Name: " + pd.Name.FamilyName) return nameTree } func (pd *PersonData) GeoTree() *tree.Tree { geoTree := tree.Root("Geo") geoTree.Child("City: " + pd.Geo.City) geoTree.Child("State: " + pd.Geo.State) geoTree.Child("State Code: " + pd.Geo.StateCode) geoTree.Child("Country: " + pd.Geo.Country) geoTree.Child("Country Code: " + pd.Geo.CountryCode) geoTree.Child("Latitude: " + fmt.Sprintf("%f", pd.Geo.Lat)) geoTree.Child("Longitude: " + fmt.Sprintf("%f", pd.Geo.Lng)) return geoTree } func (pd *PersonData) EmploymentTree() *tree.Tree { employmentTree := tree.Root("Employment") employmentTree.Child("Domain: " + pd.Employment.Domain) employmentTree.Child("Name: " + pd.Employment.Name) employmentTree.Child("Title: " + pd.Employment.Title) employmentTree.Child("Role: " + pd.Employment.Role) employmentTree.Child("Sub Role: " + pd.Employment.SubRole) employmentTree.Child("Seniority: " + pd.Employment.Seniority) return employmentTree } func (pd *PersonData) FacebookTree() *tree.Tree { facebookTree := tree.Root("Facebook") facebookTree.Child("Handle: " + pd.Facebook.Handle) facebookTree.Child("Likes: " + fmt.Sprintf("%d", pd.Facebook.Likes)) return facebookTree } func (pd *PersonData) GitHubTree() *tree.Tree { githubTree := tree.Root("GitHub") githubTree.Child("Handle: " + pd.GitHub.Handle) githubTree.Child("ID: " + pd.GitHub.ID) githubTree.Child("Avatar: " + pd.GitHub.Avatar) githubTree.Child("Company: " + pd.GitHub.Company) githubTree.Child("Blog: " + pd.GitHub.Blog) githubTree.Child("Followers: " + fmt.Sprintf("%d", pd.GitHub.Followers)) githubTree.Child("Following: " + fmt.Sprintf("%d", pd.GitHub.Following)) return githubTree } func (pd *PersonData) TwitterTree() *tree.Tree { twitterTree := tree.Root("Twitter") twitterTree.Child("Handle: " + pd.Twitter.Handle) twitterTree.Child("ID: " + pd.Twitter.ID) twitterTree.Child("Bio: " + pd.Twitter.Bio) twitterTree.Child("Followers: " + fmt.Sprintf("%d", pd.Twitter.Followers)) twitterTree.Child("Following: " + fmt.Sprintf("%d", pd.Twitter.Following)) twitterTree.Child("Location: " + pd.Twitter.Location) twitterTree.Child("Site: " + pd.Twitter.Site) twitterTree.Child("Avatar: " + pd.Twitter.Avatar) return twitterTree } func (pd *PersonData) LinkedInTree() *tree.Tree { linkedinTree := tree.Root("LinkedIn") linkedinTree.Child("Handle: " + pd.LinkedIn.Handle) return linkedinTree } func (pd *PersonData) GooglePlusTree() *tree.Tree { googlePlusTree := tree.Root("GooglePlus") googlePlusTree.Child("Handle: " + pd.GooglePlus.Handle) return googlePlusTree } func (pd *PersonData) GravatarTree() *tree.Tree { gravatarTree := tree.Root("Gravatar") gravatarTree.Child("Handle: " + pd.Gravatar.Handle) gravatarTree.Child("Avatar: " + pd.Gravatar.Avatar) return gravatarTree } func (PersonData) TableName() string { return "person" } // PersonName contains the person's name components type PersonName struct { FullName string `json:"fullName"` GivenName string `json:"givenName"` FamilyName string `json:"familyName"` } // PersonGeo contains location information for a person type PersonGeo struct { City string `json:"city"` State string `json:"state"` StateCode string `json:"stateCode"` Country string `json:"country"` CountryCode string `json:"countryCode"` Lat float64 `json:"lat"` Lng float64 `json:"lng"` } // Employment contains employment information type Employment struct { Domain string `json:"domain"` Name string `json:"name"` Title string `json:"title"` Role string `json:"role"` SubRole string `json:"subRole"` Seniority string `json:"seniority"` } // GitHub contains GitHub profile information type GitHub struct { gorm.Model Handle string `json:"handle"` ID string `json:"id"` Avatar string `json:"avatar"` Company string `json:"company"` Blog string `json:"blog"` Followers int `json:"followers"` Following int `json:"following"` PersonID int `json:"person_id,omitempty"` } // GooglePlus contains Google+ profile information type GooglePlus struct { Handle string `json:"handle"` PersonID int `json:"person_id,omitempty"` } // Gravatar contains Gravatar profile information type Gravatar struct { gorm.Model Handle string `json:"handle"` URLs []string `json:"urls" gorm:"serializer:json"` Avatar string `json:"avatar"` Avatars []string `json:"avatars" gorm:"serializer:json"` PersonID int `json:"person_id,omitempty"` } // Facebook contains Facebook profile information type Facebook struct { Handle string `json:"handle"` Likes int `json:"likes"` } // LinkedIn contains LinkedIn profile information type LinkedIn struct { Handle string `json:"handle"` } // Twitter contains Twitter profile information type Twitter struct { Handle string `json:"handle"` ID string `json:"id"` Bio string `json:"bio"` Followers int `json:"followers"` Following int `json:"following"` Location string `json:"location"` Site string `json:"site"` Avatar string `json:"avatar"` } // Crunchbase contains Crunchbase profile information type Crunchbase struct { Handle string `json:"handle"` } // YouTube contains YouTube profile information type YouTube struct { Handle string `json:"handle"` } // PersonMeta contains metadata about the API response type PersonMeta struct { Email string `json:"email"` } // HunterCombinedEnrichmentResponse represents the response from Hunter.io combined enrichment API type HunterCombinedEnrichmentResponse struct { Data CombinedData `json:"data" gorm:"embedded;embeddedPrefix:data_"` Meta CombinedMeta `json:"meta" gorm:"embedded;embeddedPrefix:meta_"` } // CombinedData contains both person and company information type CombinedData struct { IString Person PersonData `json:"person" gorm:"embedded;embeddedPrefix:person_"` Company CompanyData `json:"company" gorm:"embedded;embeddedPrefix:company_"` } func (cbd CombinedData) String() string { return fmt.Sprintf("Person: %s\nCompany: %s", cbd.Person.String(), cbd.Company.String()) } // CombinedMeta contains metadata about the API response type CombinedMeta struct { Email string `json:"email"` } // String returns a string representation of the combined enrichment response func (c *HunterCombinedEnrichmentResponse) String() string { return fmt.Sprintf("Person:\n%s\n\nCompany:\n%s", c.Data.Person.String(), c.Data.Company.String()) }