示例#1
0
 public static function sync($source, $destination, $syncTaskId = 0)
 {
     // Stats
     $stats = array('links' => 0);
     // Get source data
     $links = BackupsModel::all(array('user_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['link']))->toArray();
     $syncedLinks = MigratedDataModel::all(array('source_id' => $source['username']['id'], 'destination_id' => $destination['username']['id'], 'kind' => static::$kind['link']))->column('identifier');
     if ($links) {
         foreach ($links as $link) {
             if (!in_array($link['entity_id'], $syncedLinks)) {
                 $link['entity'] = json_decode($link['entity'], true);
                 $newLink = array_diff_key($link['entity'], array_flip(static::$skip['link']));
                 $newLink = \Rest::postJSON(static::$endpoints['link'], $newLink, $destination);
                 if (isset($newLink['result']['error'])) {
                     d($newLink);
                 }
                 $stats['links']++;
                 $syncedCalendar = MigratedDataModel::create();
                 $syncedCalendar->source_id = $source['username']['id'];
                 $syncedCalendar->destination_id = $destination['username']['id'];
                 $syncedCalendar->kind = static::$kind['link'];
                 $syncedCalendar->identifier = $link['entity_id'];
                 $syncedCalendar->created = date(DATE_TIME);
                 $syncedCalendar->save();
             }
         }
     }
     return $stats;
 }
示例#2
0
 public static function _transfer($source, $destination, $syncTaskId = 0, $ignoreUpdate = false, $whitelist = array())
 {
     // Stats
     $stats = array('lists' => 0, 'tasks' => 0);
     // Get source data
     $tasks = array();
     $lists = BackupsModel::all(array('user_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['list']))->toArray();
     $tasksDB = BackupsModel::all(array('user_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['task']))->toArray();
     if ($tasksDB) {
         foreach ($tasksDB as $task) {
             $tasks[$task['parent_id']][] = $task;
         }
     }
     $syncedLists = MigratedDataModel::all(array('source_id' => $source['username']['id'], 'destination_id' => $destination['username']['id'], 'kind' => static::$kind['list']))->column('identifier');
     $syncedTasks = MigratedDataModel::all(array('source_id' => $source['username']['id'], 'destination_id' => $destination['username']['id'], 'kind' => static::$kind['task']))->column('identifier');
     $destinationLists = BackupsModel::all(array('user_id' => $destination['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['list']))->column('entity_title');
     if ($lists) {
         foreach ($lists as $list) {
             // Whitelisting used for share feature
             $whiteListed = true;
             if ($whitelist) {
                 if (isset($whitelist['lists']) && $whitelist['lists']) {
                     if (!in_array($list['entity_id'], $whitelist['lists'])) {
                         $whiteListed = false;
                     }
                 }
             }
             if (!in_array($list['entity_id'], $syncedLists) && $whiteListed) {
                 $list['entity'] = json_decode($list['entity'], true);
                 $newList = array_diff_key($list['entity'], array_flip(static::$skip['list']));
                 if (in_array($newList['title'], $destinationLists) && !$ignoreUpdate) {
                     $newList['title'] = $newList['title'] . ' (2)';
                 } else {
                     $newList['title'] = $newList['title'];
                 }
                 $newList = \Rest::postJSON(static::$endpoints['lists'], $newList, $destination);
                 if (isset($newList['result']['error'])) {
                     d($newList);
                 }
                 $stats['lists']++;
                 // Update playlist with new id
                 if (!$ignoreUpdate && $newList) {
                     $oldPlaylist = BackupsModel::first($list['id']);
                     $oldPlaylist->entity_new_id = $newList['id'];
                     $oldPlaylist->save();
                 }
                 $syncedCalendar = MigratedDataModel::create();
                 $syncedCalendar->source_id = $source['username']['id'];
                 $syncedCalendar->destination_id = $destination['username']['id'];
                 $syncedCalendar->task_id = 0;
                 $syncedCalendar->sync_task_id = $syncTaskId;
                 $syncedCalendar->table = BackupsModel::$schema['table'];
                 $syncedCalendar->table_id = $list['id'];
                 $syncedCalendar->kind = static::$kind['list'];
                 $syncedCalendar->identifier = $list['entity_id'];
                 $syncedCalendar->status = MigratedDataModel::STATUS_ACTIVE;
                 $syncedCalendar->created = date(DATE_TIME);
                 $syncedCalendar->save();
                 // Add tasks
                 if (isset($tasks[$list['id']])) {
                     foreach ($tasks[$list['id']] as $task) {
                         if (!in_array($task['entity_id'], $syncedTasks)) {
                             $task['entity'] = json_decode($task['entity'], true);
                             $newTask = array_diff_key($task['entity'], array_flip(static::$skip['task']));
                             $newTask = \Rest::postJSON(sprintf(static::$endpoints['tasks'], $newList['id']), $newTask, $destination);
                             if (isset($newTask['result']['error'])) {
                                 d($newTask);
                             }
                             $stats['tasks']++;
                             $syncedEvent = MigratedDataModel::create();
                             $syncedEvent->source_id = $source['username']['id'];
                             $syncedEvent->destination_id = $destination['username']['id'];
                             $syncedEvent->task_id = 0;
                             $syncedEvent->sync_task_id = $syncTaskId;
                             $syncedEvent->table = BackupsModel::$schema['table'];
                             $syncedEvent->table_id = $task['id'];
                             $syncedEvent->kind = static::$kind['task'];
                             $syncedEvent->identifier = $task['entity_id'];
                             $syncedEvent->status = MigratedDataModel::STATUS_ACTIVE;
                             $syncedEvent->created = date(DATE_TIME);
                             $syncedEvent->save();
                         }
                     }
                 }
             }
         }
     }
     return $stats;
 }
示例#3
0
 public static function _clean($destination, $source, $syncTaskId = 0, $whitelist = array())
 {
     $service = ServicesModel::first(array('library' => 'Calendar'))->toArray();
     $task = TasksServicesModel::first(array('task_id' => $syncTaskId, 'service_id' => $service['id']))->toArray();
     $task['stats'] = json_decode($task['stats'], true);
     // Calendars
     $calendars = CalendarsModel::all(array('user_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId))->toArray();
     // Events
     $toDeleteEvents = array();
     $migratedEvents = MigratedDataModel::all(array('source_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId, 'kind' => static::$kind['event']));
     if ($migratedEvents) {
         $migratedEvents = $migratedEvents->toArray();
         if ($migratedEvents) {
             $destinationCalendars = CalendarsModel::all(array('user_id' => $destination['username']['id'], 'sync_task_id' => $syncTaskId));
             if ($destinationCalendars) {
                 $destinationCalendars = $destinationCalendars->toArray();
                 if ($destinationCalendars) {
                     foreach ($destinationCalendars as $calendar) {
                         // get events
                         $newEvents = array();
                         do {
                             $payload = array('maxResults' => static::$limit);
                             if (isset($events['nextPageToken'])) {
                                 $payload['pageToken'] = $events['nextPageToken'];
                             }
                             $events = \Rest::get(sprintf(static::$endpoints['events'], $calendar['calendar_id']), $payload, $destination);
                             if (isset($events['result']['error'])) {
                                 d(static::$endpoints['events']);
                             }
                             if (isset($events['items'])) {
                                 foreach ($events['items'] as $event) {
                                     if (isset($event['summary'])) {
                                         $newEvents[static::identifier($event, $calendar)] = $event['id'];
                                     }
                                 }
                             }
                         } while (isset($events['nextPageToken']) && $events['nextPageToken']);
                         // Mark events
                         foreach ($migratedEvents as $event) {
                             if (isset($newEvents[$event['unique']])) {
                                 $toDeleteEvents[] = array('eventId' => $newEvents[$event['unique']], 'calendarId' => $calendar['calendar_id']);
                             }
                         }
                     }
                 }
             }
         }
     }
     switch (true) {
         # Share / Clean
         ############################################################################
         case !empty($whitelist):
             // Calendars
             if ($calendars) {
                 foreach ($calendars as $calendar) {
                     if (isset($whitelist['calendars']) && in_array($calendar['calendar_id'], $whitelist['calendars'])) {
                         \Rest::delete('https://www.googleapis.com/calendar/v3/calendars/' . $calendar['calendar_id'], array(), $destination);
                     }
                 }
             }
             break;
             # Move
             ############################################################################
         # Move
         ############################################################################
         case $destination['username']['id'] == $source['username']['id']:
             // Calendars
             if ($calendars) {
                 foreach ($calendars as $calendar) {
                     \Rest::delete('https://www.googleapis.com/calendar/v3/calendars/' . $calendar['calendar_id'], array(), $destination);
                 }
             }
             # Migrate / Sync
             ############################################################################
         # Migrate / Sync
         ############################################################################
         default:
             // Calendars
             if ($calendars && $task['stats']['calendars']) {
                 foreach ($calendars as $calendar) {
                     if ($calendar['calendar_new_id']) {
                         \Rest::delete('https://www.googleapis.com/calendar/v3/calendars/' . $calendar['calendar_new_id'], array(), $destination);
                     }
                 }
             }
             // Events
             if ($toDeleteEvents && $task['stats']['events']) {
                 foreach ($toDeleteEvents as $event) {
                     \Rest::delete('https://www.googleapis.com/calendar/v3/calendars/' . $event['calendarId'] . '/events/' . $event['eventId'], array(), $destination);
                 }
             }
             break;
     }
 }
示例#4
0
    public static function _transfer($source, $destination, $syncTaskId = 0, $ignoreUpdate = false, $whitelist = array())
    {
        // Stats
        $stats = array('contacts' => 0);
        // Get source data
        $contacts = BackupsModel::all(array('user_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['contact']))->toArray();
        $destinationContacts = BackupsModel::all(array('user_id' => $destination['username']['id'], 'sync_task_id' => $syncTaskId, 'entity_type' => static::$kind['contact']))->column('entity_title');
        $syncedContacts = MigratedDataModel::all(array('source_id' => $source['username']['id'], 'destination_id' => $destination['username']['id'], 'status' => MigratedDataModel::STATUS_ACTIVE, 'kind' => static::$kind['contact']))->column('identifier');
        if ($contacts) {
            foreach ($contacts as $contact) {
                $contactData = json_decode($contact['entity'], true);
                // Whitelisting used for share feature
                $whiteListed = true;
                if ($whitelist) {
                    if (isset($whitelist['contacts']) && $whitelist['contacts']) {
                        if (!in_array($contactData['id'], $whitelist['contacts'])) {
                            $whiteListed = false;
                        }
                    }
                }
                if (!in_array(md5($contactData['name']), $syncedContacts) && $whiteListed) {
                    $body = <<<EOD
<?xml version='1.0' encoding='UTF-8'?>
<entry
\txmlns='http://www.w3.org/2005/Atom'
\txmlns:gd='http://schemas.google.com/g/2005'>

EOD;
                    if (in_array($contactData['name'], $destinationContacts) && !$ignoreUpdate) {
                        $contactData['name'] = $contactData['name'] . ' (2)';
                    } else {
                        $contactData['name'] = $contactData['name'];
                    }
                    $body .= '<title type="text">' . $contactData['name'] . '</title>';
                    // Emails
                    if (isset($contactData['emails']) && $contactData['emails']) {
                        foreach ($contactData['emails'] as $email) {
                            $body .= '<gd:email rel="' . (isset($email['rel']) ? $email['rel'] : 'http://schemas.google.com/g/2005#other') . '"';
                            if (isset($email['primary'])) {
                                $body .= ' primary="true" ';
                            }
                            $body .= ' address="' . $email['address'] . '" />';
                        }
                    }
                    // IM
                    if (isset($contactData['im']) && $contactData['im']) {
                        foreach ($contactData['im'] as $im) {
                            $body .= '<gd:im address="' . $im['address'] . '" protocol="' . $im['protocol'] . '" rel="' . $im['rel'] . '"/>';
                        }
                    }
                    // Numbers
                    if (isset($contactData['phoneNumbers']) && $contactData['phoneNumbers']) {
                        foreach ($contactData['phoneNumbers'] as $number) {
                            $body .= '<gd:phoneNumber rel="' . $number['rel'] . '">' . $number['number'] . '</gd:phoneNumber>';
                        }
                    }
                    // Postal
                    if (isset($contactData['postalAddress']) && $contactData['postalAddress']) {
                        foreach ($contactData['postalAddress'] as $address) {
                            $body .= '<gd:postalAddress rel="' . $address['rel'] . '">' . $address['address'] . '</gd:postalAddress>';
                        }
                    }
                    $body .= '</entry>';
                    $newContact = \Rest::postXML(static::$endpoints['contacts'], $body, $destination);
                    // Update playlist with new id
                    if (!$ignoreUpdate && $newContact) {
                        $newContactId = @basename($newContact->id);
                        if ($newContactId) {
                            $oldPlaylist = BackupsModel::first($contact['id']);
                            $oldPlaylist->entity_new_id = $newContactId;
                            $oldPlaylist->save();
                        }
                    }
                    $stats['contacts']++;
                    $syncedContact = MigratedDataModel::create();
                    $syncedContact->source_id = $source['username']['id'];
                    $syncedContact->destination_id = $destination['username']['id'];
                    $syncedContact->task_id = 0;
                    $syncedContact->sync_task_id = $syncTaskId;
                    $syncedContact->table = BackupsModel::$schema['table'];
                    $syncedContact->table_id = $contact['id'];
                    $syncedContact->kind = static::$kind['contact'];
                    $syncedContact->identifier = md5($contactData['name']);
                    $syncedContact->status = MigratedDataModel::STATUS_ACTIVE;
                    $syncedContact->created = date(DATE_TIME);
                    $syncedContact->save();
                }
            }
        }
        return $stats;
    }
示例#5
0
 public static function _clean($destination, $source, $syncTaskId = 0, $whitelist = array())
 {
     $service = ServicesModel::first(array('library' => 'Youtube'))->toArray();
     $task = TasksServicesModel::first(array('task_id' => $syncTaskId, 'service_id' => $service['id']))->toArray();
     $task['stats'] = json_decode($task['stats'], true);
     // Playlists
     $playlists = PlaylistsModel::all(array('user_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId))->toArray();
     // Videos
     $videos = array();
     $migratedVideos = MigratedDataModel::all(array('source_id' => $source['username']['id'], 'sync_task_id' => $syncTaskId, 'kind' => static::$kind['video']));
     if ($migratedVideos) {
         $migratedVideos = $migratedVideos->toArray();
         if ($migratedVideos) {
             $destinationPlaylists = PlaylistsModel::all(array('user_id' => $destination['username']['id'], 'sync_task_id' => $syncTaskId));
             if ($destinationPlaylists) {
                 $destinationPlaylists = $destinationPlaylists->toArray();
                 if ($destinationPlaylists) {
                     foreach ($destinationPlaylists as $playlist) {
                         foreach ($migratedVideos as $video) {
                             $payload = array('part' => static::$part['playlistItems']['minimal'], 'playlistId' => $playlist['youtube_playlist_id'], 'videoId' => $video['identifier']);
                             $vids = array();
                             $vids = \Rest::get(static::$endpoints['playlistItems'], $payload, $destination);
                             if (isset($vids['result']['error'])) {
                                 d($vids);
                             }
                             if ($vids && $vids['items']) {
                                 foreach ($vids['items'] as $vid) {
                                     $videos[] = $vid['id'];
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
     // Subscriptions
     $newSubscriptions = array();
     $oldSubscriptions = MigratedDataModel::all(array('destination_id' => $destination['username']['id'], 'sync_task_id' => $syncTaskId))->column('identifier');
     do {
         $payload = array('part' => static::$part['subscriptions']['minimal'], 'mine' => 'true', 'maxResults' => static::$limit);
         if (isset($subscriptions['nextPageToken'])) {
             $payload['pageToken'] = $subscriptions['nextPageToken'];
         }
         $subscriptions = \Rest::get(static::$endpoints['subscriptions'], $payload, $destination);
         if (isset($subscriptions['result']['error'])) {
             d($subscriptions);
         }
         if ($subscriptions['items']) {
             foreach ($subscriptions['items'] as $sub) {
                 $newSubscriptions[] = $sub;
             }
         }
     } while (isset($subscriptions['nextPageToken']) && $subscriptions['nextPageToken']);
     switch (true) {
         # Share / Clean
         ############################################################################
         case !empty($whitelist):
             // Playlist
             if ($playlists) {
                 foreach ($playlists as $playlist) {
                     if (isset($whitelist['playlists']) && in_array($playlist['youtube_playlist_id'], $whitelist['playlists'])) {
                         \Rest::delete(static::$endpoints['playlists'], array('id' => $playlist['youtube_playlist_id']), $destination);
                     }
                 }
             }
             // Subscriptions
             if ($newSubscriptions) {
                 foreach ($newSubscriptions as $sub) {
                     if (isset($whitelist['subscriptions']) && in_array($sub['snippet']['resourceId']['channelId'], $whitelist['subscriptions'])) {
                         \Rest::delete(static::$endpoints['subscriptions'], array('id' => $sub['id']), $destination);
                     }
                 }
             }
             break;
             # Move
             ############################################################################
         # Move
         ############################################################################
         case $destination['username']['id'] == $source['username']['id']:
             // Playlist
             if ($playlists) {
                 foreach ($playlists as $playlist) {
                     \Rest::delete(static::$endpoints['playlists'], array('id' => $playlist['youtube_playlist_id']), $destination);
                 }
             }
             // Subscriptions
             if ($newSubscriptions) {
                 foreach ($newSubscriptions as $sub) {
                     \Rest::delete(static::$endpoints['subscriptions'], array('id' => $sub['id']), $destination);
                 }
             }
             break;
             # Migrate / Sync
             ############################################################################
         # Migrate / Sync
         ############################################################################
         default:
             // Playlist
             if ($playlists && $task['stats']['playlists']) {
                 foreach ($playlists as $playlist) {
                     if ($playlist['new_youtube_id']) {
                         \Rest::delete(static::$endpoints['playlists'], array('id' => $playlist['new_youtube_id']), $destination);
                     }
                 }
             }
             // Videos
             if ($videos && $task['stats']['videos']) {
                 foreach ($videos as $videoId) {
                     \Rest::delete(static::$endpoints['playlistItems'], array('id' => $videoId), $destination);
                 }
             }
             // Subscriptions
             if ($newSubscriptions) {
                 foreach ($newSubscriptions as $sub) {
                     if (in_array($sub['snippet']['resourceId']['channelId'], $oldSubscriptions) && $task['stats']['subscriptions']) {
                         \Rest::delete(static::$endpoints['subscriptions'], array('id' => $sub['id']), $destination);
                     }
                 }
             }
             break;
     }
 }
示例#6
0
 public static function detail()
 {
     $taskId = (int) $_POST['id'];
     $task = TasksModel::details($taskId);
     if ($task['services']) {
         foreach ($task['services'] as $service) {
             if ($service['id'] == $_POST['type']) {
                 $_service = $service;
             }
         }
     }
     $kinds = array();
     $graphData = array();
     switch ($_service['name']) {
         case 'Youtube':
             $kinds = array(Youtube::$kind['playlist'], Youtube::$kind['subscription']);
             // Graph data
             $graphData['source']['playlists'] = PlaylistsModel::all(array('sync_task_id' => $taskId, 'user_id' => $task['user_id']))->toArray();
             $graphData['source']['subscriptions'] = SubscriptionsModel::all(array('sync_task_id' => $taskId, 'user_id' => $task['user_id']))->toArray();
             $graphData['destination']['playlists'] = PlaylistsModel::all(array('sync_task_id' => $taskId, 'user_id' => $task['user_affected_id']))->toArray();
             $graphData['destination']['subscriptions'] = SubscriptionsModel::all(array('sync_task_id' => $taskId, 'user_id' => $task['user_affected_id']))->toArray();
             break;
         case 'Contacts':
             $kinds = array(Contacts::$kind['contact']);
             // Graph data
             $graphData['source']['contacts'] = BackupsModel::all(array('sync_task_id' => $taskId, 'user_id' => $task['user_id'], 'entity_type' => Contacts::$kind['contact']))->toArray();
             $graphData['destination']['contacts'] = BackupsModel::all(array('sync_task_id' => $taskId, 'user_id' => $task['user_affected_id'], 'entity_type' => Contacts::$kind['contact']))->toArray();
             break;
         case 'Tasks':
             $kinds = array(Tasks::$kind['list']);
             // Graph data
             $graphData['source']['lists'] = BackupsModel::all(array('sync_task_id' => $taskId, 'user_id' => $task['user_id'], 'entity_type' => Tasks::$kind['list']))->toArray();
             $graphData['destination']['lists'] = BackupsModel::all(array('sync_task_id' => $taskId, 'user_id' => $task['user_affected_id'], 'entity_type' => Tasks::$kind['list']))->toArray();
             break;
         case 'Calendar':
             $kinds = array(Calendar::$kind['calendar']);
             // Graph data
             $graphData['source']['calendars'] = BackupsModel::all(array('sync_task_id' => $taskId, 'user_id' => $task['user_id'], 'entity_type' => Calendar::$kind['calendar']))->toArray();
             $graphData['destination']['calendars'] = BackupsModel::all(array('sync_task_id' => $taskId, 'user_id' => $task['user_affected_id'], 'entity_type' => Calendar::$kind['calendar']))->toArray();
             break;
     }
     // Migrated Data
     $migratedData = array();
     $migrated = MigratedDataModel::all(array('sync_task_id' => $taskId, 'kind' => $kinds))->toArray();
     if ($migrated) {
         foreach ($migrated as $migrate) {
             switch ($migrate['kind']) {
                 case Youtube::$kind['playlist']:
                     $play = PlaylistsModel::first($migrate['table_id'])->toArray();
                     $migratedData['playlists'][] = $play;
                     $migratedData['playlistsGraph'][$migrate['source_id']][] = $play;
                     $migratedData['playlistsIds'][] = $play['id'];
                     break;
                 case Youtube::$kind['subscription']:
                     $subs = SubscriptionsModel::first($migrate['table_id'])->toArray();
                     $migratedData['subscriptions'][] = $subs;
                     $migratedData['subscriptionsGraph'][$migrate['source_id']][] = $subs;
                     $migratedData['subscriptionsIds'][] = $subs['id'];
                     break;
                 case Contacts::$kind['contact']:
                     $contact = BackupsModel::first($migrate['table_id'])->toArray();
                     $migratedData['contacts'][] = $contact;
                     $migratedData['contactsGraph'][$migrate['source_id']][] = $contact;
                     $migratedData['contactsIds'][] = $contact['id'];
                     break;
                 case Tasks::$kind['list']:
                     $contact = BackupsModel::first($migrate['table_id'])->toArray();
                     $migratedData['lists'][] = $contact;
                     $migratedData['listsGraph'][$migrate['source_id']][] = $contact;
                     $migratedData['listsIds'][] = $contact['id'];
                     break;
                 case Calendar::$kind['calendar']:
                     $calendar = CalendarsModel::first($migrate['table_id'])->toArray();
                     $migratedData['calendars'][] = $calendar;
                     $migratedData['calendarsGraph'][$migrate['source_id']][] = $calendar;
                     $migratedData['calendarsIds'][] = $calendar['id'];
                     break;
             }
         }
     }
     echo \Render::view('migrate/details/' . strtolower($_service['name']), array('task' => $task, 'service' => $_service, 'migratedData' => $migratedData, 'graphData' => $graphData), 'return');
 }