Skip to content

Commit 0f52088

Browse files
committed
new find_by for overarching goals
1 parent 8347fe8 commit 0f52088

File tree

5 files changed

+48
-59
lines changed

5 files changed

+48
-59
lines changed

domain/src/overarching_goal.rs

+20-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,20 @@
1-
pub use entity_api::overarching_goal::{create, find_by, find_by_id, update, update_status};
1+
use crate::error::Error;
2+
use crate::overarching_goals::Model;
3+
use entity_api::IntoQueryFilterMap;
4+
use entity_api::{overarching_goals, query};
5+
use sea_orm::DatabaseConnection;
6+
7+
pub use entity_api::overarching_goal::{create, find_by_id, update, update_status};
8+
9+
pub async fn find_by(
10+
db: &DatabaseConnection,
11+
params: impl IntoQueryFilterMap,
12+
) -> Result<Vec<Model>, Error> {
13+
let overarching_goals = query::find_by::<overarching_goals::Entity, overarching_goals::Column>(
14+
db,
15+
params.into_query_filter_map(),
16+
)
17+
.await?;
18+
19+
Ok(overarching_goals)
20+
}

entity_api/src/overarching_goal.rs

+2-56
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use super::error::{EntityApiErrorKind, Error};
2-
use crate::uuid_parse_str;
3-
use entity::overarching_goals::{self, ActiveModel, Entity, Model};
2+
use entity::overarching_goals::{ActiveModel, Entity, Model};
43
use entity::{status::Status, Id};
54
use sea_orm::ActiveValue;
65
use sea_orm::{
@@ -9,7 +8,6 @@ use sea_orm::{
98
ActiveValue::{Set, Unchanged},
109
DatabaseConnection, TryIntoModel,
1110
};
12-
use std::collections::HashMap;
1311

1412
use log::*;
1513

@@ -136,32 +134,6 @@ pub async fn find_by_id(db: &DatabaseConnection, id: Id) -> Result<Model, Error>
136134
})
137135
}
138136

139-
pub async fn find_by(
140-
db: &DatabaseConnection,
141-
query_params: HashMap<String, String>,
142-
) -> Result<Vec<Model>, Error> {
143-
let mut query = Entity::find();
144-
145-
for (key, value) in query_params {
146-
match key.as_str() {
147-
"coaching_session_id" => {
148-
let coaching_session_id = uuid_parse_str(&value)?;
149-
150-
query = query
151-
.filter(overarching_goals::Column::CoachingSessionId.eq(coaching_session_id));
152-
}
153-
_ => {
154-
return Err(Error {
155-
source: None,
156-
error_kind: EntityApiErrorKind::InvalidQueryTerm,
157-
});
158-
}
159-
}
160-
}
161-
162-
Ok(query.all(db).await?)
163-
}
164-
165137
#[cfg(test)]
166138
// We need to gate seaORM's mock feature behind conditional compilation because
167139
// the feature removes the Clone trait implementation from seaORM's DatabaseConnection.
@@ -170,7 +142,7 @@ pub async fn find_by(
170142
mod tests {
171143
use super::*;
172144
use entity::{overarching_goals::Model, Id};
173-
use sea_orm::{DatabaseBackend, MockDatabase, Transaction};
145+
use sea_orm::{DatabaseBackend, MockDatabase};
174146

175147
#[tokio::test]
176148
async fn create_returns_a_new_overarching_goal_model() -> Result<(), Error> {
@@ -292,30 +264,4 @@ mod tests {
292264

293265
Ok(())
294266
}
295-
296-
#[tokio::test]
297-
async fn find_by_returns_all_overarching_goals_associated_with_coaching_session(
298-
) -> Result<(), Error> {
299-
let db = MockDatabase::new(DatabaseBackend::Postgres).into_connection();
300-
let mut query_params = HashMap::new();
301-
let coaching_session_id = Id::new_v4();
302-
303-
query_params.insert(
304-
"coaching_session_id".to_owned(),
305-
coaching_session_id.to_string(),
306-
);
307-
308-
let _ = find_by(&db, query_params).await;
309-
310-
assert_eq!(
311-
db.into_transaction_log(),
312-
[Transaction::from_sql_and_values(
313-
DatabaseBackend::Postgres,
314-
r#"SELECT "overarching_goals"."id", "overarching_goals"."coaching_session_id", "overarching_goals"."user_id", "overarching_goals"."title", "overarching_goals"."body", CAST("overarching_goals"."status" AS text), "overarching_goals"."status_changed_at", "overarching_goals"."completed_at", "overarching_goals"."created_at", "overarching_goals"."updated_at" FROM "refactor_platform"."overarching_goals" WHERE "overarching_goals"."coaching_session_id" = $1"#,
315-
[coaching_session_id.into()]
316-
)]
317-
);
318-
319-
Ok(())
320-
}
321267
}

web/src/controller/overarching_goal_controller.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::controller::ApiResponse;
22
use crate::extractors::{
33
authenticated_user::AuthenticatedUser, compare_api_version::CompareApiVersion,
44
};
5+
use crate::params::overarching_goal::IndexParams;
56
use crate::{AppState, Error};
67
use axum::extract::{Path, Query, State};
78
use axum::http::StatusCode;
@@ -10,7 +11,6 @@ use axum::Json;
1011
use domain::overarching_goal as OverarchingGoalApi;
1112
use domain::{overarching_goals::Model, Id};
1213
use service::config::ApiVersion;
13-
use std::collections::HashMap;
1414

1515
use log::*;
1616

@@ -188,7 +188,7 @@ pub async fn index(
188188
// TODO: create a new Extractor to authorize the user to access
189189
// the data requested
190190
State(app_state): State<AppState>,
191-
Query(params): Query<HashMap<String, String>>,
191+
Query(params): Query<IndexParams>,
192192
) -> Result<impl IntoResponse, Error> {
193193
debug!("GET all Overarching Goals");
194194
debug!("Filter Params: {:?}", params);

web/src/params/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ pub(crate) mod action;
1515
pub(crate) mod agreement;
1616
pub(crate) mod coaching_session;
1717
pub(crate) mod jwt;
18+
pub(crate) mod overarching_goal;

web/src/params/overarching_goal.rs

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use domain::Id;
2+
use sea_orm::Value;
3+
use serde::Deserialize;
4+
use utoipa::IntoParams;
5+
6+
use domain::{IntoQueryFilterMap, QueryFilterMap};
7+
8+
#[derive(Debug, Deserialize, IntoParams)]
9+
pub(crate) struct IndexParams {
10+
pub(crate) coaching_session_id: Id,
11+
}
12+
13+
impl IntoQueryFilterMap for IndexParams {
14+
fn into_query_filter_map(self) -> QueryFilterMap {
15+
let mut query_filter_map = QueryFilterMap::new();
16+
query_filter_map.insert(
17+
"coaching_session_id".to_string(),
18+
Some(Value::Uuid(Some(Box::new(self.coaching_session_id)))),
19+
);
20+
21+
query_filter_map
22+
}
23+
}

0 commit comments

Comments
 (0)