leetcode_tui_rs/
utils.rs

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
use api::{GQLLeetcodeRequest, QuestionRequest};
use color_eyre::Result;
use kdam::BarExt;
use leetcode_core as api;
use leetcode_tui_db::DbQuestion;

pub async fn update_database_questions() -> Result<()> {
    let mut db_question_count = 0;

    if let Ok(c) = DbQuestion::get_total_questions() {
        db_question_count = c as i32;
    }

    let query = api::QuestionRequest::default();
    let query_response = query.send().await?;
    let total_questions = query_response.get_total_questions();

    if db_question_count == total_questions {
        return Ok(());
    }

    println!(
        "Questions found in db: {}\nQuestions found in api: {}, Updating",
        db_question_count, total_questions
    );

    let mut skip = 0;
    let chunk_size = 100;
    let mut pb = kdam::tqdm!(total = total_questions as usize);

    loop {
        let resp = QuestionRequest::new(chunk_size, skip).send().await?;
        let questions = resp.get_questions();
        if questions.is_empty() {
            break;
        }
        let mut db_questions = questions
            .into_iter()
            .map(|q| q.try_into().unwrap())
            .collect::<Vec<DbQuestion>>();
        for question in db_questions.iter_mut() {
            question.save_to_db()?;
            pb.update(1)?;
        }
        skip += chunk_size;
    }
    eprintln!();

    Ok(())
}