src/App/Entity/ConversionEvent.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use App\Service\ConversionEventService;
  4. use App\Utility\GuidUtility;
  5. use App\Utility\ReflectionHelper;
  6. use DateTime;
  7. use Doctrine\ORM\Mapping as ORM;
  8. use Exception;
  9. use InvalidArgumentException;
  10. use ValueError;
  11. /**
  12. * @ORM\Entity()
  13. *
  14. * @ORM\Table(
  15. * name="conversion_events",
  16. * indexes={
  17. *
  18. * @ORM\Index(name="occured_at_idx", columns={"occured_at"}),
  19. * @ORM\Index(name="affected_user_id_occured_at_idx", columns={"affected_user_id", "occured_at"}, options={"lengths": {8, null}})
  20. * }
  21. * )
  22. */
  23. class ConversionEvent
  24. {
  25. public const STEP_LINK_CREATED = 0;
  26. public const STEP_LINK_CLICKED = 1;
  27. public const STEP_GOAL_REACHED = 2;
  28. public function __construct()
  29. {
  30. $this->affectedUserIsJobofferer = false;
  31. $this->affectedUserIsJobseeker = false;
  32. $this->referencedConversionEventId = null;
  33. $this->affectedUserId = null;
  34. $this->affectedUserRegisteredAt = null;
  35. $this->relatedRecurrentJobId = null;
  36. $this->numberOfCampaignStarts = null;
  37. $this->requestId = null;
  38. $this->sessionId = null;
  39. $this->clientId = null;
  40. $this->additionalData = null;
  41. $this->isProbablyBotRequest = null;
  42. }
  43. /**
  44. * @ORM\GeneratedValue(strategy="CUSTOM")
  45. *
  46. * @ORM\CustomIdGenerator(class="App\Utility\DatabaseIdGenerator")
  47. *
  48. * @ORM\Column(name="id", type="guid")
  49. *
  50. * @ORM\Id
  51. */
  52. private string $id;
  53. public function setId(string $id)
  54. {
  55. GuidUtility::validOrThrow($id);
  56. $this->id = $id;
  57. }
  58. public function getId(): string
  59. {
  60. return $this->id;
  61. }
  62. /**
  63. * @ORM\Column(name="affected_user_id", type="guid", nullable=true)
  64. *
  65. * We don't make this a foreign key on purpose, we don't need the integrity and don't want to delete event data
  66. * if a user is deleted.
  67. */
  68. protected ?string $affectedUserId;
  69. public function setAffectedUserId(?string $userId)
  70. {
  71. GuidUtility::validOrThrow($userId, true);
  72. $this->affectedUserId = $userId;
  73. }
  74. public function getAffectedUserId(): ?string
  75. {
  76. return $this->affectedUserId;
  77. }
  78. /**
  79. * @ORM\Column(name="affected_user_is_jobofferer", type="boolean", nullable=false)
  80. */
  81. protected bool $affectedUserIsJobofferer;
  82. public function setAffectedUserIsJobofferer(bool $affectedUserIsJobofferer)
  83. {
  84. $this->affectedUserIsJobofferer = $affectedUserIsJobofferer;
  85. }
  86. public function getAffectedUserIsJobofferer(): bool
  87. {
  88. return $this->affectedUserIsJobofferer;
  89. }
  90. /**
  91. * @ORM\Column(name="affected_user_is_jobseeker", type="boolean", nullable=false)
  92. */
  93. protected bool $affectedUserIsJobseeker;
  94. public function setAffectedUserIsJobseeker(bool $affectedUserIsJobseeker)
  95. {
  96. $this->affectedUserIsJobseeker = $affectedUserIsJobseeker;
  97. }
  98. public function getAffectedUserIsJobseeker(): bool
  99. {
  100. return $this->affectedUserIsJobseeker;
  101. }
  102. /**
  103. * @ORM\Column(name="affected_user_registered_at", type="datetime", nullable=true)
  104. */
  105. protected ?DateTime $affectedUserRegisteredAt;
  106. public function setAffectedUserRegisteredAt(?DateTime $affectedUserRegisteredAt): void
  107. {
  108. $this->affectedUserRegisteredAt = $affectedUserRegisteredAt;
  109. }
  110. public function getAffectedUserRegisteredAt(): ?DateTime
  111. {
  112. return $this->affectedUserRegisteredAt;
  113. }
  114. /**
  115. * @ORM\Column(name="referenced_conversion_events_id", type="guid", nullable=true)
  116. */
  117. protected ?string $referencedConversionEventId;
  118. public function setReferencedConversionEventId(?string $referencedConversionEventId): void
  119. {
  120. GuidUtility::validOrThrow($referencedConversionEventId, true);
  121. $this->referencedConversionEventId = $referencedConversionEventId;
  122. }
  123. public function getReferencedConversionEventId(): ?string
  124. {
  125. return $this->referencedConversionEventId;
  126. }
  127. /**
  128. * @ORM\Column(name="campaign_id", type="integer", nullable=false)
  129. */
  130. protected int $campaignId;
  131. public function setCampaignId(int $campaignId): void
  132. {
  133. if (!ReflectionHelper::hasConstWithValue(
  134. ConversionEventService::class,
  135. 'CAMPAIGN_ID_',
  136. $campaignId)
  137. ) {
  138. throw new ValueError("Invalid campaign id '$campaignId'.");
  139. }
  140. $this->campaignId = $campaignId;
  141. }
  142. public function getCampaignId(): int
  143. {
  144. return $this->campaignId;
  145. }
  146. /**
  147. * @ORM\Column(name="subcampaign_id", type="integer", nullable=false)
  148. */
  149. protected int $subcampaignId;
  150. public function setSubcampaignId(int $subcampaignId): void
  151. {
  152. if ($subcampaignId < 0) {
  153. throw new ValueError("Invalid subcampaign id '$subcampaignId'.");
  154. }
  155. $this->subcampaignId = $subcampaignId;
  156. }
  157. public function getSubcampaignId(): int
  158. {
  159. return $this->subcampaignId;
  160. }
  161. /**
  162. * @ORM\Column(name="step", type="smallint", nullable=false)
  163. */
  164. protected int $step;
  165. /** @throws Exception */
  166. public function setStep(int $step): void
  167. {
  168. if (!in_array($step, [self::STEP_LINK_CREATED, self::STEP_LINK_CLICKED, self::STEP_GOAL_REACHED])) {
  169. throw new Exception("Invalid step value '$step'.");
  170. }
  171. $this->step = $step;
  172. }
  173. public function getStep(): int
  174. {
  175. return $this->step;
  176. }
  177. /**
  178. * @ORM\Column(name="occured_at", type="datetime", nullable=false)
  179. */
  180. protected DateTime $occuredAt;
  181. public function getOccuredAt(): DateTime
  182. {
  183. return $this->occuredAt;
  184. }
  185. public function setOccuredAt(DateTime $occuredAt)
  186. {
  187. $this->occuredAt = $occuredAt;
  188. }
  189. /**
  190. * @ORM\Column(name="related_recurrent_job_id", type="guid", nullable=true)
  191. *
  192. * We don't make this a foreign key on purpose, we don't need the integrity and don't want to delete event data
  193. * if a user is deleted.
  194. */
  195. protected ?string $relatedRecurrentJobId;
  196. /** @throws InvalidArgumentException */
  197. public function setRelatedRecurrentJobId(?string $relatedRecurrentJobId = null): void
  198. {
  199. GuidUtility::validOrThrow($relatedRecurrentJobId, true);
  200. $this->relatedRecurrentJobId = $relatedRecurrentJobId;
  201. }
  202. public function getRelatedRecurrentJobId(): ?string
  203. {
  204. return $this->relatedRecurrentJobId;
  205. }
  206. /**
  207. * @ORM\Column(name="number_of_campaign_starts", type="integer", nullable=true)
  208. */
  209. protected ?int $numberOfCampaignStarts;
  210. /** @throws Exception */
  211. public function setNumberOfCampaignStarts(?int $numberOfCampaignStarts): void
  212. {
  213. $this->numberOfCampaignStarts = $numberOfCampaignStarts;
  214. }
  215. public function getNumberOfCampaignStarts(): ?int
  216. {
  217. return $this->numberOfCampaignStarts;
  218. }
  219. /**
  220. * @ORM\Column(name="request_id", type="text", length=256, nullable=true)
  221. */
  222. protected ?string $requestId;
  223. public function setRequestId(?string $requestId = null): void
  224. {
  225. $this->requestId = $requestId;
  226. }
  227. public function getRequestId(): ?string
  228. {
  229. return $this->requestId;
  230. }
  231. /**
  232. * @ORM\Column(name="session_id", type="text", length=256, nullable=true)
  233. */
  234. protected ?string $sessionId;
  235. public function setSessionId(?string $sessionId = null): void
  236. {
  237. $this->sessionId = $sessionId;
  238. }
  239. public function getSessionId(): ?string
  240. {
  241. return $this->sessionId;
  242. }
  243. /**
  244. * @ORM\Column(name="client_id", type="text", length=64, nullable=true)
  245. */
  246. protected ?string $clientId;
  247. public function setClientId(?string $clientId = null): void
  248. {
  249. $this->clientId = $clientId;
  250. }
  251. public function getClientId(): ?string
  252. {
  253. return $this->clientId;
  254. }
  255. /**
  256. * @ORM\Column(name="additional_data", type="text", length=4096, nullable=true)
  257. */
  258. protected ?string $additionalData;
  259. /** @throws Exception */
  260. public function setAdditionalData($additionalData): void
  261. {
  262. if (!is_null($additionalData)) {
  263. if (is_null(json_decode($additionalData))) {
  264. throw new Exception('additionalData must be valid JSON');
  265. }
  266. }
  267. $this->additionalData = $additionalData;
  268. }
  269. public function getAdditionalData(): ?string
  270. {
  271. return $this->additionalData;
  272. }
  273. /**
  274. * @ORM\Column(name="is_probably_bot_request", type="boolean", nullable=true)
  275. */
  276. private ?bool $isProbablyBotRequest;
  277. public function getIsProbablyBotRequest(): ?bool
  278. {
  279. return $this->isProbablyBotRequest;
  280. }
  281. public function setIsProbablyBotRequest(?bool $isProbablyBotRequest): void
  282. {
  283. $this->isProbablyBotRequest = $isProbablyBotRequest;
  284. }
  285. }