Admin Workflow - Code Refactoring

This commit is contained in:
Dillon Ngo
2025-02-23 22:04:15 +08:00
parent f2ba89d3e4
commit cc558b0af9
6 changed files with 58 additions and 72 deletions
@@ -19,6 +19,7 @@ use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Auth;
use App\Http\Resources\QuestionResource;
use App\Models\Booking;
use App\Models\QAQuestions;
class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic
{
@@ -90,52 +91,57 @@ class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic
public function logic(Request $request) : JsonResponse
{
$userId = Auth::user()->id;
$currentQuestion = $request->question;
$answerNextQuestionNumber = null;
$answerValue = null;
$timeUsedSeconds = 0;
$reference = null;
$questionMetadata = null;
$booking = null;
$isNoGoingBackOverwrite = 0;
$previousAnswer = null;
$this->canFetchQuestion->passes();
if ($request->has('answerObj')) {
$answer = $request->answerObj;
$answerNextQuestionNumber = $answer['next_question_number'];
$answerValue = $answer['value'];
}
if ($request->has('extra')) {
$extra = $request->extra;
$questionMetadata = $extra['questionMetadata'] ?? null;
$timeUsedSeconds = intval($extra['timeUsedSeconds']) ?? 0;
$reference = $extra['session_id'];
}
if($questionMetadata){
$booking = Booking::where('id', $questionMetadata['id'])->first();
$currentQuestion = $request->question;
$filesUpload = $request->only(['files', 'filesA', 'filesB', 'filesC']);
if ($request->has('questionContext')) {
$questionMetadata = $request->questionContext['questionMetadata'] ?? null;
$timeUsedSeconds = intval($request->questionContext['timeUsedSeconds']) ?? 0;
$reference = $request->questionContext['session_id'];
$booking = $questionMetadata ? Booking::where('id', $questionMetadata['id'])->first() : null;
}
//Save answer given by user (both next and previous)
$filesUpload = $request->only(['files', 'filesA', 'filesB', 'filesC']);
$answerOptionId = 0;
if ($request->has('answerObj')) {
$answerOptionId = intval($request->answerObj['id']);
}
$answerInText = $request->answer;
if ($request->has('isPrevious')){
$answerInText = "go_back";
}
$this->saveAnswerProcessor->execute($userId, 0, $currentQuestion, $questionMetadata, $answerInText, $answerOptionId, $filesUpload, $timeUsedSeconds, $request->has('isPrevious'), $reference);
$this->saveAnswerProcessor->execute($userId, 0, $currentQuestion, $questionMetadata, $request->answer, $answerOptionId, $filesUpload, $timeUsedSeconds, $request->has('isPrevious'), $reference);
if(!$request->has('isPrevious')){
$isNoGoingBackOverwrite = $this->saveAnswerActionProcessor->execute($booking, $questionMetadata, $answerOptionId, $currentQuestion, $filesUpload);
$this->saveAnswerActionProcessor->execute($booking, $questionMetadata, $answerOptionId, $currentQuestion, $filesUpload);
}
if ($request->has('questionContext')) {
$previousAnswer = $this->listsUserAnswerSelected->execute(['user_id' => $userId, 'reference' => $reference, 'is_previous' => 0, 'order_by' => (object)['column' => 'id','DESC' => true]])[0];
}
if($booking){
$this->markBookingAsProcessed($booking, $request->has('isPrevious'), $currentQuestion);
}
//Get returned question (previous or next) and additional metadata if applicable
$returnQuestion = $this->fetchNextQuestionV1AdminWFProcessor->execute($currentQuestion, $request->answerObj, $request->questionContext, $previousAnswer, $booking, $request->has('isPrevious'));
$questionMetadata = $this->fetchNextQuestionMetadataProcessor->execute($returnQuestion, $questionMetadata);
//When a questionnaire ended, return back the first question
if(is_null($returnQuestion)){
$returnQuestion = $this->fetchFirstQuestionQAProcessor->execute($request);
}
return $this->resourceResponse(new QuestionResource($returnQuestion, $userId, $request->has('isPrevious'), $this->isNoGoingBack($returnQuestion), $previousAnswer, $questionMetadata));
}
private function markBookingAsProcessed(Booking $booking, bool $isPrevious, array $currentQuestion){
//Marked data that has already been processed so that it does not appear again
$isNoGoingBack = 0;
if($currentQuestion && $currentQuestion['is_end'] === 1 && !$request->has('isPrevious')){
if($currentQuestion && $currentQuestion['is_end'] === 1 && !$isPrevious){
$key1 = "admin_workflow_processed";
$key2 = "admin_workflow_processing";
if (strpos($currentQuestion['question_number'], '1688') === 0) {
@@ -162,36 +168,18 @@ class UpdateNextQuestionV1AdminWFLogic extends AbstractControllerLogic
$keyValuePairObject = new KeyValuePairObject($key1, true);
$this->createsKeyValuePair->execute($booking, $keyValuePairObject);
}
$isNoGoingBack = 1;
}
}
$previousAnswer = null;
if ($request->has('extra')) {
$extra = $request->extra;
$reference = $extra['session_id'];
$previousAnswer = $this->listsUserAnswerSelected->execute(['user_id' => $userId, 'reference' => $reference, 'is_previous' => 0, 'order_by' => (object)['column' => 'id','DESC' => true]])[0];
}
private function isNoGoingBack(QAQuestions $returnQuestion){
//Get returned question (previous or next)
$returnQuestion = $this->fetchNextQuestionV1AdminWFProcessor->execute($request, $previousAnswer, $booking);
if($returnQuestion && $returnQuestion->is_start){
$isNoGoingBack = 1;
if($returnQuestion && ($returnQuestion->is_start || $returnQuestion->is_end)){
return 1;
}
else if($returnQuestion && $returnQuestion->is_start === 0 && $returnQuestion && $returnQuestion->is_end === 0){
$isNoGoingBack = 0;
return 0;
}
if($isNoGoingBackOverwrite === 1 && $isNoGoingBack === 0){
$isNoGoingBack = $isNoGoingBackOverwrite;
}
$questionMetadata = $this->fetchNextQuestionMetadataProcessor->execute($returnQuestion, $questionMetadata);
//When a questionnaire ended, return back the first question
if(is_null($returnQuestion)){
$returnQuestion = $this->fetchFirstQuestionQAProcessor->execute($request);
}
return $this->resourceResponse(new QuestionResource($returnQuestion, $userId, $request->has('isPrevious'), $isNoGoingBack, $previousAnswer, $questionMetadata));
return 0;
}
}