Skip to content

Commit 0d1d1d7

Browse files
committed
Add: Graphql queries for retrieving attendance
1 parent 3444f43 commit 0d1d1d7

File tree

12 files changed

+147
-74
lines changed

12 files changed

+147
-74
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7-
async-graphql = "7.0.6"
7+
async-graphql = { version = "7.0.6", features = ["chrono"] }
88
async-graphql-axum = "7.0.6"
99
axum = "0.7.3"
10+
chrono = "0.4.38"
1011
serde = { version = "1.0.188", features = ["derive"] }
1112
shuttle-axum = "0.46.0"
1213
shuttle-runtime = "0.46.0"

migrations/20240626151806_create_members.sql

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-- migrations/YYYYMMDDHHMMSS_create_member_table.sql
2+
3+
CREATE TABLE Member (
4+
id SERIAL PRIMARY KEY,
5+
rollno VARCHAR(20) NOT NULL,
6+
name VARCHAR(255) NOT NULL,
7+
hostel VARCHAR(255) NOT NULL,
8+
email VARCHAR(255) NOT NULL UNIQUE,
9+
sex VARCHAR(10) NOT NULL,
10+
year INT NOT NULL,
11+
created_at TIMESTAMP DEFAULT NOW()
12+
);
13+
14+
CREATE TABLE Attendance (
15+
id INT REFERENCES Member(id),
16+
date DATE NOT NULL,
17+
timein TIME NOT NULL,
18+
timeout TIME NOT NULL,
19+
PRIMARY KEY (id, date)
20+
);
21+

src/db/attendance.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
use sqlx::FromRow;
2+
use async_graphql::SimpleObject;
3+
4+
#[derive(FromRow, SimpleObject)]
5+
pub struct Attendance {
6+
pub id: i32,
7+
pub date: String,
8+
pub timein: String,
9+
pub timeout: String,
10+
}

src/db/member.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
use sqlx::FromRow;
2+
use async_graphql::SimpleObject;
3+
4+
#[derive(FromRow, SimpleObject)]
5+
pub struct Member {
6+
pub id: i32,
7+
pub rollno: String,
8+
pub name: String,
9+
pub hostel: String,
10+
pub email: String,
11+
pub sex: String,
12+
pub year: i32,
13+
}

src/db/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pub mod member;
2+
pub mod attendance;

src/graphql/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pub mod mutations;
2+
pub mod query;

src/graphql/mutations.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
use async_graphql::{Context, Object};
2+
use sqlx::PgPool;
3+
use std::sync::Arc;
4+
5+
use crate::db::member::Member;
6+
7+
pub struct MutationRoot;
8+
9+
#[Object]
10+
impl MutationRoot {
11+
async fn add_member(
12+
&self,
13+
ctx: &Context<'_>,
14+
rollno: String,
15+
name: String,
16+
hostel: String,
17+
email: String,
18+
sex: String,
19+
year: i32
20+
) -> Result<Member, sqlx::Error> {
21+
let pool = ctx.data::<Arc<PgPool>>().expect("Pool not found in context");
22+
23+
let member = sqlx::query_as::<_, Member>(
24+
"INSERT INTO Member (rollno, name, hostel, email, sex, year) VALUES ($1, $2, $3, $4, $5, $6) RETURNING *"
25+
)
26+
.bind(rollno)
27+
.bind(name)
28+
.bind(hostel)
29+
.bind(email)
30+
.bind(sex)
31+
.bind(year)
32+
.fetch_one(pool.as_ref())
33+
.await?;
34+
35+
Ok(member)
36+
}
37+
}

src/graphql/query.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use async_graphql::{Context, Object};
2+
use sqlx::PgPool;
3+
use std::sync::Arc;
4+
5+
use crate::db::{member::Member, attendance::Attendance};
6+
7+
pub struct QueryRoot;
8+
9+
#[Object]
10+
impl QueryRoot {
11+
async fn get_users(&self, ctx: &Context<'_>) -> Result<Vec<Member>, sqlx::Error> {
12+
let pool = ctx.data::<Arc<PgPool>>().expect("Pool not found in context");
13+
let users = sqlx::query_as::<_, Member>("SELECT * FROM Member")
14+
.fetch_all(pool.as_ref())
15+
.await?;
16+
Ok(users)
17+
}
18+
19+
async fn get_attendance(&self, ctx: &Context<'_>, date: String) -> Result<Vec<Attendance>, sqlx::Error> {
20+
let pool = ctx.data::<Arc<PgPool>>().expect("Pool not found in context");
21+
let attendance_list = sqlx::query_as::<_, Attendance>("SELECT id, date, timein, timeout FROM Attendance WHERE date = $1")
22+
.bind(date)
23+
.fetch_all(pool.as_ref())
24+
.await?;
25+
Ok(attendance_list)
26+
}
27+
}

0 commit comments

Comments
 (0)