aboutsummaryrefslogtreecommitdiffstats
path: root/ui/effect.js
Commit message (Expand)AuthorAgeFilesLines
* All: Update JS Foundation mentions to OpenJS FoundationMichał Gołębiowski-Owczarek2022-07-191-1/+1
* Effect: Define the jQuery variable before jQuery Color gets importedMichał Gołębiowski-Owczarek2021-09-031-5/+2
* Docs: Update removal comments to mention 1.14, not 1.13Michał Gołębiowski-Owczarek2021-08-261-1/+1
* Build: Migrate from JSHint & JSCS to ESLintMichał Gołębiowski-Owczarek2021-06-071-4/+8
* Build: Update jQuery Simulate, jQuery Migrate & jQuery ColorMichał Gołębiowski-Owczarek2020-05-161-682/+5
* All: Use expr.pseudos instead of deprecated expr.filtersMaksymenkov Eugene2019-12-081-3/+3
* All: Migrate away from deprecated/removed Core APIsMichał Gołębiowski-Owczarek2019-12-081-22/+28
* All: Remove uses of `jQuery.camelCase()`Scott González2017-05-171-1/+7
* Effect: Fix typoLuke Brookhart2016-12-161-1/+1
* Effect: Disable maxLineLength for description metaAlexander Schmitz2016-04-131-0/+2
* Effect: Fix line length issuesAlexander Schmitz2016-04-131-17/+30
* Effects: Style updatesAlexander Schmitz2015-08-211-173/+190
* Core: Move version and creation of the ui namespace into its own moduleAlexander Schmitz2015-08-081-1/+1
* Effects: Remove core event/alias and deprecated module dependenciesAlexander Schmitz2015-05-201-2/+2
* Effect: Make .transfer() callback optionalJörn Zaefferer2015-04-241-1/+3
* All: Drop support for jQuery 1.6.xJörn Zaefferer2015-01-131-8/+0
* Build: Remove dates from copyright noticeAnne-Gaelle Colom2015-01-021-1/+1
* Effects: RewriteMike Sherov2014-12-101-130/+433
* Build: Remove manifest files; move metadata to source filesScott González2014-11-101-2/+7
* Build: Update jscs and fix some code style issuesJörn Zaefferer2014-08-141-2/+2
* Effect: Create a local jQuery variable to make jQuery Color workScott González2014-07-151-1/+5
* All: Updating copyright year to 2014TJ VanToll2014-01-281-2/+2
* All: Rename all files, removing the "jquery.ui." prefix;Rafael Xavier de Souza2014-01-241-0/+1297
can-eq Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Files/Mount/ObjectStorePreviewCacheMountProvider.php
blob: 1546ef98f5020c11ba8d591815ffeda1b920b2b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?php

declare(strict_types=1);

/**
 * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */
namespace OC\Files\Mount;

use OC\Files\ObjectStore\AppdataPreviewObjectStoreStorage;
use OC\Files\ObjectStore\ObjectStoreStorage;
use OC\Files\Storage\Wrapper\Jail;
use OCP\Files\Config\IRootMountProvider;
use OCP\Files\Storage\IStorageFactory;
use OCP\IConfig;
use Psr\Log\LoggerInterface;

/**
 * Mount provider for object store app data folder for previews
 */
class ObjectStorePreviewCacheMountProvider implements IRootMountProvider {
	private LoggerInterface $logger;
	/** @var IConfig */
	private $config;

	public function __construct(LoggerInterface $logger, IConfig $config) {
		$this->logger = $logger;
		$this->config = $config;
	}

	/**
	 * @return MountPoint[]
	 * @throws \Exception
	 */
	public function getRootMounts(IStorageFactory $loader): array {
		if (!is_array($this->config->getSystemValue('objectstore_multibucket'))) {
			return [];
		}
		if ($this->config->getSystemValue('objectstore.multibucket.preview-distribution', false) !== true) {
			return [];
		}

		$instanceId = $this->config->getSystemValueString('instanceid', '');
		$mountPoints = [];
		$directoryRange = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
		$i = 0;
		foreach ($directoryRange as $parent) {
			foreach ($directoryRange as $child) {
				$mountPoints[] = new MountPoint(
					AppdataPreviewObjectStoreStorage::class,
					'/appdata_' . $instanceId . '/preview/' . $parent . '/' . $child,
					$this->getMultiBucketObjectStore($i),
					$loader,
					null,
					null,
					self::class
				);
				$i++;
			}
		}

		$rootStorageArguments = $this->getMultiBucketObjectStoreForRoot();
		$fakeRootStorage = new ObjectStoreStorage($rootStorageArguments);
		$fakeRootStorageJail = new Jail([
			'storage' => $fakeRootStorage,
			'root' => '/appdata_' . $instanceId . '/preview',
		]);

		// add a fallback location to be able to fetch existing previews from the old bucket
		$mountPoints[] = new MountPoint(
			$fakeRootStorageJail,
			'/appdata_' . $instanceId . '/preview/old-multibucket',
			null,
			$loader,
			null,
			null,
			self::class
		);

		return $mountPoints;
	}

	protected function getMultiBucketObjectStore(int $number): array {
		$config = $this->config->getSystemValue('objectstore_multibucket');

		// sanity checks
		if (empty($config['class'])) {
			$this->logger->error('No class given for objectstore', ['app' => 'files']);
		}
		if (!isset($config['arguments'])) {
			$config['arguments'] = [];
		}

		/*
		 * Use any provided bucket argument as prefix
		 * and add the mapping from parent/child => bucket
		 */
		if (!isset($config['arguments']['bucket'])) {
			$config['arguments']['bucket'] = '';
		}

		$config['arguments']['bucket'] .= "-preview-$number";

		// instantiate object store implementation
		$config['arguments']['objectstore'] = new $config['class']($config['arguments']);

		$config['arguments']['internal-id'] = $number;

		return $config['arguments'];
	}

	protected function getMultiBucketObjectStoreForRoot(): array {
		$config = $this->config->getSystemValue('objectstore_multibucket');

		// sanity checks
		if (empty($config['class'])) {
			$this->logger->error('No class given for objectstore', ['app' => 'files']);
		}
		if (!isset($config['arguments'])) {
			$config['arguments'] = [];
		}

		/*
		 * Use any provided bucket argument as prefix
		 * and add the mapping from parent/child => bucket
		 */
		if (!isset($config['arguments']['bucket'])) {
			$config['arguments']['bucket'] = '';
		}
		$config['arguments']['bucket'] .= '0';

		// instantiate object store implementation
		$config['arguments']['objectstore'] = new $config['class']($config['arguments']);

		return $config['arguments'];
	}
}