tdm_server_rust/runner/
test_member_seed_runner.rs1use bcrypt::{hash, DEFAULT_COST};
4use sqlx::{PgPool, Row};
5
6struct TestMember {
8 username: &'static str,
10 email: &'static str,
12 intern: i16,
14 post_ids: &'static [i32],
16}
17
18pub async fn run(pool: &PgPool) -> anyhow::Result<()> {
20 let pwd_hash = hash("123456", DEFAULT_COST)?;
21 let members = [
22 TestMember {
23 username: "Gum979",
24 email: "979437491",
25 intern: 0,
26 post_ids: &[3, 4, 6],
27 },
28 TestMember {
29 username: "翻译",
30 email: "role1@tdm.test",
31 intern: 1,
32 post_ids: &[1],
33 },
34 TestMember {
35 username: "校对",
36 email: "role2@tdm.test",
37 intern: 1,
38 post_ids: &[2],
39 },
40 TestMember {
41 username: "嵌字",
42 email: "role3@tdm.test",
43 intern: 1,
44 post_ids: &[3],
45 },
46 TestMember {
47 username: "时轴",
48 email: "role6@tdm.test",
49 intern: 1,
50 post_ids: &[6],
51 },
52 TestMember {
53 username: "管理员",
54 email: "role4@tdm.test",
55 intern: 1,
56 post_ids: &[4],
57 },
58 TestMember {
59 username: "其他人员",
60 email: "role5@tdm.test",
61 intern: 1,
62 post_ids: &[5],
63 },
64 ];
65 for m in members {
66 seed_one(pool, m.username, m.email, m.intern, &pwd_hash, m.post_ids).await?;
67 }
68 Ok(())
69}
70
71async fn seed_one(
73 pool: &PgPool,
74 username: &str,
75 email: &str,
76 intern: i16,
77 pwd_hash: &str,
78 post_ids: &[i32],
79) -> anyhow::Result<()> {
80 let exists: Option<i32> =
81 sqlx::query_scalar("SELECT \"Id\" FROM membertb WHERE lower(username) = lower($1)")
82 .bind(username)
83 .fetch_optional(pool)
84 .await?;
85 let member_id = if let Some(id) = exists {
86 id
87 } else {
88 let row = sqlx::query(
89 "INSERT INTO membertb(username, password, intern, email, \"registrationTime\") \
90 VALUES ($1, $2, $3, $4, CURRENT_TIMESTAMP) RETURNING \"Id\"",
91 )
92 .bind(username)
93 .bind(pwd_hash)
94 .bind(intern)
95 .bind(email)
96 .fetch_one(pool)
97 .await?;
98 row.get("Id")
99 };
100 for post_id in post_ids {
101 sqlx::query(
102 "INSERT INTO memberpost(\"memberId\", \"postId\") VALUES ($1, $2) \
103 ON CONFLICT (\"memberId\", \"postId\") DO NOTHING",
104 )
105 .bind(member_id)
106 .bind(post_id)
107 .execute(pool)
108 .await?;
109 }
110 Ok(())
111}