seed.rs

 1use db::{Db, UserId};
 2use rand::prelude::*;
 3use tide::log;
 4use time::{Duration, OffsetDateTime};
 5
 6#[allow(unused)]
 7#[path = "../db.rs"]
 8mod db;
 9#[path = "../env.rs"]
10mod env;
11
12#[async_std::main]
13async fn main() {
14    if let Err(error) = env::load_dotenv() {
15        log::error!(
16            "error loading .env.toml (this is expected in production): {}",
17            error
18        );
19    }
20
21    let mut rng = StdRng::from_entropy();
22    let database_url = std::env::var("DATABASE_URL").expect("missing DATABASE_URL env var");
23    let db = Db::new(&database_url, 5)
24        .await
25        .expect("failed to connect to postgres database");
26
27    let zed_users = ["nathansobo", "maxbrunsfeld", "as-cii", "iamnbutler"];
28    let mut zed_user_ids = Vec::<UserId>::new();
29    for zed_user in zed_users {
30        if let Some(user_id) = db.get_user(zed_user).await.expect("failed to fetch user") {
31            zed_user_ids.push(user_id);
32        } else {
33            zed_user_ids.push(
34                db.create_user(zed_user, true)
35                    .await
36                    .expect("failed to insert user"),
37            );
38        }
39    }
40
41    let zed_org_id = if let Some(org) = db
42        .find_org_by_slug("zed")
43        .await
44        .expect("failed to fetch org")
45    {
46        org.id
47    } else {
48        db.create_org("Zed", "zed")
49            .await
50            .expect("failed to insert org")
51    };
52
53    let general_channel_id = if let Some(channel) = db
54        .get_org_channels(zed_org_id)
55        .await
56        .expect("failed to fetch channels")
57        .iter()
58        .find(|c| c.name == "General")
59    {
60        channel.id
61    } else {
62        let channel_id = db
63            .create_org_channel(zed_org_id, "General")
64            .await
65            .expect("failed to insert channel");
66
67        let now = OffsetDateTime::now_utc();
68        let max_seconds = Duration::days(100).as_seconds_f64();
69        let mut timestamps = (0..1000)
70            .map(|_| now - Duration::seconds_f64(rng.gen_range(0_f64..=max_seconds)))
71            .collect::<Vec<_>>();
72        timestamps.sort();
73        for timestamp in timestamps {
74            let sender_id = *zed_user_ids.choose(&mut rng).unwrap();
75            let body = lipsum::lipsum_words(rng.gen_range(1..=50));
76            db.create_channel_message(channel_id, sender_id, &body, timestamp, rng.gen())
77                .await
78                .expect("failed to insert message");
79        }
80        channel_id
81    };
82
83    for user_id in zed_user_ids {
84        db.add_org_member(zed_org_id, user_id, true)
85            .await
86            .expect("failed to insert org membership");
87        db.add_channel_member(general_channel_id, user_id, true)
88            .await
89            .expect("failed to insert channel membership");
90    }
91}