/** * @param int $summit_id * @return string * @throws EntityValidationException * @throws NotFoundEntityException */ public function getSpeakerConfirmationLink($summit_id) { $confirmation_page = SummitConfirmSpeakerPage::getBy(intval($summit_id)); if (!$confirmation_page) { throw new NotFoundEntityException('Confirmation Speaker Page not set on current summit!'); } $url = $confirmation_page->getAbsoluteLiveLink(false); if ($this->hasAssistanceFor($summit_id)) { throw new EntityValidationException(sprintf('this is already an assistance request for speaker %s on summit id %s', $this->ID, $summit_id)); } $request = $this->createAssistanceFor($summit_id); $token = null; $already_exists = false; do { $token = $request->generateConfirmationToken(); $already_exists = intval(PresentationSpeakerSummitAssistanceConfirmationRequest::get()->filter(['SummitID' => intval($summit_id), 'SpeakerID:ExactMatch:not' => $this->ID, 'ConfirmationHash' => PresentationSpeakerSummitAssistanceConfirmationRequest::HashConfirmationToken($token)])->count()) > 1; } while ($already_exists); $request->write(); return $url . 'confirm?t=' . base64_encode($token); }