# Fitness Profile Feature ## Overview The Fitness Profile feature allows mobile app users to create and manage their personal fitness information, including physical metrics, fitness goals, activity levels, and health-related information. ## Features - **Basic Information**: Height, weight, age, and gender - **Fitness Goals**: Primary fitness goal and activity level - **Health Information**: Medical conditions, allergies, and injuries - **Auto-save**: Automatically updates existing profile or creates new one - **Persistent Storage**: Data saved to SQLite database ## Database Schema The fitness profile is stored in the `fitness_profiles` table with the following structure: ```sql CREATE TABLE fitness_profiles ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL UNIQUE, height REAL, -- in cm weight REAL, -- in kg age INTEGER, gender TEXT, -- male, female, other, prefer_not_to_say fitness_goal TEXT, -- weight_loss, muscle_gain, endurance, flexibility, general_fitness activity_level TEXT, -- sedentary, lightly_active, moderately_active, very_active, extremely_active medical_conditions TEXT, allergies TEXT, injuries TEXT, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); ``` ## Mobile App Implementation ### Location - Screen: `apps/mobile/src/app/fitness-profile.tsx` - Components: - `apps/mobile/src/components/Input.tsx` - `apps/mobile/src/components/Picker.tsx` ### Navigation Accessible from the home screen's "Quick Actions" section with a "Fitness Profile" button. ### User Flow 1. User taps "Fitness Profile" from Quick Actions 2. App fetches existing profile (if any) from API 3. User fills in or updates fitness information 4. User taps "Save Profile" 5. Data is saved to database via API 6. User receives success confirmation and returns to home screen ## API Endpoints ### GET `/api/fitness-profile` Fetches the authenticated user's fitness profile. **Authentication**: Required (Clerk Bearer token) **Response**: ```json { "profile": { "id": "fp_...", "userId": "user_...", "height": 175, "weight": 70, "age": 25, "gender": "male", "fitnessGoal": "muscle_gain", "activityLevel": "moderately_active", "medicalConditions": "None", "allergies": "Peanuts", "injuries": "Previous knee injury", "createdAt": 1234567890000, "updatedAt": 1234567890000 } } ``` ### POST `/api/fitness-profile` Creates or updates the authenticated user's fitness profile. **Authentication**: Required (Clerk Bearer token) **Request Body**: ```json { "height": 175, "weight": 70, "age": 25, "gender": "male", "fitnessGoal": "muscle_gain", "activityLevel": "moderately_active", "medicalConditions": "None", "allergies": "Peanuts", "injuries": "Previous knee injury" } ``` **Response** (Create): ```json { "message": "Fitness profile created successfully", "profileId": "fp_..." } ``` **Response** (Update): ```json { "message": "Fitness profile updated successfully", "profileId": "fp_..." } ``` ## Field Options ### Gender - Male - Female - Other - Prefer not to say ### Fitness Goals - Weight Loss - Muscle Gain - Endurance - Flexibility - General Fitness ### Activity Levels - Sedentary - Lightly Active - Moderately Active - Very Active - Extremely Active ## Environment Variables For mobile app to connect to the admin API: ```env EXPO_PUBLIC_API_URL=http://localhost:3000 # Development EXPO_PUBLIC_API_URL=https://your-domain.com # Production ``` ## Testing ### Manual Testing 1. **Create Profile**: - Open mobile app and sign in - Navigate to home screen - Tap "Fitness Profile" in Quick Actions - Fill in fitness information - Tap "Save Profile" - Verify success message 2. **Update Profile**: - Return to Fitness Profile screen - Verify existing data is loaded - Modify some fields - Tap "Save Profile" - Verify success message 3. **Persistence**: - Close and reopen app - Navigate to Fitness Profile - Verify data persists ### Database Verification ```bash # View fitness profiles in database cd apps/admin npm run db:studio # Navigate to fitness_profiles table ``` ## Future Enhancements - [ ] BMI calculation and display - [ ] Progress tracking over time - [ ] Integration with workout plans based on fitness goals - [ ] Trainer access to client fitness profiles - [ ] Health metrics charts and trends - [ ] Photo upload for progress tracking - [ ] Export fitness data ## Dependencies ### Mobile App - `@react-native-picker/picker`: For dropdown selectors - `@clerk/clerk-expo`: For authentication - `expo-router`: For navigation ### Admin API - `better-sqlite3`: For database operations - `@clerk/nextjs/server`: For authentication verification ## Migration To apply the database schema changes: ```bash cd packages/database npm run db:push ``` This will create the `fitness_profiles` table in the SQLite database.