Skip to content

Commit e81deea

Browse files
committed
updated code to return member object
Update .env.sample Updated Updated code to return Member Object
1 parent 9f0f606 commit e81deea

File tree

6 files changed

+156
-33
lines changed

6 files changed

+156
-33
lines changed

.env.sample

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ POSTGRES_HOST=localhost
88
ROOT_DB_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:5432/${POSTGRES_DB}
99
RUST_ENV=development
1010
ROOT_SECRET=insecuresecret123 # Used to verify origin of attendance mutations
11-
ROOT_PORT=3000
11+
ROOT_PORT=8000

Cargo.lock

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/graphql/queries/attendance_queries.rs

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::sync::Arc;
22

3-
use crate::models::attendance::{Attendance, AttendanceWithMember};
3+
use crate::models::attendance::{Attendance, AttendanceMemberRow, AttendanceWithMember};
4+
use crate::models::member::Member;
45
use async_graphql::{Context, Object, Result};
56
use chrono::NaiveDate;
67
use sqlx::PgPool;
@@ -28,17 +29,43 @@ impl AttendanceQueries {
2829
) -> Result<Vec<AttendanceWithMember>> {
2930
let pool = ctx.data::<Arc<PgPool>>().expect("Pool must be in context.");
3031

31-
let records = sqlx::query_as::<_, AttendanceWithMember>(
32-
"SELECT att.attendance_id, att.member_id, att.date, att.is_present,
33-
att.time_in, att.time_out, mem.name, mem.year, mem.group_id
34-
FROM Attendance att
35-
JOIN Member mem ON att.member_id = mem.member_id
36-
WHERE att.date = $1",
32+
let rows: Vec<AttendanceMemberRow> = sqlx::query_as(
33+
r#"
34+
SELECT * FROM Attendance att JOIN Member mem ON att.member_id = mem.member_id WHERE att.date = $1
35+
"#,
3736
)
3837
.bind(date)
3938
.fetch_all(pool.as_ref())
4039
.await?;
4140

42-
Ok(records)
41+
let result = rows
42+
.into_iter()
43+
.map(|r| AttendanceWithMember {
44+
attendance_id: r.attendance_id,
45+
member_id: r.member_id,
46+
date: r.date,
47+
is_present: r.is_present,
48+
time_in: r.time_in,
49+
time_out: r.time_out,
50+
created_at: r.created_at,
51+
updated_at: r.updated_at,
52+
member: Member {
53+
member_id: r.mem_member_id,
54+
roll_no: r.mem_roll_no,
55+
name: r.mem_name,
56+
email: r.mem_email,
57+
sex: r.mem_sex,
58+
year: r.mem_year,
59+
hostel: r.mem_hostel,
60+
mac_address: r.mem_mac_address,
61+
discord_id: r.mem_discord_id,
62+
group_id: r.mem_group_id,
63+
track: r.mem_track,
64+
created_at: r.mem_created_at,
65+
},
66+
})
67+
.collect();
68+
69+
Ok(result)
4370
}
4471
}

src/graphql/queries/streak_queries.rs

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use std::sync::Arc;
22

3-
use crate::models::status_update::StatusUpdateHistory;
3+
use crate::models::member::Member;
44
use crate::models::status_update::StatusUpdateStreak as Streak;
5+
use crate::models::status_update::{
6+
StatusUpdateHistory, StatusUpdateHistoryMemberRow, StatusUpdateHistoryWithMember,
7+
};
58
use async_graphql::{Context, Object, Result};
69
use sqlx::PgPool;
710

@@ -46,13 +49,45 @@ impl StreakQueries {
4649
.await?)
4750
}
4851

49-
async fn status_update_history(&self, ctx: &Context<'_>) -> Result<Vec<StatusUpdateHistory>> {
50-
let pool = ctx.data::<Arc<PgPool>>().expect("Pool must be in context.");
52+
async fn status_update_history(
53+
&self,
54+
ctx: &Context<'_>,
55+
) -> Result<Vec<StatusUpdateHistoryWithMember>> {
56+
{
57+
let pool = ctx.data::<Arc<PgPool>>().expect("Pool must be in context.");
58+
let rows: Vec<StatusUpdateHistoryMemberRow> = sqlx::query_as(
59+
r#"
60+
SELECT * FROM StatusUpdateHistory status JOIN Member mem ON status.member_id = mem.member_id
61+
"#,
62+
)
63+
.fetch_all(pool.as_ref())
64+
.await?;
5165

52-
Ok(
53-
sqlx::query_as::<_, StatusUpdateHistory>("SELECT * FROM StatusUpdateHistory")
54-
.fetch_all(pool.as_ref())
55-
.await?,
56-
)
66+
let result = rows
67+
.into_iter()
68+
.map(|r| StatusUpdateHistoryWithMember {
69+
update_id: r.update_id,
70+
member_id: r.member_id,
71+
is_updated: r.is_updated,
72+
date: r.date,
73+
member: Member {
74+
member_id: r.mem_member_id,
75+
roll_no: r.mem_roll_no,
76+
name: r.mem_name,
77+
email: r.mem_email,
78+
sex: r.mem_sex,
79+
year: r.mem_year,
80+
hostel: r.mem_hostel,
81+
mac_address: r.mem_mac_address,
82+
discord_id: r.mem_discord_id,
83+
group_id: r.mem_group_id,
84+
track: r.mem_track,
85+
created_at: r.mem_created_at,
86+
},
87+
})
88+
.collect();
89+
90+
Ok(result)
91+
}
5792
}
5893
}

src/models/attendance.rs

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::models::member::Member;
12
use async_graphql::{InputObject, SimpleObject};
23
use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
34
use sqlx::FromRow;
@@ -46,15 +47,43 @@ pub struct MarkAttendanceInput {
4647
pub hmac_signature: String,
4748
}
4849

49-
#[derive(SimpleObject, FromRow)]
50+
#[derive(sqlx::FromRow)]
51+
pub struct AttendanceMemberRow {
52+
pub attendance_id: i32,
53+
pub member_id: i32,
54+
pub date: NaiveDate,
55+
pub is_present: bool,
56+
pub time_in: Option<NaiveTime>,
57+
pub time_out: Option<NaiveTime>,
58+
pub created_at: NaiveDateTime,
59+
pub updated_at: NaiveDateTime,
60+
61+
pub mem_member_id: i32,
62+
pub mem_roll_no: String,
63+
pub mem_name: String,
64+
pub mem_email: String,
65+
pub mem_sex: crate::models::member::Sex,
66+
pub mem_year: i32,
67+
pub mem_hostel: String,
68+
pub mem_mac_address: String,
69+
pub mem_discord_id: String,
70+
pub mem_group_id: i32,
71+
pub mem_track: Option<String>,
72+
pub mem_created_at: NaiveDateTime,
73+
}
74+
75+
#[derive(SimpleObject)]
5076
pub struct AttendanceWithMember {
5177
pub attendance_id: i32,
5278
pub member_id: i32,
5379
pub date: NaiveDate,
5480
pub is_present: bool,
5581
pub time_in: Option<NaiveTime>,
5682
pub time_out: Option<NaiveTime>,
57-
pub name: String,
58-
pub year: i32,
59-
pub group_id: i32,
83+
#[graphql(skip)]
84+
pub created_at: NaiveDateTime,
85+
#[graphql(skip)]
86+
pub updated_at: NaiveDateTime,
87+
88+
pub member: Member,
6089
}

src/models/status_update.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
use crate::models::member::Member;
12
use async_graphql::{InputObject, SimpleObject};
2-
use chrono::NaiveDate;
3+
use chrono::{NaiveDate, NaiveDateTime};
34
use sqlx::FromRow;
45

56
#[derive(SimpleObject, FromRow)]
@@ -27,3 +28,34 @@ pub struct StatusUpdateHistory {
2728
pub is_updated: bool,
2829
pub date: NaiveDate,
2930
}
31+
32+
#[derive(sqlx::FromRow)]
33+
pub struct StatusUpdateHistoryMemberRow {
34+
pub update_id: i32,
35+
pub member_id: i32,
36+
pub is_updated: bool,
37+
pub date: NaiveDate,
38+
39+
pub mem_member_id: i32,
40+
pub mem_roll_no: String,
41+
pub mem_name: String,
42+
pub mem_email: String,
43+
pub mem_sex: crate::models::member::Sex,
44+
pub mem_year: i32,
45+
pub mem_hostel: String,
46+
pub mem_mac_address: String,
47+
pub mem_discord_id: String,
48+
pub mem_group_id: i32,
49+
pub mem_track: Option<String>,
50+
pub mem_created_at: NaiveDateTime,
51+
}
52+
53+
#[derive(SimpleObject)]
54+
pub struct StatusUpdateHistoryWithMember {
55+
pub update_id: i32,
56+
pub member_id: i32,
57+
pub is_updated: bool,
58+
pub date: NaiveDate,
59+
60+
pub member: Member,
61+
}

0 commit comments

Comments
 (0)