Shorten feedback url

This commit is contained in:
Dillon
2023-10-04 01:02:19 +08:00
parent 8f5aa0a861
commit a5c1ae14b7
11 changed files with 224 additions and 20 deletions
@@ -0,0 +1,20 @@
<?php
namespace App\Classes\General\Eloquent\Filters;
use Illuminate\Database\Eloquent\Builder;
class ShortUrl implements Filter
{
/**
* @param Builder $builder
* @param $value
* @return Builder|mixed
*/
public static function apply(Builder $builder, $value)
{
return $builder->where('short_url', $value);
}
}
@@ -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]);
}
@@ -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');
$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));
} catch(\Exception $exception){
throw new ResourceNotFoundException($exception->getMessage());
}
}
}
@@ -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.'];
@@ -0,0 +1,55 @@
<?php
namespace App\Classes\Modules\HelpMenu\DataTransferObjects;
use App\Classes\General\Interfaces\DataTransferObject;
class UrlObject implements DataTransferObject
{
/** @var string */
private $type;
/** @var string */
private $shortUrl;
/** @var string */
private $originalUrl;
/**
* UrlObject constructor.
* @param string $type
* @param string $shortUrl
* @param string $originalUrl
*/
public function __construct(string $type, string $shortUrl, string $originalUrl)
{
$this->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;
}
}
@@ -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){
@@ -0,0 +1,25 @@
<?php
namespace App\Classes\Modules\HelpMenu\Services;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\HelpMenu\DataTransferObjects\UrlObject;
use App\Models\Url;
class CreatesUrl extends AbstractUpdateRecord
{
/**
* @param UrlObject $object
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(UrlObject $object) {
$model = new Url();
$model->type = $object->getType();
$model->short_url = $object->getShortUrl();
$model->original_url = $object->getOriginalUrl();
return $this->handler($model);
}
}
@@ -0,0 +1,32 @@
<?php
namespace App\Classes\Modules\HelpMenu\Services;
use App\Classes\General\Eloquent\AbstractFetchRecord;
use App\Models\Url;
use Illuminate\Database\Eloquent\Builder;
class FetchesUrl extends AbstractFetchRecord
{
/** @var Url */
private $repository;
/**
* FetchesUrl constructor.
* @param Url $repository
*/
public function __construct(Url $repository)
{
$this->repository = $repository;
}
/**
* @return Builder
*/
public function getRepository(): Builder
{
return $this->repository->newQuery();
}
}
+9
View File
@@ -0,0 +1,9 @@
<?php
namespace App\Models;
class Url extends AbstractModel
{
protected $table = 'urls';
}
@@ -20,6 +20,7 @@ class CreateQAUserAnswerSelectedTable extends Migration
$table->unsignedBigInteger('question_id');
$table->unsignedBigInteger('answer_option_id')->default(0);
$table->string('free_text_answer')->nullable();
$table->string('reference')->nullable();
$table->timestamps();
$table->softDeletes();
@@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUrlsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('urls', function (Blueprint $table) {
$table->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');
}
}