# Signup Duplicate Phone Number Check ## Problem When a user tries to sign up with a phone number that is already registered in the database, they should be shown a message directing them to sign in instead of proceeding with signup. ## Solution Implemented ### 1. Updated SignUpScreen (Android App) **File**: `LivingAi_Lg/app/src/main/java/com/example/livingai_lg/ui/screens/auth/SignUpScreen.kt` **Changes**: - Added a check before requesting OTP to verify if the user already exists - If user exists and is fully registered (has a name), shows a toast message: "This phone number is already registered. Please sign in instead." - Automatically navigates to the sign-in screen - If user doesn't exist or is in the middle of signup (no name), proceeds with normal signup flow **Flow**: 1. User fills signup form and clicks "Sign Up" 2. App calls `checkUser()` API to verify if phone number is registered 3. If user exists → Show message and navigate to sign-in 4. If user doesn't exist → Proceed with OTP request and signup ### 2. Enhanced check-user Endpoint (Backend) **File**: `farm-auth-service/src/routes/authRoutes.js` **Changes**: - Updated the `/auth/check-user` endpoint to check if user has a name (fully registered) - Returns `user_exists: true` only if: - User exists in database - User has a name (not just created by verify-otp) - Returns `user_exists: false` if: - User doesn't exist, OR - User exists but has no name (incomplete signup - allow them to continue) **Logic**: ```javascript // Check if user exists and has a name (fully registered) const found = await db.query( `SELECT id, name FROM users WHERE (phone_number = $1 OR phone_number = $2) AND deleted = FALSE`, phoneSearchParams ); if (found.rows.length === 0) { // User not found - allow signup return { user_exists: false }; } const user = found.rows[0]; const isFullyRegistered = user.name && user.name.trim() !== ''; if (isFullyRegistered) { // User is fully registered - should sign in return { user_exists: true, message: 'User is already registered. Please sign in instead.' }; } else { // User exists but incomplete - allow signup to continue return { user_exists: false }; } ``` ## User Experience ### Scenario 1: New User 1. User enters phone number that doesn't exist in database 2. Clicks "Sign Up" 3. System checks → User doesn't exist 4. Proceeds with OTP request and signup flow ✅ ### Scenario 2: Fully Registered User 1. User enters phone number that exists and has a name 2. Clicks "Sign Up" 3. System checks → User exists and is fully registered 4. Shows toast: "This phone number is already registered. Please sign in instead." 5. Automatically navigates to sign-in screen ✅ ### Scenario 3: Incomplete Signup 1. User previously started signup (verify-otp created user but didn't complete) 2. User enters same phone number again 3. Clicks "Sign Up" 4. System checks → User exists but has no name 5. Proceeds with signup to complete registration ✅ ## Benefits 1. **Prevents Duplicate Accounts**: Users can't create multiple accounts with the same phone number 2. **Better UX**: Clear message directing users to sign in if already registered 3. **Handles Edge Cases**: Users who started but didn't complete signup can still finish 4. **Automatic Navigation**: Seamlessly redirects to sign-in screen ## Testing To test the implementation: 1. **Test New User Signup**: - Enter a new phone number - Should proceed with signup normally 2. **Test Existing User**: - Enter a phone number that's already registered - Should show message and navigate to sign-in 3. **Test Incomplete Signup**: - Start signup but don't complete (verify OTP but don't finish) - Try to sign up again with same number - Should allow completion of signup ## API Response Examples ### User Exists (Fully Registered) ```json { "success": true, "message": "User is already registered. Please sign in instead.", "user_exists": true } ``` ### User Doesn't Exist or Incomplete ```json { "success": false, "error": "USER_NOT_FOUND", "message": "User is not registered. Please sign up to create a new account.", "user_exists": false } ```