Files
admin/app/Http/Controllers/FaqController.php
Husanjonazamov e0f1989655 classify admin
2026-02-24 12:52:01 +05:00

245 lines
8.2 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Faq;
use App\Models\FaqTranslation;
use App\Models\Language;
use App\Services\ResponseService;
use App\Services\BootstrapTableService;
use App\Services\CachingService;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use Throwable;
class FaqController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
ResponseService::noAnyPermissionThenRedirect(['faq-create','faq-list','faq-update','faq-delete']);
$languages = CachingService::getLanguages()->values();
return view('faq.create',compact('languages'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
ResponseService::noPermissionThenRedirect('faq-create');
$question = $request->input('question');
$answer = $request->input('answer');
$baseRules = [
"question.1" => 'required|string',
"answer.1" => 'required|string',
'answer.*' => 'nullable|string|required_with:question.*',
];
$messages = [
"question.1.required" => "Please enter the question in English.",
"answer.1.required" => "Please enter the answer in English.",
"answer.*.required_with" => "The answer field is required when the question is present."
];
$validator = Validator::make($request->all(), $baseRules, $messages);
if ($validator->fails()) {
return ResponseService::validationError($validator->errors()->first());
}
try {
// Store main FAQ in English
$faq = Faq::create([
'question' => $question[1],
'answer' => $answer[1],
]);
// Store other language translations
foreach ($question as $langId => $qText) {
if ($langId == 1 || empty($qText)) continue;
$translatedAnswer = $answer[$langId] ?? null;
//if (!$translatedAnswer) continue;
$language = Language::find($langId);
if ($language) {
FaqTranslation::create([
'faq_id' => $faq->id,
'language_id' => $langId,
'question' => $qText,
'answer' => $translatedAnswer,
]);
}
}
return ResponseService::successResponse('FAQ created successfully');
} catch (\Throwable $th) {
ResponseService::logErrorResponse($th, "Faq Controller -> store");
return ResponseService::errorResponse();
}
}
/**
* Display the specified resource.
*/
public function show(Request $request)
{
try {
ResponseService::noPermissionThenSendJson('faq-list');
$offset = $request->input('offset', 0);
$limit = $request->input('limit', 10);
$sort = $request->input('sort', 'sequence');
$order = $request->input('order', 'ASC');
$sql = Faq::with('translations')->orderBy($sort, $order);
if (!empty($_GET['search'])) {
$search = $_GET['search'];
$sql->where('id', 'LIKE', "%$search%")->orwhere('question', 'LIKE', "%$search%")->orwhere('answer', 'LIKE', "%$search%");
}
$total = $sql->count();
$sql->skip($offset)->take($limit);
$result = $sql->get();
$bulkData = array();
$bulkData['total'] = $total;
$rows = array();
foreach ($result as $key => $row) {
$tempRow = $row->toArray();
$operate = '';
if (Auth::user()->can('faq-update')) {
$operate .= BootstrapTableService::editButton(route('faq.update', $row->id), true, '#editModal', 'faqEvents', $row->id);
}
if (Auth::user()->can('faq-delete')) {
$operate .= BootstrapTableService::deleteButton(route('faq.destroy', $row->id));
}
$tempRow['operate'] = $operate;
$tempRow['translations'] = $row->translations->map(function ($t) {
return [
'language_id' => $t->language_id,
'question' => $t->question,
'answer' =>$t->answer
];
}) ?? [];
$rows[] = $tempRow;
}
$bulkData['rows'] = $rows;
return response()->json($bulkData);
} catch (Throwable $th) {
ResponseService::logErrorResponse($th, "FaqController --> show");
ResponseService::errorResponse();
}
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, $id)
{
ResponseService::noPermissionThenSendJson('faq-update');
$question = $request->input('question');
$answer = $request->input('answer');
// Validate English (language_id = 1)
$validator = Validator::make($request->all(), [
'question.1' => 'required|string',
'answer.1' => 'required|string',
]);
if ($validator->fails()) {
return ResponseService::validationError($validator->errors()->first());
}
try {
$faq = Faq::findOrFail($id);
// Update default English values
$faq->update([
'question' => $question[1],
'answer' => $answer[1],
]);
// Loop through translations
foreach ($question as $langId => $qText) {
if ($langId == 1) continue;
$translatedAnswer = $answer[$langId] ?? null;
// Skip empty translations
if (empty($qText) || empty($translatedAnswer)) {
continue;
}
$language = Language::find($langId);
if ($language) {
// Check if translation exists
$translation = FaqTranslation::where('faq_id', $faq->id)
->where('language_id', $langId)
->first();
if ($translation) {
// Update existing
$translation->update([
'question' => $qText,
'answer' => $translatedAnswer,
]);
} else {
// Create new
FaqTranslation::create([
'faq_id' => $faq->id,
'language_id' => $langId,
'question' => $qText,
'answer' => $translatedAnswer,
]);
}
}
}
return ResponseService::successResponse('FAQ updated successfully');
} catch (Throwable $th) {
ResponseService::logErrorResponse($th, "Faq Controller -> update");
return ResponseService::errorResponse();
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
try {
ResponseService::noPermissionThenSendJson('faq-delete');
Faq::findOrFail($id)->delete();
ResponseService::successResponse('FAQ delete successfully');
} catch (Throwable $th) {
ResponseService::logErrorResponse($th, "Faq Controller -> destroy");
ResponseService::errorResponse('Something Went Wrong');
}
}
}