src/App/Entity/ExternalPartner/ExternalJobPostingCrawler/ContentParserTask.php line 23

Open in your IDE?
  1. <?php
  2. namespace App\Entity\ExternalPartner\ExternalJobPostingCrawler;
  3. use App\Entity\ExternalPartner\IntegratedExternalPartnerCustomer;
  4. use App\Entity\RecurrentJob;
  5. use App\Entity\User;
  6. use App\Service\ExternalPartner\ExternalJobPostingCrawlerService;
  7. use App\Utility\DateTimeUtility;
  8. use App\Utility\ReflectionHelper;
  9. use DateTime;
  10. use Doctrine\ORM\Mapping as ORM;
  11. use Exception;
  12. use InvalidArgumentException;
  13. /**
  14. * @ORM\Entity
  15. *
  16. * @ORM\Table(
  17. * name="external_job_posting_crawler_content_parser_tasks"
  18. * )
  19. */
  20. class ContentParserTask
  21. {
  22. public const STATUS_NEW = 0;
  23. public const STATUS_URL_INVALID = 1;
  24. public const STATUS_READY_TO_BE_SUBMITTED = 2;
  25. public const STATUS_SUBMITTED = 3;
  26. public const STATUS_COULD_NOT_BE_SUBMITTED = 4;
  27. public const STATUS_RESULT_RECEIVED = 5;
  28. public const STATUS_RESULT_HANDLING_SUCCEEDED = 6;
  29. public const STATUS_RESULT_HANDLING_FAILED = 7;
  30. public const STATUS_PARSER_HAS_RECEIVED = 8;
  31. public const STATUS_PARSER_STARTING_FETCH = 9;
  32. public const STATUS_PARSER_FINISHED_FETCH_WITH_SUCCESS = 10;
  33. public const STATUS_PARSER_FINISHED_FETCH_WITH_ERROR = 11;
  34. public const STATUS_PARSER_STARTING_PARSE = 12;
  35. public const STATUS_PARSER_FINISHED_PARSE_WITH_SUCCESS = 13;
  36. public const STATUS_PARSER_FINISHED_PARSE_WITH_ERROR = 14;
  37. public const STATUS_PARSER_STARTING_RESULT_REPORT = 15;
  38. public const STATUS_PARSER_FINISHED_RESULT_REPORT_WITH_SUCCESS = 16;
  39. public const STATUS_PARSER_FINISHED_RESULT_REPORT_WITH_ERROR = 17;
  40. public const STATUS_PARSER_OTHER_ERROR = 18;
  41. /**
  42. * @throws Exception
  43. */
  44. public function __construct(
  45. int $parserId,
  46. string $urlToParse,
  47. string $resultReportUrl,
  48. IntegratedExternalPartnerCustomer $integratedExternalPartnerCustomer,
  49. ?User $createdByUser,
  50. ?string $zipcode = null,
  51. ?string $recurrentJobsIdForUpdateCheck = null
  52. ) {
  53. if (!ReflectionHelper::hasConstWithValue(
  54. ExternalJobPostingCrawlerService::class,
  55. 'CONTENT_PARSER_ID_',
  56. $parserId
  57. )) {
  58. throw new InvalidArgumentException("Unknown parser id $parserId.");
  59. }
  60. if (!(mb_substr($urlToParse, 0, 8) === 'https://')) {
  61. throw new InvalidArgumentException("urlToParse does not start with 'https://'.");
  62. }
  63. $this->status = self::STATUS_NEW;
  64. $this->parserId = $parserId;
  65. $this->urlToParse = $urlToParse;
  66. $this->resultReportUrl = $resultReportUrl;
  67. $this->user = $createdByUser;
  68. $this->integratedExternalPartnerCustomer = $integratedExternalPartnerCustomer;
  69. $this->createdAt = DateTimeUtility::createDateTimeUtc();
  70. $this->zipcode = $zipcode;
  71. $this->recurrentJobsIdForUpdateCheck = $recurrentJobsIdForUpdateCheck;
  72. }
  73. /**
  74. * @ORM\GeneratedValue(strategy="CUSTOM")
  75. *
  76. * @ORM\CustomIdGenerator(class="App\Utility\DatabaseIdGenerator")
  77. *
  78. * @ORM\Column(name="id", type="guid")
  79. *
  80. * @ORM\Id
  81. */
  82. protected ?string $id;
  83. public function getId(): string
  84. {
  85. return $this->id;
  86. }
  87. /**
  88. * @ORM\Column(name="parser_id", type="smallint", nullable=false)
  89. */
  90. private int $parserId;
  91. public function getParserId(): int
  92. {
  93. return $this->parserId;
  94. }
  95. /**
  96. * @ORM\Column(name="url_to_parse", type="text", length="4096", nullable=false)
  97. */
  98. private string $urlToParse;
  99. public function getUrlToParse(): string
  100. {
  101. return $this->urlToParse;
  102. }
  103. /**
  104. * @ORM\Column(name="result_report_url", type="text", length="4096", nullable=false)
  105. */
  106. private string $resultReportUrl;
  107. public function getResultReportUrl(): string
  108. {
  109. return $this->resultReportUrl;
  110. }
  111. /**
  112. * @ORM\Column(name="created_at", type="datetime", nullable=false)
  113. */
  114. private DateTime $createdAt;
  115. public function getCreatedAt(): DateTime
  116. {
  117. return $this->createdAt;
  118. }
  119. /**
  120. * @ORM\ManyToOne(targetEntity="App\Entity\User")
  121. *
  122. * @ORM\JoinColumn(name="users_id", nullable=true, onDelete="SET NULL")
  123. */
  124. private ?User $user;
  125. public function getUser(): ?User
  126. {
  127. return $this->user;
  128. }
  129. /**
  130. * @ORM\Column(name="status", type="smallint", nullable=false)
  131. */
  132. private int $status;
  133. public function setStatus(int $status): void
  134. {
  135. if (!ReflectionHelper::hasConstWithValue(
  136. self::class,
  137. 'STATUS_',
  138. $status
  139. )) {
  140. throw new InvalidArgumentException("Unknown status $status.");
  141. }
  142. // Because of asynchronity, we might get a STATUS_PARSER_FINISHED_RESULT_REPORT_WITH_SUCCESS
  143. // via the info channel from the parser, but don't want to update this if handling already
  144. // failed.
  145. if ($this->status === self::STATUS_RESULT_HANDLING_FAILED) {
  146. return;
  147. }
  148. $this->status = $status;
  149. }
  150. public function getStatus(): int
  151. {
  152. return $this->status;
  153. }
  154. /**
  155. * @ORM\ManyToOne(targetEntity="App\Entity\ExternalPartner\IntegratedExternalPartnerCustomer")
  156. *
  157. * @ORM\JoinColumn(name="integrated_external_partner_customers_id", referencedColumnName="id", onDelete="CASCADE")
  158. */
  159. private IntegratedExternalPartnerCustomer $integratedExternalPartnerCustomer;
  160. public function getIntegratedExternalPartnerCustomer(): IntegratedExternalPartnerCustomer
  161. {
  162. return $this->integratedExternalPartnerCustomer;
  163. }
  164. /**
  165. * @ORM\ManyToOne(targetEntity="App\Entity\RecurrentJob")
  166. *
  167. * @ORM\JoinColumn(name="related_recurrent_jobs_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
  168. */
  169. private ?RecurrentJob $relatedRecurrentJob;
  170. /** @throws Exception */
  171. public function setRelatedRecurrentJob(?RecurrentJob $relatedRecurrentJob): void
  172. {
  173. if ($this->status !== self::STATUS_RESULT_RECEIVED) {
  174. throw new Exception('Can only set related recurrent job if status is RESULT_RECEIVED.');
  175. }
  176. $this->relatedRecurrentJob = $relatedRecurrentJob;
  177. }
  178. public function getRelatedRecurrentJob(): ?RecurrentJob
  179. {
  180. return $this->relatedRecurrentJob;
  181. }
  182. /**
  183. * @ORM\Column(name="zipcode", type="string", length=128, nullable=true)
  184. */
  185. protected ?string $zipcode;
  186. public function getZipcode(): ?string
  187. {
  188. return $this->zipcode;
  189. }
  190. /**
  191. * @ORM\ManyToOne(targetEntity="App\Entity\RecurrentJob", cascade={"persist"})
  192. *
  193. * @ORM\JoinColumn(name="recurrent_jobs_id_for_update_check", referencedColumnName="id", nullable=true, onDelete="CASCADE")
  194. */
  195. protected ?string $recurrentJobsIdForUpdateCheck;
  196. public function getRecurrentJobsIdForUpdateCheck(): ?string
  197. {
  198. return $this->recurrentJobsIdForUpdateCheck;
  199. }
  200. }