File indexing completed on 2024-12-22 05:33:07

0001 <?php /** @noinspection PhpUndefinedFieldInspection */
0002 
0003 use Ocs\Storage\FilesystemAdapter;
0004 
0005 /**
0006  * ocs-fileserver
0007  *
0008  * Copyright 2016 by pling GmbH.
0009  *
0010  * This file is part of ocs-fileserver.
0011  *
0012  * ocs-fileserver is free software: you can redistribute it and/or modify
0013  * it under the terms of the GNU Affero General Public License as published by
0014  * the Free Software Foundation, either version 3 of the License, or
0015  * (at your option) any later version.
0016  *
0017  * ocs-fileserver is distributed in the hope that it will be useful,
0018  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0019  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0020  * GNU Affero General Public License for more details.
0021  *
0022  * You should have received a copy of the GNU Affero General Public License
0023  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
0024  **/
0025 
0026 class Collections extends BaseController
0027 {
0028 
0029     public function getIndex()
0030     {
0031         $status = 'active';
0032         $clientId = null;
0033         $ownerId = null;
0034         $category = null;
0035         $tags = null; // Comma-separated list
0036         $contentId = null;
0037         $search = null; // 3 or more strings
0038         $ids = null; // Comma-separated list
0039         $favoriteIds = array();
0040         $downloadedTimeperiodBegin = null; // Datetime format
0041         $downloadedTimeperiodEnd = null; // Datetime format
0042         $sort = 'name';
0043         $perpage = $this->appConfig->general['perpage'];
0044         $page = 1;
0045 
0046         if (!empty($this->request->status)) {
0047             $status = $this->request->status;
0048         }
0049         if (!empty($this->request->client_id)) {
0050             $clientId = $this->request->client_id;
0051         }
0052         if (!empty($this->request->owner_id)) {
0053             $ownerId = $this->request->owner_id;
0054         }
0055         if (isset($this->request->category)) {
0056             $category = $this->request->category;
0057         }
0058         if (isset($this->request->tags)) {
0059             $tags = $this->request->tags;
0060         }
0061         if (isset($this->request->content_id)) {
0062             $contentId = $this->request->content_id;
0063         }
0064         if (!empty($this->request->search)) {
0065             $search = $this->request->search;
0066         }
0067         if (!empty($this->request->ids)) {
0068             $ids = $this->request->ids;
0069         }
0070         if (!empty($this->request->client_id)
0071             && !empty($this->request->favoritesby)
0072         ) {
0073             $favoriteIds = $this->_getFavoriteIds(
0074                 $this->request->client_id,
0075                 $this->request->favoritesby
0076             );
0077             if (!$favoriteIds) {
0078                 $this->response->setStatus(404);
0079                 throw new Flooer_Exception('Not found', LOG_NOTICE);
0080             }
0081         }
0082         if (!empty($this->request->downloaded_timeperiod_begin)) {
0083             $downloadedTimeperiodBegin = $this->request->downloaded_timeperiod_begin;
0084         }
0085         if (!empty($this->request->downloaded_timeperiod_end)) {
0086             $downloadedTimeperiodEnd = $this->request->downloaded_timeperiod_end;
0087         }
0088         if (!empty($this->request->sort)) {
0089             $sort = $this->request->sort;
0090         }
0091         if (!empty($this->request->perpage)
0092             && $this->_isValidPerpageNumber($this->request->perpage)
0093         ) {
0094             $perpage = $this->request->perpage;
0095         }
0096         if (!empty($this->request->page)
0097             && $this->_isValidPageNumber($this->request->page)
0098         ) {
0099             $page = $this->request->page;
0100         }
0101 
0102         $collections = $this->models->collections->getCollections(
0103             $status,
0104             $clientId,
0105             $ownerId,
0106             $category,
0107             $tags,
0108             $contentId,
0109             $search,
0110             $ids,
0111             $favoriteIds,
0112             $downloadedTimeperiodBegin,
0113             $downloadedTimeperiodEnd,
0114             $sort,
0115             $perpage,
0116             $page
0117         );
0118 
0119         if (!$collections) {
0120             $this->response->setStatus(404);
0121             throw new Flooer_Exception('Not found', LOG_NOTICE);
0122         }
0123 
0124         $this->_setResponseContent('success', $collections);
0125     }
0126 
0127     public function getCollection()
0128     {
0129         $id = null;
0130 
0131         if (!empty($this->request->id)) {
0132             $id = $this->request->id;
0133         }
0134 
0135         $collection = $this->models->collections->getCollection($id);
0136 
0137         if (!$collection) {
0138             $this->response->setStatus(404);
0139             throw new Flooer_Exception('Not found', LOG_NOTICE);
0140         }
0141 
0142         $this->_setResponseContent(
0143             'success',
0144             array('collection' => $collection)
0145         );
0146     }
0147 
0148     public function postCollection()
0149     {
0150         if (!$this->_isAllowedAccess()) {
0151             $this->response->setStatus(403);
0152             throw new Flooer_Exception('Forbidden', LOG_NOTICE);
0153         }
0154 
0155         $id = null; // Auto generated
0156         $active = 1;
0157         $clientId = null;
0158         $ownerId = null;
0159         $name = null; // Auto generated
0160         $files = 0;
0161         $size = 0;
0162         $title = null; // Name as default
0163         $description = null;
0164         $category = null;
0165         $tags = null; // Comma-separated list
0166         $version = null;
0167         $contentId = null;
0168         $contentPage = null;
0169 
0170         if (!empty($this->request->client_id)) {
0171             $clientId = $this->request->client_id;
0172         }
0173         if (!empty($this->request->owner_id)) {
0174             $ownerId = $this->request->owner_id;
0175         }
0176         if (!empty($this->request->title)) {
0177             $title = mb_substr(strip_tags($this->request->title), 0, 200);
0178         }
0179         if (isset($this->request->description)) {
0180             $description = strip_tags($this->request->description);
0181         }
0182         if (isset($this->request->category)) {
0183             $category = mb_substr(strip_tags($this->request->category), 0, 64);
0184         }
0185         if (isset($this->request->tags)) {
0186             $tags = strip_tags($this->request->tags);
0187         }
0188         if (isset($this->request->version)) {
0189             $version = mb_substr(strip_tags($this->request->version), 0, 64);
0190         }
0191         if (isset($this->request->content_id)) {
0192             $contentId = $this->request->content_id;
0193         }
0194         if (!empty($this->request->content_page)) {
0195             $contentPage = $this->request->content_page;
0196         }
0197 
0198         $errors = array();
0199         if (!$clientId) {
0200             $errors['client_id'] = 'Required';
0201         }
0202         if (!$ownerId) {
0203             $errors['owner_id'] = 'Required';
0204         }
0205 
0206         if ($errors) {
0207             $this->response->setStatus(400);
0208             $this->_setResponseContent(
0209                 'error',
0210                 array(
0211                     'message' => 'Validation error',
0212                     'errors' => $errors
0213                 )
0214             );
0215             return;
0216         }
0217 
0218         $id = $this->models->collections->generateId();
0219         $name = $id;
0220         if (!$title) {
0221             $title = $name;
0222         }
0223 
0224         $fileSystemAdapter = new FilesystemAdapter($this->appConfig);
0225         //$fileSystemAdapter = new S3Adapter($this->appConfig);
0226 
0227         // create collection dir
0228         $collectionDir = $this->appConfig->general['filesDir'] . DIRECTORY_SEPARATOR . $name;
0229         if (!$fileSystemAdapter->testAndCreate($collectionDir)) {
0230             $this->response->setStatus(500);
0231             throw new Flooer_Exception('Failed to create collection', LOG_ALERT);
0232         }
0233 
0234         $this->models->collections->$id = array(
0235             'active' => $active,
0236             'client_id' => $clientId,
0237             'owner_id' => $ownerId,
0238             'name' => $name,
0239             'files' => $files,
0240             'size' => $size,
0241             'title' => $title,
0242             'description' => $description,
0243             'category' => $category,
0244             'tags' => $tags,
0245             'version' => $version,
0246             'content_id' => $contentId,
0247             'content_page' => $contentPage
0248         );
0249 
0250         $collection = $this->models->collections->getCollection($id);
0251 
0252         $this->_setResponseContent(
0253             'success',
0254             array('collection' => $collection)
0255         );
0256     }
0257 
0258     public function putCollection()
0259     {
0260         if (!$this->_isAllowedAccess()) {
0261             $this->response->setStatus(403);
0262             throw new Flooer_Exception('Forbidden', LOG_NOTICE);
0263         }
0264 
0265         $id = null;
0266         $title = null;
0267         $description = null;
0268         $category = null;
0269         $tags = null; // Comma-separated list
0270         $version = null;
0271         $contentId = null;
0272         $contentPage = null;
0273 
0274         if (!empty($this->request->id)) {
0275             $id = $this->request->id;
0276         }
0277         if (!empty($this->request->title)) {
0278             $title = mb_substr(strip_tags($this->request->title), 0, 200);
0279         }
0280         if (isset($this->request->description)) {
0281             $description = strip_tags($this->request->description);
0282         }
0283         if (isset($this->request->category)) {
0284             $category = mb_substr(strip_tags($this->request->category), 0, 64);
0285         }
0286         if (isset($this->request->tags)) {
0287             $tags = strip_tags($this->request->tags);
0288         }
0289         if (isset($this->request->version)) {
0290             $version = mb_substr(strip_tags($this->request->version), 0, 64);
0291         }
0292         if (isset($this->request->content_id)) {
0293             $contentId = $this->request->content_id;
0294         }
0295         if (!empty($this->request->content_page)) {
0296             $contentPage = $this->request->content_page;
0297         }
0298 
0299         $collection = $this->models->collections->$id;
0300 
0301         if (!$collection) {
0302             $this->response->setStatus(404);
0303             throw new Flooer_Exception('Not found', LOG_NOTICE);
0304         }
0305         else if (!$collection->active || $collection->client_id != $this->request->client_id) {
0306             $this->response->setStatus(403);
0307             throw new Flooer_Exception('Forbidden', LOG_NOTICE);
0308         }
0309 
0310         $updata = array();
0311         if ($title !== null) {
0312             $updata['title'] = $title;
0313         }
0314         if ($description !== null) {
0315             $updata['description'] = $description;
0316         }
0317         if ($category !== null) {
0318             $updata['category'] = $category;
0319         }
0320         if ($tags !== null) {
0321             $updata['tags'] = $tags;
0322         }
0323         if ($version !== null) {
0324             $updata['version'] = $version;
0325         }
0326         if ($contentId !== null) {
0327             $updata['content_id'] = $contentId;
0328         }
0329         if ($contentPage !== null) {
0330             $updata['content_page'] = $contentPage;
0331         }
0332 
0333         $this->models->collections->$id = $updata;
0334 
0335         $collection = $this->models->collections->getCollection($id);
0336 
0337         $this->_setResponseContent(
0338             'success',
0339             array('collection' => $collection)
0340         );
0341     }
0342 
0343     public function deleteCollection() {
0344         // Please be care the remove process in Owners::deleteOwner()
0345 
0346         if (!$this->_isAllowedAccess()) {
0347             $this->response->setStatus(403);
0348             throw new Flooer_Exception('Forbidden', LOG_NOTICE);
0349         }
0350 
0351         $id = null;
0352 
0353         if (!empty($this->request->id)) {
0354             $id = $this->request->id;
0355         }
0356 
0357         $collection = $this->models->collections->$id;
0358 
0359         if (!$collection) {
0360             $this->response->setStatus(404);
0361             throw new Flooer_Exception('Not found', LOG_NOTICE);
0362         } else if (!$collection->active || $collection->client_id != $this->request->client_id) {
0363             $this->response->setStatus(403);
0364             throw new Flooer_Exception('Forbidden', LOG_NOTICE);
0365         }
0366 
0367         $thumbnail = $this->appConfig->general['thumbnailsDir'] . '/collection_' . $id . '.jpg';
0368         if (is_file($thumbnail)) {
0369             unlink($thumbnail);
0370         }
0371 
0372         $fileSystemAdapter = new FilesystemAdapter($this->appConfig);
0373         //$fileSystemAdapter = new \Ocs\Storage\S3Adapter($this->appConfig);
0374 
0375         // move collection to trash dir
0376         $trashDir = $this->appConfig->general['filesDir'] . '/.trash';
0377         if (!$fileSystemAdapter->testAndCreate($trashDir)) {
0378             $this->log->log(__METHOD__ . " - trash dir not found and could not be created: $trashDir");
0379             $this->response->setStatus(500);
0380             throw new Flooer_Exception('Failed to remove the collection', LOG_ALERT);
0381         }
0382         $pathCollection = $this->appConfig->general['filesDir'] . '/' . $collection->name;
0383         if (is_dir($pathCollection) && !rename($pathCollection, $trashDir . '/' . $id . '-' . $collection->name))
0384         {
0385             $this->response->setStatus(500);
0386             throw new Flooer_Exception('Failed to remove the collection', LOG_ALERT);
0387         }
0388 
0389         $this->models->collections->$id = array('active' => 0);
0390         //$this->models->collections_downloaded->deleteByCollectionId($id);
0391         //$this->models->files->deleteByCollectionId($id);
0392         //$this->models->files_downloaded->deleteByCollectionId($id);
0393         $this->models->favorites->deleteByCollectionId($id);
0394         $this->models->media->deleteByCollectionId($id);
0395         $this->models->media_played->deleteByCollectionId($id);
0396 
0397         $this->_setResponseContent('success');
0398     }
0399 
0400     public function headDownload()
0401     {
0402         $this->getDownload(true);
0403     }
0404 
0405     public function getDownload($headeronly = false)
0406     {
0407         // Collection download is disabled
0408         $this->response->setStatus(403);
0409         throw new Flooer_Exception('Forbidden', LOG_NOTICE);
0410 
0411 //        $id = null;
0412 //        $userId = null;
0413 //
0414 //        if (!empty($this->request->id)) {
0415 //            $id = $this->request->id;
0416 //        }
0417 //        if (!empty($this->request->u)) {
0418 //            $userId = $this->request->u;
0419 //        }
0420 //
0421 //        $collection = $this->models->collections->$id;
0422 //
0423 //        if (!$collection) {
0424 //            $this->response->setStatus(404);
0425 //            throw new Flooer_Exception('Not found', LOG_NOTICE);
0426 //        }
0427 //        else if (!$collection->active) {
0428 //            $this->response->setStatus(403);
0429 //            throw new Flooer_Exception('Forbidden', LOG_NOTICE);
0430 //        }
0431 //
0432 //        $archive = '/tmp/archives/' . $collection->name . '.tar.gz';
0433 //        $this->_generateArchive(
0434 //            $this->appConfig->general['filesDir'] . '/' . $collection->name,
0435 //            $archive
0436 //        );
0437 //
0438 //        $profile = $this->models->profiles->getProfileByClientIdAndOwnerId(
0439 //            $collection->client_id,
0440 //            $collection->owner_id
0441 //        );
0442 //
0443 //        $profileName = $collection->owner_id;
0444 //        if ($profile) {
0445 //            $profileName = $profile->name;
0446 //        }
0447 //
0448 //        $collectionTitle = $collection->name;
0449 //        if ($collection->title) {
0450 //            $collectionTitle = $collection->title;
0451 //        }
0452 //
0453 //        $filename = str_replace(' ', '_', $profileName)
0454 //            . '_' . str_replace(' ', '_', $collectionTitle);
0455 //
0456 //        if (!$headeronly && $collection->downloaded_ip != $this->server->REMOTE_ADDR) {
0457 //            $this->models->collections->updateDownloadedStatus($collection->id);
0458 //
0459 //            $downloadedId = $this->models->collections_downloaded->generateId();
0460 //            $this->models->collections_downloaded->$downloadedId = array(
0461 //                'client_id' => $collection->client_id,
0462 //                'owner_id' => $collection->owner_id,
0463 //                'collection_id' => $collection->id,
0464 //                'user_id' => $userId
0465 //            );
0466 //        }
0467 //
0468 //        $this->_sendFile(
0469 //            $archive,
0470 //            $filename . '.tar.gz',
0471 //            'application/x-gzip',
0472 //            filesize($archive),
0473 //            true,
0474 //            $headeronly
0475 //        );
0476     }
0477 
0478 }