public function run()
 {
     // 前回のデータを取得
     $oldCards = $this->converter->convert($this->reader->read(storage_path() . $this->lastDataFile, '[]'));
     if (is_null($oldCards)) {
         return false;
     }
     // URL生成
     $url = 'https://trello.com/1/lists/' . env('TRELLO_LIST_ID') . '/cards' . '?key=' . env('TRELLO_KEY') . '&token=' . env('TRELLO_TOKEN');
     // Trelloよりカード情報取得
     if (false === ($json = $this->getter->get($url))) {
         return false;
     }
     // 取得したカード情報(JSON形式)を配列へ変換
     if (is_null($cards = $this->converter->convert($json))) {
         return false;
     }
     $created = new CardCreated();
     $updated = new CardUpdated();
     $currentCards = [];
     foreach ($cards as $card) {
         // 保存用データ作成
         $id = $card['id'];
         // 日本時間で保存したほうが分かりやすい
         $carbonTime = (new Carbon($card['dateLastActivity']))->timezone('Asia/Tokyo');
         $timeString = $carbonTime->toDateTimeString();
         $currentCards[$id] = $timeString;
         // 直前のデーターに存在していなければ新規カード
         if (!array_key_exists($id, $oldCards)) {
             $created->id = $id;
             $created->name = $card['name'];
             $created->time = $carbonTime;
             $this->dispatcher->fire($created);
             continue;
         }
         // IDが一致するのに最終更新時間が異なっていれば更新
         if ($timeString !== $oldCards[$id]) {
             $updated->id = $id;
             $updated->name = $card['name'];
             $updated->time = $carbonTime;
             $this->dispatcher->fire($updated);
         }
     }
     $deleted = new CardDeleted();
     // 削除されたカードを選択
     $deletedCards = array_diff_key($oldCards, $currentCards);
     foreach ($deletedCards as $deletedId => $time) {
         $deleted->id = $deletedId;
         $this->dispatcher->fire($deleted);
     }
     // 今回の取得データをファイルへ保存
     $this->file->put(storage_path() . $this->lastDataFile, json_encode($currentCards));
     return true;
 }
 /**
  * 元のタスクへリマインダー設定されていれば
  * 日付を今日に変更し、新しく設定する
  *
  * @param array $baseTask
  * @param array $newTask
  */
 private function createRemeinderFromOriginal($baseTask, $newTask)
 {
     // ベースタスクのリマインダー取得
     $url = 'a.wunderlist.com/api/v1/reminders' . '?task_id=' . $baseTask['id'];
     $jsonReminder = $this->getter->get($url, $this->tokens);
     $reminder = $this->converter->convert($jsonReminder);
     // リマインダー設定なし
     if (empty($reminder)) {
         return;
     }
     // リマインダーはタスクに一つしか取得できないが、
     // APIがリストのリマインダー取得と共有のため、多重配列で返ってくる
     $reminderTime = Carbon::parse($reminder[0]['date']);
     // 生成したタスクに今日の日付の同時刻でリマインダー設定
     $this->createReminder($newTask, $this->todayAtSameTime($reminderTime));
 }
 private function getAllCards()
 {
     $lists = $this->getAllLists();
     $this->initializeGentlyAPICall();
     $this->myCards = [];
     foreach ($lists as $listId => $list) {
         $this->gentlyAPICall();
         $url = 'https://trello.com/1/lists/' . $listId . '/cards' . '?key=' . env('TRELLO_KEY') . '&token=' . env('TRELLO_TOKEN');
         if (false === ($result = $this->getter->get($url))) {
             continue;
         }
         $cards = $this->converter->convert($result);
         foreach ($cards as $card) {
             $this->myCards[$card['id']] = ['name' => $card['name'], 'listId' => $listId, 'listName' => $list['name'], 'boardId' => $list['boardId'], 'boardName' => $list['boardName']];
         }
     }
     return $this->myCards;
 }