Skip to content

Commit 75f7683

Browse files
committed
Linting and Access Controls
1 parent 28c6dc7 commit 75f7683

12 files changed

+111
-67
lines changed

.sqlx/query-5027790ff6e3cd978eaec2c399b171e765515747a4052d0ad59c2fd64ec81251.json .sqlx/query-00030e21560ce62548eabf89124a90e28fc6bf4651a85c7a52d6468c44e36852.json

+4-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-f75b9810062cfc9509c96fc289f0f039194865d02f6abc03662c16fcf147b3e6.json .sqlx/query-47d04e0acd95c6675cd4d5415321ac476243289d42ccb2c6ba5c35b32bf63986.json

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-40901d716c75136d6fb2bf60c6dc19c67dd744ab3b8225005afe36ccb74bd491.json .sqlx/query-4e674fb9370edd9c1b50f774406e8bcb575747135c9adccb9a2e1ea881e14963.json

+5-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-265aeab895a5d3ce441ebba42bd83c61c1a2147289e4b58d0c70680b83a30585.json .sqlx/query-8973026fd1f6a28d695834021c538cad2ce6b5c7bc1ae2d561c8219967810ee2.json

+4-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.sqlx/query-dfb486af0f1ea3f1faa1b68b5a25515cdf802a50dece2d3869b6be8dc30c497c.json

+23
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/api/v1/auth/csh.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1+
use crate::api::v1::auth::models::UserRealm;
2+
use crate::api::v1::auth::models::{CSHUserInfo, UserInfo};
3+
use crate::AppState;
14
use actix_session::Session;
25
use actix_web::http::header;
6+
use actix_web::{get, Scope};
37
use actix_web::{web, HttpResponse, Responder};
48
use oauth2::reqwest::async_http_client;
59
use oauth2::{AuthorizationCode, TokenResponse};
610
use reqwest::Client;
7-
use utoipa::{OpenApi, ToSchema};
8-
9-
use crate::api::v1::auth::models::{CSHUserInfo, UserInfo, UserRealm};
10-
use crate::AppState;
11-
use actix_web::{get, Scope};
1211
use serde::Deserialize;
12+
use utoipa::{OpenApi, ToSchema};
1313

1414
use crate::api::v1::auth::common;
1515

@@ -34,7 +34,7 @@ async fn login(data: web::Data<AppState>) -> impl Responder {
3434
#[derive(Deserialize, ToSchema)]
3535
pub struct AuthRequest {
3636
code: String,
37-
state: String,
37+
_state: String,
3838
}
3939

4040
#[utoipa::path(
@@ -72,11 +72,11 @@ async fn auth(
7272
sqlx::query!(
7373
"INSERT INTO users (id, realm, name) VALUES ($1, $2, $3) ON CONFLICT (id) DO UPDATE SET realm = EXCLUDED.realm, name = EXCLUDED.name;",
7474
user_info.ldap_id,
75-
UserRealm::CSH as _,
75+
UserRealm::Csh as _,
7676
format!("{} {}", user_info.given_name, user_info.family_name)
7777
)
7878
.execute(&data.db)
79-
.await;
79+
.await.unwrap();
8080

8181
session.insert("login", true).unwrap();
8282
session

src/api/v1/auth/google.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1+
use crate::api::v1::auth::common;
2+
use crate::api::v1::auth::models::UserRealm;
3+
use crate::api::v1::auth::models::{GoogleUserInfo, UserInfo};
4+
use crate::AppState;
15
use actix_session::Session;
26
use actix_web::http::header;
7+
use actix_web::{get, web, Scope};
38
use actix_web::{HttpResponse, Responder};
49
use oauth2::reqwest::async_http_client;
510
use oauth2::{AuthorizationCode, TokenResponse};
611
use reqwest::Client;
7-
use utoipa::{OpenApi, ToSchema};
8-
9-
use crate::api::v1::auth::common;
10-
use crate::api::v1::auth::models::{GoogleUserInfo, UserInfo, UserRealm};
11-
use crate::AppState;
12-
use actix_web::{get, web, Scope};
1312
use serde::Deserialize;
13+
use utoipa::{OpenApi, ToSchema};
1414

1515
#[derive(OpenApi)]
1616
#[openapi(paths(login, auth,), components(schemas(AuthRequest)))]
@@ -37,7 +37,7 @@ async fn login(data: web::Data<AppState>) -> impl Responder {
3737
#[derive(Deserialize, ToSchema)]
3838
pub struct AuthRequest {
3939
code: String,
40-
state: String,
40+
_state: String,
4141
}
4242

4343
#[utoipa::path(
@@ -81,7 +81,7 @@ async fn auth(
8181
format!("{} {}", user_info.given_name, user_info.family_name)
8282
)
8383
.execute(&data.db)
84-
.await;
84+
.await.unwrap();
8585

8686
session.insert("login", true).unwrap();
8787
session

src/api/v1/auth/models.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use utoipa::ToSchema;
44
#[derive(sqlx::Type)]
55
#[sqlx(type_name = "user_realm", rename_all = "lowercase")]
66
pub enum UserRealm {
7-
CSH,
7+
Csh,
88
Google,
99
}
1010

src/api/v1/event/car/mod.rs

+23-19
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ use actix_web::{
99
};
1010
use chrono::{DateTime, Utc};
1111
use serde::{Deserialize, Serialize};
12-
use sqlx::query_as;
12+
use sqlx::{query, query_as};
1313
use utoipa::{OpenApi, ToSchema};
1414

15-
use log::{debug, error};
15+
use log::error;
1616

1717
mod rider;
1818

@@ -89,15 +89,25 @@ async fn create_car(
8989
path: web::Path<i32>,
9090
) -> impl Responder {
9191
let event_id: i32 = path.into_inner();
92+
let user_id = session.get::<UserInfo>("userinfo").unwrap().unwrap().id;
9293
if car.max_capacity < 0 {
9394
return HttpResponse::BadRequest()
9495
.body("Sorry @cinnamon, you can't have negative people in your car :)");
9596
}
97+
let check = query!(
98+
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)"#,
99+
event_id, user_id
100+
).fetch_one(&data.db).await.unwrap();
101+
102+
if check.count.unwrap() > 0 {
103+
return HttpResponse::BadRequest().body("User is already in a car.");
104+
}
105+
96106
let result = sqlx::query!(
97107
r#"
98108
INSERT INTO car (event_id, driver, max_capacity, departure_time, return_time, comment) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id
99109
"#,
100-
event_id, session.get::<UserInfo>("userinfo").unwrap().unwrap().id, car.max_capacity, car.departure_time, car.return_time, car.comment
110+
event_id, user_id, car.max_capacity, car.departure_time, car.return_time, car.comment
101111
)
102112
.fetch_one(&data.db)
103113
.await;
@@ -117,11 +127,7 @@ async fn create_car(
117127
)
118128
)]
119129
#[get("/{car_id}", wrap = "SessionAuth")]
120-
async fn get_car(
121-
data: web::Data<AppState>,
122-
session: Session,
123-
path: web::Path<(i32, i32)>,
124-
) -> impl Responder {
130+
async fn get_car(data: web::Data<AppState>, path: web::Path<(i32, i32)>) -> impl Responder {
125131
let (event_id, car_id) = path.into_inner();
126132
let result: Option<CarData> = query_as!(
127133
CarData,
@@ -155,11 +161,7 @@ async fn get_car(
155161
)
156162
)]
157163
#[get("/", wrap = "SessionAuth")]
158-
async fn get_all_cars(
159-
data: web::Data<AppState>,
160-
session: Session,
161-
path: web::Path<i32>,
162-
) -> impl Responder {
164+
async fn get_all_cars(data: web::Data<AppState>, path: web::Path<i32>) -> impl Responder {
163165
let event_id: i32 = path.into_inner();
164166
let result = query_as!(
165167
CarData,
@@ -213,21 +215,22 @@ async fn update_car(
213215
departure_time = COALESCE($2, departure_time),
214216
return_time = COALESCE($3, return_time),
215217
comment = COALESCE($4, comment)
216-
WHERE event_id = $5 AND id = $6 RETURNING id
218+
WHERE event_id = $5 AND id = $6 AND driver = $7 RETURNING id
217219
"#,
218220
car.max_capacity,
219221
car.departure_time,
220222
car.return_time,
221223
car.comment,
222224
event_id,
223-
car_id
225+
car_id,
226+
session.get::<UserInfo>("userinfo").unwrap().unwrap().id
224227
)
225228
.fetch_optional(&data.db)
226229
.await;
227230

228231
match updated {
229232
Ok(Some(_)) => HttpResponse::Ok().body("Car updated successfully"),
230-
Ok(None) => HttpResponse::NotFound().body("Car not found"),
233+
Ok(None) => HttpResponse::NotFound().body("Car not found or you are not the driver."),
231234
Err(_) => HttpResponse::InternalServerError().body("Failed to update car"),
232235
}
233236
}
@@ -249,16 +252,17 @@ async fn delete_car(
249252
let (event_id, car_id) = path.into_inner();
250253

251254
let deleted = sqlx::query!(
252-
"DELETE FROM car WHERE event_id = $1 AND id = $2 RETURNING id",
255+
"DELETE FROM car WHERE event_id = $1 AND id = $2 AND driver = $3 RETURNING id",
253256
event_id,
254-
car_id
257+
car_id,
258+
session.get::<UserInfo>("userinfo").unwrap().unwrap().id
255259
)
256260
.fetch_optional(&data.db)
257261
.await;
258262

259263
match deleted {
260264
Ok(Some(_)) => HttpResponse::Ok().body("Car deleted"),
261-
Ok(None) => HttpResponse::NotFound().body("Car not found"),
265+
Ok(None) => HttpResponse::NotFound().body("Car not found or you are not the driver."),
262266
Err(_) => HttpResponse::InternalServerError().body("Failed to delete car"),
263267
}
264268
}

src/api/v1/event/car/rider/mod.rs

+15-4
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use actix_web::{
88
HttpResponse, Responder, Scope,
99
};
1010
use log::error;
11-
use serde::{Deserialize, Serialize};
12-
use utoipa::{OpenApi, ToSchema};
11+
use sqlx::query;
12+
use utoipa::OpenApi;
1313

1414
#[derive(OpenApi)]
1515
#[openapi(paths(create_rider, delete_rider))]
@@ -30,13 +30,24 @@ async fn create_rider(
3030
session: Session,
3131
path: web::Path<(i32, i32)>,
3232
) -> impl Responder {
33-
let (_event_id, car_id) = path.into_inner();
33+
let (event_id, car_id) = path.into_inner();
34+
let user_id = session.get::<UserInfo>("userinfo").unwrap().unwrap().id;
35+
36+
let check = query!(
37+
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)"#,
38+
event_id, user_id
39+
).fetch_one(&data.db).await.unwrap();
40+
41+
if check.count.unwrap() > 0 {
42+
return HttpResponse::BadRequest().body("User is already in a car.");
43+
}
44+
3445
let result = sqlx::query!(
3546
r#"
3647
INSERT INTO rider (car_id, rider) VALUES ($1, $2)
3748
"#,
3849
car_id,
39-
session.get::<UserInfo>("userinfo").unwrap().unwrap().id
50+
user_id
4051
)
4152
.execute(&data.db)
4253
.await;

0 commit comments

Comments
 (0)