first(); if (! $staff) { return false; } $code = str_pad((string) random_int(0, 999999), self::CODE_LENGTH, '0', STR_PAD_LEFT); $staff->otp_code = $code; $staff->otp_expires_at = now()->addMinutes(self::EXPIRY_MINUTES); $staff->save(); Mail::to($staff->email)->send(new OtpMail($staff->first_name, $code)); return true; } public function validate(string $email, string $code): ?Staff { $staff = Staff::where('email', $email)->first(); if (! $staff) { return null; } if (! $staff->otp_expires_at || $staff->otp_code != $code || now()->isAfter($staff->otp_expires_at)) { return null; } $staff->otp_code = null; $staff->otp_expires_at = null; $staff->save(); return $staff; } }