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; }
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; }
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; } }
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; }
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; } }
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'); }