HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/xedaptot/hi.naniguide.com/app/Http/Controllers/Admin/BlogPostController.php
<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\BlogPost;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;

class BlogPostController extends Controller
{
    public function index(Request $request)
    {
        $search = trim((string) $request->get('q', ''));

        $posts = BlogPost::query()
            ->with(['author:id,email'])
            ->when($search !== '', function ($q) use ($search) {
                $q->where('title', 'like', '%' . $search . '%')
                    ->orWhere('slug', 'like', '%' . $search . '%');
            })
            ->orderByDesc('published_at')
            ->orderByDesc('created_at')
            ->paginate(15)
            ->withQueryString();

        return view('admin.blog-posts.index', compact('posts', 'search'));
    }

    public function create()
    {
        return view('admin.blog-posts.create', [
            'post' => new BlogPost(),
        ]);
    }

    public function store(Request $request)
    {
        $data = $this->validateData($request);

        if (empty($data['slug'])) {
            $data['slug'] = Str::slug($data['title']);
        }

        $data['author_id'] = auth('admin')->id();

        $data = $this->applyStatus($data, null);

        if ($request->hasFile('featured_image')) {
            $data['featured_image'] = $request->file('featured_image')->store('blog/featured-images', 'public');
        }

        BlogPost::create($data);

        return redirect()->route('admin.blog-posts.index')->with('success', __('Blog post created.'));
    }

    public function edit(BlogPost $blog_post)
    {
        return view('admin.blog-posts.edit', [
            'post' => $blog_post,
        ]);
    }

    public function update(Request $request, BlogPost $blog_post)
    {
        $data = $this->validateData($request, $blog_post->id);

        if (empty($data['slug'])) {
            $data['slug'] = Str::slug($data['title']);
        }


        $data = $this->applyStatus($data, $blog_post);

        if ($request->hasFile('featured_image')) {
            $data['featured_image'] = $request->file('featured_image')->store('blog/featured-images', 'public');
        } else {
            unset($data['featured_image']);
        }

        $blog_post->update($data);

        return redirect()->route('admin.blog-posts.index')->with('success', __('Blog post updated.'));
    }

    public function publish(BlogPost $blog_post)
    {
        $blog_post->update([
            'status' => 'publish',
            'is_published' => true,
            'scheduled_at' => null,
            'published_at' => $blog_post->published_at ?? now(),
        ]);

        return redirect()->route('admin.blog-posts.index')->with('success', __('Blog post published.'));
    }

    public function unpublish(BlogPost $blog_post)
    {
        $blog_post->update([
            'status' => 'draft',
            'is_published' => false,
            'scheduled_at' => null,
            'published_at' => null,
        ]);

        return redirect()->route('admin.blog-posts.index')->with('success', __('Blog post unpublished.'));
    }

    public function destroy(BlogPost $blog_post)
    {
        $blog_post->delete();

        return redirect()->route('admin.blog-posts.index')->with('success', __('Blog post deleted.'));
    }

    private function validateData(Request $request, ?int $postId = null): array
    {
        $data = $request->validate([
            'title' => ['required', 'string', 'max:255'],
            'slug' => ['nullable', 'string', 'max:255', Rule::unique('blog_posts', 'slug')->ignore($postId)],
            'excerpt' => ['nullable', 'string'],
            'content' => ['required', 'string'],
            'status' => ['required', 'string', Rule::in(['draft', 'publish', 'schedule'])],
            'scheduled_at' => ['nullable', 'date', 'required_if:status,schedule'],
            'featured_image' => ['nullable', 'file', 'image', 'max:5120'],
        ]);

        return $data;
    }

    private function applyStatus(array $data, ?BlogPost $existing): array
    {
        $status = $data['status'] ?? 'draft';

        if ($status === 'publish') {
            $data['is_published'] = true;
            $data['scheduled_at'] = null;
            $data['published_at'] = $existing?->published_at ?? now();
            return $data;
        }

        if ($status === 'schedule') {
            $scheduledAt = isset($data['scheduled_at']) && $data['scheduled_at']
                ? now()->parse($data['scheduled_at'])
                : null;

            if ($scheduledAt && $scheduledAt->lessThanOrEqualTo(now())) {
                $data['status'] = 'publish';
                $data['is_published'] = true;
                $data['scheduled_at'] = null;
                $data['published_at'] = $existing?->published_at ?? now();
                return $data;
            }

            $data['is_published'] = false;
            $data['published_at'] = null;
            $data['scheduled_at'] = $scheduledAt;
            return $data;
        }

        $data['status'] = 'draft';
        $data['is_published'] = false;
        $data['scheduled_at'] = null;
        $data['published_at'] = null;
        return $data;
    }
}