Skip to content

Commit bbab130

Browse files
CRUD UI for organisation members (#612)
1 parent d8b2a4e commit bbab130

File tree

16 files changed

+486
-105
lines changed

16 files changed

+486
-105
lines changed

backend/server/src/handler/answer.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ impl AnswerHandler {
8383

8484
transaction.tx.commit().await?;
8585

86-
Ok((StatusCode::OK, Json(answers)))
86+
Ok(( Json(answers)))
8787
}
8888

8989
/// Retrieves all answers for a specific role in an application.
@@ -111,7 +111,7 @@ impl AnswerHandler {
111111

112112
transaction.tx.commit().await?;
113113

114-
Ok((StatusCode::OK, Json(answers)))
114+
Ok(( Json(answers)))
115115
}
116116

117117
/// Updates an existing answer.

backend/server/src/handler/application.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ impl ApplicationHandler {
4242
let application_id = Application::create_or_get(campaign_id, user.user_id, &mut state.snowflake_generator, &mut transaction.tx).await?;
4343
transaction.tx.commit().await?;
4444

45-
Ok((StatusCode::OK, Json(json!({ "application_id": application_id.to_string() }))))
45+
Ok(Json(json!({ "application_id": application_id.to_string() })))
4646
}
4747

4848
/// Checks if an application exists for a given campaign and user.
@@ -64,7 +64,7 @@ impl ApplicationHandler {
6464
let application_exists = Application::check_application_exists(campaign_id, user.user_id, &mut transaction.tx).await?;
6565

6666
transaction.tx.commit().await?;
67-
Ok((StatusCode::OK, Json(json!({ "application_exists": application_exists }))))
67+
Ok(Json(json!({ "application_exists": application_exists })))
6868
}
6969

7070
/// Retrieves the details of a specific application.
@@ -87,7 +87,7 @@ impl ApplicationHandler {
8787
) -> Result<impl IntoResponse, ChaosError> {
8888
let application = Application::get(application_id, admin.user_id, &mut transaction.tx).await?;
8989
transaction.tx.commit().await?;
90-
Ok((StatusCode::OK, Json(application)))
90+
Ok(Json(application))
9191
}
9292

9393
/// Updates the status of an application.
@@ -158,7 +158,7 @@ impl ApplicationHandler {
158158
) -> Result<impl IntoResponse, ChaosError> {
159159
let applications = Application::get_from_user_id(user.user_id, user.user_id, &mut transaction.tx).await?;
160160
transaction.tx.commit().await?;
161-
Ok((StatusCode::OK, Json(applications)))
161+
Ok(Json(applications))
162162
}
163163

164164
/// Retrieves all roles associated with a specific application.
@@ -183,7 +183,7 @@ impl ApplicationHandler {
183183
let roles = Application::get_roles(application_id, &mut transaction.tx).await?;
184184
transaction.tx.commit().await?;
185185

186-
Ok((StatusCode::OK, Json(roles)))
186+
Ok(Json(roles))
187187
}
188188

189189
/// Updates the roles associated with an application.

backend/server/src/handler/organisation.rs

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::models::auth::{AuthUser, OrganisationAdmin};
1313
use crate::models::campaign::{Campaign, NewCampaign};
1414
use crate::models::email_template::{EmailTemplate, NewEmailTemplate};
1515
use crate::models::error::ChaosError;
16-
use crate::models::organisation::{AdminToRemove, AdminUpdateList, NewOrganisation, Organisation, SlugCheck};
16+
use crate::models::organisation::{MemberToRemove, AdminUpdateList, NewOrganisation, Organisation, SlugCheck, MemberToInvite};
1717
use crate::models::transaction::DBTransaction;
1818
use crate::service::auth::assert_is_super_user;
1919
use axum::extract::{Json, Path, State};
@@ -202,6 +202,30 @@ impl OrganisationHandler {
202202
Ok((StatusCode::OK, Json(members)))
203203
}
204204

205+
/// Retrieves all users (role) of an organisation.
206+
///
207+
/// This handler allows organisation admins to view all members with the role "User".
208+
///
209+
/// # Arguments
210+
///
211+
/// * `state` - The application state
212+
/// * `id` - The ID of the organisation
213+
/// * `_admin` - The authenticated user (must be an organisation admin)
214+
///
215+
/// # Returns
216+
///
217+
/// * `Result<impl IntoResponse, ChaosError>` - List of members or error
218+
pub async fn get_users(
219+
mut transaction: DBTransaction<'_>,
220+
Path(id): Path<i64>,
221+
_admin: OrganisationAdmin,
222+
) -> Result<impl IntoResponse, ChaosError> {
223+
let members = Organisation::get_users(id, &mut transaction.tx).await?;
224+
225+
transaction.tx.commit().await?;
226+
Ok((StatusCode::OK, Json(members)))
227+
}
228+
205229
/// Retrieves all members of an organisation.
206230
///
207231
/// This handler allows organisation admins to view all members.
@@ -296,20 +320,17 @@ impl OrganisationHandler {
296320
mut transaction: DBTransaction<'_>,
297321
Path(id): Path<i64>,
298322
_super_user: SuperUser,
299-
Json(request_body): Json<AdminToRemove>,
323+
Json(request_body): Json<MemberToRemove>,
300324
) -> Result<impl IntoResponse, ChaosError> {
301325
Organisation::remove_admin(id, request_body.user_id, &mut transaction.tx).await?;
302326

303327
transaction.tx.commit().await?;
304-
Ok((
305-
StatusCode::OK,
306-
"Successfully removed member from organisation",
307-
))
328+
Ok(AppMessage::OkMessage("Successfully removed member from organisation"))
308329
}
309330

310-
/// Removes a member from an organisation.
331+
/// Removes a user from an organisation.
311332
///
312-
/// This handler allows organisation admins to remove members.
333+
/// This handler allows organisation admins to remove members with role "User".
313334
///
314335
/// # Arguments
315336
///
@@ -321,19 +342,29 @@ impl OrganisationHandler {
321342
/// # Returns
322343
///
323344
/// * `Result<impl IntoResponse, ChaosError>` - Success message or error
324-
pub async fn remove_member(
345+
pub async fn remove_user(
346+
mut transaction: DBTransaction<'_>,
347+
Path(id): Path<i64>,
348+
_admin: OrganisationAdmin,
349+
Json(request_body): Json<MemberToRemove>,
350+
) -> Result<impl IntoResponse, ChaosError> {
351+
Organisation::remove_user(id, request_body.user_id, &mut transaction.tx).await?;
352+
353+
transaction.tx.commit().await?;
354+
Ok(AppMessage::OkMessage("Successfully removed member from organisation"))
355+
}
356+
357+
pub async fn invite_user(
325358
mut transaction: DBTransaction<'_>,
326359
Path(id): Path<i64>,
327360
_admin: OrganisationAdmin,
328-
Json(request_body): Json<AdminToRemove>,
361+
State(state): State<AppState>,
362+
Json(request_body): Json<MemberToInvite>,
329363
) -> Result<impl IntoResponse, ChaosError> {
330-
Organisation::remove_member(id, request_body.user_id, &mut transaction.tx).await?;
364+
Organisation::invite_user(id, request_body.email, state.email_credentials, &mut transaction.tx).await?;
331365

332366
transaction.tx.commit().await?;
333-
Ok((
334-
StatusCode::OK,
335-
"Successfully removed member from organisation",
336-
))
367+
Ok(AppMessage::OkMessage("Successfully invited user to organisation"))
337368
}
338369

339370
/// Updates an organisation's logo.

backend/server/src/models/app.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,8 @@ pub async fn app() -> Result<Router, ChaosError> {
255255
.put(OrganisationHandler::update_members)
256256
)
257257
.route(
258-
"/api/v1/organisation/:organisation_id/member",
259-
delete(OrganisationHandler::remove_member),
258+
"/api/v1/organisation/:organisation_id/user",
259+
post(OrganisationHandler::invite_user).delete(OrganisationHandler::remove_user),
260260
)
261261
.route(
262262
"/api/v1/organisation/:organisation_id/admins",
@@ -267,6 +267,10 @@ pub async fn app() -> Result<Router, ChaosError> {
267267
"/api/v1/organisation/:organisation_id/admin",
268268
delete(OrganisationHandler::remove_admin),
269269
)
270+
.route(
271+
"/api/v1/organisation/:organisation_id/users",
272+
get(OrganisationHandler::get_users)
273+
)
270274
.route(
271275
"/api/v1/rating/:rating_id",
272276
get(RatingHandler::get)

backend/server/src/models/error.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ impl IntoResponse for ChaosError {
109109
AppMessage::UnauthorizedMessage("Forbidden operation").into_response()
110110
}
111111
ChaosError::BadRequest => AppMessage::BadRequestMessage("Bad request").into_response(),
112+
ChaosError::BadRequestWithMessage(msg) => AppMessage::BadRequestMessage(msg).into_response(),
112113
ChaosError::ApplicationClosed => AppMessage::BadRequestMessage("Application closed").into_response(),
113114
ChaosError::CampaignClosed => AppMessage::BadRequestMessage("Campaign closed").into_response(),
114115
ChaosError::DatabaseError(db_error) => match db_error {

0 commit comments

Comments
 (0)