work_request_repository = $work_request_repository; $this->calendar_sync_repository = $calendar_sync_repository; $this->email_creation_request_repository = $email_creation_request_repository; $this->preprocessor_requests = $preprocessor_requests; $this->facade_factory = $facade_factory; $this->tx_manager = $tx_manager; } /** * @param CalendarSyncInfo|null $calendar_sync_info */ private function sendReSyncCalendarEmail(CalendarSyncInfo $calendar_sync_info){ if(!is_null($calendar_sync_info) && !$calendar_sync_info->isRevoked()){ // revoke it ... $calendar_sync_info->setRevoked(true); // create email request $email_request = new CalendarSyncErrorEmailRequest(); $email_request->setSyncInfo($calendar_sync_info); $this->email_creation_request_repository->add($email_request); } } /** * @param string $provider * @param int $batch_size * @return int|mixed * @throws Exception */ public function processActions($provider = 'ALL', $batch_size = 1000) { return $this->tx_manager->transaction(function() use($provider, $batch_size){ $count = 0; $res = $this->work_request_repository->getUnprocessedMemberScheduleWorkRequestActionByPage ( $provider, new PagingInfo(1, $batch_size) ); $requests = $this->preprocessor_requests->preProcessActions($res->getItems()); log::info(sprintf("provider %s got %s request to process ...", $provider, count($requests))); foreach ($requests as $request){ try { log::debug(sprintf("iteration # %s", $count+1)); if (!$request instanceof MemberScheduleSummitActionSyncWorkRequest) continue; $calendar_sync_info = $request->getCalendarSyncInfo(); $remote_facade = $this->facade_factory->build($calendar_sync_info); if (is_null($remote_facade)) continue; $member = $request->getOwner(); $request_type = $request->getType(); $request_sub_type = $request->getSubType(); try { log::info(sprintf ( "%s - processing work request %s - sub type %s - type %s - member %s - credential id %s -revoked credentials %s", $provider, $request->getIdentifier(), $request_sub_type, $request_type, $member->getIdentifier(), $calendar_sync_info->getId(), $calendar_sync_info->isRevoked() ? 1 : 0 )); } catch (Exception $ex8){ Log::warning($ex8); continue; } switch ($request_sub_type) { case MemberEventScheduleSummitActionSyncWorkRequest::SubType: { $summit_event_id = $request->getSummitEventId(); $summit_event = $request->getSummitEvent(); log::info(sprintf ( "%s - processing work request %s - sub type %s - type %s - event id %s - member %s - credential id %s -revoked credentials %s", $provider, $request->getIdentifier(), $request_sub_type, $request_type, $summit_event_id, $member->getIdentifier(), $calendar_sync_info->getId(), $calendar_sync_info->isRevoked()? 1:0 )); switch ($request_type) { case AbstractCalendarSyncWorkRequest::TypeAdd: if(is_null($summit_event)){ Log::warning(sprintf("EVENT ADD : event id %s does not exists!", $summit_event_id, $member->getId())); continue; } if ($calendar_sync_info->isRevoked()){ Log::warning(sprintf("EVENT ADD : event id %s - member id %s could not be added on external calendar bc credential are revoked!", $summit_event_id, $member->getId())); continue; } if($member->isEventSynchronized($calendar_sync_info, $summit_event_id)){ Log::warning(sprintf("EVENT ADD : event id %s - member id %s already synchronized", $summit_event_id, $member->getId())); continue; } $schedule_sync_info = $remote_facade->addEvent($request); if(is_null($schedule_sync_info)){ Log::warning(sprintf("EVENT ADD : event id %s - member id %s could not be added on external calendar", $summit_event_id, $member->getId())); continue; } $member->add2ScheduleSyncInfo($schedule_sync_info); break; case AbstractCalendarSyncWorkRequest::TypeUpdate: if(is_null($summit_event)){ Log::warning(sprintf("EVENT UPDATE : event id %s does not exists!", $summit_event_id, $member->getId())); continue; } if($calendar_sync_info->isRevoked()) continue; $sync_info = $member->getScheduleSyncInfoByEvent($summit_event_id, $calendar_sync_info); $is_scheduled = $member->isOnSchedule($summit_event); if(is_null($sync_info)) continue; if(!$is_scheduled) { $member->removeFromScheduleSyncInfo($sync_info); continue; } $remote_facade->updateEvent($request, $sync_info); break; case AbstractCalendarSyncWorkRequest::TypeRemove: if($calendar_sync_info->isRevoked()) continue; $schedule_sync_info = $member->getScheduleSyncInfoByEvent($summit_event_id, $calendar_sync_info); if(is_null($schedule_sync_info)){ Log::warning(sprintf("EVENT REMOVE : event id %s - member id %s could not be removed, schedule synch info is null", $summit_event_id, $member->getId())); continue; } $remote_facade->deleteEvent($request, $schedule_sync_info); $member->removeFromScheduleSyncInfo($schedule_sync_info); break; } } break; case MemberCalendarScheduleSummitActionSyncWorkRequest::SubType: { switch ($request_type) { case AbstractCalendarSyncWorkRequest::TypeAdd: if($calendar_sync_info->isRevoked()){ Log::warning(sprintf("CALENDAR ADD : calendar sync info id %s, member id %s is revoked!", $calendar_sync_info->getId(), $member->getId())); continue; } $remote_facade->createCalendar($request, $calendar_sync_info); break; case AbstractCalendarSyncWorkRequest::TypeRemove: $remote_facade->deleteCalendar($request, $calendar_sync_info); $member->removeFromCalendarSyncInfo($calendar_sync_info); break; } } break; } $request->markProcessed(); $count++; usleep($remote_facade->getSleepInterval()); } catch(ForbiddenException $ex1){ // cant create calendar (CAL DAV)... Log::warning($ex1); } catch(RevokedAccessException $ex2){ Log::warning($ex2); $this->sendReSyncCalendarEmail($calendar_sync_info); } catch(NotFoundResourceException $ex3){ Log::warning($ex3); } catch(ServerErrorException $ex5){ Log::error($ex5); } catch (RateLimitExceededException $ex6){ Log::critical($ex6); break; } catch(Exception $ex7){ Log::error($ex7); } } return $count; }); } }