seed.rs

  1use sqlx::postgres::PgPoolOptions;
  2use tide::log;
  3
  4#[path = "../env.rs"]
  5mod env;
  6
  7#[async_std::main]
  8async fn main() {
  9    if let Err(error) = env::load_dotenv() {
 10        log::error!(
 11            "error loading .env.toml (this is expected in production): {}",
 12            error
 13        );
 14    }
 15
 16    let database_url = std::env::var("DATABASE_URL").expect("missing DATABASE_URL env var");
 17    let db = PgPoolOptions::new()
 18        .max_connections(5)
 19        .connect(&database_url)
 20        .await
 21        .expect("failed to connect to postgres database");
 22
 23    let zed_users = ["nathansobo", "maxbrunsfeld", "as-cii", "iamnbutler"];
 24    let mut zed_user_ids = Vec::<i32>::new();
 25    for zed_user in zed_users {
 26        zed_user_ids.push(
 27            sqlx::query_scalar(
 28                r#"
 29                INSERT INTO users
 30                    (github_login, admin)
 31                VALUES
 32                    ($1, true)
 33                ON CONFLICT (github_login) DO UPDATE SET
 34                    github_login=EXCLUDED.github_login
 35                RETURNING id
 36                "#,
 37            )
 38            .bind(zed_user)
 39            .fetch_one(&db)
 40            .await
 41            .expect("failed to insert user"),
 42        )
 43    }
 44
 45    let zed_org_id: i32 = sqlx::query_scalar(
 46        r#"
 47        INSERT INTO orgs
 48            (name, slug)
 49        VALUES
 50            ('Zed', 'zed')
 51        ON CONFLICT (slug) DO UPDATE SET
 52            slug=EXCLUDED.slug
 53        RETURNING id
 54        "#,
 55    )
 56    .fetch_one(&db)
 57    .await
 58    .expect("failed to insert org");
 59
 60    let general_channel_id: i32 = sqlx::query_scalar(
 61        r#"
 62        INSERT INTO channels
 63            (owner_is_user, owner_id, name)
 64        VALUES
 65            (false, $1, 'General')
 66        ON CONFLICT (owner_is_user, owner_id, name) DO UPDATE SET
 67            name=EXCLUDED.name
 68        RETURNING id
 69        "#,
 70    )
 71    .bind(zed_org_id)
 72    .fetch_one(&db)
 73    .await
 74    .expect("failed to insert channel");
 75
 76    for user_id in zed_user_ids {
 77        sqlx::query(
 78            r#"
 79            INSERT INTO org_memberships
 80                (org_id, user_id, admin)
 81            VALUES
 82                ($1, $2, true)
 83            ON CONFLICT DO NOTHING
 84            "#,
 85        )
 86        .bind(zed_org_id)
 87        .bind(user_id)
 88        .execute(&db)
 89        .await
 90        .expect("failed to insert org membership");
 91
 92        sqlx::query(
 93            r#"
 94            INSERT INTO channel_memberships
 95                (channel_id, user_id, admin)
 96            VALUES
 97                ($1, $2, true)
 98            ON CONFLICT DO NOTHING
 99            "#,
100        )
101        .bind(general_channel_id)
102        .bind(user_id)
103        .execute(&db)
104        .await
105        .expect("failed to insert channel membership");
106    }
107}