|
9 | 9 |
|
10 | 10 | namespace OCA\Settings\Controller; |
11 | 11 |
|
12 | | -use OC\Preview\Failure\PreviewFailureService; |
13 | 12 | use OC\Preview\PreviewAdminConfig; |
14 | 13 | use OCA\Settings\Settings\Admin\Previews; |
15 | | -use OCP\AppFramework\Controller; |
16 | | -use OCP\AppFramework\Db\DoesNotExistException; |
17 | 14 | use OCP\AppFramework\Http; |
| 15 | +use OCP\AppFramework\Http\Attribute\ApiRoute; |
18 | 16 | use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting; |
| 17 | +use OCP\AppFramework\Http\Attribute\OpenAPI; |
19 | 18 | use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired; |
20 | 19 | use OCP\AppFramework\Http\DataResponse; |
21 | | -use OCP\Files\File; |
22 | | -use OCP\Files\IRootFolder; |
23 | | -use OCP\Files\NotFoundException; |
| 20 | +use OCP\AppFramework\OCS\OCSBadRequestException; |
| 21 | +use OCP\AppFramework\OCSController; |
24 | 22 | use OCP\Http\Client\IClientService; |
25 | | -use OCP\IPreview; |
26 | 23 | use OCP\IRequest; |
27 | 24 | use Psr\Log\LoggerInterface; |
28 | 25 |
|
29 | | -class PreviewAdminController extends Controller { |
| 26 | +#[OpenAPI(scope: OpenAPI::SCOPE_ADMINISTRATION)] |
| 27 | +class PreviewAdminController extends OCSController { |
30 | 28 | public function __construct( |
31 | 29 | string $appName, |
32 | 30 | IRequest $request, |
33 | 31 | private PreviewAdminConfig $previewAdminConfig, |
34 | | - private PreviewFailureService $failureService, |
35 | 32 | private IClientService $clientService, |
36 | | - private IPreview $preview, |
37 | | - private IRootFolder $rootFolder, |
38 | 33 | private LoggerInterface $logger, |
39 | 34 | ) { |
40 | 35 | parent::__construct($appName, $request); |
41 | 36 | } |
42 | 37 |
|
43 | 38 | /** |
44 | | - * @param array $settings |
| 39 | + * Update preview administration settings |
| 40 | + * |
| 41 | + * @param array<string, mixed> $settings Preview settings to persist |
| 42 | + * @return DataResponse<Http::STATUS_OK, array<string, mixed>, array{}> |
| 43 | + * @throws OCSBadRequestException Invalid settings payload |
| 44 | + * |
| 45 | + * 200: Settings saved |
45 | 46 | */ |
46 | 47 | #[AuthorizedAdminSetting(settings: Previews::class)] |
47 | 48 | #[PasswordConfirmationRequired] |
| 49 | + #[ApiRoute(verb: 'PUT', url: '/api/admin/previews')] |
48 | 50 | public function update(array $settings): DataResponse { |
49 | 51 | try { |
50 | 52 | $this->previewAdminConfig->setSettings($settings); |
51 | 53 | } catch (\InvalidArgumentException $e) { |
52 | | - return new DataResponse(['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST); |
| 54 | + throw new OCSBadRequestException($e->getMessage()); |
53 | 55 | } |
54 | 56 |
|
55 | 57 | return new DataResponse($this->previewAdminConfig->getSettings()); |
56 | 58 | } |
57 | 59 |
|
| 60 | + /** |
| 61 | + * Test connectivity to an Imaginary preview service |
| 62 | + * |
| 63 | + * @param string|null $url Imaginary base URL |
| 64 | + * @param string|null $key Optional Imaginary API key |
| 65 | + * @return DataResponse<Http::STATUS_OK, array{status: string, httpCode?: int, error?: string}, array{}> |
| 66 | + * @throws OCSBadRequestException Invalid URL |
| 67 | + * |
| 68 | + * 200: Connection test completed |
| 69 | + */ |
58 | 70 | #[AuthorizedAdminSetting(settings: Previews::class)] |
| 71 | + #[ApiRoute(verb: 'POST', url: '/api/admin/previews/imaginary/test')] |
59 | 72 | public function testImaginary(?string $url = null, ?string $key = null): DataResponse { |
60 | 73 | try { |
61 | 74 | $target = $this->previewAdminConfig->validateImaginaryUrl($url ?? ''); |
62 | 75 | } catch (\InvalidArgumentException $e) { |
63 | | - return new DataResponse([ |
64 | | - 'status' => 'unreachable', |
65 | | - 'error' => $e->getMessage(), |
66 | | - ], Http::STATUS_BAD_REQUEST); |
| 76 | + throw new OCSBadRequestException($e->getMessage()); |
67 | 77 | } |
68 | 78 |
|
69 | 79 | if ($target === '') { |
@@ -99,69 +109,4 @@ public function testImaginary(?string $url = null, ?string $key = null): DataRes |
99 | 109 | ]); |
100 | 110 | } |
101 | 111 | } |
102 | | - |
103 | | - #[AuthorizedAdminSetting(settings: Previews::class)] |
104 | | - public function listFailures(?string $mime = null, ?string $provider = null, ?string $range = null): DataResponse { |
105 | | - $since = $this->rangeToSince($range); |
106 | | - return new DataResponse([ |
107 | | - 'failures' => $this->failureService->listFailures($mime, $provider, $since), |
108 | | - ]); |
109 | | - } |
110 | | - |
111 | | - #[AuthorizedAdminSetting(settings: Previews::class)] |
112 | | - public function retryFailure(int $id): DataResponse { |
113 | | - try { |
114 | | - $failure = $this->failureService->get($id); |
115 | | - } catch (DoesNotExistException) { |
116 | | - return new DataResponse(['error' => 'Unknown failure'], Http::STATUS_NOT_FOUND); |
117 | | - } |
118 | | - |
119 | | - $nodes = $this->rootFolder->getById($failure->getFileId()); |
120 | | - $file = null; |
121 | | - foreach ($nodes as $node) { |
122 | | - if ($node instanceof File) { |
123 | | - $file = $node; |
124 | | - break; |
125 | | - } |
126 | | - } |
127 | | - if ($file === null) { |
128 | | - return new DataResponse(['error' => 'File not found'], Http::STATUS_NOT_FOUND); |
129 | | - } |
130 | | - |
131 | | - try { |
132 | | - $this->preview->getPreview($file); |
133 | | - $this->failureService->clearForFile($failure->getFileId()); |
134 | | - return new DataResponse(['status' => 'ok']); |
135 | | - } catch (NotFoundException|\InvalidArgumentException $e) { |
136 | | - return new DataResponse([ |
137 | | - 'status' => 'failed', |
138 | | - 'error' => $e->getMessage(), |
139 | | - ], Http::STATUS_BAD_REQUEST); |
140 | | - } |
141 | | - } |
142 | | - |
143 | | - #[AuthorizedAdminSetting(settings: Previews::class)] |
144 | | - public function deleteFailure(int $id): DataResponse { |
145 | | - try { |
146 | | - $this->failureService->delete($id); |
147 | | - } catch (DoesNotExistException) { |
148 | | - return new DataResponse(['error' => 'Unknown failure'], Http::STATUS_NOT_FOUND); |
149 | | - } |
150 | | - return new DataResponse(['status' => 'ok']); |
151 | | - } |
152 | | - |
153 | | - #[AuthorizedAdminSetting(settings: Previews::class)] |
154 | | - public function clearFailures(): DataResponse { |
155 | | - $this->failureService->clearAll(); |
156 | | - return new DataResponse(['status' => 'ok']); |
157 | | - } |
158 | | - |
159 | | - private function rangeToSince(?string $range): ?int { |
160 | | - return match ($range) { |
161 | | - '24h' => time() - 86400, |
162 | | - '7d' => time() - 7 * 86400, |
163 | | - '30d' => time() - 30 * 86400, |
164 | | - default => null, |
165 | | - }; |
166 | | - } |
167 | 112 | } |
0 commit comments