public-album: add download API (fix #621)
Signed-off-by: Varun Patil <radialapps@gmail.com>pull/672/head
parent
4bb41d1cc4
commit
98b60f44ca
|
@ -47,6 +47,7 @@ return [
|
||||||
|
|
||||||
// Public album share
|
// Public album share
|
||||||
['name' => 'PublicAlbum#showShare', 'url' => '/a/{token}', 'verb' => 'GET'],
|
['name' => 'PublicAlbum#showShare', 'url' => '/a/{token}', 'verb' => 'GET'],
|
||||||
|
['name' => 'PublicAlbum#download', 'url' => '/a/{token}/download', 'verb' => 'GET'],
|
||||||
|
|
||||||
// API Routes
|
// API Routes
|
||||||
['name' => 'Days#days', 'url' => '/api/days', 'verb' => 'GET'],
|
['name' => 'Days#days', 'url' => '/api/days', 'verb' => 'GET'],
|
||||||
|
|
|
@ -6,12 +6,14 @@ use OCA\Memories\Db\AlbumsQuery;
|
||||||
use OCP\App\IAppManager;
|
use OCP\App\IAppManager;
|
||||||
use OCP\AppFramework\Controller;
|
use OCP\AppFramework\Controller;
|
||||||
use OCP\AppFramework\Http\RedirectResponse;
|
use OCP\AppFramework\Http\RedirectResponse;
|
||||||
|
use OCP\AppFramework\Http\Template\LinkMenuAction;
|
||||||
use OCP\AppFramework\Http\Template\PublicTemplateResponse;
|
use OCP\AppFramework\Http\Template\PublicTemplateResponse;
|
||||||
use OCP\AppFramework\Http\TemplateResponse;
|
use OCP\AppFramework\Http\TemplateResponse;
|
||||||
use OCP\AppFramework\Services\IInitialState;
|
use OCP\AppFramework\Services\IInitialState;
|
||||||
use OCP\EventDispatcher\IEventDispatcher;
|
use OCP\EventDispatcher\IEventDispatcher;
|
||||||
use OCP\Files\IRootFolder;
|
use OCP\Files\IRootFolder;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
|
use OCP\IL10N;
|
||||||
use OCP\IURLGenerator;
|
use OCP\IURLGenerator;
|
||||||
use OCP\IUserSession;
|
use OCP\IUserSession;
|
||||||
use OCP\Util;
|
use OCP\Util;
|
||||||
|
@ -27,6 +29,7 @@ class PublicAlbumController extends Controller
|
||||||
protected IRootFolder $rootFolder;
|
protected IRootFolder $rootFolder;
|
||||||
protected IURLGenerator $urlGenerator;
|
protected IURLGenerator $urlGenerator;
|
||||||
protected AlbumsQuery $albumsQuery;
|
protected AlbumsQuery $albumsQuery;
|
||||||
|
protected IL10N $l10n;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
string $appName,
|
string $appName,
|
||||||
|
@ -37,7 +40,8 @@ class PublicAlbumController extends Controller
|
||||||
IUserSession $userSession,
|
IUserSession $userSession,
|
||||||
IRootFolder $rootFolder,
|
IRootFolder $rootFolder,
|
||||||
IURLGenerator $urlGenerator,
|
IURLGenerator $urlGenerator,
|
||||||
AlbumsQuery $albumsQuery
|
AlbumsQuery $albumsQuery,
|
||||||
|
IL10N $l10n
|
||||||
) {
|
) {
|
||||||
$this->appName = $appName;
|
$this->appName = $appName;
|
||||||
$this->eventDispatcher = $eventDispatcher;
|
$this->eventDispatcher = $eventDispatcher;
|
||||||
|
@ -48,6 +52,7 @@ class PublicAlbumController extends Controller
|
||||||
$this->rootFolder = $rootFolder;
|
$this->rootFolder = $rootFolder;
|
||||||
$this->urlGenerator = $urlGenerator;
|
$this->urlGenerator = $urlGenerator;
|
||||||
$this->albumsQuery = $albumsQuery;
|
$this->albumsQuery = $albumsQuery;
|
||||||
|
$this->l10n = $l10n;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -86,14 +91,48 @@ class PublicAlbumController extends Controller
|
||||||
// Scripts
|
// Scripts
|
||||||
Util::addScript($this->appName, 'memories-main');
|
Util::addScript($this->appName, 'memories-main');
|
||||||
|
|
||||||
|
// Render main template
|
||||||
$response = new PublicTemplateResponse($this->appName, 'main', PageController::getMainParams());
|
$response = new PublicTemplateResponse($this->appName, 'main', PageController::getMainParams());
|
||||||
$response->setHeaderTitle($album['name']);
|
$response->setHeaderTitle($album['name']);
|
||||||
$response->setFooterVisible(false); // wth is that anyway?
|
$response->setFooterVisible(false); // wth is that anyway?
|
||||||
$response->setContentSecurityPolicy(PageController::getCSP());
|
$response->setContentSecurityPolicy(PageController::getCSP());
|
||||||
|
|
||||||
|
// Add download link
|
||||||
|
$dlUrl = $this->urlGenerator->linkToRoute('memories.PublicAlbum.download', [
|
||||||
|
'token' => $token, // share identification
|
||||||
|
'albums' => 1, // identify backend for share
|
||||||
|
]);
|
||||||
|
$dlAction = new LinkMenuAction($this->l10n->t('Download'), 'icon-download', $dlUrl);
|
||||||
|
$response->setHeaderActions([$dlAction]);
|
||||||
|
|
||||||
return $response;
|
return $response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @PublicPage
|
||||||
|
*
|
||||||
|
* @NoCSRFRequired
|
||||||
|
*/
|
||||||
|
public function download(string $token)
|
||||||
|
{
|
||||||
|
$album = $this->albumsQuery->getAlbumByLink($token);
|
||||||
|
if (!$album) {
|
||||||
|
return new TemplateResponse('core', '404', [], 'guest');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get list of files
|
||||||
|
$albumId = (int) $album['album_id'];
|
||||||
|
$files = $this->albumsQuery->getAlbumPhotos($albumId, null) ?? [];
|
||||||
|
$fileIds = array_map(fn ($file) => (int) $file['file_id'], $files);
|
||||||
|
|
||||||
|
// Get download handle
|
||||||
|
$downloadController = \OC::$server->get(\OCA\Memories\Controller\DownloadController::class);
|
||||||
|
$handle = $downloadController::createHandle($album['name'], $fileIds);
|
||||||
|
|
||||||
|
// Start download
|
||||||
|
return $downloadController->file($handle);
|
||||||
|
}
|
||||||
|
|
||||||
private function addOgMetadata(array $album, string $token)
|
private function addOgMetadata(array $album, string $token)
|
||||||
{
|
{
|
||||||
$fileId = (int) $album['last_added_photo'];
|
$fileId = (int) $album['last_added_photo'];
|
||||||
|
|
Loading…
Reference in New Issue