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}