diff --git a/cmd/hunter.go b/cmd/hunter.go index a024547..af3fb7d 100644 --- a/cmd/hunter.go +++ b/cmd/hunter.go @@ -113,7 +113,7 @@ var ( // Write Hunter.io Domain Search Result to file fmt.Printf("[*] Writing Hunter.io Domain Search Result to file: %s%s\n", hunterOutputFile, fType.Extension()) - err = export.WriteHunterDomainToFile(result, hunterOutputFile, fType) + err = export.WriteIStringToFile(result, hunterOutputFile, fType) if err != nil { if debugGlobal { debug.PrintInfo("failed to write hunter domain search to file") @@ -150,7 +150,7 @@ var ( // Write Hunter.io Email Finder Result to file fmt.Printf("[*] Writing Hunter.io Email Finder Result to file: %s%s\n", hunterOutputFile, fType.Extension()) - err = export.WriteHunterEmailToFile(result, hunterOutputFile, fType) + err = export.WriteIStringToFile(result, hunterOutputFile, fType) if err != nil { if debugGlobal { debug.PrintInfo("failed to write hunter email find to file") @@ -206,7 +206,7 @@ var ( } // Write Hunter.io Email Verification Result to file fmt.Printf("[*] Writing Hunter.io Email Verification Result to file: %s%s\n", hunterOutputFile, fType.Extension()) - err = export.WriteHunterEmailVerifyToFile(result, hunterOutputFile, fType) + err = export.WriteIStringToFile(result, hunterOutputFile, fType) if err != nil { if debugGlobal { debug.PrintInfo("failed to write hunter email verification to file") @@ -264,7 +264,7 @@ var ( // Write to file fmt.Printf("[*] Writing Hunter.io Company Enrichment Result to file: %s%s\n", hunterOutputFile, fType.Extension()) - err = export.WriteHunterCompanyEnrichmentToFile(result, hunterOutputFile, fType) + err = export.WriteIStringToFile(result, hunterOutputFile, fType) if err != nil { if debugGlobal { debug.PrintInfo("failed to write hunter company enrichment to file") @@ -302,7 +302,7 @@ var ( // Write to file fmt.Printf("[*] Writing Hunter.io Person Enrichment Result to file: %s%s\n", hunterOutputFile, fType.Extension()) - err = export.WriteHunterPersonEnrichmentToFile(result, hunterOutputFile, fType) + err = export.WriteIStringToFile(result, hunterOutputFile, fType) if err != nil { if debugGlobal { debug.PrintInfo("failed to write hunter person enrichment to file") @@ -339,7 +339,7 @@ var ( // Write to file fmt.Printf("[*] Writing Hunter.io Combined Enrichment Result to file: %s%s\n", hunterOutputFile, fType.Extension()) - err = export.WriteHunterCombinedEnrichmentToFile(result, hunterOutputFile, fType) + err = export.WriteIStringToFile(result, hunterOutputFile, fType) if err != nil { if debugGlobal { debug.PrintInfo("failed to write hunter combined enrichment to file") diff --git a/internal/export/export.go b/internal/export/dehashed.go similarity index 100% rename from internal/export/export.go rename to internal/export/dehashed.go diff --git a/internal/export/hunter.go b/internal/export/hunter.go deleted file mode 100644 index 8c191c0..0000000 --- a/internal/export/hunter.go +++ /dev/null @@ -1,161 +0,0 @@ -package export - -import ( - "crowsnest/internal/files" - "crowsnest/internal/sqlite" - "encoding/json" - "encoding/xml" - "fmt" - "gopkg.in/yaml.v3" - "os" -) - -func WriteHunterDomainToFile(result sqlite.HunterDomainData, outputFile string, fileType files.FileType) error { - var data []byte - var err error - - switch fileType { - case files.JSON: - data, err = json.MarshalIndent(result, "", " ") - case files.XML: - data, err = xml.MarshalIndent(result, "", " ") - case files.YAML: - data, err = yaml.Marshal(result) - case files.TEXT: - data = []byte(result.String()) - default: - return err - } - - if err != nil { - return err - } - - filePath := fmt.Sprintf("%s.%s", outputFile, fileType.String()) - return os.WriteFile(filePath, data, 0644) -} - -func WriteHunterEmailToFile(result sqlite.HunterEmailFinderData, outputFile string, fileType files.FileType) error { - var data []byte - var err error - - switch fileType { - case files.JSON: - data, err = json.MarshalIndent(result, "", " ") - case files.XML: - data, err = xml.MarshalIndent(result, "", " ") - case files.YAML: - data, err = yaml.Marshal(result) - case files.TEXT: - data = []byte(result.String()) - default: - return err - } - - if err != nil { - return err - } - - filePath := fmt.Sprintf("%s.%s", outputFile, fileType.String()) - return os.WriteFile(filePath, data, 0644) -} - -func WriteHunterEmailVerifyToFile(result sqlite.HunterEmailVerifyData, outputFile string, fileType files.FileType) error { - var data []byte - var err error - - switch fileType { - case files.JSON: - data, err = json.MarshalIndent(result, "", " ") - case files.XML: - data, err = xml.MarshalIndent(result, "", " ") - case files.YAML: - data, err = yaml.Marshal(result) - case files.TEXT: - data = []byte(result.String()) - default: - return err - } - - if err != nil { - return err - } - - filePath := fmt.Sprintf("%s.%s", outputFile, fileType.String()) - return os.WriteFile(filePath, data, 0644) -} - -func WriteHunterCompanyEnrichmentToFile(result sqlite.CompanyData, outputFile string, fileType files.FileType) error { - var data []byte - var err error - - switch fileType { - case files.JSON: - data, err = json.MarshalIndent(result, "", " ") - case files.XML: - data, err = xml.MarshalIndent(result, "", " ") - case files.YAML: - data, err = yaml.Marshal(result) - case files.TEXT: - data = []byte(result.String()) - default: - return err - } - - if err != nil { - return err - } - - filePath := fmt.Sprintf("%s.%s", outputFile, fileType.String()) - return os.WriteFile(filePath, data, 0644) -} - -func WriteHunterPersonEnrichmentToFile(result sqlite.PersonData, outputFile string, fileType files.FileType) error { - var data []byte - var err error - - switch fileType { - case files.JSON: - data, err = json.MarshalIndent(result, "", " ") - case files.XML: - data, err = xml.MarshalIndent(result, "", " ") - case files.YAML: - data, err = yaml.Marshal(result) - case files.TEXT: - data = []byte(result.String()) - default: - return err - } - - if err != nil { - return err - } - - filePath := fmt.Sprintf("%s.%s", outputFile, fileType.String()) - return os.WriteFile(filePath, data, 0644) -} - -func WriteHunterCombinedEnrichmentToFile(result sqlite.CombinedData, outputFile string, fileType files.FileType) error { - var data []byte - var err error - - switch fileType { - case files.JSON: - data, err = json.MarshalIndent(result, "", " ") - case files.XML: - data, err = xml.MarshalIndent(result, "", " ") - case files.YAML: - data, err = yaml.Marshal(result) - case files.TEXT: - data = []byte(result.String()) - default: - return err - } - - if err != nil { - return err - } - - filePath := fmt.Sprintf("%s.%s", outputFile, fileType.String()) - return os.WriteFile(filePath, data, 0644) -} diff --git a/internal/export/iString.go b/internal/export/iString.go new file mode 100644 index 0000000..809b26a --- /dev/null +++ b/internal/export/iString.go @@ -0,0 +1,36 @@ +package export + +import ( + "crowsnest/internal/files" + "crowsnest/internal/sqlite" + "encoding/json" + "encoding/xml" + "fmt" + "gopkg.in/yaml.v3" + "os" +) + +func WriteIStringToFile(iString sqlite.IString, outputFile string, fileType files.FileType) error { + var data []byte + var err error + + switch fileType { + case files.JSON: + data, err = json.MarshalIndent(iString, "", " ") + case files.XML: + data, err = xml.MarshalIndent(iString, "", " ") + case files.YAML: + data, err = yaml.Marshal(iString) + case files.TEXT: + data = []byte(iString.String()) + default: + return err + } + + if err != nil { + return err + } + + filePath := fmt.Sprintf("%s.%s", outputFile, fileType.String()) + return os.WriteFile(filePath, data, 0644) +} diff --git a/internal/sqlite/hunter.io.go b/internal/sqlite/hunter.io.go index f78a0ed..9da19f1 100644 --- a/internal/sqlite/hunter.io.go +++ b/internal/sqlite/hunter.io.go @@ -14,6 +14,7 @@ type HunterDomainSearchResult struct { // HunterDomainData contains the main domain information type HunterDomainData struct { + IString gorm.Model Domain string `json:"domain" gorm:"unique"` Disposable bool `json:"disposable"` @@ -40,7 +41,7 @@ type HunterDomainData struct { LinkedDomains []string `json:"linked_domains" gorm:"serializer:json"` } -func (h *HunterDomainData) String() string { +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) } @@ -142,6 +143,7 @@ type HunterEmailFinderResponse struct { // HunterEmailFinderData contains the main email information type HunterEmailFinderData struct { + IString FirstName string `json:"first_name"` LastName string `json:"last_name"` Email string `json:"email"` @@ -157,7 +159,7 @@ type HunterEmailFinderData struct { Verification HunterVerification `json:"verification" gorm:"embedded;embeddedPrefix:verification_"` } -func (he *HunterEmailFinderData) String() string { +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) } @@ -189,6 +191,7 @@ type HunterEmailVerifyResponse struct { // HunterEmailVerifyData contains the email verification information type HunterEmailVerifyData struct { + IString Status string `json:"status"` Result string `json:"result"` DeprecationNotice string `json:"_deprecation_notice"` @@ -206,7 +209,7 @@ type HunterEmailVerifyData struct { Sources []HunterSource `json:"sources" gorm:"serializer:json"` } -func (ev *HunterEmailVerifyData) String() string { +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) } @@ -229,6 +232,7 @@ type HunterCompanyEnrichmentResponse struct { // CompanyData contains the detailed company information type CompanyData struct { + IString ID string `json:"id"` Name string `json:"name"` LegalName string `json:"legalName"` @@ -262,7 +266,7 @@ type CompanyData struct { UltimateParent ParentCompany `json:"ultimateParent" gorm:"embedded;embeddedPrefix:ultimate_parent_"` } -func (cd *CompanyData) String() string { +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) } @@ -508,6 +512,7 @@ type HunterPersonEnrichmentResponse struct { // PersonData contains the detailed person information type PersonData struct { + IString gorm.Model ID string `json:"id"` Name PersonName `json:"name" gorm:"embedded;embeddedPrefix:name_"` @@ -534,7 +539,7 @@ type PersonData struct { InactiveAt string `json:"inactiveAt"` } -func (pd *PersonData) String() string { +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) } @@ -728,11 +733,12 @@ type HunterCombinedEnrichmentResponse struct { // 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 { +func (cbd CombinedData) String() string { return fmt.Sprintf("Person: %s\nCompany: %s", cbd.Person.String(), cbd.Company.String())