]> git.mxchange.org Git - friendica.git/blobdiff - src/Moderation/Factory/Report.php
Posts per author/server on the community pages (#13764)
[friendica.git] / src / Moderation / Factory / Report.php
index 7cf4009705ef385d9f01885d7807eac7d2e0ee2f..4d2e0bb75b90c4606c0540cae06094e4d20c518f 100644 (file)
 namespace Friendica\Moderation\Factory;
 
 use Friendica\Capabilities\ICanCreateFromTableRow;
+use Friendica\Core\System;
+use Friendica\Model\Contact;
+use Friendica\Moderation\Collection;
 use Friendica\Moderation\Entity;
+use Psr\Clock\ClockInterface;
+use Psr\Log\LoggerInterface;
 
 class Report extends \Friendica\BaseFactory implements ICanCreateFromTableRow
 {
+       /** @var ClockInterface */
+       private $clock;
+
+       public function __construct(LoggerInterface $logger, ClockInterface $clock)
+       {
+               parent::__construct($logger);
+
+               $this->clock = $clock;
+       }
+
        /**
-        * @param array $row        `report` table row
-        * @param array $postUriIds List of post URI ids from the `report-post` table
+        * @param array                        $row   `report` table row
+        * @param Collection\Report\Posts|null $posts List of posts attached to the report
+        * @param Collection\Report\Rules|null $rules List of rules from the terms of service, see System::getRules()
         * @return Entity\Report
         * @throws \Exception
         */
-       public function createFromTableRow(array $row, array $postUriIds = []): Entity\Report
+       public function createFromTableRow(array $row, Collection\Report\Posts $posts = null, Collection\Report\Rules $rules = null): Entity\Report
        {
                return new Entity\Report(
                        $row['reporter-id'],
                        $row['cid'],
-                       new \DateTime($row['created'] ?? 'now', new \DateTimeZone('UTC')),
+                       $row['gsid'],
+                       new \DateTimeImmutable($row['created'], new \DateTimeZone('UTC')),
+                       $row['category-id'],
+                       $row['uid'],
                        $row['comment'],
-                       $row['category'],
-                       $row['rules'],
                        $row['forward'],
-                       $postUriIds,
-                       $row['uid'],
+                       $posts ?? new Collection\Report\Posts(),
+                       $rules ?? new Collection\Report\Rules(),
+                       $row['public-remarks'],
+                       $row['private-remarks'],
+                       $row['edited'] ? new \DateTimeImmutable($row['edited'], new \DateTimeZone('UTC')) : null,
+                       $row['status'],
+                       $row['resolution'],
+                       $row['assigned-uid'],
+                       $row['last-editor-uid'],
                        $row['id'],
                );
        }
@@ -51,29 +75,73 @@ class Report extends \Friendica\BaseFactory implements ICanCreateFromTableRow
        /**
         * Creates a Report entity from a Mastodon API /reports request
         *
-        * @see \Friendica\Module\Api\Mastodon\Reports::post()
-        *
-        * @param int    $uid
+        * @param array  $rules      Line-number indexed node rules array, see System::getRules(true)
         * @param int    $reporterId
         * @param int    $cid
+        * @param int    $gsid
         * @param string $comment
+        * @param string $category
         * @param bool   $forward
         * @param array  $postUriIds
+        * @param array  $ruleIds
+        * @param ?int   $uid
         * @return Entity\Report
-        * @throws \Exception
+        * @see \Friendica\Module\Api\Mastodon\Reports::post()
         */
-       public function createFromReportsRequest(int $reporterId, int $cid, string $comment = '', string $category = null, string $rules = '', bool $forward = false, array $postUriIds = [], int $uid = null): Entity\Report
+       public function createFromReportsRequest(array $rules, int $reporterId, int $cid, int $gsid, string $comment = '', string $category = '', bool $forward = false, array $postUriIds = [], array $ruleIds = [], int $uid = null): Entity\Report
        {
+               if (count($ruleIds)) {
+                       $categoryId = Entity\Report::CATEGORY_VIOLATION;
+               } elseif ($category == 'spam') {
+                       $categoryId = Entity\Report::CATEGORY_SPAM;
+               } else {
+                       $categoryId = Entity\Report::CATEGORY_OTHER;
+               }
+
                return new Entity\Report(
                        $reporterId,
                        $cid,
-                       new \DateTime('now', new \DateTimeZone('UTC')),
+                       $gsid,
+                       $this->clock->now(),
+                       $categoryId,
+                       $uid,
                        $comment,
-                       $category,
-                       $rules,
                        $forward,
-                       $postUriIds,
-                       $uid,
+                       new Collection\Report\Posts(array_map(function ($uriId) {
+                               return new Entity\Report\Post($uriId);
+                       }, $postUriIds)),
+                       new Collection\Report\Rules(array_map(function ($lineId) use ($rules) {
+                               return new Entity\Report\Rule($lineId, $rules[$lineId] ?? '');
+                       }, $ruleIds)),
+               );
+       }
+
+       public function createFromForm(array $rules, int $cid, int $reporterId, int $categoryId, array $ruleIds, string $comment, array $uriIds, bool $forward): Entity\Report
+       {
+               $contact = Contact::getById($cid, ['gsid']);
+               if (!$contact) {
+                       throw new \InvalidArgumentException('Contact with id: ' . $cid . ' not found');
+               }
+
+               if (!in_array($categoryId, Entity\Report::CATEGORIES)) {
+                       throw new \OutOfBoundsException('Category with id: ' . $categoryId . ' not found in set: [' . implode(', ', Entity\Report::CATEGORIES) . ']');
+               }
+
+               return new Entity\Report(
+                       Contact::getPublicIdByUserId($reporterId),
+                       $cid,
+                       $contact['gsid'],
+                       $this->clock->now(),
+                       $categoryId,
+                       $reporterId,
+                       $comment,
+                       $forward,
+                       new Collection\Report\Posts(array_map(function ($uriId) {
+                               return new Entity\Report\Post($uriId);
+                       }, $uriIds)),
+                       new Collection\Report\Rules(array_map(function ($lineId) use ($rules) {
+                               return new Entity\Report\Rule($lineId, $rules[$lineId] ?? '');
+                       }, $ruleIds)),
                );
        }
 }