HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/orbidirectory.com/app/Http/Controllers/WebsiteController.php
<?php

namespace App\Http\Middleware;

namespace App\Http\Controllers;


use App\Models\City;
use App\Models\Country;
use App\Models\State;
use App\Models\User;
use App\Models\Website;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
use Yajra\DataTables\Facades\DataTables;
use Spatie\MediaLibrary\MediaCollections\Models\Media;

use App\Http\Middleware\EnsureTokenIsValid;
use App\Models\Blog;
use App\Models\DirectLeads;
use App\Models\OrbiLeads;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Symfony\Contracts\Service\Attribute\Required;

class WebsiteController extends Controller
{
    public function index(Request $request)
    {

        if ($request->ajax()) {
            $search_keyword = '';

            $start_date = '';
            $end_date = '';
            $request_data = $request->all();
            // if ($request->has('search_keyword')) {
            //     $search_keyword = $request->search_keyword;
            // }

            // avoid zero column as it's checkbox so we can't sort by it
            if ($request->has('order') && $request->order[0]['column'] != 0) {
                $sort_column_number = $request->order[0]['column'];
                $sort_column_dir = $request->order[0]['dir'];
                $sort_column_key = $request->columns[$sort_column_number]['data'];
            }



            $main_query = Website::query();
            $query = $main_query;


            if (!empty($sort_column_key)) {
                $query = $query->orderBy($sort_column_key, $sort_column_dir);
            } else {
                $query = $query->latest();
            }



            $data = $query->with('user')->get();
            $count_total = $main_query->count();
            $count_filter = $count_total;
            return DataTables::of($data)

                ->addColumn('user_id', function ($row) {
                    return $row->user ? $row->user->name : 'n/a';
                })
                ->addColumn('subdomain', function ($row) {
                    return $row->subdomain;
                })
                ->addColumn('name', function ($row) {
                    return $row->name;
                })
                ->addColumn('email', function ($row) {
                    return $row->email;
                })

                ->addColumn('phone_number', function ($row) {
                    return $row->phone_number;
                })
                ->addColumn('whatsapp_number', function ($row) {
                    return $row->whatsapp_number;
                })
                ->addColumn('dob', function ($row) {
                    return $row->dob;
                })

                // ->editColumn('created_at', function ($row) {
                //     return formatDate($row->created_at);
                // })
                ->addColumn('action', function ($row) {

                    if ($row->is_admin !== 1) {

                        return view('admin.website.partially.delete', compact('row'));
                    }
                })
                ->rawColumns(['action'])
                ->with([
                    "recordsTotal"    => $count_total,
                    "recordsFiltered" => $count_filter,
                ])
                ->make(true);
        }
        return view('admin.website.index');
    }

    public function create()
    {
        $users = User::where('type', 2)->get();
        $countries = Country::all();
        return view('admin.website.create', compact('users', 'countries'));
    }

    public function getStates(Request $request, $id)
    {
        $states = State::where('country_id', $id)->pluck('name', 'id');
        return response()->json($states);
    }

    public function getCities(Request $request, $id)
    {
        $cities = City::where('state_id', $id)->pluck('name', 'id');
        return response()->json($cities);
    }

    public function store(Request $request)
    {


        $validator = Validator::make($request->all(), [
            'user_id' => 'required|exists:users,id',
            'subdomain' => 'required|string|unique:websites,subdomain',
            'name' => 'required|string|max:255',
            'email' => 'required|email|max:255',
            'phone_number' => 'required|string|max:20',
            'whatsapp_number' => 'nullable|string|max:20',
            'dob' => 'required|date_format:Y-m-d',
            'address_line_1' => 'required|string|max:255',
            'address_line_2' => 'nullable|string|max:255',
            'city' => 'required|exists:cities,id',
            'state' => 'required|exists:states,id',
            'country' => 'required|exists:countries,id',
            'zip_code' => 'required|string|max:20',
            'about_heading' => 'nullable|string|max:255',
            'about_description' => 'nullable|string',
            'banner_subheading' => 'nullable|string',
            'banner_heading' => 'nullable|string',
            'banner_description' => 'nullable|string',
            'start_year' => 'required|integer|min:1900|max:' . date('Y'),
            'happy_customers' => 'required|integer|min:0',
            'customer_rating' => 'required|numeric|min:0|max:10',
            'driving_skills' => 'required|numeric|min:0|max:100',
            'vehicle_maintenance_skills' => 'required|numeric|min:0|max:100',
            'navigation_skills' => 'required|numeric|min:0|max:100',
            'time_management' => 'required|numeric|min:0|max:100',
            'additional_skills_desc' => 'required|string',
            'booking_form_heading' => 'required|string|max:255',
            'booking_form_desc' => 'required|string',
            'why_choose_heading' => 'required|string|max:255',
            'why_choose_desc' => 'required|string',
            'service_heading' => 'required|string|max:255',
            'service_desc' => 'required|string',
            'footer_description' => 'required|string',
            'facebook_url' => 'nullable|url|max:255',
            'instagram_url' => 'nullable|url|max:255',
            'linkedin_url' => 'nullable|url|max:255',
            'twitter_url' => 'nullable|url|max:255',
            'status' => 'required|boolean',
            // 'website_video' => 'nullable|mimes:mp4,avi,mkv|max:20480',
            'website_video' => 'nullable|mimes:mp4,avi,mkv',
        ]);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }

        $website = new website();

        $website->user_id = $request->user_id;
        $website->subdomain = $request->subdomain;
        $website->name = $request->name;
        $website->email = $request->email;
        $website->phone_number = $request->phone_number;
        $website->whatsapp_number = $request->whatsapp_number;
        $website->dob = $request->dob;
        $website->address_line_1 = $request->address_line_1;
        $website->address_line_2 = $request->address_line_2;
        $website->city_id = $request->city;
        $website->state_id = $request->state;
        $website->country_id = $request->country;
        $website->zip_code = $request->zip_code;
        $website->about_heading = $request->about_heading;
        $website->about_description = $request->description;
        $website->banner_subheading = $request->banner_subheading;
        $website->banner_heading = $request->banner_heading;
        $website->banner_description = $request->banner_description;
        $website->start_year = $request->start_year;
        $website->happy_customers = $request->happy_customers;
        $website->customer_rating = $request->customer_rating;
        $website->driving_skills = $request->driving_skills;
        $website->vehicle_maintenance_skills = $request->vehicle_maintenance_skills;
        $website->navigation_skills = $request->navigation_skills;
        $website->time_management = $request->time_management;
        $website->additional_skills_desc = $request->additional_skills_desc;
        $website->booking_form_heading = $request->booking_form_heading;
        $website->booking_form_desc = $request->booking_form_desc;
        $website->why_choose_heading = $request->why_choose_heading;
        $website->why_choose_desc = $request->why_choose_desc;
        $website->service_heading = $request->service_heading;
        $website->service_desc = $request->service_desc;
        $website->footer_description = $request->footer_description;
        $website->facebook_url = $request->facebook_url;
        $website->instagram_url = $request->instagram_url;
        $website->linkedin_url = $request->linkedin_url;
        $website->twitter_url = $request->twitter_url;
        $website->twitter_url = $request->twitter_url;
        $website->status = $request->status;

        $website->save();



        // $media->fill($request->except(['website_logo', 'website_favicon', 'website_footer_logo', 'driver_picture', 'why_choose_small_image', 'why_choose_big_image']));


        $fileCollections = [
            'website_logo' => 'website_logo',
            'website_favicon' => 'website_favicon',
            'website_footer_logo' => 'website_footer_logo',
            'driver_picture' => 'driver_picture',
            'why_choose_small_image' => 'why_choose_small_image',
            'why_choose_big_image' => 'why_choose_big_image',
            'banner_image' => 'banner_image',
            'website_video' => 'website_video'
        ];
        foreach ($fileCollections as $fileInput => $collectionName) {
            if ($request->hasFile($fileInput)) { // Check if file exists
                $file = $request->file($fileInput);

                if ($file->isValid()) { // Check if file is valid
                    $fileName = time() . '_' . $file->getClientOriginalName();
                    try {
                        $media = $website->addMedia($file)
                            ->usingFileName($fileName)
                            ->toMediaCollection($collectionName);
                    } catch (\Exception $e) {
                        Log::error("File upload error for {$fileInput}: " . $e->getMessage());
                        return redirect()->back()->with('error', "Failed to upload the {$collectionName}.");
                    }
                } else {
                    Log::error("Invalid file uploaded for {$fileInput}.");
                    return redirect()->back()->with('error', "Failed to upload the {$collectionName}: Invalid file uploaded.");
                }
            }
        }


        return redirect()->route('website.index')->with('success', 'Website added Successfully');
    }

    public function show(string $id)
    {
        $website = Website::find($id);


        return view('admin.website.show', compact('website'));
    }
    public function edit(string $id)
    {
        $website = Website::find($id);
        $transporters = User::all();
        $countries = Country::all();
        $states = State::all();
        $cities = City::all();
        if (isset($website)) {

            return view('admin.website.edit', compact('transporters', 'website', 'countries', 'states', 'cities'));
        } else {
            return back()->with('error', 'website  does not exist');
        }
    }

    public function update(Request $request, string $id)
    {


        $validator = Validator::make($request->all(), [
            'user_id' => 'required|exists:users,id',
            'subdomain' => 'required|string|unique:websites,subdomain',
            'subdomain' => [
                'required',
                'string',
                Rule::unique('websites')->ignore($id),
            ],
            'name' => 'required|string|max:255',
            'email' => 'required|email|max:255',
            'phone_number' => 'required|string|max:20',
            'whatsapp_number' => 'nullable|string|max:20',
            'dob' => 'required|date_format:Y-m-d',
            'address_line_1' => 'required|string|max:255',
            'address_line_2' => 'nullable|string|max:255',
            'city' => 'required|exists:cities,id',
            'state' => 'required|exists:states,id',
            'country' => 'required|exists:countries,id',
            'zip_code' => 'required|string|max:20',
            'about_heading' => 'nullable|string|max:255',
            'about_description' => 'nullable|string',
            'banner_subheading' => 'nullable|string',
            'banner_heading' => 'nullable|string',
            'banner_description' => 'nullable|string',
            'start_year' => 'required|integer|min:1900|max:' . date('Y'),
            'happy_customers' => 'required|integer|min:0',
            'customer_rating' => 'required|numeric|min:0|max:10',
            'driving_skills' => 'required|numeric|min:0|max:100',
            'vehicle_maintenance_skills' => 'required|numeric|min:0|max:100',
            'navigation_skills' => 'required|numeric|min:0|max:100',
            'time_management' => 'required|numeric|min:0|max:100',
            'additional_skills_desc' => 'required|string',
            'booking_form_heading' => 'required|string|max:255',
            'booking_form_desc' => 'required|string',
            'why_choose_heading' => 'required|string|max:255',
            'why_choose_desc' => 'required|string',
            'service_heading' => 'required|string|max:255',
            'service_desc' => 'required|string',
            'footer_description' => 'required|string',
            'facebook_url' => 'nullable|url|max:255',
            'instagram_url' => 'nullable|url|max:255',
            'linkedin_url' => 'nullable|url|max:255',
            'twitter_url' => 'nullable|url|max:255',
            'status' => 'required|boolean',
            'website_video' => 'nullable|mimes:mp4,avi,mkv|max:20480',
        ]);

        if ($validator->fails()) {
            return redirect()->back()->withErrors($validator)->withInput();
        }

        $website = Website::find($id);
        if (isset($website)) {
            $website->user_id = $request->user_id;
            $website->subdomain = $request->subdomain;
            $website->name = $request->name;
            $website->email = $request->email;
            $website->phone_number = $request->phone_number;
            $website->whatsapp_number = $request->whatsapp_number;
            $website->dob = $request->dob;
            $website->address_line_1 = $request->address_line_1;
            $website->address_line_2 = $request->address_line_2;
            $website->city_id = $request->city;
            $website->state_id = $request->state;
            $website->country_id = $request->country;
            $website->zip_code = $request->zip_code;
            $website->about_heading = $request->about_heading;
            $website->about_description = $request->description;
            $website->banner_subheading = $request->banner_subheading;
            $website->banner_heading = $request->banner_heading;
            $website->banner_description = $request->banner_description;
            $website->start_year = $request->start_year;
            $website->happy_customers = $request->happy_customers;
            $website->customer_rating = $request->customer_rating;
            $website->driving_skills = $request->driving_skills;
            $website->vehicle_maintenance_skills = $request->vehicle_maintenance_skills;
            $website->navigation_skills = $request->navigation_skills;
            $website->time_management = $request->time_management;
            $website->additional_skills_desc = $request->additional_skills_desc;
            $website->booking_form_heading = $request->booking_form_heading;
            $website->booking_form_desc = $request->booking_form_desc;
            $website->why_choose_heading = $request->why_choose_heading;
            $website->why_choose_desc = $request->why_choose_desc;
            $website->service_heading = $request->service_heading;
            $website->service_desc = $request->service_desc;
            $website->footer_description = $request->footer_description;
            $website->facebook_url = $request->facebook_url;
            $website->instagram_url = $request->instagram_url;
            $website->linkedin_url = $request->linkedin_url;
            $website->twitter_url = $request->twitter_url;
            $website->twitter_url = $request->twitter_url;
            $website->status = $request->status;

            $website->save();



            $fileCollections = [
                'website_logo' => 'website_logo',
                'website_favicon' => 'website_favicon',
                'website_footer_logo' => 'website_footer_logo',
                'driver_picture' => 'driver_picture',
                'why_choose_small_image' => 'why_choose_small_image',
                'why_choose_big_image' => 'why_choose_big_image',
                'banner_image' => 'banner_image',
                'website_video' => 'website_video'
            ];

            foreach ($fileCollections as $fileInput => $collectionName) {
                if ($request->hasFile($fileInput)) {
                    $file = $request->file($fileInput);

                    if ($file->isValid()) {
                        $fileName = time() . '_' . $file->getClientOriginalName();
                        try {
                            // Remove the existing file from the collection
                            $website->clearMediaCollection($collectionName);

                            // Add the new file to the collection
                            $website->addMedia($file)
                                ->usingFileName($fileName)
                                ->toMediaCollection($collectionName);
                        } catch (\Exception $e) {
                            Log::error("File upload error for {$fileInput}: " . $e->getMessage());
                            return redirect()->back()->with('error', "Failed to upload the {$collectionName}.");
                        }
                    } else {
                        Log::error("Invalid file uploaded for {$fileInput}.");
                        return redirect()->back()->with('error', "Failed to upload the {$collectionName}: Invalid file uploaded.");
                    }
                }
            }

            return redirect()->route('website.index')->with('success', 'Website updated successfully!');
        }
    }
    public function destroy(string $id)
    {
        $website = Website::find($id);
        if (isset($website)) {
            $website->Delete();

            return redirect()->back()->with('success', 'Website  has been deleted successfully.');
        } else {
            return back()->with('error', 'Website  not found.');
        }
    }








    public function getWebsiteDetails(Request $request, $subdomain)
    {
        
        $website = Website::with('user.transporters.vehicle', 'websiteServices', 'testimonial', 'languages')
            ->where('subdomain', $subdomain)
            ->first();
        if (!$website) {
            return response()->json(['error' => 'Website not found'], 404);
        }
        if ($website->status != 0) {
            return response()->view('front.forbidden');
        }
    $testimonials = $website->testimonial->map(function ($testimonial) {
            return [
                'testimonial' => $testimonial,
                'testimonial_image_url' => $testimonial->getFirstMediaUrl('testimonial_image')
            ];
        });
        $websiteServices = $website->websiteServices->map(function ($service) {
            return [
                'service' => $service,
                'service_image_url' => $service->getFirstMediaUrl('website_service_image')
            ];
        });
      $transporters = $website->user ? $website->user->transporters->map(function ($transporter) {
            return [
                'transporter' => $transporter,
                'vehicles' => $transporter->vehicle->map(function ($vehicle) {
                    return [
                        'vehicle' => $vehicle,
                        'make' => $vehicle->get_make->name,
                    'model' => $vehicle->get_model->name,
                        'vehicle_image_url' => $vehicle->getFirstMediaUrl('vehicle_image'),
                    ];
                })
            ];
        }) 
        : collect(); 

        $latestBlogs = Blog::latest()->take(2)->get()->map(function ($blog) {
            return [
                'id' => $blog->id,
                'author' => $blog->author,
                'title' => $blog->title,
                'description' => $blog->description,
                'created_at' => $blog->created_at,
                'updated_at' => $blog->updated_at,
                'banner_image' => $blog->getFirstMediaUrl('blog_banner_image'),
            ];
        });
        $formattedData = [
            'website_name' => $website->name,
            'logo' => $website->getFirstMediaUrl('website_logo'),
            'driver_photo' => $website->getFirstMediaUrl('driver_picture'),
            'banner_image' => $website->getFirstMediaUrl('banner_image'),
            'driver_dob' => $website->dob,
            'driver_address' => $website->address_line_1 . ', ' . $website->address_line_2,
            'driver_email' => $website->email,
            'driver_phone_number' => $website->phone_number,
            'driver_whatsapp_number' => $website->whatsapp_number,
            'banner_subheading' => $website->banner_subheading,
            'banner_heading' => $website->banner_heading,
            'banner_description' => $website->banner_description,
            'driver_video' => $website->getFirstMediaUrl('website_video'),
            'starting_year' => $website->start_year,
            'happy_customers' => $website->happy_customers,
            'client_rating' => $website->customer_rating,
            'driving_skills' => $website->driving_skills,
            'Vehicle_Maintenance_Skills' => $website->vehicle_maintenance_skills,
            'navigation_skills' => $website->navigation_skills,
            'time_management' => $website->time_management,
            'additional_skill_description' => $website->additional_skills_desc,
            'booking_form_heading' => $website->booking_form_heading,
            'booking_form_description' => $website->booking_form_desc,
            'why_choose_us_heading' => $website->why_choose_heading,
            'why_choose_us_description' => $website->why_choose_desc,
            'why_choose_us_big_image' => $website->getFirstMediaUrl('why_choose_big_image'),
            'Why_choose_us_small_image' => $website->getFirstMediaUrl('why_choose_small_image'),
            'website_favicon' => $website->getFirstMediaUrl('website_favicon'),
            'website_footer_logo' => $website->getFirstMediaUrl('website_footer_logo'),
            'services_heading' => $website->service_heading,
            'services_description' => $website->service_desc,
            'footer_description' => $website->footer_description,
            'facebook_url' => $website->facebook_url,
            'instagram_url' => $website->instagram_url,
            'linkedin_url' => $website->linkedin_url,
            'twitter_url' => $website->twitter_url,
            'website_services' => $websiteServices,
            'testimonials' => $testimonials,
            'languages' => $website->languages,
            'user' => $website->user,
            'latest_blogs' => $latestBlogs,
            // 'transporters' => $transporters,
        ];
        return response()->json($formattedData);
    }
    

    public function storeWebsiteDetails(Request $request)
    {
        // Validate incoming request data
        $validator = Validator::make($request->all(), [
            'vehicle_type_id' => 'required|integer|exists:vehicle_types,id',
            'name' => 'required|string|max:255',
            'email' => 'nullable|email|max:255|required_without:phone_number',
            'phone_number' => 'nullable|digits_between:5,13|required_without:email',
            'travel_date' => 'required|date',
            'description' => 'required|string|max:255',
            'number_of_passenger'=> 'required|integer|min:1'
        ]);

        if ($validator->fails()) {
            return response()->json(['error' => $validator->errors()->first()], 422);
        }

        $orbi_leads = new OrbiLeads();
        $orbi_leads->name = $request->input('name');
        $orbi_leads->phone_number = $request->input('phone_number');
        $orbi_leads->email = $request->input('email');
        $orbi_leads->vehicle_type_id = $request->input('vehicle_type_id');
        $orbi_leads->travel_date = $request->input('travel_date');
        $orbi_leads->number_of_passenger = $request->input('number_of_passenger');
        $orbi_leads->description = $request->input('description');
        $orbi_leads->save();


        return response()->json(['success' => true, 'data' => $orbi_leads], 201);
    }
}