# PIF Compiler - MongoDB Docker Setup

## Quick Start

Start MongoDB and Mongo Express web interface:

```bash
cd utils
docker-compose up -d
```

Stop the services:

```bash
docker-compose down
```

Stop and remove all data:

```bash
docker-compose down -v
```

## Services

### MongoDB
- **Port**: 27017
- **Database**: toxinfo
- **Username**: admin
- **Password**: admin123
- **Connection String**: `mongodb://admin:admin123@localhost:27017/toxinfo?authSource=admin`

### Mongo Express (Web UI)
- **URL**: http://localhost:8082
- **Username**: admin
- **Password**: admin123

## Usage in Python

Update your MongoDB connection in `src/pif_compiler/functions/mongo_functions.py`:

```python
# For local development with Docker
db = connect(user="admin", password="admin123", database="toxinfo")
```

Or use the connection URI directly:

```python
from pymongo import MongoClient

client = MongoClient("mongodb://admin:admin123@localhost:27017/toxinfo?authSource=admin")
db = client['toxinfo']
```

## Data Persistence

Data is persisted in Docker volumes:
- `mongodb_data` - Database files
- `mongodb_config` - Configuration files

These volumes persist even when containers are stopped.

## Creating Application User

It's recommended to create a dedicated user for your application instead of using the admin account.

### Option 1: Using mongosh (MongoDB Shell)

```bash
# Access MongoDB shell
docker exec -it pif_mongodb mongosh -u admin -p admin123 --authenticationDatabase admin

# In the MongoDB shell, run:
use toxinfo

db.createUser({
  user: "pif_app",
  pwd: "pif_app_password",
  roles: [
    { role: "readWrite", db: "toxinfo" }
  ]
})

# Exit the shell
exit
```

### Option 2: Using Mongo Express Web UI

1. Go to http://localhost:8082
2. Login with admin/admin123
3. Select `toxinfo` database
4. Click on "Users" tab
5. Add new user with `readWrite` role

### Option 3: Using Python Script

Create a file `utils/create_user.py`:

```python
from pymongo import MongoClient

# Connect as admin
client = MongoClient("mongodb://admin:admin123@localhost:27017/?authSource=admin")
db = client['toxinfo']

# Create application user
db.command("createUser", "pif_app",
           pwd="pif_app_password",
           roles=[{"role": "readWrite", "db": "toxinfo"}])

print("User 'pif_app' created successfully!")
client.close()
```

Run it:
```bash
cd utils
uv run python create_user.py
```

### Update Your Application

After creating the user, update your connection in `src/pif_compiler/functions/mongo_functions.py`:

```python
# Use application user instead of admin
db = connect(user="pif_app", password="pif_app_password", database="toxinfo")
```

Or with connection URI:
```python
client = MongoClient("mongodb://pif_app:pif_app_password@localhost:27017/toxinfo?authSource=toxinfo")
```

### Available Roles

- `read`: Read-only access to the database
- `readWrite`: Read and write access (recommended for your app)
- `dbAdmin`: Database administration (create indexes, etc.)
- `userAdmin`: Manage users and roles

## Security Notes

⚠️ **WARNING**: The default credentials are for local development only.

For production:
1. Change all passwords in `docker-compose.yml`
2. Use environment variables or secrets management
3. Create dedicated users with minimal required permissions
4. Configure firewall rules
5. Enable SSL/TLS connections
