Skip to content

Commit

Permalink
SQLX
Browse files Browse the repository at this point in the history
  • Loading branch information
jabbate19 committed Oct 13, 2024
1 parent 97543da commit d707d9a
Show file tree
Hide file tree
Showing 11 changed files with 134 additions and 67 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

70 changes: 52 additions & 18 deletions src/api/v1/event/car/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,7 @@ fn validate_car(car: &CreateCar, user: &String, other_cars: Vec<CarData>) -> Vec
if car.riders.len() > (car.max_capacity as usize) {
out.push("You have too many riders for your capacity.".to_string());
}
if car
.riders
.contains(user)
{
if car.riders.contains(user) {
out.push("You cannot be a rider in your own car.".to_string());
}
let other_car_members: Vec<String> = other_cars
Expand Down Expand Up @@ -128,7 +125,11 @@ async fn create_car(
CarData,
r#"SELECT car.id, car.event_id, car.max_capacity, car.departure_time, car.return_time, car.comment,
(driverUser.id, driverUser.realm::text, driverUser.name, driverUser.email) AS "driver!: UserData",
ARRAY_REMOVE(ARRAY_AGG(CASE WHEN riderUser.id IS NOT NULL THEN (riderUser.id, riderUser.realm::text, riderUser.name, riderUser.email) END), NULL) as "riders!: Vec<UserData>"
ARRAY_REMOVE(ARRAY_AGG(
CASE WHEN riderUser.id IS NOT NULL
THEN (riderUser.id, riderUser.realm::text, riderUser.name, riderUser.email)
END
), NULL) as "riders!: Vec<UserData>"
FROM car
JOIN users driverUser ON car.driver = driverUser.id
LEFT JOIN rider on car.id = rider.car_id
Expand All @@ -146,20 +147,30 @@ async fn create_car(

let record = query!(
r#"
INSERT INTO car (event_id, driver, max_capacity, departure_time, return_time, comment) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id
INSERT INTO car (event_id, driver, max_capacity, departure_time, return_time, comment)
VALUES ($1, $2, $3, $4, $5, $6) RETURNING id
"#,
event_id, user_id, car.max_capacity, car.departure_time, car.return_time, car.comment
event_id,
user_id,
car.max_capacity,
car.departure_time,
car.return_time,
car.comment
)
.fetch_one(&mut *tx)
.await.unwrap();

.await
.unwrap();

let _ = query!(
r#"
INSERT INTO rider (car_id, rider) SELECT $1, * FROM UNNEST($2::VARCHAR[])
"#,
record.id,
&car.riders
).execute(&mut *tx).await.unwrap();
)
.execute(&mut *tx)
.await
.unwrap();
tx.commit().await.unwrap();
HttpResponse::Ok().json(record.id)
}
Expand All @@ -179,7 +190,11 @@ async fn get_car(data: web::Data<AppState>, path: web::Path<(i32, i32)>) -> impl
CarData,
r#"SELECT car.id, car.event_id, car.max_capacity, car.departure_time, car.return_time, car.comment,
(driverUser.id, driverUser.realm::text, driverUser.name, driverUser.email) AS "driver!: UserData",
ARRAY_REMOVE(ARRAY_AGG(CASE WHEN riderUser.id IS NOT NULL THEN (riderUser.id, riderUser.realm::text, riderUser.name, riderUser.email) END), NULL) as "riders!: Vec<UserData>"
ARRAY_REMOVE(ARRAY_AGG(
CASE WHEN riderUser.id IS NOT NULL
THEN (riderUser.id, riderUser.realm::text, riderUser.name, riderUser.email)
END
), NULL) as "riders!: Vec<UserData>"
FROM car
JOIN users driverUser ON car.driver = driverUser.id
LEFT JOIN rider on car.id = rider.car_id
Expand Down Expand Up @@ -213,7 +228,11 @@ async fn get_all_cars(data: web::Data<AppState>, path: web::Path<i32>) -> impl R
CarData,
r#"SELECT car.id, car.event_id, car.max_capacity, car.departure_time, car.return_time, car.comment,
(driverUser.id, driverUser.realm::text, driverUser.name, driverUser.email) AS "driver!: UserData",
ARRAY_REMOVE(ARRAY_AGG(CASE WHEN riderUser.id IS NOT NULL THEN (riderUser.id, riderUser.realm::text, riderUser.name, riderUser.email) END), NULL) as "riders!: Vec<UserData>"
ARRAY_REMOVE(ARRAY_AGG(
CASE WHEN riderUser.id IS NOT NULL
THEN (riderUser.id, riderUser.realm::text, riderUser.name, riderUser.email)
END
), NULL) as "riders!: Vec<UserData>"
FROM car
JOIN users driverUser ON car.driver = driverUser.id
LEFT JOIN rider on car.id = rider.car_id
Expand Down Expand Up @@ -254,7 +273,11 @@ async fn update_car(
CarData,
r#"SELECT car.id, car.event_id, car.max_capacity, car.departure_time, car.return_time, car.comment,
(driverUser.id, driverUser.realm::text, driverUser.name, driverUser.email) AS "driver!: UserData",
ARRAY_REMOVE(ARRAY_AGG(CASE WHEN riderUser.id IS NOT NULL THEN (riderUser.id, riderUser.realm::text, riderUser.name, riderUser.email) END), NULL) as "riders!: Vec<UserData>"
ARRAY_REMOVE(ARRAY_AGG(
CASE WHEN riderUser.id IS NOT NULL
THEN (riderUser.id, riderUser.realm::text, riderUser.name, riderUser.email)
END
), NULL) as "riders!: Vec<UserData>"
FROM car
JOIN users driverUser ON car.driver = driverUser.id
LEFT JOIN rider on car.id = rider.car_id
Expand Down Expand Up @@ -290,24 +313,35 @@ async fn update_car(
.await;

match updated {
Ok(Some(_)) => {},
Ok(None) => return HttpResponse::NotFound().body("Car not found or you are not the driver."),
Ok(Some(_)) => {}
Ok(None) => {
return HttpResponse::NotFound().body("Car not found or you are not the driver.")
}
Err(_) => return HttpResponse::InternalServerError().body("Failed to update car"),
}

// Used for sending pings
let current_riders: Vec<String> = query!(
r#"DELETE FROM rider WHERE car_id = $1 RETURNING rider"#,
car_id
).fetch_all(&mut *tx).await.unwrap().iter().map(|record| record.rider.clone()).collect();

)
.fetch_all(&mut *tx)
.await
.unwrap()
.iter()
.map(|record| record.rider.clone())
.collect();

let _ = query!(
r#"
INSERT INTO rider (car_id, rider) SELECT $1, * FROM UNNEST($2::VARCHAR[])
"#,
car_id,
&car.riders
).execute(&mut *tx).await.unwrap();
)
.execute(&mut *tx)
.await
.unwrap();
tx.commit().await.unwrap();

HttpResponse::Ok().body("Car updated successfully")
Expand Down
20 changes: 17 additions & 3 deletions src/api/v1/event/car/rider/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,23 @@ async fn create_rider(
let user_id = session.get::<UserInfo>("userinfo").unwrap().unwrap().id;

let check = query!(
r#"SELECT COUNT(*) as count FROM (SELECT id FROM car WHERE event_id = $1 AND driver = $2 UNION SELECT rider.car_id FROM rider JOIN car ON rider.car_id = car.id WHERE car.event_id = $1 AND rider.rider = $2) AS data"#,
event_id, user_id
).fetch_one(&data.db).await.unwrap();
r#"
SELECT COUNT(*) as count
FROM (
SELECT id FROM car
WHERE event_id = $1 AND driver = $2
UNION
SELECT rider.car_id
FROM rider
JOIN car ON rider.car_id = car.id
WHERE car.event_id = $1 AND rider.rider = $2
) AS data"#,
event_id,
user_id
)
.fetch_one(&data.db)
.await
.unwrap();

if check.count.unwrap() > 0 {
return HttpResponse::BadRequest().body("User is already in a car.");
Expand Down
39 changes: 29 additions & 10 deletions src/api/v1/event/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,13 +116,20 @@ async fn create_event(
async fn get_event(data: web::Data<AppState>, path: web::Path<i32>) -> impl Responder {
let event_id = path.into_inner();
let result: Option<Event> = query_as!(
Event,
r#"SELECT event.id, event.name, event.location, event.start_time, event.end_time, (users.id, users.realm, users.name, users.email) AS "creator!: UserData" FROM event JOIN users ON users.id = event.creator WHERE event.id = $1"#,
event_id
)
.fetch_optional(&data.db)
.await
.unwrap_or(None);
Event,
r#"
SELECT
event.id, event.name, event.location, event.start_time, event.end_time,
(users.id, users.realm, users.name, users.email) AS "creator!: UserData"
FROM event
JOIN users ON users.id = event.creator
WHERE event.id = $1
"#,
event_id
)
.fetch_optional(&data.db)
.await
.unwrap_or(None);

match result {
Some(user) => HttpResponse::Ok().json(user),
Expand All @@ -147,9 +154,21 @@ async fn get_all_events(
) -> impl Responder {
let past: bool = params.past.unwrap_or(false);

let result = query_as!(Event, r#"SELECT event.id, event.name, event.location, event.start_time, event.end_time, (users.id, users.realm::text, users.name, users.email) AS "creator!: UserData" FROM event JOIN users ON users.id = event.creator WHERE (end_time >= NOW() AND $1 = False) OR (end_time < NOW() AND $1) ORDER BY start_time ASC"#, past)
.fetch_all(&data.db)
.await;
let result = query_as!(
Event,
r#"
SELECT
event.id, event.name, event.location, event.start_time, event.end_time,
(users.id, users.realm::text, users.name, users.email) AS "creator!: UserData"
FROM event
JOIN users ON users.id = event.creator
WHERE (end_time >= NOW() AND $1 = False) OR (end_time < NOW() AND $1)
ORDER BY start_time ASC
"#,
past
)
.fetch_all(&data.db)
.await;

match result {
Ok(events) => HttpResponse::Ok().json(events),
Expand Down

0 comments on commit d707d9a

Please sign in to comment.