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/ |
<?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,
]);
}
}