/**
  * Creates data provider instance with search query applied
  *
  * @param array $params
  *
  * @return ActiveDataProvider
  */
 public function search($params)
 {
     $query = ProcessedATOMFeeds::find();
     $dataProvider = new ActiveDataProvider(['query' => $query]);
     $this->load($params);
     if (!$this->validate()) {
         // uncomment the following line if you do not want to any records when validation fails
         // $query->where('0=1');
         return $dataProvider;
     }
     $query->andFilterWhere(['updated' => $this->updated]);
     $query->andFilterWhere(['like', 'feedURL', $this->feedURL]);
     return $dataProvider;
 }
Example #2
0
 public function parseAtomFeed()
 {
     $url = Yii::$app->params['AtomFeedParser']['url'];
     $startTime = time();
     $needToUpdateCAP = false;
     try {
         $atomGeneralInformation = Yii::$app->CAPParser->getAtomGeneralContent($url);
         $atomEntriesContent = Yii::$app->CAPParser->getEntriesContent($url);
         if (!isset($atomGeneralInformation['updated']) || !isset($atomGeneralInformation['id'])) {
             throw new Exception("Can't parse AtomFeed file by given URL");
         }
         $processedFeedsModel = new models\ProcessedATOMFeeds();
         $processedFeedsModelSearch = new models\ProcessedATOMFeedsSearch();
         $atomRecordInDb = $processedFeedsModelSearch->findOne(['feedURL' => $atomGeneralInformation['id']]);
         if (!$atomRecordInDb) {
             //We don't have records at all for this file
             $processedFeedsModel->updated = helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated']);
             $processedFeedsModel->feedURL = $atomGeneralInformation['id'];
             $processedFeedsModel->save();
             $this->consoleLog('Added ProcessedATOMFeeds Record, id - ' . $processedFeedsModel->feedURL . ', updated - ' . helpers\DateTimeHelper::createDateFromUnixtime($processedFeedsModel->updated) . '(' . $atomGeneralInformation['updated'] . ')');
             $needToUpdateCAP = true;
         } else {
             if ($atomRecordInDb->updated != helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated'])) {
                 $this->consoleLog('We need to update records in WeatherAlert and WeatherAlertArea tables.Updated time in the database -' . helpers\DateTimeHelper::createDateFromUnixtime($atomRecordInDb->updated) . ', from file - ' . $atomGeneralInformation['updated'] . ' (' . helpers\DateTimeHelper::createDateFromUnixtime(helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated'])) . ')');
                 $atomRecordInDb->updated = helpers\DateTimeHelper::createUnixtimeFromDate($atomGeneralInformation['updated']);
                 $atomRecordInDb->save();
                 $needToUpdateCAP = true;
             }
         }
         if (!$needToUpdateCAP) {
             $this->consoleLog('We DON\'T need to update records in WeatherAlert and WeatherAlertArea tables.');
         }
         if ($needToUpdateCAP) {
             //change 1 to $needToUpdateCAP
             foreach ($atomEntriesContent['entries'] as $entry) {
                 $entryContent = $this->_getCapAreaInformationInDatabse($entry);
                 if ($entryContent) {
                     // Now we try to find this alert and check if we have it already in our database
                     $alertModel = models\WeatherAlert::find()->where(['identifier' => $entryContent['identifier'], 'date' => helpers\DateTimeHelper::createUnixtimeFromDate($entryContent['date'])])->one();
                     if (!$alertModel) {
                         $alertModel = new models\WeatherAlert();
                     } else {
                         $this->skippedAlertsCount++;
                         $this->consoleLog('One alert entry skipped (Information about this alert is actual in our database, ID = ' . $alertModel->id . ')');
                         continue;
                     }
                     $alertModel->attributes = $entryContent;
                     $alertModel->date = helpers\DateTimeHelper::createUnixtimeFromDate($alertModel->date);
                     $alertModel->save();
                     $this->consoleLog('One alert entry added (ID: ' . $alertModel->id . ')');
                     $this->addedAlertsCount++;
                     if ($alertModel->updates) {
                         //WE need to change status of old alert
                         //TODO: this part of code should be checked on real data
                         $alertModel = models\WeatherAlert::find()->where(['identifier' => $alertModel->updates])->one();
                         $alertModel->status = models\WeatherAlert::STATUS_UPDATED;
                         $alertModel->save();
                     }
                     $weatherAlertAreaModel = new models\WeatherAlertArea();
                     $weatherAlertAreaModel->WeatherAlert_id = $alertModel->id;
                     $weatherAlertAreaModel->save();
                     if (isset($entryContent['polygon']['0'])) {
                         $coordinatePairs = explode(' ', $entryContent['polygon']['0']);
                         foreach ($coordinatePairs as $pair) {
                             $areaDefinitionModel = new models\AreaDefinition();
                             $areaDefinitionModel->WeatherAlertArea_id = $weatherAlertAreaModel->id;
                             $latLonFromPair = explode(',', $pair);
                             $areaDefinitionModel->latitude = $latLonFromPair[0];
                             $areaDefinitionModel->longitude = $latLonFromPair[1];
                             $areaDefinitionModel->save();
                         }
                     }
                     if (isset($entryContent['circle']['0'])) {
                         $coordinatePair = explode(' ', $entryContent['polygon']['0']);
                         $areaDefinitionModel = new models\AreaDefinition();
                         $areaDefinitionModel->WeatherAlertArea_id = $weatherAlertAreaModel->id;
                         $latLonFromPair = explode(',', $coordinatePair);
                         $areaDefinitionModel->latitude = $latLonFromPair[0];
                         $areaDefinitionModel->longitude = $latLonFromPair[1];
                         $areaDefinitionModel->radius = $coordinatePair[1];
                         $areaDefinitionModel->save();
                     }
                 }
             }
         }
         $endTime = time();
         $this->consoleLog('Start date - ' . date('Y-m-d\\TH:i:s', $startTime));
         $this->consoleLog('End date - ' . date('Y-m-d\\TH:i:s', $endTime));
         $this->consoleLog('Execution Time - ' . ($endTime - $startTime) . ' seconds.');
         $this->consoleLog('Count of added alerts - ' . $this->addedAlertsCount);
         $this->consoleLog('Count of skipped alerts - ' . $this->skippedAlertsCount);
         $atomGeneralInformation = array_merge(['start' => date('Y-m-d\\TH:i:s', $startTime), 'end' => date('Y-m-d\\TH:i:s', $endTime)], $atomGeneralInformation);
         $atomGeneralInformation['entries'] = isset($atomEntriesContent['entries']) ? $atomEntriesContent['entries'] : [];
         return $atomGeneralInformation;
     } catch (\Exception $e) {
         $this->consoleLog('Process ERROR -  ' . $e->getMessage());
         Yii::$app->end();
     }
 }