Oxford_changes_10/8/2022

 avatar
debo2696
php_laravel_blade
2 years ago
71 kB
5
Indexable
Never
9/8/22
####################################################Homepage Controller:
<?php

namespace App\Http\Controllers;

use App\Mail\GeneralMail;
use App\Models\Author;
use App\Models\Banner;
use App\Models\Blog;
use App\Models\BookRequest;
use App\Models\Category;
use Illuminate\Http\Request;
use App\Traits\GeneralTrait;
use Illuminate\Support\Facades\DB;
use App\Models\User;
use App\Models\Coupon;
use App\Models\Product;
use App\Models\RecentlyViewed;
use App\Models\ShoppingCart;
use App\Models\Store;
use Exception;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;
use Illuminate\Database\Eloquent\Collection;

class HomepageController extends Controller
{
    use GeneralTrait;
    //
    public function __construct()
    {
        if(session()->has('user.id'))
        {
            config()->set(['items_in_cart' => ShoppingCart::where('user_id', session()->get('user.id'))->count()]);
        }
        elseif(session()->has('cart.session_id'))
        {
            config()->set(['items_in_cart' => ShoppingCart::where('cart_session_id', session()->get('cart.session_id'))->count()]);
        }
        else
        {
            config()->set(['items_in_cart' => 0]);
        }
    }

    public function index()
    {
        
        $data['pageheader'] = "Home";
        $data['bestsellers'] = '';
        $data['banners'] = Banner::where('status', 'A')->get();
        $data['newreleases'] = Product::where('status', 'A')->orderBy('created_at', 'DESC')->get();
        $data['featured_products'] = Product::where('status', 'A')->where('is_featured', 1)->get();
        $data['recentsolds'] = '';
        $data['featured_authors'] = Author::where('status', 'A')->where('is_featured', 1)->get();
        
        return view('frontend.index', $data);
        //Dashboard 
    }

    public function product_details(Request $request)
    {
        $data['pageheader'] = "Product Detail";
        $this->recently_viewed($request); //Adding to recently viewed table
        $data['product'] = Product::where('slug', $request->slug)->where('status', 'A')->first();
        // $data['types'] = DB::table('attribute_category_product')
        //     ->join('category_attribute', 'attribute_category_product.attribute_category_id', '=', 'category_attribute.id')
        //     ->join('products', 'attribute_category_product.product_id', '=', 'products.id')
        //     ->join('attributes', 'category_attribute.attribute_id', '=', 'attributes.id')
        //     ->where('attributes.title', 'Type')
        //     ->select('attribute_category_product.attribute_value')
        //     ->get();
        //     // ->pluck('attribute_category_product.attribute_value');
        // dd($data['types']);
        
        if($request->session()->has('user.id'))
            $data['recents'] = RecentlyViewed::where('user_id', $request->session()->get('user.id'))->orderBy('updated_at', 'DESC')->with('products')->take(10)->get();
        else
            $data['recents'] = RecentlyViewed::where(['visitor_ip'=> $request->ip(), 'user_id'=> null])->orderBy('updated_at', 'DESC')->with('products')->take(10)->get();
        //dd($data);
        return view('frontend.product-details', $data);
        //Dashboard 
    }

    public function product_listing()
    {
        $data['pageheader'] = "Product List";
        return view('frontend.product-listing', $data);
        //Dashboard 
    }

    public function validate_user(Request $request)
    {
        // dd($request->all());
        $u_id = decrypt($request->_utoken);//decrypting to get email
        $user = User::where('email', $u_id)->get();
        $u = $user->first();
        // if(!empty($user->items))//Had been created earlier, but can't rember why
        if(!empty($user))
        {
            if($u->email_verified_at == null)
            {
                $u->email_verified_at = date("Y-m-d h:i:s");
                $u->save();

                if($u->role_id == 1)
                    return redirect()->route('customer.login')->with('success', 'Customer account verified'); //should redirect to customer login 
                elseif($u->role_id == 2)
                    return redirect()->route('login')->with('success', 'Admin account verified'); //Admin page
            }
            else if(!$u->email_verified_at == null)
            {
                return redirect()->route('customer.login')->with('success', 'Account was already verified');
            }

        }
        else
        {
            dump('User does not exist');
            return abort(500); //User not found
        }  
    }  
    
    public function redeem_coupon(Request $request)
    {
        auth()->user;$request->code;
        $coupon = Coupon::where('code', $request->code)->first();
        if($coupon->status == "A")//Coupon can still be redeemed
        {
            if(date('Y-m-d h:i:s') >= $coupon->start_date && date('Y-m-d h:i:s') <= $coupon->end_date)//Within start and end date
            {
                if($coupon->coupon_type == 'single') 
                {
                    //assign coupon to user and deactivate coupon
                }
                elseif($coupon->coupon_type == 'multiple')
                {
                    //count how many times coupon already redeemed from middle table
                    
                }
            }
            else
            {
                return response()->json(['status' => 'Coupon expired'], 400);    
            }
        }
        else
        {
            return response()->json(['status' => 'Coupon not active'], 400);
        } 
    }

    public function getsearchdata(Request $request)
    {
        $value = $request->val;
        $category_id = $request->cat_id;
        $pro_arr=[];
        // $pro = Product::where('status', 'A')->where('name','LIKE','%'.$value.'%')->skip(0)->take(10)->get();
        $pro = Product::where('status', 'A')/*->where('category_id', $category_id)*/->where('name','LIKE','%'.$value.'%')->take(10)->get();
      
        $arr=$pro;
        if(!empty($arr)){
            foreach($arr as $row){
            $pro_arr[]=$row->name;
            }
        }
        echo json_encode($pro_arr);
    }

    public function search_get(Request $request)
    {
        $data['pageheader'] = "Search Result";
        try{
            $search_category = $request->filled('search_category')?$request->search_category : 'empty';
            $search_name = $request->filled('search_name')?$request->search_name : 'empty';
            $record_per_page = 32;

            if($search_category == 'Books')
            {
                $results = Product::where('name', 'LIKE', '%'.$search_name.'%')->where('status', 'A'); //category's logic will be their
                if(!empty($results))
                {
                    $data['highest_price'] = Product::orderBy('price', 'DESC')->first()->price;
                    $data['lowest_price'] = Product::orderBy('price', 'ASC')->first()->price;
                }
            }
            elseif($search_category == 'Authors')
            {   
                $authors = Product::whereLike(['authors.name'], $search_name);//DB::Query being used not Eloquent 
                if(empty($authors))
                {}
                else
                {
                    $results = $authors;
                    $data['highest_price'] = Product::orderBy('price', 'DESC')->first()->price;//This needs to be changed
                    $data['lowest_price'] = Product::orderBy('price', 'ASC')->first()->price;
                }

            }
            elseif($search_category == 'Publishers')
            {
                $publishers = Product::whereLike(['publishers.name'], $search_name);//DB::Query being used not Eloquent 
                if(empty($publishers))
                {}
                else
                {
                    $results = $publishers;
                    $data['highest_price'] = Product::orderBy('price', 'DESC')->first()->price;//This needs to be changed
                    $data['lowest_price'] = Product::orderBy('price', 'ASC')->first()->price;
                }
            }
            elseif($search_category == 'Stationeries')
            {
                $results = Product::where('name', 'LIKE', '%'.$search_name.'%')->where('status', 'A');
                if(!empty($results))
                {
                    $data['highest_price'] = Product::orderBy('price', 'DESC')->first()->price;
                    $data['lowest_price'] = Product::orderBy('price', 'ASC')->first()->price;
                }
            }
            else
            {
                dd('Nothing provided in Search category');
            }
        }
        catch(Exception $e1)
        {
            dd($e1->getMessage());    
        }
        $data['categories'] = Category::where('status', 'A')->where('parent_id', 0)->get();
        $data['results'] = $results->paginate($record_per_page);
        $data['page_type'] = 'search';
        return view('frontend.product-listing', $data);
    }

    public function filter(Request $request)
    {
        // dd($request->All());
        $search_category = $request->filled('search_category')?$request->search_category : 'empty';
        $search_name = $request->filled('search_name')?$request->search_name : 'empty';
        $record_per_page = 32;

        if($search_category == 'Books')
        {
            $results = Product::where('name', 'LIKE', '%'.$search_name.'%')->where('status', 'A'); //category's logic will be their
            if(!empty($results))
            {
                $data['highest_price'] = Product::orderBy('price', 'DESC')->first()->price;
                $data['lowest_price'] = Product::orderBy('price', 'ASC')->first()->price;
            }
            if(isset($request->price_range_start) && isset($request->price_range_end))
            {
                $results = $results->whereBetween('price', [$request->price_range_start, $request->price_range_end]);
            }
        }

        $data['categories'] = Category::where('status', 'A')->where('parent_id', 0)->get();
        $data['results'] = $results->paginate($record_per_page);
        $data['page_type'] = 'filter';
        return view('partials.filter_data', $data);
    }

    public function listing(Request $request)
    {
        $record_per_page = 32;

        if($request->type == "new-releases")
        {
            $data['pageheader'] = "New Releases";
            $results = Product::where('status', 'A')->orderBy('created_at', 'DESC');
        }
        elseif($request->type == "bestsellers")
        {
            $data['pageheader'] = "Best Sellers";
            $results = '';
        }
        elseif($request->type == "featured-books")
        {
            $data['pageheader'] = "Featured Books";
            $results = Product::where('status', 'A')->where('is_featured', 1);
        }
        elseif($request->type == "recently-sold")
        {
            $data['pageheader'] = "Recently Sold";
            $results = '';
        }

        $data['categories'] = Category::where('status', 'A')->where('parent_id', 0)->get();
        $data['results'] = $results->paginate($record_per_page);
        $data['page_type'] = $request->type;
        return view('frontend.product-listing', $data);
    }

    public function book_request()
    {
        $data['pageheader'] = "Book Request";

        return view('frontend.book-request', $data);
    }

    public function book_request_post(Request $request)
    {
        $data['pageheader'] = "Book Request";
        $rules=[
            'name' => 'required',
            'email' => 'required|email',
            'city' => 'required',
            'phone' => 'required|min:9',
            'book_title' => 'required',
            'author_name' => 'required',
            'book_info' => 'required',
        ];

        $validator = Validator::make($request->All(), $rules);
        if($validator->fails()){
            foreach($validator->errors()->messages() as $key => $value){
                return response()->json([ 'status' => $value[0]], 400);
            }
        }

        try{
            $res = BookRequest::create($request->All());

            $txt = '';
            $txt .= '<p>Book Request Submitted Successfully</p>';
            $txt .= '<p><strong>Customer Name: </strong>'.$request->name.'</p>';
            $txt .= '<p><strong>Customer Email: </strong>'.$request->email.'</p>';
            $txt .= '<p><strong>Customer City: </strong>'.$request->city.'</p>';
            $txt .= '<p><strong>Customer Phone: </strong>'.$request->phone.'</p>';
            $txt .= '<p><strong>Book Title: </strong>'.$request->book_title.'</p>';
            $txt .= '<p><strong>Author Name: </strong>'.$request->author_name.'</p>';
            $txt .= '<p><strong>Book Information: </strong>'.$request->book_info.'</p>';
            
            //$txt .= URL::to("validate-user/?_token=".encrypt($request->email));
            $subject = 'Book Request - '.config()->get('app.name');
            $mailFromId = config()->get('mail.from.address');
            
            // return (new GeneralMail('Admin', $mailFromId, $txt, $subject))->render();
            Mail::to($request->email)->send(new GeneralMail($request->name, $mailFromId, $txt, $subject));
            $txt = '';
            $txt = '<p>A new Book Request has been submitted</p>';
            $txt .= '<p><strong>Customer Name: </strong>'.$request->name.'</p>';
            $txt .= '<p><strong>Customer Email: </strong>'.$request->email.'</p>';
            $txt .= '<p><strong>Customer City: </strong>'.$request->city.'</p>';
            $txt .= '<p><strong>Customer Phone: </strong>'.$request->phone.'</p>';
            $txt .= '<p><strong>Book Title: </strong>'.$request->book_title.'</p>';
            $txt .= '<p><strong>Author Name: </strong>'.$request->author_name.'</p>';
            $txt .= '<p><strong>Book Information: </strong>'.$request->book_info.'</p>';

            Mail::to(config()->get('mail.from.address'))->send(new GeneralMail('Admin', $mailFromId, $txt, $subject));
        }
        catch(Exception $e1)
        {
            return response()->json(['status'=>$e1->getMessage()], 400);
        }
        
        if($res->wasRecentlyCreated)
            return response()->json(['status'=>'Book Request Submitted successfully'], 200);
        else
            return response()->json(['status'=>'Updated Successfully'], 200);
    }

    public function stores_view()
    {
        $data['pageheader'] = "Stores";
        $data['stores'] = Store::where('status', 'A')->get();

        return view('frontend.store-view', $data);
    }

    public function blog_list()
    {
        $data['pageheader'] = "Blogs";
        $data['blogs'] = Blog::where('status', 'A')->where('approved_by_admin', 1)->cursorPaginate(3);
        return view('frontend.blog-list', $data);
    }

    public function blog_detail(Request $request)
    {
        $data['pageheader'] = "Blog Detail";
        $data['blog'] = Blog::where('slug', $request->slug)->first();
        $data['f_blogs'] = Blog::whereNotIn('slug', [$request->slug])->where('status', 'A')->where('approved_by_admin', 1)->paginate(4);
        return view('frontend.blog-detail', $data);
    }

    public function cart()
    {
        $data['pageheader'] = "Cart";
        if(session()->has('user.id')) //If user logged in then cart session id wont be required
        {
            $data['carts'] = ShoppingCart::where('user_id', session()->get('user.id'))->get();
            return view('frontend.cart-page', $data);
        }
        elseif(session()->has('cart.session_id'))//user is not logged in but cart data present
        {
            $data['carts'] = ShoppingCart::where('cart_session_id', session()->get('cart.session_id'))->get();
            return view('frontend.cart-page', $data);
        } 
        else
        {
            $data['carts'] = collect();
            return view('frontend.cart-page', $data);
        }
        
    }

    public function add_to_cart(Request $request)//sdgfdsgsfgsdfsd
    {
        // session()->forget('cart');
        try{
          
            if(session()->has('user.id'))
            {
                $rec_count = ShoppingCart::where('user_id', session()->get('user.id'))->count(); // if shopping cart already has logged in user's records
                if( $rec_count > 0)//logged in user already had records in shopping cart
                {
                    $prev_rec = ShoppingCart::where(['user_id' => session()->get('user.id'), 'product_id' => $request->product_id])->first();
                    ShoppingCart::where(['user_id' => session()->get('user.id'), 'product_id' => $request->product_id])->delete();
                    if($prev_rec != null)//if product existed aginst user, shopping cart, updating the cart value
                    {
                        $res = $prev_rec->create([
                            'user_id' => session()->get('user.id'),
                            'product_id' => $request->product_id,
                            'price' => $request->price,
                            'net_price' => $prev_rec->net_price + ($request->order_qty * $request->price),
                            'quantity' => $prev_rec->quantity + $request->order_qty,
                            'discount' => null,
                            'status' => 'A',
                        ]);
                    }
                    else //adding new product for logged in user in the cart
                    {
                        $res = ShoppingCart::create([
                            'user_id' => session()->get('user.id'),
                            'product_id' => $request->product_id,
                            'price' => $request->price,
                            'net_price' => $request->order_qty * $request->price,
                            'quantity' => $request->order_qty,
                            'discount' => null,
                            'status' => 'A',
                        ]);
                    }

                    return response()->json([
                        'status'=>'Cart updated for logged in user',
                    ], 200);
                }
            }
            if(session()->has('cart.session_id')) //cart update code
            {   
                if(!session()->has('user.id'))//if user not logged in 
                {
                    $prev_rec = ShoppingCart::where(['cart_session_id' => session()->get('cart.session_id'), 'product_id' => $request->product_id])->first();
                    
                    if($prev_rec != null)//if product existed in session id, shopping cart, upgrading the cart value
                    {
                        // dd($prev_rec, $request->All());
                        $res = $prev_rec->update([
                            //'product_id' => $request->product_id,
                            'price' => $request->price,
                            'net_price' => $prev_rec->net_price + ($request->order_qty * $request->price),
                            'quantity' => $prev_rec->quantity + $request->order_qty,
                            'discount' => null,
                            'status' => 'A',
                        ]);
                    }
                    else //if adding a new product which wasn't in session id, shopping cart
                    {
                        $res = ShoppingCart::create([
                            'cart_session_id' => session()->get('cart.session_id'),
                            'product_id' => $request->product_id,
                            'price' => $request->price,
                            'net_price' => $request->order_qty * $request->price,
                            'quantity' => $request->order_qty,
                            'discount' => null,
                            'status' => 'A',
                        ]);
                    }

                }
                

                return response()->json([
                    'status'=>'Cart updated',
                ], 200);

            }
            elseif(!session()->has('cart.session_id')) //creating new cart for guest user
            {
                if(!session()->has('user.id')) //guest user
                {
                    $cart_id = $this->generate_cart_id();
                    session()->put([
                        'cart.session_id' => $cart_id,
                    ]);

                    $res = ShoppingCart::create([
                        'cart_session_id' => $cart_id,
                        'product_id' => $request->product_id,
                        'price' => $request->price,
                        'net_price' => $request->order_qty * $request->price,
                        'quantity' => $request->order_qty,
                        'discount' => null,
                        'status' => 'A',
                    ]);
                }
                elseif(session()->has('user.id')) //if user logged in
                {
                    if($rec_count == 0) //logged in user has never added anything in cart
                    {
                        $res = ShoppingCart::create([
                            'user_id' => session()->get('user.id'),
                            'cart_session_id' => null,
                            'product_id' => $request->product_id,
                            'price' => $request->price,
                            'net_price' => $request->order_qty * $request->price,
                            'quantity' => $request->order_qty,
                            'discount' => null,
                            'status' => 'A',
                        ]);
                    }

                    if($rec_count > 0)
                    {
                        return response()->json([
                            'status'=>'Code should not enter here',
                        ], 400);
                    }
                }

                return response()->json([
                    'status'=>'Cart created',
                ], 200);
            }

            
        }
        catch(Exception $e1)
        {
            return response()->json([
                'status' => $e1->getMessage(),
            ], 400);
        }
    }

    public function remove_from_cart(Request $request)
    {
        $res = ShoppingCart::where('id', $request->cart_id)->delete();
        return response()->json(['status'=>$res], 200);   
    }

    public function empty_cart() //created for only debugging purpose
    {
        session()->forget('cart');
    }
}
###########################################################################
LoginController Frontend
#############################################################################
<?php

namespace App\Http\Controllers\Customer;

use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use App\Listener\SetDataInSession;
use App\Mail\GeneralMail;
use App\Models\ShoppingCart;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Str;

class LoginController extends Controller
{
    //
    //use 
    public const HOME = '/customer/dashboard';

    public function __construct()
    {
        $this->middleware('frontendguest')->except('logout');
    }

    public function showLoginForm()
    {
        $data['pageheader'] = "Login";
        $data['activemenu']['main'] = "login";
        return view('frontend.login', $data);
    }

    public function login(Request $request)
    {
        //dd($request->All());

        $rules = array(
            'email' => 'required|email|exists:users',
            'password' => 'required'
        );
        $validator = Validator::make($request->all(), $rules);
        if($validator->fails()){
            foreach($validator->errors()->messages() as $key => $value){
                return response()->json(['status' => $value[0]], 400);
            }
        }     
        
        $user = User::where('email', $request->email)->first();
        if(!$user){
            return response()->json(['status' => 'The email address you entered is invalid'], 400);
        }
        if($user->role_id == 2){
            return response()->json(['status' => 'Admin cannot login to Frontend.'], 400);
        }
        if($user->status == 0){
            return response()->json(['status' => 'Your account has been deactivated. To activate your account contact admin.'], 400);
        }
        elseif($user->email_verified_at == null){
            return response()->json(['status' => 'Please verify your Email and then proceed to login.'], 400);
        }
        elseif($user->mobile_verified_at == null){
            return response()->json(['status' => 'Please verify your mobile OTP and then proceed to login.'], 400);
        }
    
        if(Auth::validate(['email' => $request->email, 'password' => $request->password])){
            if(Auth::attempt(['email' => $request->email, 'password' => $request->password, 'role_id' => 1])) //If customer
            {
                if(!session()->has('cart.session_id')){
                    (new SetDataInSession)->handle($user->toArray());
                    return response()->json(['status' => 'Customer Logging in'], 200);
                }else{
                    $mycartsItem = ShoppingCart::where('cart_session_id',session()->get('cart.session_id'))->count();
                    if($mycartsItem > 0){
                        // $cart_data = ['cart_session_id'=>null,'user_id'=>$user->id];
                        $cart_items_with_session_id = ShoppingCart::where('cart_session_id',session()->get('cart.session_id'))->get();
                        $cart_items_with_user_id = ShoppingCart::where('user_id',$user->id)->get();
                        // dump($cart_items_with_session_id);
                        // dd($cart_items_with_user_id);
                        foreach($cart_items_with_session_id as $item_session)
                        {
                            $var = 0;
                            foreach($cart_items_with_user_id as $item_user)
                            {
                                if($item_session->product_id == $item_user->product_id)
                                {
                                    $var++;
                                    
                                    $item_session->where(['user_id' => $user->id, 'product_id' => $item_session->product_id]) //replace cart session id with user id in all existing records on logging in 
                                    ->update([
                                        'cart_session_id'=>null,
                                        'user_id'=>$user->id,
                                        'price'=>$item_user->price,
                                        'net_price'=>$item_session->net_price + $item_user->net_price,
                                        'quantity'=>$item_session->quantity + $item_user->quantity,
                                    ]);

                                    ShoppingCart::where(['cart_session_id' => session()->get('cart.session_id'), 'product_id' => $item_session->product_id])->delete(); //deleteing old data cuz user logging in
                                }
                            }
                            if($var == 0)
                            {
                                $item_session->where(['cart_session_id' => session()->get('cart.session_id'), 'product_id' => $item_session->product_id]) //replace cart session id with user id in all existing records on logging in 
                                    ->update([
                                        'cart_session_id'=>null,
                                        'user_id'=>$user->id,
                                    ]);
                            }
                        }
                        // ShoppingCart::where('cart_session_id', session()->get('cart.session_id')) //replace cart session id with user id in all existing records on logging in 
                        //     ->update($cart_data);
                     }
                     (new SetDataInSession)->handle($user->toArray());
                     return response()->json(['status' => 'Customer Logging in and cart details updated'], 200);
                     //return response()->json(['status' => 'Customer Logging in', 'user_type' => 'customerCart'], 200);
                }   
            }
            // else if(Auth::attempt(['email' => $request->email, 'password' => $request->password, 'role_id' => 2]))
            // {
            //     //$request->session()->invalidate();
            //     //Auth::logout();
            //     return response()->json(['status' => 'Admin cannot login to frontend'], 400);
            // }
            else
                return response()->json(['status' => 'Invalid credentials.'], 400);

        } else{
            return response()->json(['status' => 'Invalid credentials.'], 400);
        }
    }

    public function otp_form()
    {
        $data['pageheader'] = "OTP";
        $data['activemenu']['main'] = "otp";
        return view('frontend.otp_verify', $data);
    }

    public function logout(Request $request)
    {
        //$this->guard()->logout();
        Auth::logout();
        $request->session()->invalidate();
        return redirect()->route('customer.login');
    }

    /*Password Reset code below*/
    public function forgot_password()
    {
        $data['pageheader'] = 'Forgot Password';
        return view('frontend.frgt-pass', $data);
    }

    public function forgot_password_post(Request $request)
    {
        $rules = [
            'email'=>'required|email',
        ];
        $validator = Validator::make($request->all(), $rules);
        if($validator->fails()){
            foreach($validator->errors()->messages() as $key => $value){
                return response()->json(['status' => $value[0]], 400);
            }
        }

        $user = User::where('email', $request->email)->whereNotIn('role_id', [2])->first();        
        if (empty($user)) {
            return response()->json(['status' => 'No User records found with that email'], 400);
        }

        DB::table('password_resets')->insert([
            'email' => $request->email,
            'token' => Str::random(60),
            'created_at' => Carbon::now()
        ]);

        //Get the token just created above
        $tokenData = DB::table('password_resets')
        ->where('email', $request->email)->first();
    
        if ($this->sendResetEmail($request->email, $tokenData->token)) {
            return response()->json(['status' => 'Email reset link has been sent to your email'], 200);
        } else {
            return response()->json(['status' => 'A Network Error occurred. Please try again.'], 400);
        }
    }

    private function sendResetEmail($email, $token)
    {
        //Retrieve the user from the database
        $user = User::where('email', $email)->select('name', 'email')->first();
        //Generate, the password reset link. The token generated is embedded in the link
        $link = URL::to("password-reset-form/?token=".$token."&email=".$user->email);
       
        try 
        {
            //Here send the link with CURL with an external email API 
            $subject = 'Password Reset Form - '.config()->get('app.name');
            $txt = '';
            $txt .= '<p>Below given is the form link to reset your Oxford Bookstore account password</p>';
            $txt .= '<a href="'.$link.'"><button  type="button" class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 mr-2 mb-2 dark:bg-blue-600 dark:hover:bg-blue-700 focus:outline-none dark:focus:ring-blue-800">Reset Password</button></a>';
            $mailFromId = config()->get('mail.from.address');
            Mail::to($user->email)->send(new GeneralMail($user->name, $mailFromId, $txt, $subject));
            // Mail::to($user->email)->send(new FrontEndPasswordResetMail($user->name, $mailFromId, $link));
            return response()->json(['status' => 'Email reset link has been sent'], 200);
        } catch (\Exception $e) 
        {
            return false;
        }
    }

    public function pass_reset_form_show()
    {
        return view('frontend.password_reset_form')->with(['email'=>request()->email, 'token'=>request()->token]);
    }

    public function resetPassword(Request $request)
    {
        //Validate input
        $validator = Validator::make($request->all(), [
            'email' => 'required|email|exists:users,email',
            'password' => 'required|confirmed',
            'token' => 'required' ]);

        //check if payload is valid before moving on
        
        if ($validator->fails()) {
            $arr = array('status' => implode(",",$validator->errors()->all()));
            return response()->json($arr, 400);
        }

        $password = $request->password;

        // Validate the token
        $tokenData = DB::table('password_resets')
        ->where('token', $request->token)->first();
        // Redirect the user back to the password reset request form if the token is invalid
        // if (!$tokenData) return view('auth.passwords.email');

        $user = User::where('email', $tokenData->email)->first();
        // Redirect the user back if the email is invalid
        if (!$user) return response()->json(['status' => 'Email not found'], 400);
        //Hash and update the new password
        
        $user->password = Hash::make($password);
        $user->update(); //or $user->save();

        // //login the user immediately they change password successfully
        // Auth::login($user);

        //Delete the token
        DB::table('password_resets')->where('email', $user->email)
        ->delete();

        //Send Email Reset Success Email
        
        $mailFromId = config()->get('mail.from.address');
        $subject = 'Password Updated - '.config()->get('app.name');
        $txt = '';
        $txt .= '<p>You have successfully reset your password</p>';
        Mail::to($user->email)->send(new GeneralMail($user->name, $mailFromId, $txt, $subject));
        // Mail::to($user->email)->send(new OnlyTextMail($user->name, $mailFromId, $txt, $subject));
        return response()->json(['status' => 'Password has been updated successfully'], 200);
        // if ($this->sendSuccessEmail($tokenData->email)) {
        //     return response()->route('login');
        // } else {
        //     return response()->json(['status' => 'Network error occured'], 400);
        // }
    }
    /*Password reset section over*/ 
}
############################################################################
ShoppingCart Model:
#################################################################################
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class ShoppingCart extends Model
{
    use HasFactory;
    protected $fillable = [
        'user_id',
        'cart_session_id',
        'product_id',
        'price',
        'net_price',
        'quantity',
        'discount',
        'status',
    ];

    protected $with = ['products'];

    public function products()
    {
        return $this->belongsTo(Product::class, 'product_id');
    }
}
####################################################################################
cart-page.blade.php
##############################################################################################
@extends('layouts.frontendLayout')

@push('head_script')

@endpush

@section('content')




<section class="sectiongap cartpage-main">
	<div class="container">
		<div class="d-flex mb-4 justify-content-between align-items-center">
			<div class="title-cart"><h1><span>Your Cart</span> (3 items)</h1></div>
			<div class="con-spoping">
				<a class="con-spoping-btn" href="#0">Continue Shopping</a>
			</div>
		</div>
		<div class="row">
			<div class="col-md-8">
				<div class="product-list">
					
					@forelse($carts as $key => $cart)
						<div class="pr-listbox">
							<div class="list-primg">
								<img src="{{asset('uploads/product_images/'.$cart->products->featured_image)}}">
							</div>
							<div class="checkdetails">
								<h3>{{$cart->products->name}}</h3>
								<h6><span>Book Author:</span>  
                                        @foreach($cart->products->authors as $author)
                                            {{$author->name}}
                                        @endforeach
								</h6>
								<p>1 Offer Applied <i class="fa fa-info-circle"></i> <b> 34% Off</b></p>
								<ul class="redting-div">
									<li><i class="fa fa-star"></i></li>
									<li><i class="fa fa-star"></i></li>
									<li><i class="fa fa-star"></i></li>
									<li><i class="fa fa-star"></i></li>
									<li><i class="fa fa-star-half-o"></i></li>
								</ul>
							</div>
							<div class="qunatity-check ml-auto">
								<div class="input-group">
									<span class="input-group-btn">
										<button type="button" class="quantity-left-minus btn btn-number"  data-type="minus" data-field="">
										<i class="fa fa-minus"></i>
										</button>
									</span>
									<input type="text" id="quantity" name="quantity" class="form-control input-number" value="{{$cart->quantity}}" min="1" max="100">
									<span class="input-group-btn">
										<button type="button" class="quantity-right-plus btn btn-number" data-type="plus" data-field="">
											<i class="fa fa-plus"></i>
										</button>
									</span>
								</div>
							</div>
							<div class="price-check">
								<h5> <del>₹disc_prc</del> <span>₹{{$cart->price}}</span></h5>
								<a class="rm-btn" onclick="remove_from_cart({{$cart->id}})" >Remove</a>
							</div>
						</div>
					@empty
						EMPTY
					@endforelse
				</div>
			</div>
			@if(!$carts->isEmpty())
			<div class="col-md-4">
				<div class="checkoutslip">
					<h2>Order Summary</h2>
					<div class="row">
						<div class="col-7">
							<h5>Price (3 Items)</h5>
						</div>
						<div class="col-5 text-right">
							<h5>₹1,997.00</h5>
						</div>
						<div class="col-7">
							<h5>Discount</h5>
						</div>
						<div class="col-5 text-right text-danger">
							<h5>- ₹140.00</h5>
						</div>
						<div class="col-7">
							<h5>Delivery Charges</h5>
						</div>
						<div class="col-5 text-right text-danger">
							<h5>Free</h5>
						</div>
					</div>
					<hr class="mt-0">
					<div class="row">
						<div class="col-7">
							<h4>Total Amount</h4>
						</div>
						<div class="col-5 text-right">
							<h4> ₹1,857.00</h4>
						</div>	
					</div>
					<hr>
					<p class="denger mb-5">You will save ₹140 on this order</p>

					<button class="btn chakeout-btn w-100">Proceed To Checkout</button>
				</div>
			</div>
			@else
			EMPTY
			@endif
		</div>
	</div>
</section>
<section class="sectiongap pt-3 recent-view-main">
	<div class="container">
		
		<div class="d-flex mb-4 justify-content-between align-items-center">
			<div class="title-cart"><h4 class="mb-0">You May Also Like</h4></div>
			<div class="con-spoping">
				<a class="con-load-more" href="#0"> <i class="fa fa-refresh" aria-hidden="true"></i> Continue Shopping</a>
			</div>
		</div>

		<div class="owl-carousel product-slide">
		    <div class="item">
		    	<div class="product-box">
		    		<div class="product-img">
		    			<a class="hardicon" href="#0">
		    				<img src="images/wishlist-white.png">
		    			</a>
		    			<a class="book-img" href="#0">
		    			<img src="images/book-1.png" alt="">
		    			</a>
		    		</div>
		    		<div class="product-describe">
		    			<a href="#0">
		    				<h3>The Nutmeg’s Curse</h3>
			    			<h5><b>Book Author:</b> Amitav Ghosh</h5>
			    			<div class="price">
			    				<span>₹539.00</span> <del>₹599.00</del>
			    			</div>
		    			</a>
		    			<div class="rating">
		    				<ul>
		    					<li><i class="fa fa-star"></i></li>
		    					<li><i class="fa fa-star"></i></li>
		    					<li><i class="fa fa-star"></i></li>
		    					<li><i class="fa fa-star"></i></li>
		    					<li><i class="fa fa-star-half-o"></i></li>
		    				</ul>
		    			</div>
		    		</div>
		    	</div>
		    </div>
		    
		</div>
	</div>
</section>


@endsection

@push('footer_script')

<script>
	$('#loginform').validate({
        rules: {
            email: {
                required: true,
                email: true
            },
        },
        messages: {
            email: {
                required: "Please enter your email address",
                email: "The inserted email address must be a email"
            },
        },
        errorElement: "p",
        submitHandler: function() {
            
            var form = $('#loginform');
            
            form.ajaxSubmit({
                dataType:'json',
                beforeSubmit:function(){
                    //data.find('button[type="submit"]').button('loading');
                },
                success:function(data){
                    // form.find('button[type="submit"]').button('reset');
                    form[0].reset();
                    notify(data.status, 'success');
                    window.location.href = "{{route('customer.forgotpass')}}";
                },
                error: function(errors) {
                    //form.find('button[type="submit"]').button('reset');
                    showErrors(errors, form);
                }
            });
        }
    });
</script>
@endpush
##############################################################################################
below code is for adding rs
###########################################################################################
                <h2><span>Best Sellers &#8377;</span></h2>
###############################################################################################
frontendlayout.blade.php
#############################################################################################

<!DOCTYPE html>
<html lang="en">
<head>
	<!-- Required meta tags -->
	<meta charset="utf-8">
	
	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

	<link rel="shortcut icon" href="{{asset('customResource/apeejay-frontend/images/oxfordLogo.jpg')}}" type="image/x-icon">
    <title>{{isset($pageheader)?$pageheader : 'Home'}} | {{config('app.name', 'ApeejayOxford')}}</title>
	<link href="{{asset('customResource/apeejay-frontend/font-awesome-4.7.0/css/font-awesome.css')}}" rel="stylesheet">
	<link href="{{asset('customResource/apeejay-frontend/css/bootstrap.css')}}" rel="stylesheet">
	<link href="{{asset('customResource/apeejay-frontend/css/style.css')}}" rel="stylesheet">
	<link href="{{asset('customResource/apeejay-frontend/css/responsive.css')}}" rel="stylesheet">
	<link href="{{asset('customResource/apeejay-frontend/fonts/stylesheet.css')}}" rel="stylesheet">
	<link href="{{asset('customResource/apeejay-frontend/fonts/aos.css')}}" rel="stylesheet">
	<link href="{{asset('customResource/apeejay-frontend/images/favicon.png')}}" rel="shortcut icon">

	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-toast-plugin/1.3.2/jquery.toast.css" integrity="sha512-8D+M+7Y6jVsEa7RD6Kv/Z7EImSpNpQllgaEIQAtqHcI0H6F4iZknRj0Nx1DCdB+TwBaS+702BGWYC0Ze2hpExQ==" crossorigin="anonymous" />

	<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"> <!-- For dropwdown search-->
	<link rel="stylesheet" type="text/css" href="{{asset('customResource/ul-css.css')}}"> <!-- For dropwdown search-->

	
    <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.4.1/font/bootstrap-icons.css" rel="stylesheet"><!-- Bootstrap Icons -->
    @stack('head_script')
</head>

<body>
	
<header class="menudiv">

	<div id="loadList"  class="loader">
		<div style="width: 100%;height: 100%;display: flex;flex-wrap: nowrap;justify-content: center;align-items: center;">
			<div class="col-12">
				<img src="{{asset('customResource/LoaderFrontend.gif')}}"><br>
	  
		  		<p style="color:  #fff;">Please wait... </p> 
			</div>
		  
		</div>
	</div>

	<div class="had-offer">
		<div class="container">
			<h5>Buy one, get one 50% off our monthly picks! <a href="#0">Shop Now</a></h5>
		</div>
	</div>
	<div class="menumd-div">
		<div class="container">
			<div class="d-flex">
				<ul class="myacnav">
					<li><a href="{{route('frontend.store')}}"><img src="{{asset('customResource/apeejay-frontend/images/location.png')}}"> Store Location</a></li>
					<li><a href="#0">About Us</a></li>
					<li><a href="{{route('frontend.blog')}}">Blog</a></li>
					<li><a href="#0">Contact Us</a></li>
				</ul>
				<ul class="myacnav ml-auto">
				  	<li class="dropdown">
						
						@if(!session()->has('user.roles.slug'))
						{{-- @if(session()->get('user.roles.slug') == 'customer') --}}
						<a href="{{route('customer.login')}}">Login</p>
						@else
						@endif

						@if(session()->has('user.roles.slug'))
						  <a class="dropdown-toggle" href="JavaScript: void(0)" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
						   	<img src="{{asset('customResource/apeejay-frontend/images/account.png')}}"> My Account
						  </a>
						  <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
						    <a class="dropdown-item" href="{{route('customer.dashboard')}}">Dashboard</a>
						    <a class="dropdown-item" href="{{route('customer.logout')}}">Logout</a>
						    {{-- <a class="dropdown-item" href="#">Another action</a>
						    <a class="dropdown-item" href="#">Something else here</a> --}}
						  </div>
						@endif
					</li>
				  	<li><a href="#0"><img src="{{asset('customResource/apeejay-frontend/images/wishlist.png')}}"> Wishlist</a></li>
				</ul>
			</div>
		</div>
	</div>
	<div class="had-brand">
		<div class="container">
			<div class="d-flex align-items-center">
				 <a class="navbar-brand" href="{{route('frontend.index')}}">
					  <img src="{{asset('customResource/apeejay-frontend/images/logo.png')}}">
				  </a>
				  <div class="serch-div ml-auto">
						<form class="serchbar-main" action="{{route('search_get')}}" method="GET">
								<select class="form-control" id="search_dropdown" name="search_category">
									{{-- <option value="0">All</option>
									@forelse(config()->get('categories') as $category)
									<option value="{{$category->id}}">{{$category->title}}</option>
									@empty
									<option value="0">No Categories</option>
									@endforelse --}}
									@forelse(config()->get('categories') as $category)
									<option value="{{$category}}">{{$category}}</option>
									@empty
									<option value="0">No Categories</option>
									@endforelse

								</select>
								<input type="text" onkeypress="get_prod('search_name')"  id="search_name" name="search_name" placeholder="Search By Book, Author, Publisher, Book Type, Category, Binding and Combo">
								<button class="btn"><img src="{{asset('customResource/apeejay-frontend/images/search.png')}}"></button>
						</form>
						<div class="search-block" id="pro_search"></div>
				  </div>
				  <div class="right-mm">
				  		<ul>
							<li><a href="{{route('frontend.cart')}}"><span class="cart"><img src="{{asset('customResource/apeejay-frontend/images/cart.png')}}"> <span class="count" id="cart_count">20</span></span> Cart</a></li>
							<li><a class="all-offer" href="#0">See All Offers</a></li>
						</ul>
				  </div>
			</div>
		</div>
	</div>
		<nav class="navbar navbar-expand-lg">
			<div class="container">
				  <div class="menuright ">
					  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
					    <span class="navbar-toggler-icon"></span>
					  </button>

					  <div class="collapse navbar-collapse" id="navbarSupportedContent">
						    <ul class="navbar-nav ml-auto">
						      <li><a class="nav-active" href="{{route('frontend.index')}}">Home</a></li>
						      <li><a href="#0">Gift voucher</a></li>      
						      <li><a href="#0">Bestsellers </a></li>     
						      <li><a href="{{route('frontend.list',['type' => 'new-releases'])}}">New Releases </a></li>     
						      <li><a href="{{route('frontend.book_request')}}">Book Request </a></li>     
						      <li><a href="#0">Cha Bar </a></li>     
						      <li><a href="#0">Toys & Games</a></li>      
						      <li><a href="#0">Stationery & Gifts  </a></li>    
						      <li><a href="#0">Festivals </a></li>    
						    </ul> 
					  </div>
				  </div>
			</div>
		</nav>
</header>

<section class="offer">
	<a href="#0">
		<img class="w-100" src="{{asset('customResource/apeejay-frontend/images/offer-code.png')}}" alt="offer-code">
	</a>
</section>
               

@yield('content')


<footer class="footer-main">
	<div class="container">
		<div class="footer-top">
			<div class="row">
				<div class="col-md-4">
					<h4>FIND A STORE</h4>
					<form class="serch-box">
						<input type="text" name="" placeholder="Store Name, Location, or ZIP Code">
						<button><img src="{{asset('customResource/apeejay-frontend/images/Email-Arrow.png')}}"></button>
					</form>

					<h4>SIGN UP FOR SAVINGS, NEWS, AND UPDATES</h4>
					<form class="serch-box">
						<input type="text" name="" placeholder="Enter Your Email Address">
						<a href="{{'customer.login'}}"><button><img src="{{asset('customResource/apeejay-frontend/images/Email-Arrow.png')}}"></button></a>
					</form>
					<p>Submit your email address to receive Apeejay Oxford Bookstores Pvt. Ltd offers & updates. You can view Apeejay Oxford Bookstores Pvt. Ltd Privacy Policy here. Unsubscribe from our emails at any time.</p>

					<ul class="sochal">
						<li>Follow Us</li>
						<li><a target="_blank" href="#0"><i class="fa fa-facebook"></i></a></li>
						<li><a target="_blank" href="#0"><i class="fa fa-twitter"></i></a></li>
						<li><a target="_blank" href="#0"><i class="fa fa-instagram"></i></a></li>
						<li><a target="_blank" href="#0"><i class="fa fa-youtube-play"></i></a></li>
					</ul>
				</div>
				<div class="col-md-3 ml-auto pl-5">
					<h4>SHOPPING GUIDE</h4>
					<ul>
						<li><a href="#0">FAQ’s</a></li>
						<li><a href="{{route('frontend.store')}}">Store Locator</a></li>
						<li><a href="#0">Return Policy</a></li>
						<li><a href="#0">Payments & Shipping</a></li>
					</ul>
				</div>
				<div class="col-md-3">
					<h4>INFORMATION</h4>
					<ul>
						<li><a href="#0">About Us</a></li>
						<li><a href="{{route('frontend.blog')}}">Blog</a></li>
						<li><a href="#0">Careers</a></li>
						<li><a href="#0">Contact Us</a></li>
						<li><a href="#0">Privacy policy</a></li>
						<li><a href="#0">Customer service</a></li>
						<li><a href="#0">Terms & condition</a></li>
					</ul>
				</div>
				<div class="col-md-2">
					<h4>QUICK HELP</h4>
					<ul>
						<li><a href="#0">Help Centre</a></li>
						<li><a href="#0">Shipping & Returns</a></li>
						<li><a href="#0">Buy Online, Pick up in Store</a></li>
						<li><a href="#0">Order Status</a></li>
						<li><a href="#0">Gift Cards</a></li>
					</ul>
				</div>
			</div>
		</div>
		<div class="footer-bottom d-flex flex-wra align-items-center justify-content-between">
			<p>Copyright © 2022 <span style="text-transform: uppercase; font-weight: 600;">Apeejay Oxford Bookstores Pvt. Ltd</span>  |  Designed and Developed By <a target="_blank" style="color: red;" href="https://www.ivaninfotech.com/">Ivan Infotech</a></p>
			<div class="right-cardicon">
				<img src="{{asset('customResource/apeejay-frontend/images/payment.png')}}">
			</div>
		</div>
	</div>
</footer>


		


	<!-- ========================JavaScript========================== -->
	<script src="{{asset('customResource/apeejay-frontend/js/jquery.min.js')}}" ></script>
	<script src="{{asset('customResource/apeejay-frontend/js/popper.min.js')}}"></script>
	<script src="{{asset('customResource/apeejay-frontend/js/bootstrap.min.js')}}"></script>
	<script src="{{asset('customResource/apeejay-frontend/js/owl.carousel.js')}}"></script>
	<script src="{{asset('customResource/apeejay-frontend/js/custom.js')}}"></script>
	<script src="{{asset('customResource/apeejay-frontend/js/aos.js')}}"></script>


    <script src="{{asset('js/custom.js')}}"></script>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-toast-plugin/1.3.2/jquery.toast.min.js" integrity="sha512-zlWWyZq71UMApAjih4WkaRpikgY9Bz1oXIW5G0fED4vk14JjGlQ1UmkGM392jEULP8jbNMiwLWdM8Z87Hu88Fw==" crossorigin="anonymous"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.3/jquery.validate.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.form/4.3.0/jquery.form.min.js" integrity="sha512-YUkaLm+KJ5lQXDBdqBqk7EVhJAdxRnVdT2vtCzwPHSweCzyMgYV/tgGF4/dCyqtCC2eCphz0lRQgatGVdfR0ww==" crossorigin="anonymous"></script>
	
	<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script> <!-- For dropwdown search-->
	<script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script> <!-- Sweet Alert2 -->
	<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <!-- For Axios -->

	<script>
		function get_prod(text_id){
		var textLength = $("#"+text_id).val().length;
		if(textLength > 1){
			var cat_id = $('#search_dropdown').val();
			$( "#"+text_id ).autocomplete({
					source: function(request, response) {
					$.ajax({
					url: "{{route('getsearchdata')}}",
					data:{'_token':'{{csrf_token()}}','val':$("#"+text_id).val(),'cat_id':cat_id},
					dataType: "json",
					type: "POST",
						success: function(data){
							var arr_data=data.pro;
							$("#pro_search").val(arr_data);
							response(data);
						}
						});
					},
				});
			}
		}

		async function remove_from_cart(cart_rec_id) { //deleting item from cart
			try {
				const response = await axios.post("{{route('frontend.remove_from_cart')}}", {
					cart_id:cart_rec_id,
				});
				console.log(response.data.status);
				location.reload();
			} catch (error) {
				console.error(error);
			}
		}

		$(document).ready(function () { //for updating cart icon value
			$("#cart_count").text({{config()->get('items_in_cart')}});
		});

	</script>
	
	@stack('footer_script')


</body>
</html>
#####################################################################################################
web.php
##########################################################################################################
<?php

use App\Http\Controllers\Admin\GeneralAdminController;
use App\Http\Controllers\Admin\MembersController;
use App\Http\Controllers\Admin\AttributeController;
use App\Http\Controllers\Admin\CategoryController;
use App\Http\Controllers\Admin\TypeController;
use App\Http\Controllers\Admin\ProductController;
use App\Http\Controllers\Admin\AuthorPublisher;
use App\Http\Controllers\Admin\CouponController;
use App\Http\Controllers\Admin\BannerController;
use App\Http\Controllers\Admin\ReportController;
use App\Http\Controllers\Admin\BlogController;
use App\Http\Controllers\Admin\BlogCategoryController;
use App\Http\Controllers\Admin\BookRequestController;
use App\Http\Controllers\Admin\StoreController;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\HomepageController;
use App\Http\Controllers\Auth;
use App\Http\Controllers\Customer;
use App\Http\Controllers\Customer\GeneralCustomerController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

//middleware auth for chceking and redirection
//customer also for customer chcek and redirection
//roleif for role check

// Route::get('/', function () {
//     return view('welcome');
// });

Route::middleware('common')->group(function() {


    Route::get('validate-user', [HomepageController::class, 'validate_user'])->name('validate_user');
    Route::post('getsearchdata', [HomepageController::class, 'getsearchdata'])->name('getsearchdata');
    Route::get('search', [HomepageController::class, 'search_get'])->name('search_get');

    //Admin panel Authentication Routes...
    Route::get('admin/login', [Auth\LoginController::class, 'showLoginForm'])->name('login');
    Route::post('admin/login', [Auth\LoginController::class, 'login'])->name('login');
    Route::any('admin/logout', [Auth\LoginController::class, 'logout'])->name('logout');
    Route::get('admin/register', [Auth\RegisterController::class, 'showRegistrationForm'])->name('register');
    Route::post('admin/register', [Auth\RegisterController::class, 'register'])->name('register');
    
    //Customer panel Authentication Routes
    Route::name('customer.')->group(function(){
        Route::get('login', [Customer\LoginController::class, 'showLoginForm'])->name('login');
        Route::post('login', [Customer\LoginController::class, 'login'])->name('login');
        Route::get('otp-verify', [Customer\LoginController::class, 'otp_form'])->name('otp');
        Route::post('otp-verify', [Customer\LoginController::class, 'otp_verify'])->name('otp');
        Route::get('register', [Customer\RegisterController::class, 'showRegistrationForm'])->name('register');
        Route::post('register', [Customer\RegisterController::class, 'register_post'])->name('register');
        Route::any('logout', [Customer\LoginController::class, 'logout'])->name('logout');
        Route::get('forgot-password', [Customer\LoginController::class, 'forgot_password'])->name('forgotpass');
        Route::post('forgot-password', [Customer\LoginController::class, 'forgot_password_post'])->name('forgotpass');
        Route::get('password-reset-form/', [Customer\LoginController::class, 'pass_reset_form_show'])->name('pass_reset_form');
        Route::post('password-reset-form', [Customer\LoginController::class, 'resetPassword'])->name('pass_reset_form');
    });


    Route::name('admin/password.')->group(function() {
        Route::get('admin/password/reset', [Auth\ForgotPasswordController::class, 'showLinkRequestForm'])->name('request');
        Route::post('admin/password/email', [Auth\ForgotPasswordController::class, 'sendResetLinkEmail'])->name('email');
        Route::get('admin/password/reset/{token}', [Auth\ResetPasswordController::class, 'showResetForm'])->name('reset');
        Route::post('admin/password/reset', [Auth\ResetPasswordController::class, 'reset'])->name('reset');
    });
    // Route::get('/login', [Auth\LoginController::class, 'showLoginForm'])->name('login');
    // Route::post('/login', [Auth\LoginController::class, 'login'])->name('login');
    // Route::any('/logout', [Auth\LoginController::class, 'logout'])->name('logout');
    // Route::get('register', [Auth\RegisterController::class, 'showRegistrationForm'])->name('register');
    // Route::post('register', [Auth\RegisterController::class, 'register'])->name('register');

    // Password Reset Routes...


    Route::name('frontend.')->group(function(){
        Route::get('/', [HomepageController::class, 'index'])->name('index');
        Route::get('/product-listing', [HomepageController::class, 'product_listing'])->name('product_listing');
        Route::get('/product-details/{slug}', [HomepageController::class, 'product_details'])->name('product_details');
        Route::get('/book-request', [HomepageController::class, 'book_request'])->name('book_request');
        Route::post('/book-request', [HomepageController::class, 'book_request_post'])->name('book_request');
        Route::get('/stores', [HomepageController::class, 'stores_view'])->name('store');
        Route::get('/blogs', [HomepageController::class, 'blog_list'])->name('blog');
        Route::get('/blog/{slug}', [HomepageController::class, 'blog_detail'])->name('blog_detail');
        Route::post('/filter', [HomepageController::class, 'filter'])->name('filter');
        Route::get('/list/{type}', [HomepageController::class, 'listing'])->name('list');
        Route::post('/add-to-cart', [HomepageController::class, 'add_to_cart'])->name('add_to_cart');
        Route::get('/cart', [HomepageController::class, 'cart'])->name('cart');
        Route::post('/remove_from_cart', [HomepageController::class, 'remove_from_cart'])->name('remove_from_cart');

        Route::get('/empty_cart', [HomepageController::class, 'empty_cart'])->name('frgt'); //only for dev purpose

        // Route::get('/services', [HomepageController::class, 'services'])->name('services');
        // Route::get('/service-detail/{slug}', [HomepageController::class, 'service_detail'])->name('service_detail');
        // Route::get('/fog-maker', [HomepageController::class, 'fog_maker'])->name('fog_maker');
        // Route::get('/contact-us', [HomepageController::class, 'contact_us'])->name('contact_us');
        // Route::post('/contact-us', [HomepageController::class, 'contact_us_post'])->name('contact_us_post');
        // Route::get('/fire-evacuation-plans', [HomepageController::class, 'fire_evacuation'])->name('fire_evacuation');
        // Route::get('/community-audits', [HomepageController::class, 'community_audits'])->name('community_audits');
        // Route::get('/about-us', [HomepageController::class, 'about_us'])->name('about_us');
        // Route::get('/terms-conditions', [HomepageController::class, 'terms_conditions'])->name('terms_conditions');
        // Route::get('/privacy-policy', [HomepageController::class, 'privacy_policy'])->name('privacy_policy');
        // Route::post('/subscribe-newsletter', [HomepageController::class, 'subscribe_news'])->name('subscribe_news');
    });

    Route::prefix('/admin')->name('admin.')->middleware('adminauth','roleif:admin')->group(function (){
        Route::get('/dashboard', [GeneralAdminController::class, 'dashboard'])->name('dashboard');
        Route::get('/profile', [GeneralAdminController::class, 'profile'])->name('profile');
        Route::get('/setting', [GeneralAdminController::class, 'setting'])->name('setting');
        Route::post('/setting', [GeneralAdminController::class, 'setting_submit'])->name('setting');
        Route::get('/password-change', [GeneralAdminController::class, 'password_change'])->name('admin_password_change');
        Route::post('/password-change', [GeneralAdminController::class, 'password_change_post'])->name('admin_password_change');

        Route::prefix('/members')->name('member.')->group(function (){
            Route::get('/index', [MembersController::class, 'index'])->name('index');
            Route::post('/change', [MembersController::class, 'change'])->name('change');
            Route::get('editOrCreate', [MembersController::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('editOrCreate', [MembersController::class, 'editOrCreate_post'])->name('editOrCreate');
        });

        Route::prefix('/attributes')->name('attribute.')->group(function (){
            Route::get('/index', [AttributeController::class, 'index'])->name('index');
            Route::get('/editOrCreate', [AttributeController::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('/editOrCreate', [AttributeController::class, 'editOrCreate_post'])->name('editOrCreate');
            Route::post('/change', [AttributeController::class, 'change'])->name('change');
        });

        Route::prefix('/banners')->name('banner.')->group(function (){
            Route::get('/index', [BannerController::class, 'index'])->name('index');
            Route::get('/editOrCreate', [BannerController::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('/editOrCreate', [BannerController::class, 'editOrCreate_post'])->name('editOrCreate_post');
            Route::post('/change', [BannerController::class, 'change'])->name('change');
        });

        Route::prefix('/types')->name('type.')->group(function (){
            Route::get('/index', [TypeController::class, 'index'])->name('index');
            Route::get('/editOrCreate', [TypeController::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('/editOrCreate', [TypeController::class, 'editOrCreate_post'])->name('editOrCreate');
            Route::post('/change', [TypeController::class, 'change'])->name('change');
        });

        Route::prefix('/categories')->name('category.')->group(function (){
            Route::get('/index', [CategoryController::class, 'index'])->name('index');
            Route::get('/editOrCreate', [CategoryController::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('/editOrCreate', [CategoryController::class, 'editOrCreate_post'])->name('editOrCreate');
            Route::post('/change', [CategoryController::class, 'change'])->name('change');
        });

        Route::prefix('/products')->name('product.')->group(function (){
            Route::get('/index', [ProductController::class, 'index'])->name('index');
            Route::get('/editOrCreate', [ProductController::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('/editOrCreate', [ProductController::class, 'editOrCreate_post'])->name('editOrCreate');
            Route::post('/change', [ProductController::class, 'change'])->name('change');
            Route::post('/get_attributes', [ProductController::class, 'get_attributes'])->name('get_attributes');
        });

        Route::prefix('/authors')->name('author.')->group(function(){
            Route::get('/index', [AuthorPublisher::class, 'index'])->name('index');
            Route::get('/editOrCreate', [AuthorPublisher::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('/editOrCreate', [AuthorPublisher::class, 'editOrCreate_post'])->name('editOrCreate');
            Route::post('/change', [AuthorPublisher::class, 'change'])->name('change');
        });

        Route::prefix('/publishers')->name('publisher.')->group(function(){
            Route::get('/index', [AuthorPublisher::class, 'index'])->name('index');
            Route::get('/editOrCreate', [AuthorPublisher::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('/editOrCreate', [AuthorPublisher::class, 'editOrCreate_post'])->name('editOrCreate');
            Route::post('/change', [AuthorPublisher::class, 'change'])->name('change');
        });

        Route::prefix('/coupons')->name('coupon.')->group(function(){
            Route::get('/index', [CouponController::class, 'index'])->name('index');
            Route::get('/editOrCreate', [CouponController::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('/editOrCreate', [CouponController::class, 'editOrCreate_post'])->name('editOrCreate');
            Route::post('/change', [CouponController::class, 'change'])->name('change');
        });

        Route::prefix('/reports')->name('report.')->group(function(){
            Route::get('/index', [ReportController::class, 'index'])->name('index');
            Route::post('/generate', [ReportController::class, 'generate'])->name('generate');
            // Route::post('/editOrCreate', [ReportController::class, 'editOrCreate_post'])->name('editOrCreate');
            // Route::post('/change', [ReportController::class, 'change'])->name('change');
        });

        Route::prefix('/blogs')->name('blog.')->group(function(){
            Route::get('/index', [BlogController::class, 'index'])->name('index');
            Route::get('/editOrCreate', [BlogController::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('/editOrCreate', [BlogController::class, 'editOrCreate_post'])->name('editOrCreate');
            Route::post('/change', [BlogController::class, 'change'])->name('change');
        });

        Route::prefix('/blog-categories')->name('blog_category.')->group(function (){
            Route::get('/index', [BlogCategoryController::class, 'index'])->name('index');
            Route::get('/editOrCreate', [BlogCategoryController::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('/editOrCreate', [BlogCategoryController::class, 'editOrCreate_post'])->name('editOrCreate');
            Route::post('/change', [BlogCategoryController::class, 'change'])->name('change');
            Route::post('/changeDefault', [BlogCategoryController::class, 'changeDefault'])->name('changeDefault');
        });

        Route::prefix('/stores')->name('store.')->group(function(){
            Route::get('/index', [StoreController::class, 'index'])->name('index');
            Route::get('/editOrCreate', [StoreController::class, 'editOrCreate'])->name('editOrCreate');
            Route::post('/editOrCreate', [StoreController::class, 'editOrCreate_post'])->name('editOrCreate');
            Route::post('/change', [StoreController::class, 'change'])->name('change');
        });

        Route::prefix('/book-request')->name('book_request.')->group(function(){
            Route::get('/index', [BookRequestController::class, 'index'])->name('index');
            Route::get('/view', [BookRequestController::class, 'view'])->name('view');
            // Route::get('/editOrCreate', [StoreController::class, 'editOrCreate'])->name('editOrCreate');
            // Route::post('/editOrCreate', [StoreController::class, 'editOrCreate_post'])->name('editOrCreate');
            // Route::post('/change', [StoreController::class, 'change'])->name('change');
        });

        
        
        
    });

    Route::prefix('/customer')->name('customer.')->middleware('customer','roleif:customer')->group(function (){
        //coupon checkout code here
        Route::get('/dashboard', [GeneralCustomerController::class, 'dashboard'])->name('dashboard');
    });
});
########################################################################################################