FOSSology  4.4.0
Open Source License Compliance by Open Source Software
CopyrightController.php
Go to the documentation of this file.
1 <?php
2 /*
3  Author: Soham Banerjee <sohambanerjee4abc@hotmail.com>
4  SPDX-FileCopyrightText: © 2023 Soham Banerjee <sohambanerjee4abc@hotmail.com>
5  SPDX-License-Identifier: GPL-2.0-only
6 */
7 
13 namespace Fossology\UI\Api\Controllers;
14 
21 use Psr\Http\Message\ServerRequestInterface;
22 
23 
25 {
29  const COPYRIGHT_PARAM = "status";
30 
34  const LIMIT_PARAM = "limit";
35 
39  const PAGE_PARAM = "page";
40 
44  const COPYRIGHT_FETCH_LIMIT = 100;
45 
50  private $copyrightHist;
51 
56  private $copyrightDao;
57  const TYPE_COPYRIGHT = 1;
58  const TYPE_EMAIL = 2;
59  const TYPE_URL = 4;
60  const TYPE_AUTHOR = 8;
61  const TYPE_ECC = 16;
62  const TYPE_KEYWORD = 32;
63  const TYPE_IPRA = 64;
64 
65  public function __construct($container)
66  {
67  parent::__construct($container);
68  $this->copyrightDao = $this->container->get('dao.copyright');
69  $this->copyrightHist = $this->restHelper->getPlugin('ajax-copyright-hist');
70  }
71 
80  public function getFileCopyrights($request, $response, $args)
81  {
82  return $this->getFileCX($request, $response, $args, self::TYPE_COPYRIGHT);
83  }
84 
93  public function getFileEmail($request, $response, $args)
94  {
95  return $this->getFileCX($request, $response, $args, self::TYPE_EMAIL);
96  }
97 
106  public function getFileUrl($request, $response, $args)
107  {
108  return $this->getFileCX($request, $response, $args, self::TYPE_URL);
109  }
110 
119  public function getFileAuthor($request, $response, $args)
120  {
121  return $this->getFileCX($request, $response, $args, self::TYPE_AUTHOR);
122  }
123 
132  public function getFileEcc($request, $response, $args)
133  {
134  return $this->getFileCX($request, $response, $args, self::TYPE_ECC);
135  }
136 
145  public function getFileKeyword($request, $response, $args)
146  {
147  return $this->getFileCX($request, $response, $args, self::TYPE_KEYWORD);
148  }
149 
158  public function getFileIpra($request, $response, $args)
159  {
160  return $this->getFileCX($request, $response, $args, self::TYPE_IPRA);
161  }
162 
171  public function deleteFileCopyright($request, $response, $args)
172  {
173  return $this->deleteFileCX($args, $response, self::TYPE_COPYRIGHT);
174  }
175 
184  public function deleteFileEmail($request, $response, $args)
185  {
186  return $this->deleteFileCX($args, $response, self::TYPE_EMAIL);
187  }
188 
197  public function deleteFileUrl($request, $response, $args)
198  {
199  return $this->deleteFileCX($args, $response, self::TYPE_URL);
200  }
201 
210  public function deleteFileAuthor($request, $response, $args)
211  {
212  return $this->deleteFileCX($args, $response, self::TYPE_AUTHOR);
213  }
214 
223  public function deleteFileEcc($request, $response, $args)
224  {
225  return $this->deleteFileCX($args, $response, self::TYPE_ECC);
226  }
227 
236  public function deleteFileKeyword($request, $response, $args)
237  {
238  return $this->deleteFileCX($args, $response, self::TYPE_KEYWORD);
239  }
240 
249  public function deleteFileIpra($request, $response, $args)
250  {
251  return $this->deleteFileCX($args, $response, self::TYPE_IPRA);
252  }
253 
262  public function updateFileCopyright($request, $response, $args)
263  {
264  return $this->updateFileCx($request, $response, $args, self::TYPE_COPYRIGHT);
265  }
266 
275  public function updateFileEmail($request, $response, $args)
276  {
277  return $this->updateFileCx($request, $response, $args, self::TYPE_EMAIL);
278  }
279 
288  public function updateFileUrl($request, $response, $args)
289  {
290  return $this->updateFileCx($request, $response, $args, self::TYPE_URL);
291  }
292 
301  public function updateFileAuthor($request, $response, $args)
302  {
303  return $this->updateFileCx($request, $response, $args, self::TYPE_AUTHOR);
304  }
305 
314  public function updateFileEcc($request, $response, $args)
315  {
316  return $this->updateFileCx($request, $response, $args, self::TYPE_ECC);
317  }
318 
327  public function updateFileKeyword($request, $response, $args)
328  {
329  return $this->updateFileCx($request, $response, $args, self::TYPE_KEYWORD);
330  }
331 
340  public function updateFileIpra($request, $response, $args)
341  {
342  return $this->updateFileCx($request, $response, $args, self::TYPE_IPRA);
343  }
344 
353  public function restoreFileCopyright($request, $response, $args)
354  {
355  return $this->restoreFileCx($args, $response, self::TYPE_COPYRIGHT);
356  }
357 
366  public function restoreFileEmail($request, $response, $args)
367  {
368  return $this->restoreFileCx($args, $response, self::TYPE_EMAIL);
369  }
370 
379  public function restoreFileUrl($request, $response, $args)
380  {
381  return $this->restoreFileCx($args, $response, self::TYPE_URL);
382  }
383 
392  public function restoreFileAuthor($request, $response, $args)
393  {
394  return $this->restoreFileCx($args, $response, self::TYPE_AUTHOR);
395  }
396 
405  public function restoreFileEcc($request, $response, $args)
406  {
407  return $this->restoreFileCx($args, $response, self::TYPE_ECC);
408  }
409 
418  public function restoreFileKeyword($request, $response, $args)
419  {
420  return $this->restoreFileCx($args, $response, self::TYPE_KEYWORD);
421  }
422 
431  public function restoreFileIpra($request, $response, $args)
432  {
433  return $this->restoreFileCx($args, $response, self::TYPE_IPRA);
434  }
435 
445  public function getTotalFileCopyrights($request, $response, $args)
446  {
447  $uploadPk = $args["id"];
448  $uploadTreeId = $args["itemId"];
449  $query = $request->getQueryParams();
450  $statusVal = true;
451 
452  $this->uploadAccessible($uploadPk);
453  $this->isItemExists($uploadPk, $uploadTreeId);
454 
455  if (!array_key_exists(self::COPYRIGHT_PARAM, $query)) {
456  throw new HttpBadRequestException("Bad Request. 'status' is a " .
457  "required query param with expected values 'active' or 'inactive");
458  }
459  $status = $query[self::COPYRIGHT_PARAM];
460  if ($status == "active") {
461  $statusVal = true;
462  } else if ($status == "inactive") {
463  $statusVal = false;
464  } else {
465  throw new HttpBadRequestException("Bad Request. Invalid query " .
466  "parameter, expected values 'active' or 'inactive");
467  }
468  $agentId = $this->copyrightHist->getAgentId($uploadPk, 'copyright_ars');
469  $uploadTreeTableName = $this->restHelper->getUploadDao()->getUploadtreeTableName($uploadPk);
470  $returnVal = $this->copyrightDao->getTotalCopyrights($uploadPk, $uploadTreeId, $uploadTreeTableName, $agentId, 'statement', $statusVal);
471  return $response->withJson(array("total_copyrights" => intval($returnVal)), 200);
472  }
473 
484  private function getFileCX($request, $response, $args, $cxType)
485  {
486  switch ($cxType) {
487  case self::TYPE_COPYRIGHT:
488  $dataType = 'statement';
489  $agentArs = 'copyright_ars';
490  break;
491  case self::TYPE_EMAIL:
492  $dataType = 'email';
493  $agentArs = 'copyright_ars';
494  break;
495  case self::TYPE_URL:
496  $dataType = 'url';
497  $agentArs = 'copyright_ars';
498  break;
499  case self::TYPE_AUTHOR:
500  $dataType = 'author';
501  $agentArs = 'copyright_ars';
502  break;
503  case self::TYPE_ECC:
504  $dataType = 'ecc';
505  $agentArs = 'ecc_ars';
506  break;
507  case self::TYPE_KEYWORD:
508  $dataType = 'keyword';
509  $agentArs = 'keyword_ars';
510  break;
511  case self::TYPE_IPRA:
512  $dataType = 'ipra';
513  $agentArs = 'ipra_ars';
514  break;
515  default:
516  $dataType = 'statement';
517  $agentArs = 'copyright_ars';
518  }
519  $uploadPk = $args["id"];
520  $uploadTreeId = $args["itemId"];
521  $query = $request->getQueryParams();
522  $limit = $request->getHeaderLine(self::LIMIT_PARAM);
523  $finalVal = [];
524  if (!empty($limit)) {
525  $limit = filter_var($limit, FILTER_VALIDATE_INT);
526  if ($limit < 1) {
527  throw new HttpBadRequestException(
528  "limit should be positive integer > 1");
529  }
530  } else {
532  }
533  if (!array_key_exists(self::COPYRIGHT_PARAM, $query)) {
534  throw new HttpBadRequestException("Bad Request. 'status' is a " .
535  "required query param with expected values 'active' or 'inactive");
536  }
537  $status = $query[self::COPYRIGHT_PARAM];
538  if ($status == "active") {
539  $statusVal = true;
540  } else if ($status == "inactive") {
541  $statusVal = false;
542  } else {
543  throw new HttpBadRequestException("Bad Request. Invalid query " .
544  "parameter, expected values 'active' or 'inactive");
545  }
546 
547  $this->uploadAccessible($uploadPk);
548  $this->isItemExists($uploadPk, $uploadTreeId);
549 
550  $agentId = $this->copyrightHist->getAgentId($uploadPk, $agentArs);
551  $uploadTreeTableName = $this->restHelper->getUploadDao()->getuploadTreeTableName($uploadPk);
552  $page = $request->getHeaderLine(self::PAGE_PARAM);
553  if (empty($page) && $page != "0") {
554  $page = 1;
555  }
556  if (!empty($page) || $page == "0") {
557  $page = filter_var($page, FILTER_VALIDATE_INT);
558  if ($page <= 0) {
559  throw new HttpBadRequestException(
560  "page should be positive integer > 0");
561  }
562  }
563  $offset = $limit * ($page - 1);
564  list($rows, $iTotalDisplayRecords, $iTotalRecords) = $this->copyrightHist
565  ->getCopyrights($uploadPk, $uploadTreeId, $uploadTreeTableName,
566  $agentId, $dataType, 'active', $statusVal, $offset, $limit);
567  foreach ($rows as $row) {
568  $row['count'] = intval($row['copyright_count']);
569  unset($row['copyright_count']);
570  $finalVal[] = $row;
571  }
572  $totalPages = intval(ceil($iTotalRecords / $limit));
573  if ($totalPages != 0 && $page > $totalPages) {
574  throw (new HttpBadRequestException(
575  "Can not exceed total pages: $totalPages"))
576  ->setHeaders(["X-Total-Pages" => $totalPages]);
577  }
578  return $response->withHeader("X-Total-Pages", $totalPages)->withJson($finalVal, 200);
579  }
580 
590  private function deleteFileCX($args, $response, $cxType)
591  {
592  list($dataType, $delName) = $this->convertTypeToTable($cxType);
593 
594  $uploadDao = $this->restHelper->getUploadDao();
595  $uploadPk = intval($args['id']);
596  $uploadTreeId = intval($args['itemId']);
597  $copyrightHash = $args['hash'];
598  $userId = $this->restHelper->getUserId();
599  $cpTable = $this->copyrightHist->getTableName($dataType);
600 
601  $this->uploadAccessible($uploadPk);
602  $this->isItemExists($uploadPk, $uploadTreeId);
603 
604  $uploadTreeTableName = $uploadDao->getUploadTreeTableName($uploadTreeId);
605  $item = $uploadDao->getItemTreeBounds($uploadTreeId, $uploadTreeTableName);
606  $this->copyrightDao->updateTable($item, $copyrightHash, '', $userId, $cpTable, 'delete');
607  $returnVal = new Info(200, "Successfully removed $delName.", InfoType::INFO);
608  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
609  }
610 
620  private function restoreFileCx($args, $response, $cxType)
621  {
622  list($dataType, $resName) = $this->convertTypeToTable($cxType);
623  $uploadPk = intval($args['id']);
624  $uploadTreeId = intval($args['itemId']);
625  $copyrightHash = ($args['hash']);
626  $userId = $this->restHelper->getUserId();
627  $cpTable = $this->copyrightHist->getTableName($dataType);
628 
629  $this->uploadAccessible($uploadPk);
630  $this->isItemExists($uploadPk, $uploadTreeId);
631 
632  $uploadTreeTableName = $this->restHelper->getUploadDao()->getuploadTreeTableName($uploadTreeId);
633  $item = $this->restHelper->getUploadDao()->getItemTreeBounds($uploadTreeId, $uploadTreeTableName);
634  $this->copyrightDao->updateTable($item, $copyrightHash, '', $userId, $cpTable, 'rollback');
635  $returnVal = new Info(200, "Successfully restored $resName.", InfoType::INFO);
636  return $response->withJson($returnVal->getArray(), 200);
637  }
638 
649  private function updateFileCx($request, $response, $args, $cxType)
650  {
651  list($dataType, $resName) = $this->convertTypeToTable($cxType);
652  $uploadTreeId = intval($args["itemId"]);
653  $uploadPk = intval($args["id"]);
654  $copyrightHash = $args["hash"];
655  $userId = $this->restHelper->getUserId();
656  $cpTable = $this->copyrightHist->getTableName($dataType);
657  $body = $this->getParsedBody($request);
658  $content = $body['content'];
659 
660  $this->uploadAccessible($uploadPk);
661  $this->isItemExists($uploadPk, $uploadTreeId);
662 
663  $uploadTreeTableName = $this->restHelper->getUploadDao()->getuploadTreeTableName($uploadTreeId);
664  $item = $this->restHelper->getUploadDao()->getItemTreeBounds($uploadTreeId, $uploadTreeTableName);
665  $this->copyrightDao->updateTable($item, $copyrightHash, $content, $userId, $cpTable);
666  $returnVal = new Info(200, "Successfully Updated $resName.", InfoType::INFO);
667  return $response->withJson($returnVal->getArray(), 200);
668  }
669 
676  private function convertTypeToTable(int $cxType): array
677  {
678  switch ($cxType) {
679  case self::TYPE_COPYRIGHT:
680  $dataType = 'statement';
681  $dispName = 'copyright';
682  break;
683  case self::TYPE_EMAIL:
684  $dispName = $dataType = 'email';
685  break;
686  case self::TYPE_URL:
687  $dispName = $dataType = 'url';
688  break;
689  case self::TYPE_AUTHOR:
690  $dispName = $dataType = 'author';
691  break;
692  case self::TYPE_ECC:
693  $dispName = $dataType = 'ecc';
694  break;
695  case self::TYPE_KEYWORD:
696  $dispName = $dataType = 'keyword';
697  break;
698  case self::TYPE_IPRA:
699  $dispName = $dataType = 'ipra';
700  break;
701  default:
702  $dataType = 'statement';
703  $dispName = 'copyright';
704  }
705  return array($dataType, $dispName);
706  }
707 }
getFileCX($request, $response, $args, $cxType)
updateFileCx($request, $response, $args, $cxType)
Base controller for REST calls.
isItemExists(int $uploadId, int $itemId)
getParsedBody(ServerRequestInterface $request)
Parse request body as JSON and return associative PHP array.
Override Slim response for withJson function.
Different type of infos provided by REST.
Definition: InfoType.php:16
Info model to contain general error and return values.
Definition: Info.php:19
list_t type structure used to keep various lists. (e.g. there are multiple lists).
Definition: nomos.h:308