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);
}
}