seed.rs

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