# RideAware API Train with Focus. Ride with Awareness RideAware API is the backend service for the RideAware platform, built with Go and PostgreSQL. It provides comprehensive endpoints for user authentication, profile management, and cycling performance tracking. RideAware is a **comprehensive cycling training platform** designed to help riders stay aware of their performance, progress, and goals. Whether you're building a structured training plan, analyzing ride data, or completing workouts indoors, RideAware keeps you connected to every detail of your ride. ## Tech Stack - **Language**: Go 1.21+ - **Database**: PostgreSQL - **ORM**: GORM - **Router**: Chi v5 - **Auth**: JWT (Access + Refresh tokens) - **Email**: Resend - **Containerization**: Podman/Docker ## Getting Started ### Prerequisites Ensure you have the following installed on your system: - Go 1.21 or later - PostgreSQL 12 or later - Podman or Docker - Git ### Setting Up the Project 1. **Clone the Repository** ```bash git clone https://github.com/VeloInnovate/rideaware-api.git cd rideaware-api ``` 2. **Install Dependencies** ```bash go mod download go mod tidy ``` 3. **Configure Environment Variables** Create a `.env` file in the root directory: ```env # Database PG_USER=postgres PG_PASSWORD=your_password PG_HOST=localhost PG_PORT=5432 PG_DATABASE=rideaware # Server PORT=5000 # Security JWT_SECRET_KEY=your-super-secret-key-change-in-production # Email Service RESEND_API_KEY=re_your_resend_api_key SENDER_EMAIL=noreply@rideaware.app ``` 4. **Set Up the Database** Ensure PostgreSQL is running and create the database: ```bash createdb rideaware ``` GORM will automatically run migrations on startup. ### Running Locally **Option 1: Direct Execution** ```bash go run main.go ``` The API will be available at `http://localhost:5000` **Option 2: Build and Run Binary** ```bash go build -o server . ./server ``` ### Running with Podman/Docker #### Quick Start (with build script) ```bash chmod +x build.sh ./build.sh --run ``` This will build the image and start a container. #### Manual Build 1. **Build the Image** ```bash podman build -t rideaware:latest . ``` 2. **Run the Container** ```bash podman run -d \ --name rideaware-api \ -p 5000:5000 \ --env-file .env \ rideaware:latest ``` 3. **View Logs** ```bash podman logs -f rideaware-api ``` The API will be available at `http://localhost:5000` ## API Documentation ### Health Check ```bash GET /health ``` Response: `OK` ### Authentication #### Sign Up ```bash POST /api/signup Content-Type: application/json { "username": "cyclist", "password": "SecurePass123", "email": "cyclist@example.com", "first_name": "John", "last_name": "Cyclist" } ``` Response: ```json { "access_token": "eyJ...", "refresh_token": "eyJ...", "expires_in": 900, "user_id": 1, "username": "cyclist", "email": "cyclist@example.com" } ``` #### Login ```bash POST /api/login Content-Type: application/json { "username": "cyclist", "password": "SecurePass123" } ``` #### Request Password Reset ```bash POST /api/password-reset/request Content-Type: application/json { "email": "cyclist@example.com" } ``` #### Confirm Password Reset ```bash POST /api/password-reset/confirm Content-Type: application/json { "token": "reset_token_from_email", "new_password": "NewSecurePass123" } ``` #### Logout ```bash POST /api/logout ``` ### Protected Routes All protected routes require the `Authorization: Bearer ` header. #### Get User Profile ```bash GET /api/protected/profile Authorization: Bearer ``` ## Testing Run the test suite: ```bash chmod +x test-api.sh ./test-api.sh ``` This will test: - User signup - Login - Protected routes - Password reset - Error handling ## Development ### Running Tests ```bash ./test-api.sh ``` ### Building a New Binary ```bash go build -o server . ``` ### Code Formatting ```bash go fmt ./... ``` ### Linting ```bash go vet ./... ``` ## Deployment ### Environment Variables for Production ```env JWT_SECRET_KEY= RESEND_API_KEY= PG_PASSWORD= ``` ### Building for Production ```bash ./build.sh -t prod --no-cache --run ``` Or push to registry: ```bash ./build.sh -t prod -r docker.io/username --push ``` ## Troubleshooting ### Database Connection Errors Ensure PostgreSQL is running and `.env` variables are correct: ```bash psql -h localhost -U postgres -d rideaware ``` ### Port Already in Use Change the PORT in `.env` or stop the running container: ```bash podman kill rideaware-api podman rm rideaware-api ``` ### Docker Permission Issues Run podman with sudo or add your user to the podman group: ```bash sudo usermod -aG podman $USER ``` ## Contributing Contributions are welcome! Please: 1. Fork the repository 2. Create a feature branch (`git checkout -b feature/amazing-feature`) 3. Commit your changes (`git commit -m 'Add amazing feature'`) 4. Push to the branch (`git push origin feature/amazing-feature`) 5. Open a Pull Request ## License This project is licensed under the AGPL-3.0 License - see the LICENSE file for details. ## Support For issues, questions, or suggestions, please open an issue on GitHub or contact the development team.