/home2/mshostin/farms.ms-hostingladz.com/app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\View;
use Illuminate\Pagination\Paginator;
use App\Models\Permission;
use App\Models\User;
use App\Models\Category;
use App\Models\Subcategory;
use App\Repositories\Farm\FarmRepositoryInterface;
use App\Repositories\Farm\FarmRepository;
use App\Repositories\Animal\AnimalRepositoryInterface;
use App\Repositories\Animal\AnimalRepository;

class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->bind(FarmRepositoryInterface::class, FarmRepository::class);
        $this->app->bind(AnimalRepositoryInterface::class, AnimalRepository::class);
    }

    public function boot(): void
    {
        Paginator::useBootstrapFive();

        Gate::before(function (User $user, string $ability) {
            if ($user->hasRole('super_admin')) {
                return true;
            }
        });

        try {
            Permission::pluck('slug')->each(function ($slug) {
                Gate::define($slug, function (User $user) use ($slug) {
                    return $user->hasPermission($slug);
                });
            });
        } catch (\Exception $e) {
        }

        View::composer(['partials.admin.header', 'dashboard.includes.partial.nav'], function ($view) {
            if (auth()->check()) {
                $query = \App\Models\Activity::with('causer')->latest()->take(5);
                $user = auth()->user();

                if (!$user->hasRole('super_admin') && $user->farm) {
                    $farmUserIds = $user->farm->users()->pluck('id');
                    $query->where('causer_type', \App\Models\User::class)
                          ->whereIn('causer_id', $farmUserIds);
                }
                
                $view->with('recentActivities', $query->get());
            } else {
                $view->with('recentActivities', collect());
            }
        });
    }
}