diff --git a/Controller/ApiController.php b/Controller/ApiController.php new file mode 100644 index 0000000..8876895 --- /dev/null +++ b/Controller/ApiController.php @@ -0,0 +1,212 @@ +createCommentList(); + $this->createModel($request->getHeader()->getAccount(), $commentList, CommentListMapper::class, 'comment_list', $request->getOrigin()); + } + + public function createCommentList() : CommentList + { + $list = new CommentList(); + // @todo: allow config + + return $list; + } + + /** + * Api method to create comment + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiCommentCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateCommentCreate($request))) { + $response->set('news_create', new FormValidation($val)); + + return; + } + + $comment = $this->createCommentFromRequest($request); + $this->createModel($request->getHeader()->getAccount(), $comment, CommentMapper::class, 'comment', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Comment', 'Comment successfully created', $comment); + } + + /** + * Validate comment create request + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateCommentCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['title'] = empty($request->getData('title'))) + || ($val['plain'] = empty($request->getData('plain'))) + ) { + return $val; + } + + return []; + } + + /** + * Method to create comment from request. + * + * @param RequestAbstract $request Request + * + * @return Comment + * + * @since 1.0.0 + */ + private function createCommentFromRequest(RequestAbstract $request) : Comment + { + $comment = new Comment(); + $comment->setCreatedBy(new NullAccount($request->getHeader()->getAccount())); + $comment->setTitle((string) ($request->getData('title') ?? '')); + $comment->setContentRaw($request->getData('plain') ?? ''); + $comment->setContent(Markdown::parse((string) ($request->getData('plain') ?? ''))); + $comment->setRef($request->getData('ref') !== null ? (int) $request->getData('ref') : null); + $comment->setList((int) ($request->getData('list') ?? 0)); + + return $comment; + } + + /** + * Api method to create comment + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiCommentUpdate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $old = clone CommentMapper::get((int) $request->getData('id')); + $new = $this->updateCommentFromRequest($request); + $this->updateModel($request->getHeader()->getAccount(), $old, $new, CommentMapper::class, 'comment', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Comment', 'Comment successfully updated', $new); + } + + /** + * Method to update comment from request. + * + * @param RequestAbstract $request Request + * + * @return Comment + * + * @since 1.0.0 + */ + private function updateCommentFromRequest(RequestAbstract $request) : Comment + { + $comment = CommentMapper::get((int) $request->getData('id')); + $comment->setTitle($request->getData('title') ?? $comment->getTitle()); + $comment->setContentRaw($request->getData('plain') ?? $comment->getContentRaw()); + $comment->setContent(Markdown::parse((string) ($request->getData('plain') ?? $comment->getPlain()))); + $comment->setRef($request->getData('ref') ?? $comment->getRef()); + + return $comment; + } + + /** + * Api method to get a comment + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiCommentGet(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $comment = CommentMapper::get((int) $request->getData('id')); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Comment', 'Comment successfully returned', $comment); + } + + /** + * Api method to delete comment + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiCommentDelete(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $comment = CommentMapper::get((int) $request->getData('id')); + $this->deleteModel($request->getHeader()->getAccount(), $comment, CommentMapper::class, 'comment', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Comment', 'Comment successfully deleted', $comment); + } +} diff --git a/Models/Comment.php b/Models/Comment.php index 11a3df4..2152377 100755 --- a/Models/Comment.php +++ b/Models/Comment.php @@ -54,7 +54,7 @@ class Comment /** * Comment list this comment belongs to * - * @var int + * @var int|CommentList * @since 1.0.0 */ private int $list = 0; @@ -73,7 +73,7 @@ class Comment * @var int * @since 1.0.0 */ - private int $status = 0; + private int $status = CommentStatus::VISIBLE; /** * Content @@ -94,10 +94,10 @@ class Comment /** * Comment this is refering to * - * @var null|self + * @var null|int|self * @since 1.0.0 */ - private ?Comment $ref = null; + private $ref = null; /** * Constructor. @@ -149,15 +149,41 @@ class Comment } /** - * Set the list this comment belongs to + * Set the status * - * @param int $list List + * @param int $status Status * * @return void * * @since 1.0.0 */ - public function setList(int $list) : void + public function setStatus(int $status) : void + { + $this->status = $status; + } + + /** + * Get the status + * + * @return int + * + * @since 1.0.0 + */ + public function getStatus() : int + { + return $this->status; + } + + /** + * Set the list this comment belongs to + * + * @param int|CommentList $list List + * + * @return void + * + * @since 1.0.0 + */ + public function setList($list) : void { $this->list = $list; } diff --git a/Models/CommentList.php b/Models/CommentList.php index 5b1725e..300d673 100755 --- a/Models/CommentList.php +++ b/Models/CommentList.php @@ -33,12 +33,21 @@ class CommentList protected int $id = 0; /** + * Comments * * @var array * @since 1.0.0 */ private array $comments = []; + /** + * Is active + * + * @var bool + * @since 1.0.0 + */ + protected bool $isActive = true; + /** * Get id. * @@ -54,7 +63,7 @@ class CommentList /** * Get the comments * - * @return array + * @return int[]|Comment[] * * @since 1.0.0 */ @@ -76,4 +85,30 @@ class CommentList { $this->comments[] = $comment; } + + /** + * Is active + * + * @return bool + * + * @since 1.0.0 + */ + public function isActive() : bool + { + return $this->isActive; + } + + /** + * Set list activity + * + * @param bool $active Is active + * + * @return void + * + * @since 1.0.0 + */ + public function setActive(bool $active) : void + { + $this->isActive = $active; + } } diff --git a/Models/CommentMapper.php b/Models/CommentMapper.php index a9075ef..bd48a6e 100755 --- a/Models/CommentMapper.php +++ b/Models/CommentMapper.php @@ -56,6 +56,10 @@ final class CommentMapper extends DataMapperAbstract 'mapper' => AccountMapper::class, 'self' => 'comments_comment_created_by', ], + 'list' => [ + 'mapper' => CommentListMapper::class, + 'self' => 'comments_comment_list', + ], ]; /** diff --git a/Models/CommentStatus.php b/Models/CommentStatus.php new file mode 100644 index 0000000..5e3f96f --- /dev/null +++ b/Models/CommentStatus.php @@ -0,0 +1,31 @@ +id = $id; + $this->isActive = false; + } +} diff --git a/tests/Models/CommentListTest.php b/tests/Models/CommentListTest.php index b827da6..4399a41 100755 --- a/tests/Models/CommentListTest.php +++ b/tests/Models/CommentListTest.php @@ -34,8 +34,12 @@ class CommentListTest extends \PHPUnit\Framework\TestCase $list = new CommentList(); $comment = new Comment(); $comment->setTitle('Test Comment'); + $comment->setContentRaw('TestRaw'); + $comment->setContent('TestContent'); $list->addComment($comment); self::assertEquals('Test Comment', $list->getComments()[0]->getTitle()); + self::assertEquals('Test Comment', $list->getComments()[0]->getContentRaw()); + self::assertEquals('Test Comment', $list->getComments()[0]->getcontent()); } } diff --git a/tests/Models/CommentMapperTest.php b/tests/Models/CommentMapperTest.php index f62b822..3de3f21 100755 --- a/tests/Models/CommentMapperTest.php +++ b/tests/Models/CommentMapperTest.php @@ -17,6 +17,7 @@ namespace Modules\Comments\tests\Models; use Modules\Admin\Models\NullAccount; use Modules\Comments\Models\Comment; use Modules\Comments\Models\CommentMapper; +use Modules\Comments\Models\CommentList; /** * @internal @@ -30,7 +31,7 @@ class CommentMapperTest extends \PHPUnit\Framework\TestCase $comment->setTitle('Test Title'); $comment->setContent('Test Content'); $comment->setRef(null); - $comment->setList(1); + $comment->setList(new CommentList()); $id = CommentMapper::create($comment); self::assertGreaterThan(0, $comment->getId());