feat: add verify with link and back to app
This commit is contained in:
@@ -139,44 +139,63 @@ public function login(Request $request)
|
||||
'token' => $token,
|
||||
]);
|
||||
}
|
||||
public function resendEmailVerification(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'email' => 'required|email',
|
||||
]);
|
||||
|
||||
$user = User::where('email', $request->email)->first();
|
||||
|
||||
if (!$user) {
|
||||
return response()->json(['message' => 'User not found'], 404);
|
||||
}
|
||||
|
||||
if ($user->email_verified_at) {
|
||||
return response()->json(['message' => 'Email is already verified'], 400);
|
||||
}
|
||||
|
||||
// Generate new code
|
||||
$code = rand(1000, 9999);
|
||||
|
||||
// Delete previous codes
|
||||
\DB::table('email_verifications')->where('user_id', $user->id)->delete();
|
||||
|
||||
// Insert new verification code
|
||||
\DB::table('email_verifications')->insert([
|
||||
'user_id' => $user->id,
|
||||
'code' => $code,
|
||||
'expires_at' => now()->addMinutes(15),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
// Send email
|
||||
\Mail::to($user->email)->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Verification email resent successfully'
|
||||
]);
|
||||
public function resendEmailVerification(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'email' => 'required|email',
|
||||
'method' => 'string|in:code,link|nullable',
|
||||
'package_name' => 'string|required',
|
||||
]);
|
||||
|
||||
$method = $data['method'] ?? 'code';
|
||||
$packageNameValue = $data['package_name'];
|
||||
unset($data['package_name']);
|
||||
|
||||
$user = User::where('email', $data['email'])->first();
|
||||
// return response()->json(['message' => $user]);
|
||||
|
||||
if (!$user) {
|
||||
return response()->json(['message' => 'User not found'], 404);
|
||||
}
|
||||
|
||||
if ($user->email_verified_at) {
|
||||
return response()->json(['message' => 'Email is already verified'], 400);
|
||||
}
|
||||
|
||||
$code = rand(1000, 9999);
|
||||
$token = Str::random(64);
|
||||
|
||||
\DB::table('email_verifications')->where('user_id', $user->id)->delete();
|
||||
|
||||
\DB::table('email_verifications')->insert([
|
||||
'user_id' => $user->id,
|
||||
'code' => $code,
|
||||
'token' => $token,
|
||||
'expires_at' => now()->addMinutes(15),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
try {
|
||||
if ($method === 'code') {
|
||||
\Mail::to($user->email)->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
} else {
|
||||
$verificationUrl = url("api/auth/verify-email-link/{$token}?package={$packageNameValue}");
|
||||
\Mail::to($user->email)->send(new \App\Mail\VerifyEmailLinkMail($verificationUrl));
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// rollback verification
|
||||
\DB::table('email_verifications')->where('user_id', $user->id)->delete();
|
||||
|
||||
return response()->json([
|
||||
'error' => $e->getMessage(),
|
||||
'message' => 'ارسال ایمیل با مشکل مواجه شد، لطفا دوباره تلاش کنید'
|
||||
], 400);
|
||||
}
|
||||
|
||||
return response()->json(['message' => 'Verification email resent successfully']);
|
||||
}
|
||||
|
||||
public function register(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
@@ -186,11 +205,16 @@ public function register(Request $request)
|
||||
'password' => 'string|nullable|required_with:email',
|
||||
'mobile' => ['string', new MobileNumber, 'nullable', 'required_without:email'],
|
||||
'fcm_token' => 'string|nullable',
|
||||
'package_name' => 'string|required'
|
||||
'package_name' => 'string|required',
|
||||
'method' => 'string|in:code,link|nullable'
|
||||
]);
|
||||
|
||||
$packageNameValue = $data['package_name'];
|
||||
unset($data['package_name']);
|
||||
$method = $data['method'] ?? 'code';
|
||||
unset($data['method']);
|
||||
|
||||
// Extract and remove package_name
|
||||
$packageNameValue = $data['package_name'];
|
||||
unset($data['package_name']);
|
||||
|
||||
if (isset($data['mobile'])) {
|
||||
$data['mobile'] = MobileNumberHelper::formatMobile($data['mobile']);
|
||||
@@ -203,21 +227,35 @@ public function register(Request $request)
|
||||
return response()->json(['message' => 'Email already exists'], 400);
|
||||
}
|
||||
|
||||
$code = rand(1000, 9999);
|
||||
$token = Str::random(64);
|
||||
// ✅ Check if email can receive a message before creating the user
|
||||
if (isset($data['email'])) {
|
||||
$code = rand(1000, 9999);
|
||||
|
||||
try {
|
||||
// Try sending email
|
||||
\Mail::to($data['email'])->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => $e->getCode(),
|
||||
'error' => $e->getMessage(),
|
||||
'message' => 'لطفا آدرس ایمیل خود را بررسی کنید و مجدد تلاش کنید',
|
||||
// $code = rand(1000, 9999);
|
||||
try {
|
||||
if ($method === 'code') {
|
||||
\Mail::to($data['email'])->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
} else {
|
||||
$verificationUrl = url("api/auth/verify-email-link/{$token}?package={$packageNameValue}");
|
||||
\Mail::to($data['email'])->send(new \App\Mail\VerifyEmailLinkMail($verificationUrl));
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'error' => $e->getMessage(),
|
||||
'message' => 'لطفا آدرس ایمیل خود را بررسی کنید و مجدد تلاش کنید'
|
||||
], 400);
|
||||
}
|
||||
// try {
|
||||
// // Try sending email
|
||||
// \Mail::to($data['email'])->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
// } catch (\Exception $e) {
|
||||
// return response()->json([
|
||||
// 'code' => $e->getCode(),
|
||||
// 'error' => $e->getMessage(),
|
||||
// 'message' => 'لطفا آدرس ایمیل خود را بررسی کنید و مجدد تلاش کنید',
|
||||
|
||||
], 400);
|
||||
}
|
||||
// ], 400);
|
||||
// }
|
||||
}
|
||||
|
||||
// Hash password
|
||||
@@ -237,15 +275,17 @@ public function register(Request $request)
|
||||
}
|
||||
|
||||
// Save email verification code after user is created
|
||||
if (isset($data['email'])) {
|
||||
\DB::table('email_verifications')->insert([
|
||||
'user_id' => $user->id,
|
||||
'code' => $code,
|
||||
// if (isset($data['email'])) {
|
||||
\DB::table('email_verifications')->where('user_id', $user->id)->delete();
|
||||
\DB::table('email_verifications')->insert([
|
||||
'user_id' => $user->id,
|
||||
'code' => $code,
|
||||
'token' => $token,
|
||||
'expires_at' => now()->addMinutes(15),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
]);
|
||||
// }
|
||||
|
||||
// Create token
|
||||
$token = $user->createToken('token', $user->is_admin ? ['admin'] : ['user'])->plainTextToken;
|
||||
@@ -286,6 +326,44 @@ public function verifyEmailCode(Request $request)
|
||||
$token = $user->createToken('token', $user->is_admin ? ['admin'] : ['user'])->plainTextToken;
|
||||
return response()->json(['message' => 'Email verified successfully', 'token' => $token]);
|
||||
}
|
||||
public function verifyEmailLink(Request $request, $token)
|
||||
{
|
||||
$record = \DB::table('email_verifications')
|
||||
->where('token', $token)
|
||||
->where('expires_at', '>', now())
|
||||
->first();
|
||||
|
||||
if (!$record) {
|
||||
return response()->json(['message' => 'Invalid or expired token'], 400);
|
||||
}
|
||||
|
||||
$user = User::find($record->user_id);
|
||||
if (!$user) {
|
||||
return response()->json(['message' => 'User not found'], 404);
|
||||
}
|
||||
|
||||
$user->update(['email_verified_at' => now()]);
|
||||
|
||||
\DB::table('email_verifications')->where('id', $record->id)->delete();
|
||||
|
||||
// Optionally redirect to app deep link
|
||||
$packageName = $request->query('package');
|
||||
if ($packageName && $package = \App\Models\PackageName::where('name', $packageName)->first()) {
|
||||
if ($package->web_app_url) {
|
||||
return redirect()->away($package->web_app_url . '?verified=1');
|
||||
}
|
||||
}
|
||||
|
||||
// $packageName = $request->query('package') ?? 'default';
|
||||
$deepLink = "approagency://{$packageName}?verified=1";
|
||||
|
||||
return view('emails.verified', [
|
||||
'status' => 'success',
|
||||
'message' => 'ایمیل شما با موفقیت تایید شد',
|
||||
'deepLink' => $deepLink,
|
||||
]);
|
||||
}
|
||||
|
||||
public function loginOTP(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
|
||||
Reference in New Issue
Block a user