From aadb600397c968113af12a9ffad4f29c11584171 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sat, 5 Jun 2021 11:01:03 +0200 Subject: [PATCH] bug fixes --- Admin/Install/db.json | 19 +++++---- Admin/Routes/Web/Api.php | 36 ++++++++++++++++ Controller/ApiController.php | 64 +++++++++++++++++++++++++++++ Models/CommentVote.php | 80 ++++++++++++++++++++++++++++++++++++ Models/CommentVoteMapper.php | 66 +++++++++++++++++++++++++++++ Models/NullCommentVote.php | 38 +++++++++++++++++ Models/PermissionState.php | 34 +++++++++++++++ 7 files changed, 330 insertions(+), 7 deletions(-) create mode 100644 Models/CommentVote.php create mode 100644 Models/CommentVoteMapper.php create mode 100644 Models/NullCommentVote.php create mode 100644 Models/PermissionState.php diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 94ef849..982c655 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -126,23 +126,28 @@ "primary": true, "autoincrement": true }, - "comments_comment_vote_src": { - "name": "comments_comment_vote_src", + "comments_comment_vote_score": { + "name": "comments_comment_vote_score", + "type": "TINYINT", + "null": false + }, + "comments_comment_vote_comment": { + "name": "comments_comment_vote_comment", "type": "INT", "null": false, "foreignTable": "comments_comment", "foreignKey": "comments_comment_id" }, - "comments_comment_vote_dst": { - "name": "comments_comment_vote_dst", + "comments_comment_vote_created_by": { + "name": "comments_comment_vote_created_by", "type": "INT", "null": false, "foreignTable": "account", "foreignKey": "account_id" }, - "comments_comment_vote_score": { - "name": "comments_comment_vote_score", - "type": "TINYINT", + "comments_comment_vote_created_at": { + "name": "comments_comment_vote_created_at", + "type": "DATETIME", "null": false } } diff --git a/Admin/Routes/Web/Api.php b/Admin/Routes/Web/Api.php index 6d76688..ffe14d5 100755 --- a/Admin/Routes/Web/Api.php +++ b/Admin/Routes/Web/Api.php @@ -1,4 +1,40 @@ [ + [ + 'dest' => '\Modules\Comments\Controller\ApiController:apiCommentCreate', + 'verb' => RouteVerb::PUT, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionState::COMMENT, + ], + ], + [ + 'dest' => '\Modules\Comments\Controller\ApiController:apiCommentUpdate', + 'verb' => RouteVerb::SET, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionState::COMMENT, + ], + ], + ], + '^.*/comment/vote(\?.*|$)' => [ + [ + 'dest' => '\Modules\Comments\Controller\ApiController:apiChangeCommentVote', + 'verb' => RouteVerb::PUT | RouteVerb::SET, + 'permission' => [ + 'module' => ApiController::MODULE_NAME, + 'type' => PermissionType::CREATE, + 'state' => PermissionState::VOTE, + ], + ], + ], ]; diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 7c122cf..c650a3d 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -18,6 +18,9 @@ namespace Modules\Comments\Controller; use Modules\Admin\Models\NullAccount; use Modules\Comments\Models\Comment; +use Modules\Comments\Models\CommentVote; +use Modules\Comments\Models\NullCommentVote; +use Modules\Comments\Models\CommentVoteMapper; use Modules\Comments\Models\CommentList; use Modules\Comments\Models\CommentListMapper; use Modules\Comments\Models\CommentMapper; @@ -261,4 +264,65 @@ final class ApiController extends Controller $this->deleteModel($request->header->account, $comment, CommentMapper::class, 'comment', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Comment', 'Comment successfully deleted', $comment); } + + /** + * Api method to change vote + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + private function apiChangeCommentVote(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateAnswerVote($request))) { + $response->set('qa_answer_vote', new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + + return; + } + + $vote = CommentVoteMapper::findVote((int) $reqeust->getData('id'), $request->header->account); + + if ($vote instanceof NullCommentVote) { + $new = new CommentVote(); + $new->score = (int) $request->getData('type'); + $new->createdBy = $request->header->account; + + $this->createModel($request->header->account, $new, CommentVoteMapper::class, 'comment_vote', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Vote', 'Sucessfully voted.', $new); + } else { + $new = clone $vote; + $new->score = (int) $request->getData('type'); + + $this->updateModel($request->header->account, $vote, $new, CommentVoteMapper::class, 'comment_vote', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Vote', 'Vote successfully changed.', $new); + } + } + + /** + * Validate answer vote request + * + * @param RequestAbstract $request Request + * + * @return array Returns the validation array of the request + * + * @since 1.0.0 + */ + private function validateCommentVote(RequestAbstract $request) : array + { + $val = []; + if (($val['id'] = ($request->getData('id') === null)) + || ($val['type'] = ($request->getData('type', 'int') < -1 || $request->getData('type') > 1)) + ) { + return $val; + } + + return []; + } } diff --git a/Models/CommentVote.php b/Models/CommentVote.php new file mode 100644 index 0000000..bde2784 --- /dev/null +++ b/Models/CommentVote.php @@ -0,0 +1,80 @@ +createdBy = new NullAccount(); + $this->createdAt = new \DateTimeImmutable(); + } +} diff --git a/Models/CommentVoteMapper.php b/Models/CommentVoteMapper.php new file mode 100644 index 0000000..bc4d9fd --- /dev/null +++ b/Models/CommentVoteMapper.php @@ -0,0 +1,66 @@ + + * @since 1.0.0 + */ + protected static array $columns = [ + 'comments_comment_vote_id' => ['name' => 'comments_comment_vote_id', 'type' => 'int', 'internal' => 'id'], + 'comments_comment_vote_score' => ['name' => 'comments_comment_vote_score', 'type' => 'int', 'internal' => 'score'], + 'comments_comment_vote_comment' => ['name' => 'comments_comment_vote_comment', 'type' => 'int', 'internal' => 'comment', 'readonly' => true], + 'comments_comment_vote_created_by' => ['name' => 'comments_comment_vote_created_by', 'type' => 'int', 'internal' => 'createdBy', 'readonly' => true], + 'comments_comment_vote_created_at' => ['name' => 'comments_comment_vote_created_at', 'type' => 'DateTimeImmutable', 'internal' => 'createdAt', 'readonly' => true], + ]; + + /** + * Primary table. + * + * @var string + * @since 1.0.0 + */ + protected static string $table = 'comments_comment_vote'; + + /** + * Created at. + * + * @var string + * @since 1.0.0 + */ + protected static string $createdAt = 'comments_comment_vote_created_at'; + + /** + * Primary field name. + * + * @var string + * @since 1.0.0 + */ + protected static string $primaryField = 'comments_comment_vote_id'; +} diff --git a/Models/NullCommentVote.php b/Models/NullCommentVote.php new file mode 100644 index 0000000..ba8fef0 --- /dev/null +++ b/Models/NullCommentVote.php @@ -0,0 +1,38 @@ +id = $id; + } +} diff --git a/Models/PermissionState.php b/Models/PermissionState.php new file mode 100644 index 0000000..f184199 --- /dev/null +++ b/Models/PermissionState.php @@ -0,0 +1,34 @@ +