diff --git a/api/services/src/organisation.rs b/api/services/src/organisation.rs index 5aecf65..e17065e 100644 --- a/api/services/src/organisation.rs +++ b/api/services/src/organisation.rs @@ -47,6 +47,20 @@ impl OrganisationService { Ok(exists) } + pub async fn joined( + user: &User, + db: &OrmConnection, + organisation: Uuid, + ) -> Result { + let exists = organisation_user::Entity::find() + .filter(organisation_user::COLUMN.organisation_id.eq(organisation)) + .filter(organisation_user::COLUMN.user_id.eq(user.id().to_string())) + .exists(db) + .await?; + + Ok(exists) + } + pub async fn create( db: &OrmConnection, organisation: Organisation, diff --git a/api/src/routes/organisation.rs b/api/src/routes/organisation.rs index 7dfa5b3..99457fa 100644 --- a/api/src/routes/organisation.rs +++ b/api/src/routes/organisation.rs @@ -25,15 +25,22 @@ enum ApiError { #[error("organisation does not exists")] OrganisationDoesNotExists, + + #[error("organisation already exists")] + OrganisationAlreadyJoined, + + #[error("organisation does not exists")] + OrganisationNotJoined, } impl IntoResponse for ApiError { fn into_response(self) -> Response { let status = match &self { ApiError::ServiceError(_) => StatusCode::INTERNAL_SERVER_ERROR, - ApiError::OrganisationAlreadyExists | ApiError::OrganisationDoesNotExists => { - StatusCode::BAD_REQUEST - } + ApiError::OrganisationAlreadyExists + | ApiError::OrganisationDoesNotExists + | ApiError::OrganisationAlreadyJoined + | ApiError::OrganisationNotJoined => StatusCode::BAD_REQUEST, }; warn!("{:?}", self); @@ -86,6 +93,10 @@ async fn join_organisation( return Err(ApiError::OrganisationDoesNotExists); } + if OrganisationService::joined(&user, &state.db_connection, org_uuid).await? { + return Err(ApiError::OrganisationAlreadyJoined); + } + OrganisationService::join(&user, &state.db_connection, organisation.uuid).await?; Ok(StatusCode::OK) @@ -102,6 +113,10 @@ async fn leave_organisation( return Err(ApiError::OrganisationDoesNotExists); } + if !OrganisationService::joined(&user, &state.db_connection, org_uuid).await? { + return Err(ApiError::OrganisationNotJoined); + } + OrganisationService::leave(&user, &state.db_connection, organisation.uuid).await?; Ok(StatusCode::OK) diff --git a/api/tests/organisation.rs b/api/tests/organisation.rs index ce51e82..7cc24c6 100644 --- a/api/tests/organisation.rs +++ b/api/tests/organisation.rs @@ -182,10 +182,79 @@ async fn join_unknown_organisation() { #[tokio::test] async fn join_already_joined_organisation() { - todo!() + let client = get_client().await; + + let organisation_uuid = Uuid::new_v4(); + + client + .add_organisation_json(json!( + { + "uuid": organisation_uuid, + "name": "Test Organisation", + } + )) + .await; + + client + .leave_organisation(json!( + { + "uuid": organisation_uuid, + } + )) + .await + .assert_status_success(); + + client + .join_organisation(json!( + { + "uuid": organisation_uuid, + } + )) + .await + .assert_status_success(); + + let response = client + .join_organisation(json!( + { + "uuid": organisation_uuid, + } + )) + .await; + + response.assert_status_bad_request(); } #[tokio::test] async fn leave_already_leaved_organisation() { - todo!() + let client = get_client().await; + + let organisation_uuid = Uuid::new_v4(); + + client + .add_organisation_json(json!( + { + "uuid": organisation_uuid, + "name": "Test Organisation", + } + )) + .await; + + client + .leave_organisation(json!( + { + "uuid": organisation_uuid, + } + )) + .await + .assert_status_success(); + + let response = client + .leave_organisation(json!( + { + "uuid": organisation_uuid, + } + )) + .await; + + response.assert_status_bad_request(); }