1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const dotenv_1 = __importDefault(require("dotenv"));
7dotenv_1.default.config();
8const node_fetch_1 = __importDefault(require("node-fetch"));
9const apify_1 = require("apify");
10const utils_1 = require("./utils");
11const types_1 = require("./types");
12(async () => {
13 try {
14 await apify_1.Actor.init();
15 const { domain, apiKey, limit, offset, type, seniorityLevels, departments, requiredFields, } = await getActorInput();
16 const API_ENDPOINT = `https://api.hunter.io/v2/domain-search?api_key=${apiKey}`;
17 const baseUrl = buildBaseUrl(API_ENDPOINT, domain, limit, offset, type, seniorityLevels, departments, requiredFields);
18 const data = await fetchEmailData(baseUrl);
19 if (!data?.emails?.length)
20 apify_1.log.info(`No emails found for ${domain}`);
21 if (data.emails.length)
22 await logAndSaveData(domain, data);
23
24 await (0, utils_1.delay)(100);
25 }
26 catch (err) {
27 apify_1.log.error(err.message);
28 }
29 finally {
30 await apify_1.Actor.exit();
31 }
32})();
33const getActorInput = async () => {
34 const input = await apify_1.Actor.getInput();
35 const { domain, api_key: apiKey, limit, offset, type, } = input;
36 if (!apiKey)
37 throw new Error("No API key supplied!");
38 if (!domain)
39 throw new Error("No domain or company provided!");
40 return {
41 domain,
42 apiKey,
43 limit,
44 offset,
45 type,
46 seniorityLevels: (0, utils_1.getEnumVal)(types_1.Seniority, input),
47 departments: (0, utils_1.getEnumVal)(types_1.Departments, input),
48 requiredFields: (0, utils_1.getEnumVal)(types_1.RequiredFields, input),
49 };
50};
51const fetchEmailData = async (baseUrl) => {
52 const response = await (0, node_fetch_1.default)(baseUrl);
53 if (!response.ok) {
54 throw new Error(`HTTP error! status: ${response.status}`);
55 }
56 const jsonResponse = await response.json();
57 const { data } = jsonResponse;
58 return data;
59};
60const logAndSaveData = async (domain, data) => {
61 const emailCount = data.emails.length;
62 apify_1.log.info(`Found ${emailCount} emails for ${domain}`);
63 await saveResults(domain, data);
64};
65function buildBaseUrl(endpoint, domain, limit, offset, type, seniorityLevels, departments, requiredFields) {
66 const url = new URL(endpoint);
67 if ((0, utils_1.isNumeric)(limit))
68 url.searchParams.append("limit", limit);
69 if ((0, utils_1.isNumeric)(offset))
70 url.searchParams.append("offset", offset);
71 if (type === "personal" || type === "generic")
72 url.searchParams.append("type", type);
73 if (seniorityLevels.length)
74 url.searchParams.append("seniority", seniorityLevels.join());
75 if (departments.length)
76 url.searchParams.append("department", departments.join());
77 if (requiredFields.length)
78 url.searchParams.append("required_field", requiredFields.join());
79
80 const isDomainProvided = (0, utils_1.isDomain)(domain);
81 if (isDomainProvided)
82 url.searchParams.append("domain", domain);
83 if (!isDomainProvided)
84 url.searchParams.append("company", domain);
85 return url.toString();
86}
87async function saveResults(domain, data) {
88 for (const email of data.emails) {
89 await apify_1.Actor.pushData(Object.assign({ domain }, email));
90 }
91}