lmrc-cli 0.3.16

CLI tool for scaffolding LMRC Stack infrastructure projects
Documentation
# {{app_name}} Database Migrator

SeaORM database migration tool for {{app_name}}.

## Setup

Set the `DATABASE_URL` environment variable:

```bash
export DATABASE_URL="postgres://username:password@localhost/{{app_name}}"
```

Or create a `.env` file:
```
DATABASE_URL=postgres://username:password@localhost/{{app_name}}
```

## Usage

### Run all pending migrations

```bash
cargo run -p {{app_name}}-migrator
# or explicitly
cargo run -p {{app_name}}-migrator -- up
```

### Rollback last migration

```bash
cargo run -p {{app_name}}-migrator -- down
```

### Check migration status

```bash
cargo run -p {{app_name}}-migrator -- status
```

### Refresh (rollback all and reapply)

```bash
cargo run -p {{app_name}}-migrator -- refresh
```

### Reset (rollback all)

```bash
cargo run -p {{app_name}}-migrator -- reset
```

## Migrations

Current migrations:

1. **m20240101_000001_create_users_table** - Creates `users` table with:
   - `id` (primary key, auto-increment)
   - `email` (unique, indexed)
   - `password_hash`
   - `created_at`

2. **m20240101_000002_create_sessions_table** - Creates `sessions` table with:
   - `id` (primary key, auto-increment)
   - `token` (unique, indexed)
   - `user_id` (foreign key to users, indexed)
   - `expires_at` (indexed)
   - `created_at`

## Adding New Migrations

1. Create a new migration file in `src/migrations/`:

```rust
// src/migrations/m20240115_create_posts_table.rs
use sea_orm_migration::prelude::*;

#[derive(DeriveMigrationName)]
pub struct Migration;

#[async_trait::async_trait]
impl MigrationTrait for Migration {
    async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager
            .create_table(
                Table::create()
                    .table(Posts::Table)
                    .if_not_exists()
                    .col(ColumnDef::new(Posts::Id).integer().not_null().auto_increment().primary_key())
                    .col(ColumnDef::new(Posts::Title).string().not_null())
                    .to_owned(),
            )
            .await
    }

    async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
        manager
            .drop_table(Table::drop().table(Posts::Table).to_owned())
            .await
    }
}

#[derive(DeriveIden)]
enum Posts {
    Table,
    Id,
    Title,
}
```

2. Add it to `src/migrations/mod.rs`:
```rust
pub mod m20240115_create_posts_table;
```

3. Register it in `src/lib.rs`:
```rust
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
    vec![
        // ... existing migrations
        Box::new(migrations::m20240115_create_posts_table::Migration),
    ]
}
```

## Generating Entities

After running migrations, generate SeaORM entities for your gateway app:

```bash
cd ../{{app_name}}
sea-orm-cli generate entity \
    -u $DATABASE_URL \
    -o src/adapters/entities \
    --with-serde both
```

This will generate entity files matching your database schema.

## SeaORM CLI

Install globally for easier migration management:

```bash
cargo install sea-orm-cli
```

Then use:
```bash
sea-orm-cli migrate up
sea-orm-cli migrate down
sea-orm-cli migrate status
```

## Resources

- [SeaORM Migration Guide]https://www.sea-ql.org/SeaORM/docs/migration/setting-up-migration/
- [SeaORM Entity Generation]https://www.sea-ql.org/SeaORM/docs/generate-entity/sea-orm-cli/