217 lines
9.3 KiB
Markdown
217 lines
9.3 KiB
Markdown
# Codebase Structure
|
|
|
|
**Analysis Date:** 2026-02-15
|
|
|
|
## Directory Layout
|
|
|
|
```
|
|
gravl/
|
|
├── .git/ # Git repository
|
|
├── .planning/
|
|
│ └── codebase/ # Analysis documents (this file)
|
|
├── agents/ # AI agent configurations (not active codebase)
|
|
│ ├── architect/
|
|
│ ├── backend-dev/
|
|
│ ├── coach/
|
|
│ ├── frontend-dev/
|
|
│ ├── nutritionist/
|
|
│ └── reviewer/
|
|
├── backend/ # Express.js REST API server
|
|
│ ├── src/
|
|
│ │ └── index.js # Main server file (all routes and handlers)
|
|
│ ├── package.json # Backend dependencies
|
|
│ ├── Dockerfile # Docker build config
|
|
│ └── node_modules/ # Dependencies (not committed)
|
|
├── frontend/ # React SPA application
|
|
│ ├── src/
|
|
│ │ ├── main.jsx # App entry point (routing, providers)
|
|
│ │ ├── App.jsx # Main app shell (view routing)
|
|
│ │ ├── index.css # Global styles
|
|
│ │ ├── App.css # App component styles
|
|
│ │ ├── pages/ # Full-page components (views)
|
|
│ │ ├── components/ # Reusable components
|
|
│ │ └── context/ # React Context providers
|
|
│ ├── index.html # HTML template
|
|
│ ├── vite.config.js # Vite build configuration
|
|
│ ├── package.json # Frontend dependencies
|
|
│ ├── Dockerfile # Docker build config
|
|
│ └── node_modules/ # Dependencies (not committed)
|
|
├── db/ # Database schema and initialization
|
|
│ └── init.sql # PostgreSQL schema definition
|
|
├── docker/ # Docker-related files
|
|
├── docker-compose.yml # Multi-container orchestration
|
|
├── README.md # Project overview
|
|
├── CLAUDE.md # LLM context file
|
|
└── TODO.md # Project tasks and notes
|
|
```
|
|
|
|
## Directory Purposes
|
|
|
|
**backend/src/:**
|
|
- Purpose: Backend application code
|
|
- Contains: Single Express server file with all routes, middleware, and database handlers
|
|
- Key files: `index.js` (14,361 lines, monolithic backend)
|
|
|
|
**frontend/src/:**
|
|
- Purpose: Frontend application source code
|
|
- Contains: React component files, styling, and global state management
|
|
- Key files: `App.jsx`, `main.jsx`, page components, AuthContext
|
|
|
|
**frontend/src/pages/:**
|
|
- Purpose: Full-page/route components (views)
|
|
- Contains: 8 page components handling entire view logic
|
|
- Key files:
|
|
- `Dashboard.jsx` - Main view showing program and scheduled workout
|
|
- `WorkoutPage.jsx` - Active workout tracking interface
|
|
- `ProfilePage.jsx` - User profile and measurements
|
|
- `ProgressPage.jsx` - Progress tracking and statistics
|
|
- `LoginPage.jsx` - Authentication entry
|
|
- `RegisterPage.jsx` - Account creation
|
|
- `OnboardingWizard.jsx` - Initial profile setup
|
|
- `WorkoutSelectPage.jsx` - Program/day selection
|
|
|
|
**frontend/src/components/:**
|
|
- Purpose: Reusable UI components
|
|
- Contains: Shared UI building blocks
|
|
- Key files: `Icons.jsx` - Icon system and icon name mapping
|
|
|
|
**frontend/src/context/:**
|
|
- Purpose: React Context providers for global state
|
|
- Contains: Authentication state and session management
|
|
- Key files: `AuthContext.jsx` - User login, registration, profile updates, token management
|
|
|
|
**db/:**
|
|
- Purpose: Database schema and initialization
|
|
- Contains: SQL scripts for schema creation and seed data
|
|
- Key files: `init.sql` - Creates 8 tables, indexes, and inserts PPL program template
|
|
|
|
**docker/:**
|
|
- Purpose: Docker-related configuration (currently minimal)
|
|
- Contains: Likely Dockerfile templates or configuration
|
|
|
|
## Key File Locations
|
|
|
|
**Entry Points:**
|
|
- `frontend/index.html` - HTML template that loads React app
|
|
- `frontend/src/main.jsx` - React bootstrap, BrowserRouter setup, routing definitions
|
|
- `frontend/src/App.jsx` - Main app shell, view routing, workout state management
|
|
- `backend/src/index.js` - Express server initialization, all API routes
|
|
|
|
**Configuration:**
|
|
- `frontend/vite.config.js` - Vite build config, dev proxy setup
|
|
- `frontend/package.json` - React, React Router, Vite dependencies
|
|
- `backend/package.json` - Express, PostgreSQL driver, JWT, bcrypt dependencies
|
|
- `docker-compose.yml` - Service definitions, networking, Traefik routing labels
|
|
|
|
**Core Logic:**
|
|
- `frontend/src/context/AuthContext.jsx` - Authentication and session management
|
|
- `backend/src/index.js` - All API endpoints, auth middleware, database queries
|
|
- `db/init.sql` - Database schema and initial data
|
|
|
|
**Styling:**
|
|
- `frontend/src/index.css` - Global styles, CSS variables, base components
|
|
- `frontend/src/App.css` - Application layout styles
|
|
- `frontend/src/pages/*.jsx` - Inline inline className attributes (CSS-in-JS via CSS class selectors)
|
|
|
|
## Naming Conventions
|
|
|
|
**Files:**
|
|
- **Pages:** PascalCase with "Page" suffix (e.g., `LoginPage.jsx`, `WorkoutPage.jsx`)
|
|
- **Components:** PascalCase (e.g., `Icons.jsx`)
|
|
- **Context:** PascalCase with "Context" suffix (e.g., `AuthContext.jsx`)
|
|
- **Backend routes:** Lowercase with slashes (e.g., `/api/auth/login`, `/api/user/profile`)
|
|
- **Database tables:** Lowercase with underscores (e.g., `workout_logs`, `program_exercises`)
|
|
|
|
**Directories:**
|
|
- **Page directory:** `pages/` (plural)
|
|
- **Component directory:** `components/` (plural)
|
|
- **Context directory:** `context/` (singular, convention)
|
|
- **Backend:** `src/` (single index.js file, no subdirectories)
|
|
|
|
**Functions:**
|
|
- **React components:** PascalCase (e.g., `function Dashboard()`)
|
|
- **Hooks/helpers:** camelCase (e.g., `fetchProgram()`, `getCoachGreeting()`, `getMuscleGroups()`)
|
|
- **Constants:** camelCase (e.g., `API_URL`, `weekdays`, `warmupExercises`)
|
|
- **Middleware:** camelCase (e.g., `authMiddleware`)
|
|
|
|
**Variables:**
|
|
- **State:** camelCase (e.g., `user`, `loading`, `selectedDay`)
|
|
- **Props:** camelCase (e.g., `onStartWorkout`, `onNavigate`)
|
|
- **API endpoints:** Lowercase kebab-case in URLs, snake_case in query parameters and JSON bodies
|
|
|
|
**Types/Database:**
|
|
- **Columns:** snake_case (e.g., `password_hash`, `onboarding_complete`, `program_exercise_id`)
|
|
- **Tables:** Lowercase plural (e.g., `users`, `programs`, `workout_logs`)
|
|
- **Foreign keys:** Follow pattern `{table_id}` (e.g., `user_id`, `program_id`)
|
|
|
|
## Where to Add New Code
|
|
|
|
**New Feature (e.g., new page/view):**
|
|
- Primary code: `frontend/src/pages/{FeatureName}Page.jsx`
|
|
- Styling: Inline CSS class names in JSX or extend `App.css`
|
|
- API calls: Direct fetch in component useEffect hooks, passing API_URL from page file
|
|
- Routing: Add Route to `frontend/src/main.jsx` with Route path and component
|
|
- If requires auth: Wrap in `<ProtectedRoute>` wrapper in main.jsx
|
|
- If requires context: Use `useAuth()` hook from AuthContext
|
|
|
|
**New API Endpoint (backend):**
|
|
- Location: Add route handler in `backend/src/index.js`
|
|
- Pattern: Use `app.get()`, `app.post()`, `app.put()` with path and handler function
|
|
- Database: Use `pool.query()` for PostgreSQL queries with parameterized queries ($1, $2, etc.)
|
|
- Auth: Add `authMiddleware` parameter if endpoint requires authentication
|
|
- Response: Return `res.json()` with data or error object
|
|
- Error handling: Wrap in try-catch, return appropriate status codes (400, 401, 404, 500)
|
|
|
|
**New Component:**
|
|
- Location: `frontend/src/components/{ComponentName}.jsx`
|
|
- Export: Default export or named export function component
|
|
- Props: Accept props for reusability, avoid direct API calls
|
|
- Integration: Import into pages or other components as needed
|
|
|
|
**New Database Table/Schema Change:**
|
|
- Location: `db/init.sql`
|
|
- Pattern: Add CREATE TABLE statement with proper data types and constraints
|
|
- Relations: Use FOREIGN KEY references and ON DELETE CASCADE
|
|
- Indexes: Add indexes for frequently queried columns (user_id, date, etc.)
|
|
- Seed data: Use INSERT statements with ON CONFLICT DO NOTHING
|
|
- Application: Changes apply on container restart (init.sql runs every startup)
|
|
|
|
**Utilities/Helpers:**
|
|
- Location: Keep in page file if only used there, or create in `frontend/src/utils/` if reused
|
|
- Pattern: Export as named functions (no separate utils directory currently exists)
|
|
- Examples: `getCoachGreeting()`, `getMuscleGroups()`, `getWeekStart()` are defined in pages
|
|
|
|
**Authentication/State:**
|
|
- Location: Extend `frontend/src/context/AuthContext.jsx` if global
|
|
- Location: Add to page component state with useState if local to page
|
|
- Pattern: Use `useAuth()` hook for auth context, create custom hooks if reusable state pattern emerges
|
|
|
|
## Special Directories
|
|
|
|
**node_modules/:**
|
|
- Purpose: Installed npm dependencies
|
|
- Generated: Yes (by npm install)
|
|
- Committed: No (.gitignore)
|
|
- Notes: Frontend and backend have separate node_modules directories
|
|
|
|
**.git/:**
|
|
- Purpose: Git version control repository
|
|
- Generated: Yes (git init)
|
|
- Committed: N/A (git internal)
|
|
|
|
**.planning/codebase/:**
|
|
- Purpose: Architecture and codebase analysis documents
|
|
- Generated: Yes (by mapping tools)
|
|
- Committed: Yes (for orchestrator reference)
|
|
- Contains: ARCHITECTURE.md, STRUCTURE.md, and other analysis documents
|
|
|
|
**agents/:**
|
|
- Purpose: Agent configuration (not part of active codebase)
|
|
- Generated: Yes (from setup)
|
|
- Committed: Yes
|
|
- Notes: These are orchestrator definitions, not part of the running application
|
|
|
|
---
|
|
|
|
*Structure analysis: 2026-02-15*
|