Skip to content

Commit

Permalink
Fixed a bug related to attendance streak
Browse files Browse the repository at this point in the history
  • Loading branch information
he1senbrg committed Dec 29, 2024
1 parent e1ca4bb commit 300630f
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 101 deletions.
181 changes: 81 additions & 100 deletions src/attendance/scheduled_task.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use chrono::{Local, NaiveTime};
use chrono::{Datelike, Local, NaiveTime};
use chrono_tz::Asia::Kolkata;
use sqlx::PgPool;
use std::sync::Arc;
Expand Down Expand Up @@ -94,107 +94,88 @@ pub async fn scheduled_task(pool: Arc<PgPool>) {
Err(e) => eprintln!("Failed to update leaderboard: {:?}", e),
}

let present_attendance = sqlx::query_scalar::<_, i64>(
r#"
SELECT COUNT(*)
FROM Attendance
WHERE id = $1
AND is_present = true
AND date = (CURRENT_DATE AT TIME ZONE 'Asia/Kolkata') - INTERVAL '1 day'
"#,
)
.bind(member.id)
.fetch_one(pool.as_ref())
.await;

match present_attendance {
Ok(1) => {
let existing_streak = sqlx::query_scalar::<_, i32>(
r#"
SELECT streak
FROM AttendanceStreak
WHERE member_id = $1
AND month = date_trunc('month', CURRENT_DATE::date)
"#,
)
.bind(member.id)
.fetch_optional(pool.as_ref())
.await;

match existing_streak {
Ok(Some(streak)) => {
let update_streak = sqlx::query(
r#"
UPDATE AttendanceStreak
SET streak = $1
WHERE member_id = $2
AND month = date_trunc('month', CURRENT_DATE::date)
"#,
)
.bind(streak + 1)
.bind(member.id)
.execute(pool.as_ref())
.await;

match update_streak {
Ok(_) => println!("Attendance streak incremented for member ID: {}", member.id),
Err(e) => eprintln!(
"Failed to update Attendance streak for member ID: {}: {:?}",
member.id, e
),
}
}
Ok(None) => {
let insert_streak = sqlx::query(
r#"
INSERT INTO AttendanceStreak (member_id, month, streak)
VALUES ($1, date_trunc('month', CURRENT_DATE::date), $2)
"#,
)
.bind(member.id)
.bind(1)
.execute(pool.as_ref())
.await;

match insert_streak {
Ok(_) => println!("Attendance streak created for member ID: {}", member.id),
Err(e) => eprintln!(
"Failed to create Attendance streak for member ID: {}: {:?}",
member.id, e
),
}
}
Err(e) => eprintln!("Error checking existing streak for member ID: {}: {:?}", member.id, e),
}
}
Ok(0) => {
let ensure_streak = sqlx::query(
r#"
INSERT INTO AttendanceStreak (member_id, month, streak)
VALUES ($1, date_trunc('month', CURRENT_DATE::date), $2)
ON CONFLICT (member_id, month) DO NOTHING
"#,
)
.bind(member.id)
.bind(0)
.execute(pool.as_ref())
.await;

match ensure_streak {
Ok(_) => println!("Attendance streak ensured for member ID: {}", member.id),
Err(e) => eprintln!(
"Failed to ensure Attendance streak for member ID: {}: {:?}",
member.id, e
),
}
}
Ok(_) => {
eprintln!("Unexpected attendance value for member ID: {}", member.id);
}
Err(e) => eprintln!("Error checking attendance for member ID: {}: {:?}", member.id, e),
}
// Update attendance streak
update_attendance_streak(member.id, pool.as_ref()).await;
}
}
Err(e) => eprintln!("Failed to fetch members: {:?}", e),
}
}

// Function to update attendance streak
async fn update_attendance_streak(member_id: i32, pool: &sqlx::PgPool) {
let today = chrono::Local::now().with_timezone(&chrono_tz::Asia::Kolkata).naive_local();
let yesterday = today.checked_sub_signed(chrono::Duration::hours(12)).unwrap().date();

if today.day() == 1 {
let _ = sqlx::query(
r#"
INSERT INTO AttendanceStreak (member_id, month, streak)
VALUES ($1, date_trunc('month', $2::date AT TIME ZONE 'Asia/Kolkata'), 0)
"#,
)
.bind(member_id)
.bind(today)
.execute(pool)
.await;
println!("Attendance streak created for member ID: {}", member_id);
}

let present_attendance = sqlx::query_scalar::<_, i64>(
r#"
SELECT COUNT(*)
FROM Attendance
WHERE id = $1
AND is_present = true
AND date = $2
"#,
)
.bind(member_id)
.bind(yesterday)
.fetch_one(pool)
.await;

match present_attendance {
Ok(1) => {
let existing_streak = sqlx::query_scalar::<_, i32>(
r#"
SELECT streak
FROM AttendanceStreak
WHERE member_id = $1
AND month = date_trunc('month', $2::date AT TIME ZONE 'Asia/Kolkata')
"#,
)
.bind(member_id)
.bind(today)
.fetch_optional(pool)
.await;

match existing_streak {
Ok(Some(streak)) => {
let _ = sqlx::query(
r#"
UPDATE AttendanceStreak
SET streak = $1
WHERE member_id = $2
AND month = date_trunc('month', $3::date AT TIME ZONE 'Asia/Kolkata')
"#,
)
.bind(streak + 1)
.bind(member_id)
.bind(today)
.execute(pool)
.await;
}
Ok(None) => {
println!("No streak found for member ID: {}", member_id);
}
Err(e) => eprintln!("Error checking streak for member ID {}: {:?}", member_id, e),
}
}
Ok(0) => {
println!("Sreak not incremented for member ID: {}", member_id);
}
Ok(_) => eprintln!("Unexpected attendance value for member ID: {}", member_id),
Err(e) => eprintln!("Error checking attendance for member ID {}: {:?}", member_id, e),
}
}
1 change: 0 additions & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ async fn main(
.with_state(state)
.layer(cors);
task::spawn(async move {
scheduled_task(pool.clone()).await;
schedule_task_at_midnight(pool.clone()).await; // Call the function after 10 seconds
});
Ok(router.into())
Expand Down

0 comments on commit 300630f

Please sign in to comment.