4.1 KiB
4.1 KiB
Signup Flow Fix - Database Entry Creation
Problem
Successful signups were not creating entries in the database. The database was empty even after successful signup attempts.
Root Cause
- verify-otp endpoint was returning 404 error if user didn't exist, preventing new user creation
- signup endpoint was only populating minimal fields (phone_number, name, country_code) and missing important data like language and timezone from device_info
Solution Implemented
1. Fixed verify-otp Endpoint (Lines 431-465)
- Before: Returned 404 error if user didn't exist
- After: Creates a minimal user entry if user doesn't exist (for signup flow)
- Now creates user with:
phone_number(encrypted)country_code(extracted from phone number)language(from device_info)timezone(from device_info)
- User is created without a name initially, which will be added by the signup endpoint
2. Enhanced signup Endpoint (Lines 959-978, 810-831)
- Before: Only inserted phone_number, name, and country_code
- After: Now also populates:
language(from device_info.language_code)timezone(from device_info.timezone)
- When updating existing user (created by verify-otp), also updates language and timezone
3. Device Information Storage
- Device information is already properly stored in
user_devicestable via upsert operation - Includes: platform, model, os_version, app_version, language_code, timezone
Complete Signup Flow
- User requests OTP → OTP is sent to phone number
- User verifies OTP →
verify-otpendpoint:- Verifies OTP code
- Creates minimal user entry if user doesn't exist
- Creates/updates device entry in
user_devicestable - Returns access_token and refresh_token
- User completes signup →
signupendpoint:- Updates user with name and location data
- Updates language and timezone if provided
- Creates location entry if location data provided
- Returns updated user info and tokens
Database Fields Populated
Users Table
- ✅
id- Auto-generated UUID - ✅
phone_number- Encrypted phone number - ✅
name- User's name (from signup) - ✅
country_code- Extracted from phone number - ✅
language- From device_info.language_code - ✅
timezone- From device_info.timezone - ✅
is_active- Default TRUE - ✅
roles- Default ['seller_buyer'] - ✅
active_role- Default 'seller_buyer' - ✅
user_type- Default 'user' - ✅
token_version- Default 1 - ✅
deleted- Default FALSE - ✅
created_at- Auto-generated timestamp - ✅
updated_at- Auto-updated timestamp - ✅
last_login_at- Updated on login/signup
User Devices Table
- ✅
user_id- Foreign key to users - ✅
device_identifier- Device ID - ✅
device_platform- From device_info.platform - ✅
device_model- From device_info.model - ✅
os_version- From device_info.os_version - ✅
app_version- From device_info.app_version - ✅
language_code- From device_info.language_code - ✅
timezone- From device_info.timezone - ✅
last_seen_at- Updated on each request - ✅
is_active- Set to TRUE
Locations Table (Optional)
- ✅ Created if state, district, or city_village provided
- ✅ Linked to user via user_id
Testing
To verify the fix works:
- Check users table:
SELECT id, phone_number, name, country_code, language, timezone, created_at, last_login_at
FROM users
WHERE deleted = FALSE
ORDER BY created_at DESC;
- Check user_devices table:
SELECT ud.*, u.name, u.phone_number
FROM user_devices ud
JOIN users u ON ud.user_id = u.id
WHERE u.deleted = FALSE
ORDER BY ud.created_at DESC;
- Check locations table:
SELECT l.*, u.name, u.phone_number
FROM locations l
JOIN users u ON l.user_id = u.id
WHERE u.deleted = FALSE
ORDER BY l.created_at DESC;
Notes
- Phone numbers are encrypted before storage (field-level encryption)
- Device information is automatically collected from Android app
- All timestamps are in UTC
- Users are soft-deleted (deleted flag) rather than hard-deleted
- Device entries are upserted (created or updated) on each login/signup