Skip to content

Commit

Permalink
updated the model to contain respected types
Browse files Browse the repository at this point in the history
  • Loading branch information
sabarixr committed Feb 13, 2025
1 parent 715bfef commit 613f104
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 15 deletions.
33 changes: 18 additions & 15 deletions src/graphql/queries/attendance_queries.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
use std::sync::Arc;
use chrono::NaiveDate;

use async_graphql::{Context, Object, Result};
use async_graphql::{Context, Object, Result, };
use sqlx::PgPool;

use crate::models::{attendance::Attendance, member::Member};
use crate::models::{attendance::{Attendance, AttendanceReport, DailyCount, MemberAttendanceSummary}, member::Member};


/// Sub-query for the [`Attendance`] table. The queries are:
/// * attendance - get a specific member's attendance details using their member_id, roll_no or discord_id
#[derive(Default)]
pub struct AttendanceQueries;



#[Object]
impl AttendanceQueries {
async fn attendance(
Expand Down Expand Up @@ -71,16 +75,16 @@ impl AttendanceQueries {
ctx: &Context<'_>,
start_date: String,
end_date: String,
) -> Result<AttendanceSummary> {
) -> Result<AttendanceReport> {
let pool = ctx.data::<Arc<PgPool>>().expect("Pool must be in context.");

let start = NaiveDate::parse_from_str(&start_date, "%Y-%m-%d")
.map_err(|_| async_graphql::Error::new("Invalid start_date format. Use YYYY-MM-DD"))?;
let end = NaiveDate::parse_from_str(&end_date, "%Y-%m-%d")
.map_err(|_| async_graphql::Error::new("Invalid end_date format. Use YYYY-MM-DD"))?;

let daily_count_query = sqlx::query!(
r#"
let daily_count_query = sqlx::query!(
r#"
WITH date_series AS (
SELECT generate_series($1::date, $2::date, '1 day'::interval)::date AS date
)
Expand All @@ -93,12 +97,12 @@ impl AttendanceQueries {
GROUP BY ds.date
ORDER BY ds.date
"#,
start,
end
)
.fetch_all(pool.as_ref())
.await?;
start,
end
)
.fetch_all(pool.as_ref())
.await?;

let daily_count = daily_count_query
.into_iter()
.map(|row| DailyCount {
Expand All @@ -107,7 +111,7 @@ impl AttendanceQueries {
})
.collect();

let member_attendance_query = sqlx::query!(
let member_attendance_query = sqlx::query!(
r#"
SELECT
m.member_id as "id!",
Expand All @@ -122,7 +126,6 @@ impl AttendanceQueries {
)
.fetch_all(pool.as_ref())
.await?;


let member_attendance = member_attendance_query
.into_iter()
Expand All @@ -147,9 +150,9 @@ impl AttendanceQueries {
.fetch_all(pool.as_ref())
.await?;

let count:i32 = max_days.len() as i32;
let count: i32 = max_days.len() as i32;

Ok(AttendanceSummary {
Ok(AttendanceReport {
daily_count,
member_attendance,
max_days: count,
Expand Down
21 changes: 21 additions & 0 deletions src/models/attendance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,24 @@ pub struct MarkAttendanceInput {
pub date: NaiveDate,
pub hmac_signature: String,
}

#[derive(SimpleObject)]
pub struct DailyCount {
pub date: String,
pub count: i32,
}

#[derive(SimpleObject)]
pub struct MemberAttendanceSummary {
pub id: i32,
pub name: String,
pub present_days: i32,
}

#[derive(SimpleObject)]
pub struct AttendanceReport {
pub daily_count: Vec<DailyCount>,
pub member_attendance: Vec<MemberAttendanceSummary>,
pub max_days: i32,
}

0 comments on commit 613f104

Please sign in to comment.