File: /var/www/html/app/Http/Controllers/AuthenticationController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Services\ApiEndpoints;
use App\Services\DeviceService;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Session;
class AuthenticationController extends Controller
{
protected $deviceService;
public function __construct(DeviceService $deviceService)
{
$this->deviceService = $deviceService;
}
protected function getLocation()
{
try {
$clientIp = request()->getClientIp();
// Check if there's a country data in the session and if the IP matches
if (Session::has('country') && Session::get('country')['ip'] === $clientIp) {
info('IP address unchanged, using session data');
return Session::get('country'); // Use the session data directly
}
// If IP is different or no data in session, call the external API
$response = Http::get("https://ipinfo.io/{$clientIp}?token=55690b2a8bf492");
if ($response->successful()) {
$data = $response->json();
$location = explode(',', $data['loc'] ?? '');
$latitude = $location[0] ?? '';
$longitude = $location[1] ?? '';
// Include city and state in the response if needed
$data = [
'ip' => $clientIp ?? '',
'latitude' => $latitude ?? '',
'longitude' => $longitude ?? '',
];
// Store the new data in the session
Session::put('country', $data);
return $data;
}
} catch (\Exception $e) {
Log::error('Location fetching error: ' . $e->getMessage());
}
return null; // Return null if location fetching fails
}
protected function getDevice()
{
if (!Session::has('device_name')) {
$deviceName = $this->deviceService->getDeviceName();
Session::put('device_name', $deviceName);
}
}
protected function getLocationAndDevice()
{
$this->getLocation();
$this->getDevice();
}
public function welcome()
{
$this->getLocationAndDevice();
return view('welcome');
}
public function downloadApp()
{
return view('pages.download-app');
}
public function decisionScreen()
{
return view("auth.decision-screen");
}
public function sellerNIN()
{
return view("auth.nin-registration");
}
public function login()
{
$this->getLocationAndDevice();
if (Session::get('token')) {
return redirect('/services');
}
return view('auth.login');
}
public function register()
{
if (Session::get('token')) {
return redirect()->intended('/services');
}
$this->getLocationAndDevice();
return view('auth.register');
}
public function verifyAccountEmail()
{
if (Session::get('token')) {
return redirect()->intended('/services');
}
return view('auth.verify-account-email');
}
public function becomeSeller()
{
return view('auth.become-a-seller');
}
public function forgetPassword()
{
if (Session::get('token')) {
return redirect()->intended('/services');
}
return view('auth.forget-password');
}
public function setNewPassword()
{
if (Session::get('token')) {
return redirect()->intended('/services');
}
return view('auth.set-new-password');
}
public function verifyEmail()
{
if (Session::get('token')) {
return redirect()->intended('/services');
}
return view('auth.verify-email');
}
public function verifyPhone()
{
if (Session::get('token')) {
return redirect()->intended('/services');
}
return view('auth.verify-phone');
}
public function verifyDeleteAccountOtp()
{
return view('auth.delete-account-otp');
}
public function logout()
{
Session::flush();
return redirect()->to('/login')->with('error', 'Logout');
}
public function showDeleteAccountForm()
{
return view('livewire.auth.delete-account');
}
public function showAccountDeleteSuccess()
{
return view('livewire.auth.account-deleted');
}
public function requestDeleteOTP(Request $request)
{
// dd('got here');
// dd($request->all());
$request->validate([
'email' => 'required|email',
]);
/*
$api = new ApiEndpoints();
Http::withHeaders($api->header())
*/
$api = new ApiEndpoints();
/*
// $response = Http::withHeaders(ApiEndpoints::header())->post(ApiEndpoints::sendEmailOtp(), [
$response = Http::withHeaders(ApiEndpoints::header())->post(ApiEndpoints::sendEmailOtp(), [
'email' => $request->email,
'purpose' => 'delete_account',
]);
*/
https://console.fixgini.com/api/v1/send-email-otp
$response = Http::withHeaders($api->header())
->post('https://console.fixgini.com/api/v1/send-email-otp', [
'email' => $request->email,
'purpose' => 'delete_account',
]);
/*
Log::info('Send Email OTP API response', [
'status' => $response->status(),
'body' => $response->body(),
]);
*/ /*
if ($response->successful()) {
return redirect()->route('delete.account.form')->with([
'success' => 'OTP sent to your email.',
'show_otp_form' => true,
]);
}
*/
if ($response->successful()) {
return redirect()->route('delete.account.form')->with([
'success' => 'OTP sent to your email.',
'show_otp_form' => true,
'email' => $request->email,
]);
}
else {
return redirect()->route('delete.account.form')->with('error', 'Failed to send OTP. Please try again.');
}
}
public function confirmDeleteAccount(Request $request)
{
// ✅ Validate input
$request->validate([
'email' => 'required|email|exists:users,email',
'otp' => 'required|digits:6',
]);
try {
// ✅ Call single API for OTP verification + account deletion
$response = Http::post('https://console.fixgini.com/api/v1/confirm-account-delete', [
'email' => $request->email,
'otp' => $request->otp,
'purpose' => 'delete_account',
]);
if ($response->successful()) {
auth()->logout();
Session::flush();
return view('livewire.auth.account-deleted');
}
// If API returns error (non-200)
return redirect()
->route('delete.account.form')
->with('error', $response->json('message') ?? 'Invalid OTP or deletion failed.');
} catch (\Throwable $e) {
Log::error("Account deletion error: " . $e->getMessage());
return redirect()
->route('delete.account.form')
->with('error', 'Something went wrong. Please try again later.');
}
}
}