# API Refactor v2.0 - Complete Redesign

## Overview

The API has been completely refactored to be **standalone and independent**. It no longer depends on bot modules and contains all necessary code within the `api/` directory.

## Changes

### ✅ Completed

1. **Cleaned root directory**:
   - Moved all `.md` documentation files to `docs/archive/`
   - Moved migration scripts to `scripts/`
   - Root is now clean with only essential config files

2. **Created standalone API modules**:
   - `api/database.py` - Complete database operations (no bot dependency)
   - `api/world_loader.py` - Game world loader with data models
   - `api/items.py` - Items manager
   - `api/game_logic.py` - All game mechanics
   - `api/main_new.py` - New standalone FastAPI application

3. **New database schema**:
   - `players.id` is now the primary key (auto-increment)
   - `telegram_id` is optional (nullable) for Telegram users
   - `username`/`password_hash` for web users
   - All foreign keys now reference `players.id` instead of `telegram_id`

4. **Simplified deployment**:
   - Removed unnecessary nginx complexity
   - Traefik handles all routing
   - PWA serves static files via nginx (efficient for static content)
   - API is completely standalone

## Migration Path

### Option 1: Fresh Start (Recommended)

**Pros**: Clean database, no migration issues  
**Cons**: Loses existing Telegram user data

```bash
# 1. Stop all containers
docker compose down

# 2. Remove old database
docker volume rm echoes-of-the-ashes-postgres-data

# 3. Update files
mv api/main_new.py api/main.py
mv api/requirements_new.txt api/requirements.txt
mv Dockerfile.api.new Dockerfile.api

# 4. Rebuild and start
docker compose up -d --build
```

### Option 2: Migrate Existing Data

**Pros**: Keeps Telegram user data  
**Cons**: Requires running migration script

```bash
# 1. Create migration script to:
#    - Add `id` column as primary key
#    - Make `telegram_id` nullable
#    - Update all foreign keys
#    - Backfill `id` values

# 2. Run migration
docker exec -it echoes_of_the_ashes_api python scripts/migrate_to_v2.py

# 3. Update files and rebuild
# (same as Option 1 steps 3-4)
```

## New API Structure

```
api/
├── main_new.py          # Standalone FastAPI app
├── database.py          # All database operations  
├── world_loader.py      # World data loading
├── items.py             # Items management
├── game_logic.py        # Game mechanics
├── internal.py          # (deprecated - logic moved to main)
└── requirements_new.txt # Minimal dependencies
```

## Bot Integration

The bot will now call the API for all operations instead of directly accessing the database.

### Bot Changes Needed:

1. **Replace direct database calls** with API calls using `httpx`:
   ```python
   # Old:
   player = await get_player(telegram_id)
   
   # New:
   response = await http_client.get(
       f"{API_URL}/api/internal/player/{telegram_id}",
       headers={"Authorization": f"Bearer {INTERNAL_KEY}"}
   )
   player = response.json()
   ```

2. **Use internal endpoints** (protected by API key):
   - `GET /api/internal/player/{telegram_id}` - Get player
   - `POST /api/internal/player` - Create player
   - All other game operations use public endpoints with JWT

## Environment Variables

```env
# Database
POSTGRES_USER=your_user
POSTGRES_PASSWORD=your_password
POSTGRES_DB=echoes_db
POSTGRES_HOST=echoes_of_the_ashes_db
POSTGRES_PORT=5432

# API
JWT_SECRET_KEY=your-jwt-secret-key
API_INTERNAL_KEY=your-internal-api-key

# Bot (if using)
TELEGRAM_BOT_TOKEN=your-bot-token
```

## Testing the New API

1. **Health check**:
   ```bash
   curl https://your-domain.com/health
   ```

2. **Register web user**:
   ```bash
   curl -X POST https://your-domain.com/api/auth/register \
     -H "Content-Type: application/json" \
     -d '{"username":"testuser","password":"testpass"}'
   ```

3. **Get location**:
   ```bash
   curl https://your-domain.com/api/game/location \
     -H "Authorization: Bearer YOUR_JWT_TOKEN"
   ```

## Benefits

1. **Standalone** - API has zero bot dependencies
2. **Clean** - All logic in one place
3. **Testable** - Easy to test without bot infrastructure
4. **Maintainable** - Clear separation of concerns
5. **Scalable** - API and bot can scale independently
6. **Flexible** - Easy to add new clients (mobile app, etc.)

## Next Steps

1. Choose migration path (fresh start vs migrate)
2. Update and rebuild containers
3. Test web interface
4. Refactor bot to use API endpoints
5. Remove old `api/main.py` and `api/internal.py`
