%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/cospend/lib/UserMigration/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/cospend/lib/UserMigration/UserMigrator.php |
<?php declare(strict_types=1); namespace OCA\Cospend\UserMigration; use OCA\Cospend\AppInfo\Application; use OCA\Cospend\Db\Project; use OCA\Cospend\Db\ProjectMapper; use OCA\Cospend\Service\ProjectService; use OCP\IConfig; use OCP\IL10N; use OCP\IUser; use OCP\UserMigration\IExportDestination; use OCP\UserMigration\IImportSource; use OCP\UserMigration\IMigrator; use OCP\UserMigration\ISizeEstimationMigrator; use OCP\UserMigration\TMigratorBasicVersionHandling; use OCP\UserMigration\UserMigrationException; use Symfony\Component\Console\Output\OutputInterface; use Throwable; class UserMigrator implements IMigrator, ISizeEstimationMigrator { use TMigratorBasicVersionHandling; private const PATH_ROOT = Application::APP_ID; private const PROJECTS_PATH = self::PATH_ROOT . '/projects'; private const SETTINGS_PATH = self::PATH_ROOT . '/settings.json'; public function __construct( private ProjectService $projectService, private ProjectMapper $projectMapper, private IConfig $config, private IL10N $l10n ) { } /** * Returns an estimate of the exported data size in KiB. * Should be fast, favor performance over accuracy. * * @since 25.0.0 */ public function getEstimatedExportSize(IUser $user): int { $size = 100; // 100KiB for user data JSON return $size; } /** * Export user data * * @throws UserMigrationException * @since 24.0.0 */ public function export(IUser $user, IExportDestination $exportDestination, OutputInterface $output): void { $output->writeln('Exporting Cospend projects in ' . self::PROJECTS_PATH . '…'); $userId = $user->getUID(); /** @var Project[] $projects */ $projects = $this->projectMapper->getProjects($userId); foreach ($projects as $project) { try { $exportFilePath = self::PROJECTS_PATH . '/' . $project->getId() . '.csv'; $content = ''; foreach ($this->projectService->getJsonProject($project->getId()) as $chunk) { $content .= $chunk; } $exportDestination->addFileContents($exportFilePath, $content); } catch (Throwable $e) { throw new UserMigrationException('Could not export Cospend projects', 0, $e); } } // settings $userSettings = []; foreach ($this->config->getUserKeys($userId, Application::APP_ID) as $key) { $value = $this->config->getUserValue($userId, Application::APP_ID, $key, null); if ($value !== null) { $userSettings[$key] = $value; } } $exportDestination->addFileContents(self::SETTINGS_PATH, json_encode($userSettings)); } /** * Import user data * * @throws UserMigrationException * @since 24.0.0 */ public function import(IUser $user, IImportSource $importSource, OutputInterface $output): void { if ($importSource->getMigratorVersion($this->getId()) === null) { $output->writeln('No version for ' . static::class . ', skipping import…'); return; } $output->writeln('Importing Cospend projects from ' . self::PROJECTS_PATH . '…'); // no idea why this does not work // zip->locateName($path) works with the trashbin app but not here /* if (!$importSource->pathExists(self::PATH_ROOT)) { $output->writeln('No Cospend directory, skipping import…'); return; } if (!$importSource->pathExists(self::PROJECTS_PATH)) { $output->writeln('No "projects" directory for Cospend, skipping import…'); return; } */ $userId = $user->getUID(); $fileList = $importSource->getFolderListing(self::PROJECTS_PATH . '/'); foreach ($fileList as $fileName) { try { $handler = $importSource->getFileAsStream(self::PROJECTS_PATH . '/' . $fileName); $projectName = preg_replace('/\.csv$/', '', $fileName); $this->projectService->importCsvProjectAtomicWrapper($handler, $userId, $projectName); } catch (Throwable $e) { // throw new UserMigrationException('Could not import Cospend project in ' . $fileName, 0, $e); $output->writeln('Error when importing Cospend project in ' . $fileName); } } // settings if ($importSource->pathExists(self::SETTINGS_PATH)) { $settingsFileContent = $importSource->getFileContents(self::SETTINGS_PATH); $settings = json_decode($settingsFileContent, true); if ($settings !== false && is_array($settings)) { foreach ($settings as $key => $value) { $this->config->setUserValue($userId, Application::APP_ID, $key, (string)$value); } } } } /** * Returns the unique ID * * @since 24.0.0 */ public function getId(): string { return 'cospend'; } /** * Returns the display name * * @since 24.0.0 */ public function getDisplayName(): string { return $this->l10n->t('Cospend'); } /** * Returns the description * * @since 24.0.0 */ public function getDescription(): string { return $this->l10n->t('Cospend projects and user settings'); } }