Skip to main content

tdm_server_rust/runner/
test_member_seed_runner.rs

1//! 测试角色账号种子数据(对齐 WebBack-end README 测试账号)
2
3use bcrypt::{hash, DEFAULT_COST};
4use sqlx::{PgPool, Row};
5
6/// 测试角色:用户名、邮箱、职阶、岗位 ID 列表
7struct TestMember {
8    /// 登录用户名
9    username: &'static str,
10    /// QQ/邮箱(唯一)
11    email: &'static str,
12    /// 职阶(intern)
13    intern: i16,
14    /// 岗位 postId 列表
15    post_ids: &'static [i32],
16}
17
18/// 预置测试账号(不存在则插入)
19pub 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
71/// 插入单个测试组员及其岗位
72async 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}