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

253 lines
10 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Blog;
use App\Models\BlogTranslation;
use App\Models\Category;
use App\Services\BootstrapTableService;
use App\Services\CachingService;
use App\Services\FileService;
use App\Services\HelperService;
use App\Services\ResponseService;
use Carbon\Carbon;
use App\Jobs\SendFcmBatchJob;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Throwable;
use Validator;
use function compact;
use function view;
class BlogController extends Controller {
private string $uploadFolder;
public function __construct() {
$this->uploadFolder = "blog";
}
public function index() {
ResponseService::noAnyPermissionThenRedirect(['blog-list', 'blog-create', 'blog-delete', 'blog-update']);
$languages = CachingService::getLanguages()->values();
return view('blog.index',compact('languages'));
}
public function create() {
ResponseService::noPermissionThenRedirect('blog-create');
$categories = Category::all();
$languages = CachingService::getLanguages()->values();
return view('blog.create', compact('categories','languages'));
}
public function store(Request $request)
{
ResponseService::noPermissionThenSendJson('blog-create');
$request->validate([
'title.1' => 'required',
'slug' => 'required',
'image' => 'required|mimes:jpg,jpeg,png|max:7168',
]);
try {
$data = [
'title' => $request->input('title')[1],
'slug' => HelperService::generateUniqueSlug(new Blog(), $request->input('slug')),
'description' => $request->input('blog_description')[1] ?? '',
'tags' => implode(',', $request->input('tags')[1] ?? []),
];
if ($request->hasFile('image')) {
$data['image'] = FileService::compressAndUpload($request->file('image'), $this->uploadFolder);
}
$blog = Blog::create($data);
foreach ($request->input('languages', []) as $langId) {
if ($langId != 1) {
$translatedTitle = $request->input("title.$langId");
$translatedDesc = $request->input("blog_description.$langId");
$translatedTags = implode(',', $request->input("tags.$langId", []));
if ($translatedTitle || $translatedDesc || !empty($translatedTags)) {
BlogTranslation::create([
'blog_id' => $blog->id,
'language_id' => $langId,
'title' => $translatedTitle,
'description' => $translatedDesc,
'tags' => $translatedTags,
]);
}
}
}
$customBodyFields = [
'image' => $blog->image,
'blog_id' => $blog->id,
'type' => 'blog'
];
redirect(route('blog.index'))->with([
'success' => trans("Blog Added Successfully")
])->send();
// ResponseService::successRedirectResponse("Blog Added Successfully", route('blog.index'))->send();
if (ob_get_level() > 0) {
ob_end_flush();
}
flush();
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
(new SendFcmBatchJob(
$blog->title,
"New blog uploaded by admin. Check it out!",
'blog',
$customBodyFields,
true,
[]
))->handle();
} else {
register_shutdown_function(function () use ($blog, $customBodyFields) {
try {
(new SendFcmBatchJob(
$blog->title,
"New blog uploaded by admin. Check it out!",
'blog',
$customBodyFields,
true,
[]
))->handle();
} catch (\Throwable $th) {
Log::error('Background notification job failed: ' . $th->getMessage());
}
});
}
exit();
} catch (Throwable $th) {
ResponseService::logErrorRedirect($th, "BlogController->store");
ResponseService::errorRedirectResponse();
}
}
public function show(Request $request) {
ResponseService::noPermissionThenSendJson('blog-list');
$offset = $request->input('offset', 0);
$limit = $request->input('limit', 10);
$sort = $request->input('sort', 'id');
$order = $request->input('order', 'ASC');
$sql = Blog::with('category:id,name');
if (!empty($request->search)) {
$sql = $sql->search($request->search);
}
$total = $sql->count();
$sql = $sql->sort($sort, $order)->skip($offset)->take($limit);
$result = $sql->get();
$bulkData = array();
$bulkData['total'] = $total;
$rows = array();
$no = 1;
foreach ($result as $key => $row) {
$operate = '';
if (Auth::user()->can('blog-update')) {
$operate .= BootstrapTableService::editButton(route('blog.edit', $row->id));
}
if (Auth::user()->can('blog-delete')) {
$operate .= BootstrapTableService::deleteButton(route('blog.destroy', $row->id));
}
$tempRow = $row->toArray();
$tempRow['no'] = $no++;
$tempRow['created_at'] = Carbon::createFromFormat('Y-m-d H:i:s', $row->created_at)->format('d-m-y H:i:s');
$tempRow['updated_at'] = Carbon::createFromFormat('Y-m-d H:i:s', $row->updated_at)->format('d-m-y H:i:s');
$tempRow['operate'] = $operate;
$tempRow['description'] = Str::limit(strip_tags($row->description), 200);
$rows[] = $tempRow;
}
$bulkData['rows'] = $rows;
return response()->json($bulkData);
}
public function edit($id)
{
ResponseService::noPermissionThenRedirect('blog-update');
$blog = Blog::with('translations')->findOrFail($id);
$categories = Category::all();
$languages = CachingService::getLanguages()->values();
// Get translations as keyed array by language_id
$translations = $blog->translations->keyBy('language_id');
return view('blog.edit', compact('blog', 'categories', 'languages', 'translations'));
}
public function update(Request $request, $id)
{
ResponseService::noPermissionThenSendJson('blog-update');
try {
$request->validate([
'title.1' => 'required',
'slug' => 'required',
'image' => 'nullable|mimes:jpg,jpeg,png|max:7168',
]);
$blog = Blog::findOrFail($id);
$data = [
'title' => $request->input('title')[1],
'slug' => HelperService::generateUniqueSlug(new Blog(), $request->input('slug'), $blog->id),
'description' => $request->input('blog_description')[1] ?? '',
'tags' => implode(',', $request->input('tags')[1] ?? []),
];
if ($request->hasFile('image')) {
$data['image'] = FileService::compressAndReplace($request->file('image'), $this->uploadFolder, $blog->getRawOriginal('image'));
}
$blog->update($data);
foreach ($request->input('languages', []) as $langId) {
if ($langId != 1) {
$translatedTitle = $request->input("title.$langId");
$translatedDesc = $request->input("blog_description.$langId");
$translatedTags = $request->input("tags.$langId", []);
if ($translatedTitle || $translatedDesc || !empty($translatedTags)) {
BlogTranslation::updateOrCreate(
['blog_id' => $blog->id, 'language_id' => $langId],
[
'title' => $translatedTitle,
'description' => $translatedDesc,
'tags' => implode(',', $translatedTags),
]
);
}
}
}
ResponseService::successRedirectResponse("Blog Updated Successfully", route('blog.index'));
} catch (Throwable $th) {
ResponseService::logErrorRedirect($th);
ResponseService::errorRedirectResponse('Something Went Wrong');
}
}
public function destroy($id) {
ResponseService::noPermissionThenSendJson('blog-delete');
try {
$blog = Blog::find($id);
FileService::delete($blog->getRawOriginal('image'));
$blog->delete();
ResponseService::successResponse('Blog delete successfully');
} catch (Throwable $th) {
ResponseService::logErrorResponse($th);
ResponseService::errorResponse('Something Went Wrong ');
}
}
}