prehnite_core/db/schema/app_global/
mod.rs

1#![doc = "アプリケーションのグローバル設定"]
2pub mod book_search_api;
3pub mod book_search_result;
4
5use crate::db::schema::app_global::book_search_api::BookSearchApi;
6use crate::db::schema::{TaskCategory, TaskTemplate};
7use crate::i18n::i18n;
8use sqlx::{Acquire, FromRow, SqliteConnection, SqliteTransaction};
9
10/// タスクカテゴリの初期値を登録します。
11async fn register_default_data_task_categories(
12    tx: &mut SqliteTransaction<'_>,
13) -> Result<(), sqlx::Error> {
14    sqlx::query("INSERT INTO task_categories(id, name, autocomplete_paragraph_link) VALUES (?,?,?), (?,?,?)")
15        .bind(1)
16        .bind(i18n("task-category-foreshadowing"))
17        .bind(true)
18        .bind(2)
19        .bind(i18n("task-category-unexplained"))
20        .bind(true)
21        .execute(&mut **tx).await?;
22    Ok(())
23}
24
25/// タスクカテゴリとタスクテンプレートの初期値を登録します。
26pub async fn register_default_data_task_category_and_templates(
27    tx: &mut SqliteTransaction<'_>,
28) -> Result<(), sqlx::Error> {
29    register_default_data_task_categories(tx).await?;
30    let values = vec![
31        TaskTemplate {
32            id: 1,
33            task_category: Some(TaskCategory {
34                id: 1,
35                ..Default::default()
36            }),
37            title: i18n("task-template-recover"),
38            detail: Some(i18n("task-template-recover-detail")),
39        },
40        TaskTemplate {
41            id: 2,
42            task_category: Some(TaskCategory {
43                id: 2,
44                ..Default::default()
45            }),
46            title: i18n("task-template-will-explain"),
47            detail: Some(i18n("task-template-will-explain-detail")),
48        },
49    ];
50    TaskTemplate::register_many(values.as_slice(), &mut *tx, false).await?;
51    Ok(())
52}
53
54/// BookSearchAPIの設定例を登録します。
55pub async fn register_default_data_book_search_api(
56    tx: &mut SqliteTransaction<'_>,
57) -> Result<(), sqlx::Error> {
58    BookSearchApi {
59        id: 0,
60        name: i18n("book-search-api-example-name"),
61        detail: i18n("book-search-api-example-detail"),
62        isbn_url: "https://example.com/api/book?isbn=<isbn>".to_string(),
63        text_url: "https://example.com/api/book?search=<text>".to_string(),
64        mapping_script: r#"fn mapper(isbn, search_text, response){
65    let x = [];
66    for result in response.result {
67        x += new_res(
68            result.isbn, // isbn
69            "", // url
70            result.title, // title
71            result.detail, // detail
72            result.authors, // authors
73            (), // publisher (Option::None)
74            result.publication_date, // publication date
75        )
76    }
77    x
78}"#
79        .to_string(),
80        is_example: true,
81    }
82    .register(&mut *tx, false)
83    .await?;
84    Ok(())
85}
86
87/// すべての初期データを登録します。
88pub async fn register_all_default_data(conn: &mut SqliteConnection) -> Result<(), sqlx::Error> {
89    let mut tx = conn.begin().await?;
90    register_default_data_task_category_and_templates(&mut tx).await?;
91    register_default_data_book_search_api(&mut tx).await?;
92    tx.commit().await
93}
94
95#[cfg(test)]
96mod tests {
97    use crate::db::schema::app_global::register_all_default_data;
98    use crate::i18n::initialize_i18n_from_db_with_conn;
99    use sqlx::SqlitePool;
100
101    #[sqlx::test(migrator = "crate::db::migrate::app_global::MIGRATOR")]
102    async fn valid_register_all_default_data(pool: SqlitePool) {
103        let mut conn = pool.acquire().await.unwrap();
104        initialize_i18n_from_db_with_conn(&mut *conn).await;
105        register_all_default_data(&mut *conn).await.unwrap();
106    }
107}