Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions backend/server/src/handler/answer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ impl AnswerHandler {

transaction.tx.commit().await?;

Ok((StatusCode::OK, Json(answers)))
Ok(( Json(answers)))
}

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

transaction.tx.commit().await?;

Ok((StatusCode::OK, Json(answers)))
Ok(( Json(answers)))
}

/// Updates an existing answer.
Expand Down
10 changes: 5 additions & 5 deletions backend/server/src/handler/application.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ impl ApplicationHandler {
let application_id = Application::create_or_get(campaign_id, user.user_id, &mut state.snowflake_generator, &mut transaction.tx).await?;
transaction.tx.commit().await?;

Ok((StatusCode::OK, Json(json!({ "application_id": application_id.to_string() }))))
Ok(Json(json!({ "application_id": application_id.to_string() })))
}

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

transaction.tx.commit().await?;
Ok((StatusCode::OK, Json(json!({ "application_exists": application_exists }))))
Ok(Json(json!({ "application_exists": application_exists })))
}

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

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

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

Ok((StatusCode::OK, Json(roles)))
Ok(Json(roles))
}

/// Updates the roles associated with an application.
Expand Down
61 changes: 46 additions & 15 deletions backend/server/src/handler/organisation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use crate::models::auth::{AuthUser, OrganisationAdmin};
use crate::models::campaign::{Campaign, NewCampaign};
use crate::models::email_template::{EmailTemplate, NewEmailTemplate};
use crate::models::error::ChaosError;
use crate::models::organisation::{AdminToRemove, AdminUpdateList, NewOrganisation, Organisation, SlugCheck};
use crate::models::organisation::{MemberToRemove, AdminUpdateList, NewOrganisation, Organisation, SlugCheck, MemberToInvite};
use crate::models::transaction::DBTransaction;
use crate::service::auth::assert_is_super_user;
use axum::extract::{Json, Path, State};
Expand Down Expand Up @@ -202,6 +202,30 @@ impl OrganisationHandler {
Ok((StatusCode::OK, Json(members)))
}

/// Retrieves all users (role) of an organisation.
///
/// This handler allows organisation admins to view all members with the role "User".
///
/// # Arguments
///
/// * `state` - The application state
/// * `id` - The ID of the organisation
/// * `_admin` - The authenticated user (must be an organisation admin)
///
/// # Returns
///
/// * `Result<impl IntoResponse, ChaosError>` - List of members or error
pub async fn get_users(
mut transaction: DBTransaction<'_>,
Path(id): Path<i64>,
_admin: OrganisationAdmin,
) -> Result<impl IntoResponse, ChaosError> {
let members = Organisation::get_users(id, &mut transaction.tx).await?;

transaction.tx.commit().await?;
Ok((StatusCode::OK, Json(members)))
}

/// Retrieves all members of an organisation.
///
/// This handler allows organisation admins to view all members.
Expand Down Expand Up @@ -296,20 +320,17 @@ impl OrganisationHandler {
mut transaction: DBTransaction<'_>,
Path(id): Path<i64>,
_super_user: SuperUser,
Json(request_body): Json<AdminToRemove>,
Json(request_body): Json<MemberToRemove>,
) -> Result<impl IntoResponse, ChaosError> {
Organisation::remove_admin(id, request_body.user_id, &mut transaction.tx).await?;

transaction.tx.commit().await?;
Ok((
StatusCode::OK,
"Successfully removed member from organisation",
))
Ok(AppMessage::OkMessage("Successfully removed member from organisation"))
}

/// Removes a member from an organisation.
/// Removes a user from an organisation.
///
/// This handler allows organisation admins to remove members.
/// This handler allows organisation admins to remove members with role "User".
///
/// # Arguments
///
Expand All @@ -321,19 +342,29 @@ impl OrganisationHandler {
/// # Returns
///
/// * `Result<impl IntoResponse, ChaosError>` - Success message or error
pub async fn remove_member(
pub async fn remove_user(
mut transaction: DBTransaction<'_>,
Path(id): Path<i64>,
_admin: OrganisationAdmin,
Json(request_body): Json<MemberToRemove>,
) -> Result<impl IntoResponse, ChaosError> {
Organisation::remove_user(id, request_body.user_id, &mut transaction.tx).await?;

transaction.tx.commit().await?;
Ok(AppMessage::OkMessage("Successfully removed member from organisation"))
}

pub async fn invite_user(
mut transaction: DBTransaction<'_>,
Path(id): Path<i64>,
_admin: OrganisationAdmin,
Json(request_body): Json<AdminToRemove>,
State(state): State<AppState>,
Json(request_body): Json<MemberToInvite>,
) -> Result<impl IntoResponse, ChaosError> {
Organisation::remove_member(id, request_body.user_id, &mut transaction.tx).await?;
Organisation::invite_user(id, request_body.email, state.email_credentials, &mut transaction.tx).await?;

transaction.tx.commit().await?;
Ok((
StatusCode::OK,
"Successfully removed member from organisation",
))
Ok(AppMessage::OkMessage("Successfully invited user to organisation"))
}

/// Updates an organisation's logo.
Expand Down
8 changes: 6 additions & 2 deletions backend/server/src/models/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -255,8 +255,8 @@ pub async fn app() -> Result<Router, ChaosError> {
.put(OrganisationHandler::update_members)
)
.route(
"/api/v1/organisation/:organisation_id/member",
delete(OrganisationHandler::remove_member),
"/api/v1/organisation/:organisation_id/user",
post(OrganisationHandler::invite_user).delete(OrganisationHandler::remove_user),
)
.route(
"/api/v1/organisation/:organisation_id/admins",
Expand All @@ -267,6 +267,10 @@ pub async fn app() -> Result<Router, ChaosError> {
"/api/v1/organisation/:organisation_id/admin",
delete(OrganisationHandler::remove_admin),
)
.route(
"/api/v1/organisation/:organisation_id/users",
get(OrganisationHandler::get_users)
)
.route(
"/api/v1/rating/:rating_id",
get(RatingHandler::get)
Expand Down
1 change: 1 addition & 0 deletions backend/server/src/models/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ impl IntoResponse for ChaosError {
AppMessage::UnauthorizedMessage("Forbidden operation").into_response()
}
ChaosError::BadRequest => AppMessage::BadRequestMessage("Bad request").into_response(),
ChaosError::BadRequestWithMessage(msg) => AppMessage::BadRequestMessage(msg).into_response(),
ChaosError::ApplicationClosed => AppMessage::BadRequestMessage("Application closed").into_response(),
ChaosError::CampaignClosed => AppMessage::BadRequestMessage("Campaign closed").into_response(),
ChaosError::DatabaseError(db_error) => match db_error {
Expand Down
Loading
Loading