You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.9 KiB
PHP
98 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace OCA\KiCanvasViewer\Controller;
|
|
|
|
use OCP\AppFramework\Controller;
|
|
use OCP\AppFramework\Http\TemplateResponse;
|
|
use OCP\AppFramework\Http\DataDisplayResponse;
|
|
use OCP\Files\IRootFolder;
|
|
use OCP\IRequest;
|
|
use OCP\IUserSession;
|
|
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
|
|
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
|
|
use OCP\AppFramework\Http\JSONResponse;
|
|
|
|
class ViewerController extends Controller {
|
|
public function __construct(
|
|
string $appName,
|
|
IRequest $request,
|
|
private IRootFolder $rootFolder,
|
|
private IUserSession $userSession,
|
|
) {
|
|
parent::__construct($appName, $request);
|
|
}
|
|
|
|
#[NoAdminRequired]
|
|
#[NoCSRFRequired]
|
|
public function view(int $fileId): TemplateResponse {
|
|
$file = $this->getFileById($fileId);
|
|
$name = $file->getName();
|
|
|
|
return new TemplateResponse('kicanvasviewer', 'viewer', [
|
|
'fileId' => $fileId,
|
|
'fileName' => $name,
|
|
]);
|
|
}
|
|
|
|
#[NoAdminRequired]
|
|
#[NoCSRFRequired]
|
|
public function file(int $fileId, string $name): DataDisplayResponse {
|
|
$file = $this->getFileById($fileId);
|
|
|
|
if (!preg_match('/\.(kicad_sch|kicad_pcb)$/i', $file->getName())) {
|
|
return new DataDisplayResponse('Unsupported file type', 400);
|
|
}
|
|
|
|
$response = new DataDisplayResponse($file->getContent());
|
|
$response->addHeader('Content-Type', 'text/plain; charset=utf-8');
|
|
$response->addHeader('Content-Disposition', 'inline; filename="' . basename($file->getName()) . '"');
|
|
|
|
return $response;
|
|
}
|
|
|
|
private function getFileById(int $fileId) {
|
|
$user = $this->userSession->getUser();
|
|
if ($user === null) {
|
|
throw new \Exception('Not logged in');
|
|
}
|
|
|
|
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
|
|
$nodes = $userFolder->getById($fileId);
|
|
|
|
if (empty($nodes)) {
|
|
throw new \Exception('File not found');
|
|
}
|
|
|
|
return $nodes[0];
|
|
}
|
|
|
|
#[NoAdminRequired]
|
|
#[NoCSRFRequired]
|
|
public function resolve(string $etag): JSONResponse {
|
|
$user = $this->userSession->getUser();
|
|
|
|
if ($user === null) {
|
|
return new JSONResponse(['error' => 'not logged in'], 401);
|
|
}
|
|
|
|
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
|
|
|
|
$nodes = array_merge(
|
|
$userFolder->searchByMime('application/x-kicad-schematic'),
|
|
$userFolder->searchByMime('application/x-kicad-pcb')
|
|
);
|
|
|
|
foreach ($nodes as $node) {
|
|
if ($node->getEtag() === $etag) {
|
|
return new JSONResponse([
|
|
'fileId' => $node->getId(),
|
|
'fileName' => $node->getName(),
|
|
'mime' => $node->getMimeType(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
return new JSONResponse(['error' => 'not found'], 404);
|
|
}
|
|
}
|