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