X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FSettings%2FUserExport.php;h=132505371ecbd8477d91d68812c2e545cacb3d69;hb=c6b45a958e3b09bc8f3950a718c181dfc9e0b910;hp=2a19d5f208ae7acccfefc4907778443758de21fb;hpb=15cdfdd414937554ecfefacabea0b8ff55628050;p=friendica.git diff --git a/src/Module/Settings/UserExport.php b/src/Module/Settings/UserExport.php index 2a19d5f208..132505371e 100644 --- a/src/Module/Settings/UserExport.php +++ b/src/Module/Settings/UserExport.php @@ -1,53 +1,68 @@ . + * */ namespace Friendica\Module\Settings; use Friendica\App; -use Friendica\App\Arguments; -use Friendica\BaseModule; use Friendica\Core\Hook; -use Friendica\Core\L10n; use Friendica\Core\Renderer; -use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\Database\DBStructure; -use Friendica\Module\BaseSettingsModule; +use Friendica\DI; +use Friendica\Module\BaseSettings; /** * Module to export user data **/ -class UserExport extends BaseSettingsModule +class UserExport extends BaseSettings { /** * Handle the request to export data. - * At the moment one can export two different data set + * At the moment one can export three different data set * 1. The profile data that can be used by uimport to resettle * to a different Friendica instance * 2. The entire data-set, profile plus postings + * 3. A list of contacts as CSV file similar to the export of Mastodon * * If there is an action required through the URL / path, react * accordingly and export the requested data. **/ - public static function content() + public static function content(array $parameters = []) { - parent::content(); + parent::content($parameters); /** * options shown on "Export personal data" page * list of array( 'link url', 'link text', 'help text' ) */ $options = [ - ['settings/uexport/account', L10n::t('Export account'), L10n::t('Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server.')], - ['settings/uexport/backup', L10n::t('Export all'), L10n::t("Export your accout info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account \x28photos are not exported\x29")], + ['settings/userexport/account', DI::l10n()->t('Export account'), DI::l10n()->t('Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server.')], + ['settings/userexport/backup', DI::l10n()->t('Export all'), DI::l10n()->t("Export your account info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account \x28photos are not exported\x29")], + ['settings/userexport/contact', DI::l10n()->t('Export Contacts to CSV'), DI::l10n()->t("Export the list of the accounts you are following as CSV file. Compatible to e.g. Mastodon.")], ]; Hook::callAll('uexport_options', $options); $tpl = Renderer::getMarkupTemplate("settings/userexport.tpl"); return Renderer::replaceMacros($tpl, [ - '$title' => L10n::t('Export personal data'), + '$title' => DI::l10n()->t('Export personal data'), '$options' => $options ]); } @@ -57,22 +72,30 @@ class UserExport extends BaseSettingsModule * to the browser which then offers a save / open dialog * to the user. **/ - public static function rawContent() + public static function rawContent(array $parameters = []) { - $args = self::getClass(Arguments::class); + $args = DI::args(); if ($args->getArgc() == 3) { // @TODO Replace with router-provided arguments $action = $args->get(2); - $user = self::getApp()->user; - header("Content-type: application/json"); - header('Content-Disposition: attachment; filename="' . $user['nickname'] . '.' . $action . '"'); + $user = DI::app()->user; switch ($action) { case "backup": - self::exportAll(self::getApp()); + header("Content-type: application/json"); + header('Content-Disposition: attachment; filename="' . $user['nickname'] . '.' . $action . '"'); + self::exportAll(DI::app()); exit(); break; case "account": - self::exportAccount(self::getApp()); + header("Content-type: application/json"); + header('Content-Disposition: attachment; filename="' . $user['nickname'] . '.' . $action . '"'); + self::exportAccount(DI::app()); + exit(); + break; + case "contact": + header("Content-type: application/csv"); + header('Content-Disposition: attachment; filename="' . $user['nickname'] . '-contacts.csv'. '"'); + self::exportContactsAsCSV(); exit(); break; default: @@ -82,35 +105,31 @@ class UserExport extends BaseSettingsModule } private static function exportMultiRow(string $query) { - $dbStructure = DBStructure::definition(self::getApp()->getBasePath(), false); + $dbStructure = DBStructure::definition(DI::app()->getBasePath(), false); preg_match("/\s+from\s+`?([a-z\d_]+)`?/i", $query, $match); $table = $match[1]; $result = []; - $r = q($query); - if (DBA::isResult($r)) { - foreach ($r as $rr) { - $p = []; - foreach ($rr as $k => $v) { - switch ($dbStructure[$table]['fields'][$k]['type']) { - case 'datetime': - $p[$k] = $v ?? DBA::NULL_DATETIME; - break; - default: - $p[$k] = $v; - break; - } + $rows = DBA::p($query); + while ($row = DBA::fetch($rows)) { + $p = []; + foreach ($dbStructure[$table]['fields'] as $column => $field) { + if ($field['type'] == 'datetime') { + $p[$column] = $v ?? DBA::NULL_DATETIME; + } else { + $p[$column] = $v; } - $result[] = $p; } + $result[] = $p; } + DBA::close($rows); return $result; } private static function exportRow(string $query) { - $dbStructure = DBStructure::definition(self::getApp()->getBasePath(), false); + $dbStructure = DBStructure::definition(DI::app()->getBasePath(), false); preg_match("/\s+from\s+`?([a-z\d_]+)`?/i", $query, $match); $table = $match[1]; @@ -135,6 +154,20 @@ class UserExport extends BaseSettingsModule return $result; } + /** + * Export a list of the contacts as CSV file as e.g. Mastodon and Pleroma are doing. + **/ + private static function exportContactsAsCSV() + { + // write the table header (like Mastodon) + echo "Account address, Show boosts\n"; + // get all the contacts + $contacts = DBA::select('contact', ['addr'], ['uid' => $_SESSION['uid'], 'self' => false, 'rel' => [1,3], 'deleted' => false]); + while ($contact = DBA::fetch($contacts)) { + echo $contact['addr'] . ", true\n"; + } + DBA::close($contacts); + } private static function exportAccount(App $a) { $user = self::exportRow( @@ -147,7 +180,11 @@ class UserExport extends BaseSettingsModule $profile = self::exportMultiRow( - sprintf("SELECT * FROM `profile` WHERE `uid` = %d ", intval(local_user())) + sprintf("SELECT *, 'default' AS `profile_name`, 1 AS `is-default` FROM `profile` WHERE `uid` = %d ", intval(local_user())) + ); + + $profile_fields = self::exportMultiRow( + sprintf("SELECT * FROM `profile_field` WHERE `uid` = %d ", intval(local_user())) ); $photo = self::exportMultiRow( @@ -172,10 +209,11 @@ class UserExport extends BaseSettingsModule $output = [ 'version' => FRIENDICA_VERSION, 'schema' => DB_UPDATE_VERSION, - 'baseurl' => System::baseUrl(), + 'baseurl' => DI::baseUrl(), 'user' => $user, 'contact' => $contact, 'profile' => $profile, + 'profile_fields' => $profile_fields, 'photo' => $photo, 'pconfig' => $pconfig, 'group' => $group, @@ -189,7 +227,7 @@ class UserExport extends BaseSettingsModule * echoes account data and items as separated json, one per line * * @param App $a - * @throws Exception + * @throws \Exception */ private static function exportAll(App $a) {