JFIF$        dd7 

Viewing File: /home/optimaldigitaltr/public_html/src/app/Http/Controllers/Api/Auth/AuthenticateController.php

<?php

namespace App\Http\Controllers\Api\Auth;

use App\Enums\Email\EmailSmsTemplateName;
use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\RegisteredRequest;
use App\Jobs\EmailSmsProcessJob;
use App\Models\PasswordReset;
use App\Models\User;
use App\Notifications\UserRegisteredNotification;
use App\Services\Payment\WalletService;
use App\Services\UserService;
use App\Utilities\Api\ApiJsonResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use Illuminate\Validation\ValidationException;

class AuthenticateController extends Controller
{
    /**
     * The WalletService instance.
     *
     * @var \App\Services\Payment\WalletService
     */
    protected WalletService $walletService;

    /**
     * The UserService instance.
     *
     * @var \App\Services\UserService
     */
    protected UserService $userService;

    /**
     * Create a new controller instance.
     *
     * @param  \App\Services\Payment\WalletService  $walletService
     * @param  \App\Services\UserService  $userService
     * @return void
     */
    public function __construct(WalletService $walletService, UserService $userService)
    {
        $this->walletService = $walletService;
        $this->userService = $userService;
    }

    /**
     * Register a new user.
     *
     * @param  \App\Http\Requests\Auth\RegisteredRequest  $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function register(RegisteredRequest $request): JsonResponse
    {
        $referralId = null;

        if ($request->has('referral_id') && !is_null($request->input('referral_id'))) {
            $referralUser = $this->userService->findByUuid($request->input('referral_id'));
            $referralId = $referralUser ? $referralUser->id : null;
        }

        $user = User::create([
            'uuid' => Str::uuid(),
            'first_name' => $request->input('name'),
            'email' => $request->input('email'),
            'referral_by' => $referralId,
            'password' => Hash::make($request->input('password')),
            'email_verified_at' => now(),
            'status' => 1, // Set status to active upon registration
        ]);

        // Initialize user's wallet
        $this->walletService->save($this->walletService->prepParams((int) $user->id));

        // Notify user of successful registration
        $user->notify(new UserRegisteredNotification());

        // Generate access token
        $accessToken = $user->createToken($user->first_name . $user->email . '-AuthToken')->plainTextToken;

        return ApiJsonResponse::success('Registration Successful', [
            'access_token' => $accessToken,
        ], Response::HTTP_CREATED);
    }

    /**
     * Handle user login.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\JsonResponse
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    public function login(Request $request): JsonResponse
    {
        // Validate the login form data
        $request->validate([
            'email' => ['required', 'email'],
            'password' => ['required'],
        ]);

        $user = User::where('email', $request->input('email'))->first();

        // Check if user exists
        if (!$user) {
            throw ValidationException::withMessages([
                'email' => ['The provided credentials are incorrect.'],
            ]);
        }

        // Check if the user's status is active
        if ($user->status == 0) {
            throw ValidationException::withMessages([
                'email' => ['Your account has been banned. Please contact support.'],
            ]);
        }

        // Check if password is correct
        if (!Hash::check($request->input('password'), $user->password)) {
            throw ValidationException::withMessages([
                'email' => ['The provided credentials are incorrect.'],
            ]);
        }

        // Authentication passed, generate access token
        $accessToken = $user->createToken($user->first_name . $user->email . '-AuthToken')->plainTextToken;

        return ApiJsonResponse::success('Login Successful and access token created', [
            'access_token' => $accessToken,
        ]);
    }

    /**
     * Logout the authenticated user.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout(): JsonResponse
    {
        // Revoke all tokens for the authenticated user
        auth()->user()->tokens()->delete();

        return ApiJsonResponse::success('Logged out successfully');
    }

    /**
     * Handle forgot password request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function forgotPassword(Request $request): JsonResponse
    {
        $request->validate(['email' => 'required|email']);

        $user = User::where('email', $request->input('email'))->first();

        if (!$user) {
            return ApiJsonResponse::error('Email not found');
        }

        // Generate a unique token
        $token = Str::random(60);

        // Create or update the password reset record
        PasswordReset::updateOrCreate(
            ['email' => $user->email],
            ['token' => $token]
        );

        // Dispatch job to send password reset email/SMS
        dispatch(new EmailSmsProcessJob($user, [
            'token' => $token,
        ], EmailSmsTemplateName::PASSWORD_RESET_CODE->value));

        return ApiJsonResponse::success('Password reset email sent successfully');
    }

    /**
     * Handle password reset.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function resetPassword(Request $request): JsonResponse
    {
        $request->validate([
            'email' => 'required|email',
            'password' => 'required|min:8|confirmed',
            'token' => 'required|string',
        ]);

        $passwordReset = PasswordReset::where('email', $request->input('email'))
            ->where('token', $request->input('token'))
            ->first();

        if (!$passwordReset) {
            return ApiJsonResponse::error('Invalid or expired password reset token', statusCode: 404);
        }

        $user = User::where('email', $passwordReset->email)->first();

        if (!$user) {
            return ApiJsonResponse::error('User not found', statusCode: 404);
        }

        // Check if the user's status is active before allowing password reset
        if ($user->status == 0) {
            return ApiJsonResponse::error('Your account has been banned. Cannot reset password.', statusCode: 403);
        }

        // Update user's password
        $user->password = Hash::make($request->input('password'));
        $user->save();

        // Delete the password reset record
        $passwordReset->delete();

        return ApiJsonResponse::success('Password has been reset successfully');
    }
}
Back to Directory  nL+D550H?Mx ,D"v]qv;6*Zqn)ZP0!1 A "#a$2Qr D8 a Ri[f\mIykIw0cuFcRı?lO7к_f˓[C$殷WF<_W ԣsKcëIzyQy/_LKℂ;C",pFA:/]=H  ~,ls/9ć:[=/#f;)x{ٛEQ )~ =𘙲r*2~ a _V=' kumFD}KYYC)({ *g&f`툪ry`=^cJ.I](*`wq1dđ#̩͑0;H]u搂@:~וKL Nsh}OIR*8:2 !lDJVo(3=M(zȰ+i*NAr6KnSl)!JJӁ* %݉?|D}d5:eP0R;{$X'xF@.ÊB {,WJuQɲRI;9QE琯62fT.DUJ;*cP A\ILNj!J۱+O\͔]ޒS߼Jȧc%ANolՎprULZԛerE2=XDXgVQeӓk yP7U*omQIs,K`)6\G3t?pgjrmۛجwluGtfh9uyP0D;Uڽ"OXlif$)&|ML0Zrm1[HXPlPR0'G=i2N+0e2]]9VTPO׮7h(F*癈'=QVZDF,d߬~TX G[`le69CR(!S2!P <0x<!1AQ "Raq02Br#SCTb ?Ζ"]mH5WR7k.ۛ!}Q~+yԏz|@T20S~Kek *zFf^2X*(@8r?CIuI|֓>^ExLgNUY+{.RѪ τV׸YTD I62'8Y27'\TP.6d&˦@Vqi|8-OΕ]ʔ U=TL8=;6c| !qfF3aů&~$l}'NWUs$Uk^SV:U# 6w++s&r+nڐ{@29 gL u"TÙM=6(^"7r}=6YݾlCuhquympǦ GjhsǜNlɻ}o7#S6aw4!OSrD57%|?x>L |/nD6?/8w#[)L7+6〼T ATg!%5MmZ/c-{1_Je"|^$'O&ޱմTrb$w)R$& N1EtdU3Uȉ1pM"N*(DNyd96.(jQ)X 5cQɎMyW?Q*!R>6=7)Xj5`J]e8%t!+'!1Q5 !1 AQaqё#2"0BRb?Gt^## .llQT $v,,m㵜5ubV =sY+@d{N! dnO<.-B;_wJt6;QJd.Qc%p{ 1,sNDdFHI0ГoXшe黅XۢF:)[FGXƹ/w_cMeD,ʡcc.WDtA$j@:) -# u c1<@ۗ9F)KJ-hpP]_x[qBlbpʖw q"LFGdƶ*s+ډ_Zc"?%t[IP 6J]#=ɺVvvCGsGh1 >)6|ey?Lӣm,4GWUi`]uJVoVDG< SB6ϏQ@ TiUlyOU0kfV~~}SZ@*WUUi##; s/[=!7}"WN]'(L! ~y5g9T̅JkbM' +s:S +B)v@Mj e Cf jE 0Y\QnzG1д~Wo{T9?`Rmyhsy3!HAD]mc1~2LSu7xT;j$`}4->L#vzŏILS ֭T{rjGKC;bpU=-`BsK.SFw4Mq]ZdHS0)tLg