From a5c1ae14b7606041f34481a9c71f863330ab05f2 Mon Sep 17 00:00:00 2001 From: Dillon Date: Wed, 4 Oct 2023 01:02:19 +0800 Subject: [PATCH] Shorten feedback url --- .../General/Eloquent/Filters/ShortUrl.php | 20 +++++++ .../GenerateFeedbackUrlLogic.php | 19 ++++++- .../ControllersLogic/ListQuestionsQALogic.php | 27 +++++---- .../SubmitQAQuestionsLogic.php | 17 ++++-- .../DataTransferObjects/UrlObject.php | 55 +++++++++++++++++++ .../Processors/SaveAnswerProcessor.php | 5 +- .../Modules/HelpMenu/Services/CreatesUrl.php | 25 +++++++++ .../Modules/HelpMenu/Services/FetchesUrl.php | 32 +++++++++++ app/Models/Url.php | 9 +++ ...0_create_qa_user_answer_selected_table.php | 1 + .../2023_10_03_230901_create_urls_table.php | 34 ++++++++++++ 11 files changed, 224 insertions(+), 20 deletions(-) create mode 100644 app/Classes/General/Eloquent/Filters/ShortUrl.php create mode 100644 app/Classes/Modules/HelpMenu/DataTransferObjects/UrlObject.php create mode 100644 app/Classes/Modules/HelpMenu/Services/CreatesUrl.php create mode 100644 app/Classes/Modules/HelpMenu/Services/FetchesUrl.php create mode 100644 app/Models/Url.php create mode 100644 database/migrations/2023_10_03_230901_create_urls_table.php diff --git a/app/Classes/General/Eloquent/Filters/ShortUrl.php b/app/Classes/General/Eloquent/Filters/ShortUrl.php new file mode 100644 index 00000000..12e2eb17 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/ShortUrl.php @@ -0,0 +1,20 @@ +where('short_url', $value); + } + +} diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/GenerateFeedbackUrlLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/GenerateFeedbackUrlLogic.php index 9a40b8b2..f8c3289e 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/GenerateFeedbackUrlLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/GenerateFeedbackUrlLogic.php @@ -4,11 +4,14 @@ namespace App\Classes\Modules\HelpMenu\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; +use App\Classes\Modules\HelpMenu\DataTransferObjects\UrlObject; use App\Classes\Modules\HelpMenu\Standards\Rules\CanGenerateFeedbackUrl; +use App\Classes\Modules\HelpMenu\Services\CreatesUrl; use ErrorException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Crypt; +use Illuminate\Support\Str; class GenerateFeedbackUrlLogic extends AbstractControllerLogic { @@ -26,14 +29,18 @@ class GenerateFeedbackUrlLogic extends AbstractControllerLogic /** @var CanGenerateFeedbackUrl */ private $canGenerateFeedbackUrl; + /** @var CreatesUrl */ + private $createsUrl; /** * GenerateFeedbackUrlLogic constructor. * @param CanGenerateFeedbackUrl $canGenerateFeedbackUrl + * @param CreatesUrl $createsUrl */ - public function __construct(CanGenerateFeedbackUrl $canGenerateFeedbackUrl) + public function __construct(CanGenerateFeedbackUrl $canGenerateFeedbackUrl, CreatesUrl $createsUrl) { $this->canGenerateFeedbackUrl = $canGenerateFeedbackUrl; + $this->createsUrl = $createsUrl; } @@ -46,8 +53,14 @@ class GenerateFeedbackUrlLogic extends AbstractControllerLogic { $this->canGenerateFeedbackUrl->passes(); - $originalText = $request->input('system') . '|' . $request->input('customer_marking'). '|' . $request->input('email'). '|' . $request->input('question_set'); - $resource = ['token' => Crypt::encryptString($originalText)]; + $shortUrl = Str::random(20); + $originalText = $request->input('system') . '|' . $request->input('customer_marking'). '|' . $request->input('email'). '|' . $request->input('question_set') . $shortUrl; + $originalUrl = Crypt::encryptString($originalText); + + + $url = $this->createsUrl->execute(new UrlObject('feedback', $shortUrl, $originalUrl)); + $resource = ['token' => $url->short_url]; + return $this->response(['data' => $resource]); } diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/ListQuestionsQALogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/ListQuestionsQALogic.php index c0244ae5..ca25eeb7 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/ListQuestionsQALogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/ListQuestionsQALogic.php @@ -5,6 +5,7 @@ namespace App\Classes\Modules\HelpMenu\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\HelpMenu\Services\ListsHelpMenuQuestions; +use App\Classes\Modules\HelpMenu\Services\FetchesUrl; use App\Http\Resources\HelpMenuQuestionResource; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -27,13 +28,18 @@ class ListQuestionsQALogic extends AbstractControllerLogic /** @var ListsHelpMenuQuestions */ private $listsHelpMenuQuestions; + /** @var FetchesUrl */ + private $fetchesUrl; + /** * ListQuestionsQALogic constructor. * @param ListsHelpMenuQuestions $listsHelpMenuQuestions + * @param FetchesUrl $fetchesUrl */ - public function __construct(ListsHelpMenuQuestions $listsHelpMenuQuestions) + public function __construct(ListsHelpMenuQuestions $listsHelpMenuQuestions, FetchesUrl $fetchesUrl) { $this->listsHelpMenuQuestions = $listsHelpMenuQuestions; + $this->fetchesUrl = $fetchesUrl; } @@ -47,17 +53,14 @@ class ListQuestionsQALogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - try{ - $token = $request->input('token'); - $decriptedToken = Crypt::decryptString($token); - $delimiter = "|"; - $parts = explode($delimiter, $decriptedToken); - $questionSet = $parts[3]; - $query = $this->listsHelpMenuQuestions->execute(['questionnaire_set_id' => $questionSet]); - return $this->collectionResponse(HelpMenuQuestionResource::collection($query)); - } catch(\Exception $exception){ - throw new ResourceNotFoundException($exception->getMessage()); - } + $url = $this->fetchesUrl->execute(['short_url' => $request->input('token')]); + $token = $url->original_url; + $decriptedToken = Crypt::decryptString($token); + $delimiter = "|"; + $parts = explode($delimiter, $decriptedToken); + $questionSet = $parts[3]; + $query = $this->listsHelpMenuQuestions->execute(['questionnaire_set_id' => $questionSet]); + return $this->collectionResponse(HelpMenuQuestionResource::collection($query)); } } diff --git a/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php b/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php index c46532c8..047b7add 100644 --- a/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php +++ b/app/Classes/Modules/HelpMenu/ControllersLogic/SubmitQAQuestionsLogic.php @@ -5,6 +5,7 @@ namespace App\Classes\Modules\HelpMenu\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\HelpMenu\Processors\SaveAnswerProcessor; use App\Classes\Modules\HelpMenu\Processors\UserSourceForQAProcessor; +use App\Classes\Modules\HelpMenu\Services\FetchesUrl; use ErrorException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -30,15 +31,20 @@ class SubmitQAQuestionsLogic extends AbstractControllerLogic /** @var UserSourceForQAProcessor */ private $userSourceForQAProcessor; + /** @var FetchesUrl */ + private $fetchesUrl; + /** * SubmitQAQuestionsLogic constructor. * @param SaveAnswerProcessor $saveAnswerProcessor * @param UserSourceForQAProcessor $userSourceForQAProcessor + * @param FetchesUrl $fetchesUrl */ - public function __construct(SaveAnswerProcessor $saveAnswerProcessor, UserSourceForQAProcessor $userSourceForQAProcessor) + public function __construct(SaveAnswerProcessor $saveAnswerProcessor, UserSourceForQAProcessor $userSourceForQAProcessor, FetchesUrl $fetchesUrl) { $this->saveAnswerProcessor = $saveAnswerProcessor; $this->userSourceForQAProcessor = $userSourceForQAProcessor; + $this->fetchesUrl = $fetchesUrl; } @@ -49,11 +55,14 @@ class SubmitQAQuestionsLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - $token = $request->input('token'); + $originalToken = ''; + $shortToken = $request->input('token'); $userId = 0; $sourceId = 0; try { - $decriptedToken = Crypt::decryptString($token); + $url = $this->fetchesUrl->execute(['short_url' => $shortToken]); + $originalToken = $url->original_url; + $decriptedToken = Crypt::decryptString($originalToken); $delimiter = "|"; $parts = explode($delimiter, $decriptedToken); $system = $parts[0]; @@ -71,7 +80,7 @@ class SubmitQAQuestionsLogic extends AbstractControllerLogic $answers = $request->input('answers'); foreach ($answers as $answer) { $filesUpload = $request->input('files'); - $this->saveAnswerProcessor->execute($userId, $sourceId, $answer['questionId'], $answer['answer'], $answer['answerId'], $filesUpload); + $this->saveAnswerProcessor->execute($userId, $sourceId, $answer['questionId'], $answer['answer'], $answer['answerId'], $filesUpload, $shortToken); } $response = ['message' => 'Thank you for your feedback.']; diff --git a/app/Classes/Modules/HelpMenu/DataTransferObjects/UrlObject.php b/app/Classes/Modules/HelpMenu/DataTransferObjects/UrlObject.php new file mode 100644 index 00000000..150e3475 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/DataTransferObjects/UrlObject.php @@ -0,0 +1,55 @@ +type = $type; + $this->shortUrl = $shortUrl; + $this->originalUrl = $originalUrl; + } + + /** + * @return string + */ + public function getType(): string + { + return $this->type; + } + + /** + * @return string + */ + public function getShortUrl(): string + { + return $this->shortUrl; + } + + /** + * @return string + */ + public function getOriginalUrl(): string + { + return $this->originalUrl; + } + +} diff --git a/app/Classes/Modules/HelpMenu/Processors/SaveAnswerProcessor.php b/app/Classes/Modules/HelpMenu/Processors/SaveAnswerProcessor.php index 5830bc0f..611d3317 100644 --- a/app/Classes/Modules/HelpMenu/Processors/SaveAnswerProcessor.php +++ b/app/Classes/Modules/HelpMenu/Processors/SaveAnswerProcessor.php @@ -26,7 +26,7 @@ class SaveAnswerProcessor $this->uploadDocumentForHelpMenuProcessor = $uploadDocumentForHelpMenuProcessor; } - public function execute($userId, $sourceId, $questionId, $answerInText, $answerOptionId, $filesUpload){ + public function execute($userId, $sourceId, $questionId, $answerInText, $answerOptionId, $filesUpload, $reference = null){ $answer = null; // try{ @@ -45,6 +45,9 @@ class SaveAnswerProcessor $answer->question_id = $questionId; $answer->answer_option_id = intval($answerOptionId); $answer->free_text_answer = $answerInText; + if($reference){ + $answer->reference = $reference; + } $answer->save(); if($filesUpload){ diff --git a/app/Classes/Modules/HelpMenu/Services/CreatesUrl.php b/app/Classes/Modules/HelpMenu/Services/CreatesUrl.php new file mode 100644 index 00000000..bf84bacb --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Services/CreatesUrl.php @@ -0,0 +1,25 @@ +type = $object->getType(); + $model->short_url = $object->getShortUrl(); + $model->original_url = $object->getOriginalUrl(); + + return $this->handler($model); + + } +} diff --git a/app/Classes/Modules/HelpMenu/Services/FetchesUrl.php b/app/Classes/Modules/HelpMenu/Services/FetchesUrl.php new file mode 100644 index 00000000..c13c9da3 --- /dev/null +++ b/app/Classes/Modules/HelpMenu/Services/FetchesUrl.php @@ -0,0 +1,32 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Models/Url.php b/app/Models/Url.php new file mode 100644 index 00000000..9df84ee4 --- /dev/null +++ b/app/Models/Url.php @@ -0,0 +1,9 @@ +unsignedBigInteger('question_id'); $table->unsignedBigInteger('answer_option_id')->default(0); $table->string('free_text_answer')->nullable(); + $table->string('reference')->nullable(); $table->timestamps(); $table->softDeletes(); diff --git a/database/migrations/2023_10_03_230901_create_urls_table.php b/database/migrations/2023_10_03_230901_create_urls_table.php new file mode 100644 index 00000000..5e62e784 --- /dev/null +++ b/database/migrations/2023_10_03_230901_create_urls_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('type'); + $table->string('short_url'); + $table->text('original_url'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('urls'); + } +}