File "LanguageController.php"
Full Path: /home/trinadezambia/public_html/admin_panel/app/Http/Controllers/LanguageController.php
File size: 8.58 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace App\Http\Controllers;
use App\Models\SystemSetting;
use App\Models\User;
use App\Repositories\Languages\LanguageInterface;
use App\Repositories\SystemSetting\SystemSettingInterface;
use App\Repositories\User\UserInterface;
use App\Services\BootstrapTableService;
use App\Services\CachingService;
use App\Services\ResponseService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Session;
use PhpParser\Node\Stmt\TryCatch;
use Throwable;
class LanguageController extends Controller
{
private LanguageInterface $language;
private CachingService $cache;
public function __construct(LanguageInterface $language, CachingService $cachingService)
{
$this->language = $language;
$this->cache = $cachingService;
}
public function index()
{
ResponseService::noPermissionThenRedirect('language-create');
return view('settings.language_setting');
}
public function language_sample()
{
ResponseService::noPermissionThenRedirect('language-create');
$filePath = base_path("resources/lang/en.json");
$headers = ['Content-Type: application/json'];
$fileName = 'language.json';
if (File::exists(base_path("resources/lang/en.json"))) {
return response()->download($filePath, $fileName, $headers);
}
ResponseService::errorResponse();
}
public function store(Request $request)
{
ResponseService::noPermissionThenRedirect('language-create');
$request->validate([
'name' => 'required',
'code' => 'required|unique:languages,code',
'file' => 'required|mimes:json',
]);
try {
if ($request->hasFile('file')) {
$file = $request->file('file');
$filename = $request->code . '.' . $file->getClientOriginalExtension();
$file->move(base_path('resources/lang/'), $filename);
}
$languageData = array(
'name' => $request->name,
'code' => $request->code,
'status' => 0,
'is_rtl' => $request->rtl ?? 0,
'file' => $filename ?? NULL
);
$this->language->create($languageData);
$this->cache->removeSystemCache(config('constants.CACHE.SYSTEM.LANGUAGE'));
ResponseService::successResponse('Data Stored Successfully');
} catch (Throwable $e) {
ResponseService::logErrorResponse($e, "Language Controller -> Store method");
ResponseService::errorResponse();
}
}
public function show()
{
ResponseService::noPermissionThenRedirect('language-list');
$offset = request('offset', 0);
$limit = request('limit', 10);
$sort = request('sort', 'id');
$order = request('order', 'DESC');
$search = request('search');
$sql = $this->language->builder()
->where(function ($query) use ($search) {
$query->when('search', function ($query) use ($search) {
$query->where(function ($query) use ($search) {
$query->where('id', 'LIKE', "%$search%")
->orwhere('name', 'LIKE', "%$search%")
->orwhere('code', 'LIKE', "%$search%")
->orwhere('status', 'LIKE', "%$search%");
});
});
});
$total = $sql->count();
if ($offset >= $total && $total > 0) {
$lastPage = floor(($total - 1) / $limit) * $limit; // calculate last page offset
$offset = $lastPage;
}
$sql->orderBy($sort, $order)->skip($offset)->take($limit);
$res = $sql->get();
$bulkData = array();
$bulkData['total'] = $total;
$rows = array();
$no = 1;
foreach ($res as $row) {
$operate = "";
$operate .= BootstrapTableService::editButton(route('language.update', $row->id));
$operate .= BootstrapTableService::button('fa fa-file', route('language.json.file', $row->code), ['btn-gradient-info'], ['title' => trans("file")]);
if ($row->code != "en") {
$operate .= BootstrapTableService::deleteButton(route('language.destroy', $row->id));
}
$tempRow = $row->toArray();
$tempRow['no'] = $no++;
$tempRow['operate'] = $operate;
$rows[] = $tempRow;
}
$bulkData['rows'] = $rows;
return response()->json($bulkData);
}
public function update($id, Request $request)
{
ResponseService::noPermissionThenRedirect('language-edit');
$request->validate([
'name' => 'required',
'code' => 'required|unique:languages,code,' . $id,
'file' => 'nullable|mimes:json',
]);
try {
$languageData = array(
'name' => $request->name,
'code' => $request->code,
'is_rtl' => $request->rtl ?? 0,
);
$languageDB = $this->language->findById($id);
if ($request->hasFile('file')) {
$request->validate(['file' => 'required|mimes:json',]);
if (File::exists(base_path("resources/lang/") . $languageDB->file)) {
File::delete(base_path("resources/lang/") . $languageDB->file);
}
$file = $request->file('file');
$filename = $request->code . '.' . $file->getClientOriginalExtension();
$file->move(base_path('resources/lang/'), $filename);
// $language['file'] = $filename;
}
$this->language->update($id, $languageData);
ResponseService::successResponse('Data Updated Successfully');
} catch (Throwable $e) {
ResponseService::logErrorResponse($e, "Language Controller -> Update method");
ResponseService::errorResponse();
}
}
public function destroy($id)
{
ResponseService::noPermissionThenSendJson('language-delete');
try {
$language = $this->language->findById($id);
// Safety Check: Prevent deletion of default language
$defaultLanguage = SystemSetting::where('name', 'default_language')->first();
if ($defaultLanguage && $defaultLanguage->data == $language->code) {
return ResponseService::errorResponse("Cannot delete the system default language.");
}
// Safety Check: Prevent deletion if language is assigned to any user
if (User::where('language', $language->code)->exists()) {
return ResponseService::errorResponse("Cannot delete this language because it is assigned to one or more users. Please change their language preference first.");
}
$this->language->deleteById($id);
$this->cache->removeSystemCache(config('constants.CACHE.SYSTEM.LANGUAGE'));
ResponseService::successResponse('Data Deleted Successfully');
} catch (Throwable $e) {
ResponseService::logErrorResponse($e, "Language Controller -> Delete method");
ResponseService::errorResponse();
}
}
public function set_language(Request $request)
{
Session::put('locale', $request->lang);
Session::save();
$language = $this->language->builder()->where('code', $request->lang)->first();
Session::put('language', $language);
app()->setLocale(Session::get('locale'));
Session::put('landing_locale', $request->lang);
Session::save();
Session::put('language', $language);
app()->setLocale(Session::get('landing_locale'));
Cache::flush();
if (Auth::user()) {
User::where('id', Auth::user()->id)->update(['language' => $language->code]);
}
return redirect()->back();
}
public function language_file($code = null)
{
try {
$filePath = base_path("resources/lang");
$filePath .= '/' . $code . '.json';
$headers = ['Content-Type: application/json'];
$fileName = $code . '.json';
if (File::exists($filePath)) {
return response()->download($filePath, $fileName, $headers);
}
return redirect()->back()->with('error', 'No file found.');
} catch (\Throwable $th) {
return redirect()->back()->with('error', 'No file found.');
}
}
}