diff --git a/interim-server/src/routes/relations_single/update_rel_name_handler.rs b/interim-server/src/routes/relations_single/update_rel_name_handler.rs index 8077c73..180ed57 100644 --- a/interim-server/src/routes/relations_single/update_rel_name_handler.rs +++ b/interim-server/src/routes/relations_single/update_rel_name_handler.rs @@ -13,7 +13,7 @@ use uuid::Uuid; use validator::Validate; use crate::{ - app::{App, AppDbConn}, + app::App, errors::AppError, extractors::ValidatedForm, navigator::{Navigator, NavigatorPage as _}, diff --git a/interim-server/src/routes/workspaces_single/mod.rs b/interim-server/src/routes/workspaces_single/mod.rs index 4cba241..8574e5d 100644 --- a/interim-server/src/routes/workspaces_single/mod.rs +++ b/interim-server/src/routes/workspaces_single/mod.rs @@ -16,6 +16,8 @@ mod add_service_credential_handler; mod add_table_handler; mod nav_handler; mod service_credentials_handler; +mod settings_handler; +mod update_name_handler; mod update_service_cred_permissions_handler; #[derive(Clone, Debug, Deserialize)] @@ -37,6 +39,11 @@ pub(super) fn new_router() -> Router { }, ), ) + .route_with_tsr("/{workspace_id}/settings/", get(settings_handler::get)) + .route( + "/{workspace_id}/settings/update-name", + post(update_name_handler::post), + ) .route( "/{workspace_id}/add-service-credential", post(add_service_credential_handler::post), diff --git a/interim-server/src/routes/workspaces_single/settings_handler.rs b/interim-server/src/routes/workspaces_single/settings_handler.rs new file mode 100644 index 0000000..02f6c60 --- /dev/null +++ b/interim-server/src/routes/workspaces_single/settings_handler.rs @@ -0,0 +1,68 @@ +use askama::Template; +use axum::{ + debug_handler, + extract::{Path, State}, + response::{Html, IntoResponse}, +}; +use interim_models::workspace::Workspace; +use serde::Deserialize; +use uuid::Uuid; + +use crate::{ + app::{App, AppDbConn}, + errors::AppError, + navigator::Navigator, + settings::Settings, + user::CurrentUser, + workspace_nav::WorkspaceNav, + workspace_pooler::{RoleAssignment, WorkspacePooler}, +}; + +#[derive(Debug, Deserialize)] +pub(super) struct PathParams { + workspace_id: Uuid, +} + +/// HTTP GET handler for workspace settings, including renaming, access control, +/// and deletion. +#[debug_handler(state = App)] +pub(super) async fn get( + State(settings): State, + CurrentUser(user): CurrentUser, + AppDbConn(mut app_db): AppDbConn, + Path(PathParams { workspace_id }): Path, + navigator: Navigator, + State(mut pooler): State, +) -> Result { + // FIXME: Check workspace authorization. + // permission to access/alter both as needed. + + let workspace = Workspace::with_id(workspace_id) + .fetch_one(&mut app_db) + .await?; + + let mut workspace_client = pooler + .acquire_for(workspace.id, RoleAssignment::User(user.id)) + .await?; + + #[derive(Debug, Template)] + #[template(path = "workspaces_single/settings.html")] + struct ResponseTemplate { + settings: Settings, + workspace: Workspace, + workspace_nav: WorkspaceNav, + } + Ok(Html( + ResponseTemplate { + workspace_nav: WorkspaceNav::builder() + .navigator(navigator) + .workspace(workspace.clone()) + .populate_rels(&mut app_db, &mut workspace_client) + .await? + .build()?, + workspace, + settings, + } + .render()?, + )) +} diff --git a/interim-server/src/routes/workspaces_single/update_name_handler.rs b/interim-server/src/routes/workspaces_single/update_name_handler.rs new file mode 100644 index 0000000..8236f34 --- /dev/null +++ b/interim-server/src/routes/workspaces_single/update_name_handler.rs @@ -0,0 +1,50 @@ +use axum::{debug_handler, extract::Path, response::Response}; +use serde::Deserialize; +use sqlx::query; +use uuid::Uuid; +use validator::Validate; + +use crate::{ + app::{App, AppDbConn}, + errors::AppError, + extractors::ValidatedForm, + navigator::{Navigator, NavigatorPage as _}, + user::CurrentUser, +}; + +#[derive(Debug, Deserialize)] +pub(super) struct PathParams { + workspace_id: Uuid, +} + +#[derive(Debug, Deserialize, Validate)] +pub(super) struct FormBody { + name: String, +} + +/// HTTP POST handler for updating a workspace's name. +#[debug_handler(state = App)] +pub(super) async fn post( + AppDbConn(mut app_db): AppDbConn, + CurrentUser(_user): CurrentUser, + navigator: Navigator, + Path(PathParams { workspace_id }): Path, + ValidatedForm(FormBody { name }): ValidatedForm, +) -> Result { + // FIXME: Check workspace authorization. + + query!( + "update workspaces set display_name = $1 where id = $2", + name, + workspace_id + ) + .execute(app_db.get_conn()) + .await?; + + Ok(navigator + .workspace_page() + .workspace_id(workspace_id) + .suffix("settings/") + .build()? + .redirect_to()) +} diff --git a/interim-server/templates/portal_table.html b/interim-server/templates/portal_table.html index e0b56fb..c61c67f 100644 --- a/interim-server/templates/portal_table.html +++ b/interim-server/templates/portal_table.html @@ -5,10 +5,8 @@
@@ -22,7 +27,7 @@
-

Name

+

Portal Name

diff --git a/interim-server/templates/relations_single/settings.html b/interim-server/templates/relations_single/settings.html index 98f9af7..ea776ec 100644 --- a/interim-server/templates/relations_single/settings.html +++ b/interim-server/templates/relations_single/settings.html @@ -3,16 +3,17 @@ {% block main %}
+ {% include "toolbar_user.html" %}
{{ workspace_nav | safe }}
-
+
-

Name

+

Table Name

diff --git a/interim-server/templates/workspace_nav.html b/interim-server/templates/workspace_nav.html index 12d339b..5f1758e 100644 --- a/interim-server/templates/workspace_nav.html +++ b/interim-server/templates/workspace_nav.html @@ -8,14 +8,22 @@ {% endif %} - +
  • - PostgreSQL Credentials + PostgreSQL credentials + +
  • +
  • + + Workspace settings
  • @@ -23,7 +31,7 @@ href="{{ navigator.get_root_path() }}/" role="button" > - All Workspaces + All workspaces
  • @@ -39,7 +47,9 @@ method="post" > - +
    @@ -57,16 +67,22 @@ >

    {{ rel.name }}

    - - Settings - + + + +
  • + + Table settings + +
  • +
    +
  • @@ -81,7 +97,9 @@ method="post" > - +
  • @@ -103,17 +121,35 @@ > {{ portal.name }} - - Form - + + + +
  • + + Portal settings + +
  • +
  • + + Form + +
  • +
    +
    {% endfor %} diff --git a/interim-server/templates/workspaces_single/settings.html b/interim-server/templates/workspaces_single/settings.html new file mode 100644 index 0000000..129628d --- /dev/null +++ b/interim-server/templates/workspaces_single/settings.html @@ -0,0 +1,29 @@ +{% extends "base.html" %} + +{% block main %} +
    +
    + {% include "toolbar_user.html" %} +
    +
    +
    + {{ workspace_nav | safe }} +
    +
    +
    +
    +
    +

    Workspace Name

    + + +
    +
    +
    +
    +

    Sharing

    + +
    +
    +
    +
    +{% endblock %} diff --git a/sass/main.scss b/sass/main.scss index 32b250a..0fbe848 100644 --- a/sass/main.scss +++ b/sass/main.scss @@ -58,18 +58,22 @@ button, input[type="submit"] { .button { &--primary { + @include globals.reset-anchor; @include globals.button-primary; } &--secondary { + @include globals.reset-anchor; @include globals.button-secondary; } &--clear { + @include globals.reset-anchor; @include globals.button-clear; } &--small { + @include globals.reset-anchor; @include globals.button-small; } }