Skip to content

Commit e111e13

Browse files
committed
updated code to return member object
1 parent 9f0f606 commit e111e13

File tree

6 files changed

+69
-52
lines changed

6 files changed

+69
-52
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.
Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,26 @@
1-
use std::sync::Arc;
2-
3-
use crate::models::attendance::{Attendance, AttendanceWithMember};
4-
use async_graphql::{Context, Object, Result};
1+
use crate::models::attendance::Attendance;
2+
use crate::models::member::Member;
3+
use async_graphql::{ComplexObject, Context, Object, Result};
54
use chrono::NaiveDate;
65
use sqlx::PgPool;
6+
use std::sync::Arc;
77

88
#[derive(Default)]
99
pub struct AttendanceQueries;
1010

11+
#[ComplexObject]
12+
impl Attendance {
13+
async fn member(&self, ctx: &Context<'_>) -> Result<Member> {
14+
let pool = ctx.data::<Arc<PgPool>>()?;
15+
let member = sqlx::query_as::<_, Member>("SELECT * FROM Member WHERE member_id = $1")
16+
.bind(self.member_id)
17+
.fetch_one(pool.as_ref())
18+
.await?;
19+
20+
Ok(member)
21+
}
22+
}
23+
1124
#[Object]
1225
impl AttendanceQueries {
1326
async fn attendance(&self, ctx: &Context<'_>, member_id: i32) -> Result<Vec<Attendance>> {
@@ -25,20 +38,14 @@ impl AttendanceQueries {
2538
&self,
2639
ctx: &Context<'_>,
2740
date: NaiveDate,
28-
) -> Result<Vec<AttendanceWithMember>> {
29-
let pool = ctx.data::<Arc<PgPool>>().expect("Pool must be in context.");
41+
) -> Result<Vec<Attendance>> {
42+
let pool = ctx.data::<Arc<PgPool>>()?;
3043

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",
37-
)
38-
.bind(date)
39-
.fetch_all(pool.as_ref())
40-
.await?;
44+
let rows = sqlx::query_as::<_, Attendance>("SELECT * FROM Attendance WHERE date = $1")
45+
.bind(date)
46+
.fetch_all(pool.as_ref())
47+
.await?;
4148

42-
Ok(records)
49+
Ok(rows)
4350
}
4451
}

src/graphql/queries/streak_queries.rs

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,27 @@
1-
use std::sync::Arc;
2-
1+
use crate::models::member::Member;
32
use crate::models::status_update::StatusUpdateHistory;
43
use crate::models::status_update::StatusUpdateStreak as Streak;
5-
use async_graphql::{Context, Object, Result};
4+
use async_graphql::{ComplexObject, Context, Object, Result};
5+
use chrono::NaiveDate;
66
use sqlx::PgPool;
7+
use std::sync::Arc;
78

89
#[derive(Default)]
910
pub struct StreakQueries;
1011

12+
#[ComplexObject]
13+
impl StatusUpdateHistory {
14+
async fn member(&self, ctx: &Context<'_>) -> Result<Member> {
15+
let pool = ctx.data::<Arc<PgPool>>()?;
16+
let member = sqlx::query_as::<_, Member>("SELECT * FROM Member WHERE member_id = $1")
17+
.bind(self.member_id)
18+
.fetch_one(pool.as_ref())
19+
.await?;
20+
21+
Ok(member)
22+
}
23+
}
24+
1125
#[Object]
1226
impl StreakQueries {
1327
async fn streak(&self, ctx: &Context<'_>, member_id: i32) -> Result<Streak> {
@@ -46,13 +60,18 @@ impl StreakQueries {
4660
.await?)
4761
}
4862

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.");
63+
async fn status_update_history(
64+
&self,
65+
ctx: &Context<'_>,
66+
date: NaiveDate,
67+
) -> Result<Vec<StatusUpdateHistory>> {
68+
let pool = ctx.data::<Arc<PgPool>>()?;
5169

52-
Ok(
53-
sqlx::query_as::<_, StatusUpdateHistory>("SELECT * FROM StatusUpdateHistory")
54-
.fetch_all(pool.as_ref())
55-
.await?,
56-
)
70+
let rows = sqlx::query_as::<_, StatusUpdateHistory>("SELECT * FROM StatusUpdateHistory")
71+
.bind(date)
72+
.fetch_all(pool.as_ref())
73+
.await?;
74+
75+
Ok(rows)
5776
}
5877
}

src/models/attendance.rs

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
33
use sqlx::FromRow;
44

55
#[derive(SimpleObject, FromRow)]
6+
#[graphql(complex)]
67
pub struct Attendance {
78
pub attendance_id: i32,
9+
#[graphql(skip)]
810
pub member_id: i32,
911
pub date: NaiveDate,
1012
pub is_present: bool,
@@ -45,16 +47,3 @@ pub struct MarkAttendanceInput {
4547
pub date: NaiveDate,
4648
pub hmac_signature: String,
4749
}
48-
49-
#[derive(SimpleObject, FromRow)]
50-
pub struct AttendanceWithMember {
51-
pub attendance_id: i32,
52-
pub member_id: i32,
53-
pub date: NaiveDate,
54-
pub is_present: bool,
55-
pub time_in: Option<NaiveTime>,
56-
pub time_out: Option<NaiveTime>,
57-
pub name: String,
58-
pub year: i32,
59-
pub group_id: i32,
60-
}

src/models/status_update.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ pub struct StreakInput {
2121
}
2222

2323
#[derive(SimpleObject, FromRow)]
24+
#[graphql(complex)]
2425
pub struct StatusUpdateHistory {
2526
pub update_id: i32,
27+
#[graphql(skip)]
2628
pub member_id: i32,
2729
pub is_updated: bool,
2830
pub date: NaiveDate,

0 commit comments

Comments
 (0)