File size: 3,207 Bytes
6858ec5
1eb186a
6858ec5
 
 
 
 
 
 
 
 
 
b772fd3
 
 
d94c6df
f102c60
 
6858ec5
 
1eb186a
f102c60
 
 
6858ec5
 
 
 
f102c60
 
 
b772fd3
 
 
 
6858ec5
 
 
 
b772fd3
 
1eb186a
6858ec5
b772fd3
 
f102c60
 
 
6858ec5
f102c60
 
 
 
 
 
 
 
 
 
b772fd3
 
 
 
 
 
 
1eb186a
 
 
b772fd3
6858ec5
b772fd3
1eb186a
 
 
 
 
 
6858ec5
 
b772fd3
 
 
 
1eb186a
6858ec5
1eb186a
 
 
 
 
 
 
6858ec5
b772fd3
 
1eb186a
 
 
 
6858ec5
b772fd3
 
 
 
 
6858ec5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
use chrono::{ Local, FixedOffset, Utc };
use migration::Expr;
use sea_orm::{
    ActiveModelTrait,
    DbConn,
    DbErr,
    DeleteResult,
    EntityTrait,
    PaginatorTrait,
    QueryOrder,
    UpdateResult,
};
use sea_orm::ActiveValue::Set;
use sea_orm::QueryFilter;
use sea_orm::ColumnTrait;
use crate::entity::dialog_info;
use crate::entity::dialog_info::Entity;

fn now() -> chrono::DateTime<FixedOffset> {
    Utc::now().with_timezone(&FixedOffset::east_opt(3600 * 8).unwrap())
}
pub struct Query;

impl Query {
    pub async fn find_dialog_info_by_id(
        db: &DbConn,
        id: i64
    ) -> Result<Option<dialog_info::Model>, DbErr> {
        Entity::find_by_id(id).one(db).await
    }

    pub async fn find_dialog_infos(db: &DbConn) -> Result<Vec<dialog_info::Model>, DbErr> {
        Entity::find().all(db).await
    }

    pub async fn find_dialog_infos_by_uid(
        db: &DbConn,
        uid: i64
    ) -> Result<Vec<dialog_info::Model>, DbErr> {
        Entity::find()
            .filter(dialog_info::Column::Uid.eq(uid))
            .filter(dialog_info::Column::IsDeleted.eq(false))
            .all(db).await
    }

    pub async fn find_dialog_infos_in_page(
        db: &DbConn,
        page: u64,
        posts_per_page: u64
    ) -> Result<(Vec<dialog_info::Model>, u64), DbErr> {
        // Setup paginator
        let paginator = Entity::find()
            .order_by_asc(dialog_info::Column::DialogId)
            .paginate(db, posts_per_page);
        let num_pages = paginator.num_pages().await?;

        // Fetch paginated posts
        paginator.fetch_page(page - 1).await.map(|p| (p, num_pages))
    }
}

pub struct Mutation;

impl Mutation {
    pub async fn create_dialog_info(
        db: &DbConn,
        uid: i64,
        kb_id: i64,
        name: &String
    ) -> Result<dialog_info::ActiveModel, DbErr> {
        (dialog_info::ActiveModel {
            dialog_id: Default::default(),
            uid: Set(uid),
            kb_id: Set(kb_id),
            dialog_name: Set(name.to_owned()),
            history: Set("".to_owned()),
            created_at: Set(now()),
            updated_at: Set(now()),
            is_deleted: Default::default(),
        }).save(db).await
    }

    pub async fn update_dialog_info_by_id(
        db: &DbConn,
        dialog_id: i64,
        dialog_name: &String,
        history: &String
    ) -> Result<UpdateResult, DbErr> {
        Entity::update_many()
            .col_expr(dialog_info::Column::DialogName, Expr::value(dialog_name))
            .col_expr(dialog_info::Column::History, Expr::value(history))
            .col_expr(dialog_info::Column::UpdatedAt, Expr::value(now()))
            .filter(dialog_info::Column::DialogId.eq(dialog_id))
            .exec(db).await
    }

    pub async fn delete_dialog_info(db: &DbConn, dialog_id: i64) -> Result<UpdateResult, DbErr> {
        Entity::update_many()
            .col_expr(dialog_info::Column::IsDeleted, Expr::value(true))
            .filter(dialog_info::Column::DialogId.eq(dialog_id))
            .exec(db).await
    }

    pub async fn delete_all_dialog_infos(db: &DbConn) -> Result<DeleteResult, DbErr> {
        Entity::delete_many().exec(db).await
    }
}