/src/MessageManagement/Api/Resource/Reports.php

https://gitlab.com/Blueprint-Marketing/dyn-php · PHP · 710 lines · 366 code · 85 blank · 259 comment · 74 complexity · 1e74d10eb1c5cd82015096312fc74b04 MD5 · raw file

  1. <?php
  2. namespace Dyn\MessageManagement\Api\Resource;
  3. use InvalidArgumentException;
  4. use DateTime;
  5. class Reports extends AbstractResource
  6. {
  7. /**
  8. * Build a params array from optional report values
  9. *
  10. * @param null|DateTime|string $startDate Optional start date
  11. * @param null|DateTime|string $endDate Optional end date
  12. * @param null|string $sender Optional sender email address
  13. * @param null|array $xHeaders Optional array of X-Header values
  14. * @return array
  15. */
  16. protected function buildBasicParams($startDate = null, $endDate = null, $sender = null, $xHeaders = null)
  17. {
  18. $params = array();
  19. // optional start date
  20. if ($startDate) {
  21. if (!($startDate instanceof DateTime)) {
  22. $startDate = new DateTime($startDate);
  23. }
  24. $params['starttime'] = $startDate->format(DateTime::ISO8601);
  25. }
  26. // add optional end date
  27. if ($endDate) {
  28. if (!($endDate instanceof DateTime)) {
  29. $endDate = new DateTime($endDate);
  30. }
  31. $params['endtime'] = $endDate->format(DateTime::ISO8601);
  32. }
  33. // filter by sender (email address)
  34. if ($sender) {
  35. if (filter_var($sender, FILTER_VALIDATE_EMAIL) === false) {
  36. throw new InvalidArgumentException(
  37. 'Invalid email address supplied for sender parameter'
  38. );
  39. }
  40. $params['sender'] = $sender;
  41. }
  42. // filter by X-Header value
  43. if ($xHeaders) {
  44. if (!is_array($xHeaders)) {
  45. throw new InvalidArgumentException(
  46. 'Invalid X-Headers parameter supplied'
  47. );
  48. }
  49. $params = array_merge($params, $xHeaders);
  50. }
  51. return $params;
  52. }
  53. /**
  54. * Returns the total number of emails sent through the specified account
  55. * for the specified date range, optionally filtered by sender.
  56. *
  57. * @param null|DateTime|string $startDate Optional start date
  58. * @param null|DateTime|string $endDate Optional end date
  59. * @param null|string $sender Optional sender email address
  60. * @param null|array $xHeaders Optional array of X-Header values
  61. * @return integer
  62. */
  63. public function getSentCount($startDate = null, $endDate = null, $sender = null, $xHeaders = null)
  64. {
  65. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  66. $result = $this->getApiClient()->get('/reports/sent/count', $params);
  67. if ($result && $result->isOk()) {
  68. return (int)$result->data->count;
  69. }
  70. return false;
  71. }
  72. /**
  73. * Returns a list of all emails sent through the specified account for the
  74. * specified date range, optionally filtered by start/end date, sender
  75. * and X-Headers. Including a date range is recommended.
  76. *
  77. * Returns a maximum of 500 email addresses at a time. If the total sent
  78. * (as returned by getSentCount()) is more than 500, use the start index
  79. * parameter and multiple API calls to retrieve all the results.
  80. *
  81. * @param integer $startIndex Optional start index
  82. * @param null|DateTime|string $startDate Optional start date
  83. * @param null|DateTime|string $endDate Optional end date
  84. * @param null|string $sender Optional sender email address
  85. * @param null|array $xHeaders Optional array of X-Header values
  86. * @return array|false
  87. */
  88. public function getSent($startIndex = 0, $startDate = null, $endDate = null, $sender = null, $xHeaders = null)
  89. {
  90. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  91. if ($startIndex) {
  92. $params['startindex'] = $startIndex;
  93. }
  94. $result = $this->getApiClient()->get('/reports/sent', $params);
  95. if ($result && $result->isOk()) {
  96. // TODO parse the result into objects?
  97. return $result->data;
  98. }
  99. return false;
  100. }
  101. /**
  102. * Returns total number of successfully delivered emails, optionally filtered
  103. * by date range, sender and X-Headers. Including a date range is recommended.
  104. *
  105. * @param null|DateTime|string $startDate Optional start date
  106. * @param null|DateTime|string $endDate Optional end date
  107. * @param null|string $sender Optional sender email address
  108. * @param null|array $xHeaders Optional array of X-Header values
  109. * @return integer
  110. */
  111. public function getDeliveredCount($startDate = null, $endDate = null, $sender = null, $xHeaders = null)
  112. {
  113. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  114. $result = $this->getApiClient()->get('/reports/delivered/count', $params);
  115. if ($result && $result->isOk()) {
  116. return (int)$result->data->count;
  117. }
  118. return false;
  119. }
  120. /**
  121. * Returns a list of all successfully delivered emails, optionally filtered
  122. * by date range, sender and X-Headers. Including a date range is recommended.
  123. *
  124. * Returns a maximum of 500 results at a time. If the total sent (as
  125. * returned by getDeliveredCount()) is more than 500, use the start index
  126. * parameter and multiple API calls to retrieve all the results.
  127. *
  128. * @param integer $startIndex Optional start index
  129. * @param null|DateTime|string $startDate Optional start date
  130. * @param null|DateTime|string $endDate Optional end date
  131. * @param null|string $sender Optional sender email address
  132. * @param null|array $xHeaders Optional array of X-Header values
  133. * @return array|false
  134. */
  135. public function getDelivered($startIndex = 0, $startDate = null, $endDate = null, $sender = null, $xHeaders = null)
  136. {
  137. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  138. if ($startIndex) {
  139. $params['startindex'] = $startIndex;
  140. }
  141. $result = $this->getApiClient()->get('/reports/delivered', $params);
  142. if ($result && $result->isOk()) {
  143. // TODO parse the result into objects?
  144. return $result->data;
  145. }
  146. return false;
  147. }
  148. /**
  149. * Get the count of various bounce types, optionally filtered by date,
  150. * sender, and X-Header value.
  151. *
  152. * Returns a stdClass object with the following properties:
  153. * count
  154. * totalcount
  155. * hardbouncecount
  156. * softbouncecount
  157. * prevhardbouncecount
  158. *
  159. * @param null|DateTime|string $startDate Optional start date
  160. * @param null|DateTime|string $endDate Optional end date
  161. * @param null|string $sender Optional sender email address
  162. * @param null|array $xHeaders Optional array of X-Header values
  163. * @return stdClass
  164. */
  165. public function getBouncesCount($startDate = null, $endDate = null, $sender = null, $xHeaders = null)
  166. {
  167. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  168. $result = $this->getApiClient()->get('/reports/bounces/count', $params);
  169. if ($result && $result->isOk()) {
  170. return $result->data;
  171. }
  172. return false;
  173. }
  174. /**
  175. * Returns a list of email bounces, optionally filtered by date range,
  176. * and/or various other parameters. Including a date range is recommended.
  177. *
  178. * Returns a maximum of 500 results at a time. If the total (as
  179. * returned by getBouncesCount()) is more than 500, use the start index
  180. * parameter and multiple API calls to retrieve all the results.
  181. *
  182. * @param integer $startIndex
  183. * @param null|DateTime|string $startDate
  184. * @param null|DateTime|string $endDate
  185. * @param null|string $sender
  186. * @param null|string $emailAddress
  187. * @param null|string $bounceType
  188. * @param null|boolean $noHeaders
  189. * @param null|array $xHeaders
  190. * @return stdClass
  191. */
  192. public function getBounces(
  193. $startIndex = 0,
  194. $startDate = null,
  195. $endDate = null,
  196. $sender = null,
  197. $emailAddress = null,
  198. $bounceType = null,
  199. $noHeaders = null,
  200. $xHeaders = null
  201. ) {
  202. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  203. if ($startIndex) {
  204. $params['startindex'] = $startIndex;
  205. }
  206. if ($emailAddress) {
  207. $params['emailaddress'] = $emailAddress;
  208. }
  209. if ($bounceType) {
  210. $validBounceTypes = array(
  211. 'hard', 'soft', 'suppressed', 'previouslyhardbounced',
  212. 'previouslycomplained'
  213. );
  214. if (!in_array($bounceType, $validBounceTypes)) {
  215. throw new InvalidArgumentException(
  216. "Invalid value '" . htmlspecialchars($bounceType) . "'
  217. specified for bounce type. Must be one of: " .
  218. implode(', ', $validBounceTypes)
  219. );
  220. }
  221. $params['bouncetype'] = $bounceType;
  222. }
  223. if ($noHeaders !== null) {
  224. $params['noheaders'] = $noHeaders ? '1' : '0';
  225. }
  226. $result = $this->getApiClient()->get('/reports/bounces', $params);
  227. if ($result && $result->isOk()) {
  228. // TODO parse the result into objects?
  229. return $result->data;
  230. }
  231. return false;
  232. }
  233. /**
  234. * Get the count of spam complaints, optionally filtered by date, sender
  235. * and X-Header value.
  236. *
  237. * Returns a stdClass object with the following properties:
  238. * count
  239. * totalcount
  240. * complaintcount
  241. * prevcomplaintcount
  242. *
  243. * @param null|DateTime|string $startDate Optional start date
  244. * @param null|DateTime|string $endDate Optional end date
  245. * @param null|string $sender Optional sender email address
  246. * @param null|array $xHeaders Optional array of X-Header values
  247. * @return stdClass
  248. */
  249. public function getComplaintsCount(
  250. $startDate = null,
  251. $endDate = null,
  252. $sender = null,
  253. $xHeaders = null
  254. ) {
  255. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  256. $result = $this->getApiClient()->get('/reports/complaints/count', $params);
  257. if ($result && $result->isOk()) {
  258. return $result->data;
  259. }
  260. return false;
  261. }
  262. /**
  263. * Returns a list of spam complaints, optionally filtered by date range,
  264. * sender and X-Headers. Including a date range is recommended.
  265. *
  266. * Returns a maximum of 500 results at a time. If the total sent (as
  267. * returned by getComplaintsCount()) is more than 500, use the start index
  268. * parameter and multiple API calls to retrieve all the results.
  269. *
  270. * @param integer $startIndex Optional start index
  271. * @param null|DateTime|string $startDate Optional start date
  272. * @param null|DateTime|string $endDate Optional end date
  273. * @param null|string $sender Optional sender email address
  274. * @param null|array $xHeaders Optional array of X-Header values
  275. * @return array|false
  276. */
  277. public function getComplaints(
  278. $startIndex = 0,
  279. $startDate = null,
  280. $endDate = null,
  281. $sender = null,
  282. $xHeaders = null
  283. ) {
  284. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  285. if ($startIndex) {
  286. $params['startindex'] = $startIndex;
  287. }
  288. $result = $this->getApiClient()->get('/reports/complaints', $params);
  289. if ($result && $result->isOk()) {
  290. // TODO parse the result into objects?
  291. return $result->data;
  292. }
  293. return false;
  294. }
  295. /**
  296. * Get the count of issues, optionally filtered by date.
  297. *
  298. * @param null|DateTime|string $startDate Optional start date
  299. * @param null|DateTime|string $endDate Optional end date
  300. * @return stdClass
  301. */
  302. public function getIssuesCount($startDate = null, $endDate = null)
  303. {
  304. $params = $this->buildBasicParams($startDate, $endDate);
  305. $result = $this->getApiClient()->get('/reports/issues/count', $params);
  306. if ($result && $result->isOk()) {
  307. return $result->data;
  308. }
  309. return false;
  310. }
  311. /**
  312. * Returns a list of issues, optionally filtered by date range. Including
  313. * a date range is recommended.
  314. *
  315. * Returns a maximum of 500 results at a time. If the total sent (as
  316. * returned by getIssuesCount()) is more than 500, use the start index
  317. * parameter and multiple API calls to retrieve all the results.
  318. *
  319. * @param integer $startIndex Optional start index
  320. * @param null|DateTime|string $startDate Optional start date
  321. * @param null|DateTime|string $endDate Optional end date
  322. * @return array|false
  323. */
  324. public function getIssues($startIndex = 0, $startDate = null, $endDate = null)
  325. {
  326. $params = $this->buildBasicParams($startDate, $endDate);
  327. if ($startIndex) {
  328. $params['startindex'] = $startIndex;
  329. }
  330. $result = $this->getApiClient()->get('/reports/issues', $params);
  331. if ($result && $result->isOk()) {
  332. // TODO parse the result into objects?
  333. return $result->data;
  334. }
  335. return false;
  336. }
  337. /**
  338. * Get the open count, optionally filtered by date range and/or various
  339. * other parameters. Including a date range is recommended.
  340. *
  341. * @param null|DateTime|string $startDate Optional start date
  342. * @param null|DateTime|string $endDate Optional end date
  343. * @return stdClass
  344. */
  345. public function getOpensCount(
  346. $startDate = null,
  347. $endDate = null,
  348. $sender = null,
  349. $domain = null,
  350. $recipient = null,
  351. $xHeaders = null
  352. ) {
  353. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  354. if ($domain) {
  355. $params['domain'] = $domain;
  356. }
  357. if ($recipient) {
  358. $params['recipient'];
  359. }
  360. $result = $this->getApiClient()->get('/reports/opens/count', $params);
  361. if ($result && $result->isOk()) {
  362. return $result->data;
  363. }
  364. return false;
  365. }
  366. /**
  367. * Returns a list of opens, optionally filtered by date range and/or
  368. * various other parameters. Including a date range is recommended.
  369. *
  370. * Returns a maximum of 500 results at a time. If the total sent (as
  371. * returned by getOpensCount()) is more than 500, use the start index
  372. * parameter and multiple API calls to retrieve all the results.
  373. *
  374. * @param integer $startIndex Optional start index
  375. * @param null|DateTime|string $startDate Optional start date
  376. * @param null|DateTime|string $endDate Optional end date
  377. * @param null|string $sender Optional sender email address
  378. * @param null|string $domain Optional domain of the recipient
  379. * @param null|string $recipient Optional recipient email address
  380. * @param null|array $xHeaders Optional array of X-Header values
  381. * @return array|false
  382. */
  383. public function getOpens(
  384. $startIndex = 0,
  385. $startDate = null,
  386. $endDate = null,
  387. $sender = null,
  388. $domain = null,
  389. $recipient = null,
  390. $xHeaders = null
  391. ) {
  392. $params = $this->buildBasicParams($startDate, $endDate);
  393. if ($startIndex) {
  394. $params['startindex'] = $startIndex;
  395. }
  396. if ($domain) {
  397. $params['domain'] = $domain;
  398. }
  399. if ($recipient) {
  400. $params['recipient'] = $recipient;
  401. }
  402. $result = $this->getApiClient()->get('/reports/opens', $params);
  403. if ($result && $result->isOk()) {
  404. // TODO parse the result into objects?
  405. return $result->data;
  406. }
  407. return false;
  408. }
  409. /**
  410. * Get the unique open count, optionally filtered by date range and/or
  411. * various other parameters. Including a date range is recommended.
  412. *
  413. * @param null|DateTime|string $startDate Optional start date
  414. * @param null|DateTime|string $endDate Optional end date
  415. * @return stdClass
  416. */
  417. public function getUniqueOpensCount(
  418. $startDate = null,
  419. $endDate = null,
  420. $sender = null,
  421. $domain = null,
  422. $recipient = null,
  423. $xHeaders = null
  424. ) {
  425. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  426. if ($domain) {
  427. $params['domain'] = $domain;
  428. }
  429. if ($recipient) {
  430. $params['recipient'] = $recipient;
  431. }
  432. $result = $this->getApiClient()->get('/reports/opens/count/unique', $params);
  433. if ($result && $result->isOk()) {
  434. return $result->data;
  435. }
  436. return false;
  437. }
  438. /**
  439. * Returns a list of unique opens, optionally filtered by date range
  440. * and/or various other parameters. Including a date range is recommended.
  441. *
  442. * Returns a maximum of 500 results at a time. If the total sent (as
  443. * returned by getOpensCount()) is more than 500, use the start index
  444. * parameter and multiple API calls to retrieve all the results.
  445. *
  446. * @param integer $startIndex Optional start index
  447. * @param null|DateTime|string $startDate Optional start date
  448. * @param null|DateTime|string $endDate Optional end date
  449. * @param null|string $sender Optional sender email address
  450. * @param null|string $domain Optional domain of the recipient
  451. * @param null|string $recipient Optional recipient email address
  452. * @param null|array $xHeaders Optional array of X-Header values
  453. * @return array|false
  454. */
  455. public function getUniqueOpens(
  456. $startIndex = 0,
  457. $startDate = null,
  458. $endDate = null,
  459. $sender = null,
  460. $domain = null,
  461. $recipient = null,
  462. $xHeaders = null
  463. ) {
  464. $params = $this->buildBasicParams($startDate, $endDate);
  465. if ($startIndex) {
  466. $params['startindex'] = $startIndex;
  467. }
  468. if ($domain) {
  469. $params['domain'] = $domain;
  470. }
  471. if ($recipient) {
  472. $params['recipient'] = $recipient;
  473. }
  474. $result = $this->getApiClient()->get('/reports/opens/unique', $params);
  475. if ($result && $result->isOk()) {
  476. // TODO parse the result into objects?
  477. return $result->data;
  478. }
  479. return false;
  480. }
  481. /**
  482. * Get the click count, optionally filtered by date range and/or various
  483. * other parameters. Including a date range is recommended.
  484. *
  485. * @param null|DateTime|string $startDate Optional start date
  486. * @param null|DateTime|string $endDate Optional end date
  487. * @return stdClass
  488. */
  489. public function getClicksCount(
  490. $startDate = null,
  491. $endDate = null,
  492. $sender = null,
  493. $domain = null,
  494. $recipient = null,
  495. $xHeaders = null
  496. ) {
  497. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  498. if ($domain) {
  499. $params['domain'] = $domain;
  500. }
  501. if ($recipient) {
  502. $params['recipient'];
  503. }
  504. $result = $this->getApiClient()->get('/reports/clicks/count', $params);
  505. if ($result && $result->isOk()) {
  506. return $result->data;
  507. }
  508. return false;
  509. }
  510. /**
  511. * Returns a list of clicks, optionally filtered by date range and/or
  512. * various other parameters. Including a date range is recommended.
  513. *
  514. * Returns a maximum of 500 results at a time. If the total sent (as
  515. * returned by getOpensCount()) is more than 500, use the start index
  516. * parameter and multiple API calls to retrieve all the results.
  517. *
  518. * @param integer $startIndex Optional start index
  519. * @param null|DateTime|string $startDate Optional start date
  520. * @param null|DateTime|string $endDate Optional end date
  521. * @param null|string $sender Optional sender email address
  522. * @param null|string $domain Optional domain of the recipient
  523. * @param null|string $recipient Optional recipient email address
  524. * @param null|array $xHeaders Optional array of X-Header values
  525. * @return array|false
  526. */
  527. public function getClicks(
  528. $startIndex = 0,
  529. $startDate = null,
  530. $endDate = null,
  531. $sender = null,
  532. $domain = null,
  533. $recipient = null,
  534. $xHeaders = null
  535. ) {
  536. $params = $this->buildBasicParams($startDate, $endDate);
  537. if ($startIndex) {
  538. $params['startindex'] = $startIndex;
  539. }
  540. if ($domain) {
  541. $params['domain'] = $domain;
  542. }
  543. if ($recipient) {
  544. $params['recipient'] = $recipient;
  545. }
  546. $result = $this->getApiClient()->get('/reports/clicks', $params);
  547. if ($result && $result->isOk()) {
  548. // TODO parse the result into objects?
  549. return $result->data;
  550. }
  551. return false;
  552. }
  553. /**
  554. * Get the unique click count, optionally filtered by date range and/or
  555. * various other parameters. Including a date range is recommended.
  556. *
  557. * @param null|DateTime|string $startDate Optional start date
  558. * @param null|DateTime|string $endDate Optional end date
  559. * @return stdClass
  560. */
  561. public function getUniqueClicksCount(
  562. $startDate = null,
  563. $endDate = null,
  564. $sender = null,
  565. $domain = null,
  566. $recipient = null,
  567. $xHeaders = null
  568. ) {
  569. $params = $this->buildBasicParams($startDate, $endDate, $sender, $xHeaders);
  570. if ($domain) {
  571. $params['domain'] = $domain;
  572. }
  573. if ($recipient) {
  574. $params['recipient'] = $recipient;
  575. }
  576. $result = $this->getApiClient()->get('/reports/clicks/count/unique', $params);
  577. if ($result && $result->isOk()) {
  578. return $result->data;
  579. }
  580. return false;
  581. }
  582. /**
  583. * Returns a list of unique clicks, optionally filtered by date range
  584. * and/or various other parameters. Including a date range is recommended.
  585. *
  586. * Returns a maximum of 500 results at a time. If the total sent (as
  587. * returned by getUniqueClicksCount()) is more than 500, use the start index
  588. * parameter and multiple API calls to retrieve all the results.
  589. *
  590. * @param integer $startIndex Optional start index
  591. * @param null|DateTime|string $startDate Optional start date
  592. * @param null|DateTime|string $endDate Optional end date
  593. * @param null|string $sender Optional sender email address
  594. * @param null|string $domain Optional domain of the recipient
  595. * @param null|string $recipient Optional recipient email address
  596. * @param null|array $xHeaders Optional array of X-Header values
  597. * @return array|false
  598. */
  599. public function getUniqueClicks(
  600. $startIndex = 0,
  601. $startDate = null,
  602. $endDate = null,
  603. $sender = null,
  604. $domain = null,
  605. $recipient = null,
  606. $xHeaders = null
  607. ) {
  608. $params = $this->buildBasicParams($startDate, $endDate);
  609. if ($startIndex) {
  610. $params['startindex'] = $startIndex;
  611. }
  612. if ($domain) {
  613. $params['domain'] = $domain;
  614. }
  615. if ($recipient) {
  616. $params['recipient'] = $recipient;
  617. }
  618. $result = $this->getApiClient()->get('/reports/clicks/unique', $params);
  619. if ($result && $result->isOk()) {
  620. // TODO parse the result into objects?
  621. return $result->data;
  622. }
  623. return false;
  624. }
  625. }