From c9b755521e78e8125c4f76ce271482ebd0ee85d2 Mon Sep 17 00:00:00 2001 From: Brent Schroeter Date: Tue, 23 Sep 2025 13:08:51 -0700 Subject: [PATCH] refactor with updated naming convention --- interim-models/src/{encodable.rs => datum.rs} | 4 +- interim-models/src/expression.rs | 10 ++--- interim-models/src/field.rs | 12 +++--- interim-models/src/language.rs | 39 ++++++++++++------- interim-models/src/lib.rs | 2 +- interim-models/src/workspace_user_perm.rs | 4 +- interim-server/src/{app_state.rs => app.rs} | 9 ++--- interim-server/src/auth.rs | 4 +- interim-server/src/cli.rs | 4 +- .../src/{app_error.rs => errors.rs} | 0 interim-server/src/main.rs | 12 +++--- interim-server/src/navigator.rs | 2 +- interim-server/src/routes/mod.rs | 2 +- .../relations_single/add_field_handler.rs | 6 +-- .../relations_single/add_portal_handler.rs | 4 +- .../relations_single/get_data_handler.rs | 18 ++++----- .../routes/relations_single/insert_handler.rs | 14 +++---- .../src/routes/relations_single/mod.rs | 2 +- .../routes/relations_single/portal_handler.rs | 10 ++--- .../routes/workspaces_multi/list_handlers.rs | 3 +- .../src/routes/workspaces_multi/mod.rs | 2 +- .../workspaces_single/add_table_handler.rs | 6 +-- .../src/routes/workspaces_single/mod.rs | 2 +- .../routes/workspaces_single/nav_handler.rs | 8 ++-- interim-server/src/sessions.rs | 2 +- interim-server/src/settings.rs | 2 +- interim-server/src/user.rs | 4 +- interim-server/src/worker.rs | 2 +- .../src/{navbar.rs => workspace_nav.rs} | 0 .../{base_pooler.rs => workspace_pooler.rs} | 2 +- ..._user_perms.rs => workspace_user_perms.rs} | 0 .../{lens.html => portal_table.html} | 0 ...able-editor.svelte => datum-editor.svelte} | 10 ++--- .../{encodable.svelte.ts => datum.svelte.ts} | 22 +++++------ svelte/src/editor-state.svelte.ts | 8 ++-- svelte/src/expression-editor.webc.svelte | 16 ++++---- svelte/src/expression.svelte.ts | 4 +- svelte/src/field.svelte.ts | 4 +- svelte/src/presentation.svelte.ts | 4 +- svelte/src/table-viewer.webc.svelte | 32 +++++++-------- 40 files changed, 146 insertions(+), 145 deletions(-) rename interim-models/src/{encodable.rs => datum.rs} (97%) rename interim-server/src/{app_state.rs => app.rs} (93%) rename interim-server/src/{app_error.rs => errors.rs} (100%) rename interim-server/src/{navbar.rs => workspace_nav.rs} (100%) rename interim-server/src/{base_pooler.rs => workspace_pooler.rs} (99%) rename interim-server/src/{base_user_perms.rs => workspace_user_perms.rs} (100%) rename interim-server/templates/{lens.html => portal_table.html} (100%) rename svelte/src/{encodable-editor.svelte => datum-editor.svelte} (88%) rename svelte/src/{encodable.svelte.ts => datum.svelte.ts} (51%) diff --git a/interim-models/src/encodable.rs b/interim-models/src/datum.rs similarity index 97% rename from interim-models/src/encodable.rs rename to interim-models/src/datum.rs index ba4c6c5..a7fdbee 100644 --- a/interim-models/src/encodable.rs +++ b/interim-models/src/datum.rs @@ -5,13 +5,13 @@ use uuid::Uuid; #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] #[serde(tag = "t", content = "c")] -pub enum Encodable { +pub enum Datum { Text(Option), Timestamp(Option>), Uuid(Option), } -impl Encodable { +impl Datum { // TODO: Can something similar be achieved with a generic return type? /// Bind this as a parameter to a sqlx query. pub fn bind_onto<'a>( diff --git a/interim-models/src/expression.rs b/interim-models/src/expression.rs index a8dd32c..ad050d0 100644 --- a/interim-models/src/expression.rs +++ b/interim-models/src/expression.rs @@ -3,7 +3,7 @@ use std::fmt::Display; use interim_pgtypes::escape_identifier; use serde::{Deserialize, Serialize}; -use crate::encodable::Encodable; +use crate::datum::Datum; #[derive(Clone, Debug, PartialEq)] pub struct QueryFragment { @@ -12,7 +12,7 @@ pub struct QueryFragment { /// the lines of `["select * from foo where id = ", " and status = ", ""]`. /// `plain_sql` should always have exactly one more element than `params`. plain_sql: Vec, - params: Vec, + params: Vec, } impl QueryFragment { @@ -34,7 +34,7 @@ impl QueryFragment { .join("") } - pub fn to_params(&self) -> Vec { + pub fn to_params(&self) -> Vec { self.params.clone() } @@ -45,7 +45,7 @@ impl QueryFragment { } } - pub fn from_param(param: Encodable) -> Self { + pub fn from_param(param: Datum) -> Self { Self { plain_sql: vec!["".to_owned(), "".to_owned()], params: vec![param], @@ -99,7 +99,7 @@ impl QueryFragment { pub enum PgExpressionAny { Comparison(PgComparisonExpression), Identifier(PgIdentifierExpression), - Literal(Encodable), + Literal(Datum), ToJson(PgToJsonExpression), } diff --git a/interim-models/src/field.rs b/interim-models/src/field.rs index 68df728..83a9cc6 100644 --- a/interim-models/src/field.rs +++ b/interim-models/src/field.rs @@ -7,7 +7,7 @@ use thiserror::Error; use uuid::Uuid; use crate::client::AppDbClient; -use crate::encodable::Encodable; +use crate::datum::Datum; use crate::presentation::Presentation; /// A materialization of a database column, fit for consumption by an end user. @@ -51,7 +51,7 @@ impl Field { }) } - pub fn get_value_encodable(&self, row: &PgRow) -> Result { + pub fn get_datum(&self, row: &PgRow) -> Result { let value_ref = row .try_get_raw(self.name.as_str()) .or(Err(ParseError::FieldNotFound))?; @@ -60,12 +60,10 @@ impl Field { dbg!(&ty); Ok(match ty { "TEXT" | "VARCHAR" => { - Encodable::Text( as Decode>::decode(value_ref).unwrap()) + Datum::Text( as Decode>::decode(value_ref).unwrap()) } - "UUID" => { - Encodable::Uuid( as Decode>::decode(value_ref).unwrap()) - } - "TIMESTAMPTZ" => Encodable::Timestamp( + "UUID" => Datum::Uuid( as Decode>::decode(value_ref).unwrap()), + "TIMESTAMPTZ" => Datum::Timestamp( > as Decode>::decode(value_ref).unwrap(), ), _ => return Err(ParseError::UnknownType), diff --git a/interim-models/src/language.rs b/interim-models/src/language.rs index d3820fe..f2914b6 100644 --- a/interim-models/src/language.rs +++ b/interim-models/src/language.rs @@ -1,24 +1,34 @@ +use std::str::FromStr; + use serde::{Deserialize, Serialize}; -use sqlx::Decode; +use sqlx::{Decode, Postgres}; use strum::{EnumIter, EnumString}; /// Languages represented as /// [ISO 639-3 codes](https://en.wikipedia.org/wiki/List_of_ISO_639-3_codes). -#[derive( - Clone, Debug, Decode, Deserialize, strum::Display, PartialEq, Serialize, EnumIter, EnumString, -)] +#[derive(Clone, Debug, Deserialize, strum::Display, PartialEq, Serialize, EnumIter, EnumString)] #[serde(rename_all = "lowercase")] #[strum(serialize_all = "lowercase")] -// [`sqlx`] implements Decode and Encode to/from the Postgres `TEXT` type based -// on the [`std::fmt::Display`] and [`std::str::FromStr`] traits, so it should -// use the transformations applied by [`strum`]. -// +// NOTE: The [`sqlx::Encode`] and [`sqlx::Decode`] derive macros do not seem to +// use the [`strum`] serializations. The corresponding traits should be +// implemented explicitly (if used). pub enum Language { Deu, Eng, Spa, } +impl Language { + /// Returns language name to be presented in UI. + pub fn as_locale_str(&self) -> &'static str { + match self { + Self::Deu => "Deutsch", + Self::Eng => "English", + Self::Spa => "Español", + } + } +} + impl Default for Language { /// Language defaults to English when necessary, as the product is being /// developed with a primarily English speaking/reading/writing market in @@ -28,12 +38,11 @@ impl Default for Language { } } -impl Language { - pub fn as_locale_str(&self) -> &'static str { - match self { - Self::Deu => "Deutsch", - Self::Eng => "English", - Self::Spa => "Español", - } +impl Decode<'_, Postgres> for Language { + fn decode( + value: ::ValueRef<'_>, + ) -> Result { + let value = <&str as Decode>::decode(value)?; + Ok(Self::from_str(value)?) } } diff --git a/interim-models/src/lib.rs b/interim-models/src/lib.rs index 9395d41..4464ec6 100644 --- a/interim-models/src/lib.rs +++ b/interim-models/src/lib.rs @@ -1,5 +1,5 @@ pub mod client; -pub mod encodable; +pub mod datum; pub mod expression; pub mod field; pub mod field_form_prompt; diff --git a/interim-models/src/workspace_user_perm.rs b/interim-models/src/workspace_user_perm.rs index e6f4d92..1bf30a2 100644 --- a/interim-models/src/workspace_user_perm.rs +++ b/interim-models/src/workspace_user_perm.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use derive_builder::Builder; use serde::{Deserialize, Serialize}; -use sqlx::{Decode, Encode, Postgres, query_as}; +use sqlx::{Decode, Postgres, query_as}; use strum::EnumString; use uuid::Uuid; @@ -113,7 +113,7 @@ from workspace_user_perms as p // TODO: The sqlx::Decode derive macro doesn't follow the strum serialization. // Does sqlx::Encode? -#[derive(Clone, Debug, Deserialize, Encode, EnumString, PartialEq, Serialize, strum::Display)] +#[derive(Clone, Debug, Deserialize, EnumString, PartialEq, Serialize, strum::Display)] #[serde(rename = "snake_case")] #[strum(serialize_all = "snake_case")] pub enum PermissionValue { diff --git a/interim-server/src/app_state.rs b/interim-server/src/app.rs similarity index 93% rename from interim-server/src/app_state.rs rename to interim-server/src/app.rs index 1629e4d..e794d16 100644 --- a/interim-server/src/app_state.rs +++ b/interim-server/src/app.rs @@ -7,11 +7,10 @@ use interim_models::client::AppDbClient; use oauth2::basic::BasicClient; use sqlx::postgres::PgPoolOptions; -use crate::app_error::AppError; -use crate::auth; -use crate::base_pooler::WorkspacePooler; -use crate::sessions::PgStore; -use crate::settings::Settings; +use crate::{ + auth, errors::AppError, sessions::PgStore, settings::Settings, + workspace_pooler::WorkspacePooler, +}; /// Global app configuration #[derive(Clone, Debug)] diff --git a/interim-server/src/auth.rs b/interim-server/src/auth.rs index 3238ee0..bdf0193 100644 --- a/interim-server/src/auth.rs +++ b/interim-server/src/auth.rs @@ -14,8 +14,8 @@ use oauth2::{ use serde::{Deserialize, Serialize}; use crate::{ - app_error::AppError, - app_state::{App, ReqwestClient}, + app::{App, ReqwestClient}, + errors::AppError, sessions::{AppSession, PgStore}, settings::Settings, }; diff --git a/interim-server/src/cli.rs b/interim-server/src/cli.rs index f029833..471a597 100644 --- a/interim-server/src/cli.rs +++ b/interim-server/src/cli.rs @@ -15,9 +15,7 @@ use tower_http::{ compression::CompressionLayer, set_header::response::SetResponseHeaderLayer, trace::TraceLayer, }; -use crate::{ - app_state::App, middleware::lowercase_uri_path, routes::new_router, worker::run_worker, -}; +use crate::{app::App, middleware::lowercase_uri_path, routes::new_router, worker::run_worker}; #[derive(Parser)] #[command(version, about, long_about = None)] diff --git a/interim-server/src/app_error.rs b/interim-server/src/errors.rs similarity index 100% rename from interim-server/src/app_error.rs rename to interim-server/src/errors.rs diff --git a/interim-server/src/main.rs b/interim-server/src/main.rs index 0742cab..fb92656 100644 --- a/interim-server/src/main.rs +++ b/interim-server/src/main.rs @@ -5,20 +5,17 @@ use interim_models::MIGRATOR; use tracing_subscriber::EnvFilter; use crate::{ - app_state::App, + app::App, cli::{Cli, Commands, serve_command, worker_command}, settings::Settings, }; -mod app_error; -mod app_state; +mod app; mod auth; -mod base_pooler; -mod base_user_perms; mod cli; +mod errors; mod field_info; mod middleware; -mod navbar; mod navigator; mod renderable_role_tree; mod routes; @@ -26,6 +23,9 @@ mod sessions; mod settings; mod user; mod worker; +mod workspace_nav; +mod workspace_pooler; +mod workspace_user_perms; /// Run CLI #[tokio::main] diff --git a/interim-server/src/navigator.rs b/interim-server/src/navigator.rs index ed8f62c..bc0b3d1 100644 --- a/interim-server/src/navigator.rs +++ b/interim-server/src/navigator.rs @@ -6,7 +6,7 @@ use axum::{ use interim_models::portal::Portal; use uuid::Uuid; -use crate::{app_error::AppError, app_state::App}; +use crate::{app::App, errors::AppError}; /// Helper type for semantically generating URI paths, e.g. for redirects. #[derive(Clone, Debug)] diff --git a/interim-server/src/routes/mod.rs b/interim-server/src/routes/mod.rs index d0058c0..01d613e 100644 --- a/interim-server/src/routes/mod.rs +++ b/interim-server/src/routes/mod.rs @@ -22,7 +22,7 @@ use tower_http::{ }; use crate::auth; -use crate::{app_state::App, settings::Settings}; +use crate::{app::App, settings::Settings}; mod relations_single; mod workspaces_multi; diff --git a/interim-server/src/routes/relations_single/add_field_handler.rs b/interim-server/src/routes/relations_single/add_field_handler.rs index 52eb1f1..bdf4002 100644 --- a/interim-server/src/routes/relations_single/add_field_handler.rs +++ b/interim-server/src/routes/relations_single/add_field_handler.rs @@ -19,11 +19,11 @@ use sqlx::query; use uuid::Uuid; use crate::{ - app_error::{AppError, forbidden}, - app_state::{App, AppDbConn}, - base_pooler::{RoleAssignment, WorkspacePooler}, + app::{App, AppDbConn}, + errors::{AppError, forbidden}, navigator::Navigator, user::CurrentUser, + workspace_pooler::{RoleAssignment, WorkspacePooler}, }; #[derive(Debug, Deserialize)] diff --git a/interim-server/src/routes/relations_single/add_portal_handler.rs b/interim-server/src/routes/relations_single/add_portal_handler.rs index 443eebc..0bd03f5 100644 --- a/interim-server/src/routes/relations_single/add_portal_handler.rs +++ b/interim-server/src/routes/relations_single/add_portal_handler.rs @@ -8,8 +8,8 @@ use sqlx::postgres::types::Oid; use uuid::Uuid; use crate::{ - app_error::{AppError, forbidden}, - app_state::AppDbConn, + app::AppDbConn, + errors::{AppError, forbidden}, navigator::Navigator, user::CurrentUser, }; diff --git a/interim-server/src/routes/relations_single/get_data_handler.rs b/interim-server/src/routes/relations_single/get_data_handler.rs index e1763a6..abe4502 100644 --- a/interim-server/src/routes/relations_single/get_data_handler.rs +++ b/interim-server/src/routes/relations_single/get_data_handler.rs @@ -5,18 +5,18 @@ use axum::{ extract::{Path, State}, response::{IntoResponse as _, Response}, }; -use interim_models::{encodable::Encodable, field::Field, portal::Portal}; +use interim_models::{datum::Datum, field::Field, portal::Portal}; use interim_pgtypes::{escape_identifier, pg_attribute::PgAttribute, pg_class::PgClass}; use serde::{Deserialize, Serialize}; use sqlx::{postgres::PgRow, query}; use uuid::Uuid; use crate::{ - app_error::AppError, - app_state::AppDbConn, - base_pooler::{RoleAssignment, WorkspacePooler}, + app::AppDbConn, + errors::AppError, field_info::FieldInfo, user::CurrentUser, + workspace_pooler::{RoleAssignment, WorkspacePooler}, }; #[derive(Clone, Debug, Deserialize)] @@ -106,23 +106,23 @@ pub(super) async fn get( #[derive(Serialize)] struct DataRow { pkey: String, - data: Vec, + data: Vec, } let mut data_rows: Vec = vec![]; let mut pkeys: Vec = vec![]; for row in rows.iter() { - let mut pkey_values: HashMap = HashMap::new(); + let mut pkey_values: HashMap = HashMap::new(); for attr in pkey_attrs.clone() { let field = Field::default_from_attr(&attr) .ok_or(anyhow::anyhow!("unsupported primary key column type"))?; - pkey_values.insert(field.name.clone(), field.get_value_encodable(row)?); + pkey_values.insert(field.name.clone(), field.get_datum(row)?); } let pkey = serde_json::to_string(&pkey_values)?; pkeys.push(pkey.clone()); - let mut row_data: Vec = vec![]; + let mut row_data: Vec = vec![]; for field in fields.iter() { - row_data.push(field.field.get_value_encodable(row)?); + row_data.push(field.field.get_datum(row)?); } data_rows.push(DataRow { pkey, diff --git a/interim-server/src/routes/relations_single/insert_handler.rs b/interim-server/src/routes/relations_single/insert_handler.rs index 777b38a..2361a03 100644 --- a/interim-server/src/routes/relations_single/insert_handler.rs +++ b/interim-server/src/routes/relations_single/insert_handler.rs @@ -9,7 +9,7 @@ use axum::{ // https://docs.rs/axum-extra/0.10.1/axum_extra/extract/struct.Form.html#differences-from-axumextractform use axum_extra::extract::Form; use interim_models::{ - encodable::Encodable, + datum::Datum, portal::Portal, workspace::Workspace, workspace_user_perm::{self, WorkspaceUserPerm}, @@ -20,11 +20,11 @@ use sqlx::{postgres::types::Oid, query}; use uuid::Uuid; use crate::{ - app_error::{AppError, forbidden}, - app_state::{App, AppDbConn}, - base_pooler::{RoleAssignment, WorkspacePooler}, + app::{App, AppDbConn}, + errors::{AppError, forbidden}, navigator::Navigator, user::CurrentUser, + workspace_pooler::{RoleAssignment, WorkspacePooler}, }; #[derive(Debug, Deserialize)] @@ -38,7 +38,7 @@ pub(super) struct PathParams { /// takes a form where the keys are column names, with keys optionally repeated /// to insert multiple rows at once. If any key is repeated, the others should /// be repeated the same number of times. Form values are expected to be JSON- -/// serialized representations of the `[Encodable]` type. +/// serialized representations of the `[Datum]` type. #[debug_handler(state = App)] pub(super) async fn post( State(mut workspace_pooler): State, @@ -87,12 +87,12 @@ pub(super) async fn post( let n_rows = form.values().map(|value| value.len()).max().unwrap_or(0); if n_rows > 0 { let mut param_index = 1; - let mut params: Vec = vec![]; + let mut params: Vec = vec![]; let mut row_list: Vec = vec![]; for i in 0..n_rows { let mut param_slots: Vec = vec![]; for col in col_names.iter() { - let maybe_value: Option = form + let maybe_value: Option = form .get(col) .and_then(|col_values| col_values.get(i)) .map(|value_raw| serde_json::from_str(value_raw)) diff --git a/interim-server/src/routes/relations_single/mod.rs b/interim-server/src/routes/relations_single/mod.rs index ebf2836..f174c9a 100644 --- a/interim-server/src/routes/relations_single/mod.rs +++ b/interim-server/src/routes/relations_single/mod.rs @@ -4,7 +4,7 @@ use axum::{ }; use axum_extra::routing::RouterExt as _; -use crate::app_state::App; +use crate::app::App; mod add_field_handler; mod add_portal_handler; diff --git a/interim-server/src/routes/relations_single/portal_handler.rs b/interim-server/src/routes/relations_single/portal_handler.rs index 5de9541..17651d0 100644 --- a/interim-server/src/routes/relations_single/portal_handler.rs +++ b/interim-server/src/routes/relations_single/portal_handler.rs @@ -10,13 +10,13 @@ use sqlx::postgres::types::Oid; use uuid::Uuid; use crate::{ - app_error::AppError, - app_state::AppDbConn, - base_pooler::{RoleAssignment, WorkspacePooler}, - navbar::{NavLocation, RelLocation, WorkspaceNav}, + app::AppDbConn, + errors::AppError, navigator::Navigator, settings::Settings, user::CurrentUser, + workspace_nav::{NavLocation, RelLocation, WorkspaceNav}, + workspace_pooler::{RoleAssignment, WorkspacePooler}, }; #[derive(Clone, Debug, Deserialize)] @@ -59,7 +59,7 @@ pub(super) async fn get( let attr_names: Vec = attrs.iter().map(|attr| attr.attname.clone()).collect(); #[derive(Template)] - #[template(path = "lens.html")] + #[template(path = "portal_table.html")] struct ResponseTemplate { attr_names: Vec, filter: Option, diff --git a/interim-server/src/routes/workspaces_multi/list_handlers.rs b/interim-server/src/routes/workspaces_multi/list_handlers.rs index b0cc4e5..3fa8a04 100644 --- a/interim-server/src/routes/workspaces_multi/list_handlers.rs +++ b/interim-server/src/routes/workspaces_multi/list_handlers.rs @@ -6,8 +6,7 @@ use axum::{ use interim_models::workspace_user_perm::WorkspaceUserPerm; use crate::{ - app_error::AppError, app_state::AppDbConn, navigator::Navigator, settings::Settings, - user::CurrentUser, + app::AppDbConn, errors::AppError, navigator::Navigator, settings::Settings, user::CurrentUser, }; pub(super) async fn get( diff --git a/interim-server/src/routes/workspaces_multi/mod.rs b/interim-server/src/routes/workspaces_multi/mod.rs index 11b2579..2615b61 100644 --- a/interim-server/src/routes/workspaces_multi/mod.rs +++ b/interim-server/src/routes/workspaces_multi/mod.rs @@ -1,7 +1,7 @@ use axum::{Router, response::Redirect, routing::get}; use axum_extra::routing::RouterExt as _; -use crate::app_state::App; +use crate::app::App; mod list_handlers; diff --git a/interim-server/src/routes/workspaces_single/add_table_handler.rs b/interim-server/src/routes/workspaces_single/add_table_handler.rs index 81782f7..4ff37ba 100644 --- a/interim-server/src/routes/workspaces_single/add_table_handler.rs +++ b/interim-server/src/routes/workspaces_single/add_table_handler.rs @@ -9,12 +9,12 @@ use sqlx::query; use uuid::Uuid; use crate::{ - app_error::{AppError, forbidden}, - app_state::AppDbConn, - base_pooler::{RoleAssignment, WorkspacePooler}, + app::AppDbConn, + errors::{AppError, forbidden}, navigator::Navigator, settings::Settings, user::CurrentUser, + workspace_pooler::{RoleAssignment, WorkspacePooler}, }; #[derive(Debug, Deserialize)] diff --git a/interim-server/src/routes/workspaces_single/mod.rs b/interim-server/src/routes/workspaces_single/mod.rs index 4261735..931de89 100644 --- a/interim-server/src/routes/workspaces_single/mod.rs +++ b/interim-server/src/routes/workspaces_single/mod.rs @@ -5,7 +5,7 @@ use axum::{ }; use axum_extra::routing::RouterExt as _; -use crate::app_state::App; +use crate::app::App; use super::relations_single; diff --git a/interim-server/src/routes/workspaces_single/nav_handler.rs b/interim-server/src/routes/workspaces_single/nav_handler.rs index 49ac6d4..27dc67f 100644 --- a/interim-server/src/routes/workspaces_single/nav_handler.rs +++ b/interim-server/src/routes/workspaces_single/nav_handler.rs @@ -12,13 +12,13 @@ use serde::Deserialize; use uuid::Uuid; use crate::{ - app_error::{AppError, forbidden}, - app_state::{App, AppDbConn}, - base_pooler::{RoleAssignment, WorkspacePooler}, - navbar::WorkspaceNav, + app::{App, AppDbConn}, + errors::{AppError, forbidden}, navigator::Navigator, settings::Settings, user::CurrentUser, + workspace_nav::WorkspaceNav, + workspace_pooler::{RoleAssignment, WorkspacePooler}, }; #[derive(Debug, Deserialize)] diff --git a/interim-server/src/sessions.rs b/interim-server/src/sessions.rs index b1c19f2..1e1d91e 100644 --- a/interim-server/src/sessions.rs +++ b/interim-server/src/sessions.rs @@ -12,7 +12,7 @@ use chrono::{DateTime, TimeDelta, Utc}; use sqlx::{PgPool, query, query_as}; use tracing::{Instrument, trace_span}; -use crate::{app_error::AppError, app_state::App}; +use crate::{app::App, errors::AppError}; const EXPIRY_DAYS: i64 = 7; diff --git a/interim-server/src/settings.rs b/interim-server/src/settings.rs index f2e85b4..592c813 100644 --- a/interim-server/src/settings.rs +++ b/interim-server/src/settings.rs @@ -6,7 +6,7 @@ use config::{Config, Environment}; use dotenvy::dotenv; use serde::Deserialize; -use crate::app_state::App; +use crate::app::App; #[derive(Clone, Debug, Deserialize)] pub(crate) struct Settings { diff --git a/interim-server/src/user.rs b/interim-server/src/user.rs index 877d7f8..f8a6598 100644 --- a/interim-server/src/user.rs +++ b/interim-server/src/user.rs @@ -16,9 +16,9 @@ use sqlx::query_as; use uuid::Uuid; use crate::{ - app_error::AppError, - app_state::App, + app::App, auth::{AuthInfo, SESSION_KEY_AUTH_INFO, SESSION_KEY_AUTH_REDIRECT}, + errors::AppError, sessions::AppSession, }; diff --git a/interim-server/src/worker.rs b/interim-server/src/worker.rs index fb06199..ffb2f2c 100644 --- a/interim-server/src/worker.rs +++ b/interim-server/src/worker.rs @@ -1,7 +1,7 @@ use anyhow::Result; use tracing::Instrument as _; -use crate::app_state::App; +use crate::app::App; pub async fn run_worker(_state: App) -> Result<()> { async move { Ok(()) } diff --git a/interim-server/src/navbar.rs b/interim-server/src/workspace_nav.rs similarity index 100% rename from interim-server/src/navbar.rs rename to interim-server/src/workspace_nav.rs diff --git a/interim-server/src/base_pooler.rs b/interim-server/src/workspace_pooler.rs similarity index 99% rename from interim-server/src/base_pooler.rs rename to interim-server/src/workspace_pooler.rs index ee58b84..52c3e2d 100644 --- a/interim-server/src/base_pooler.rs +++ b/interim-server/src/workspace_pooler.rs @@ -9,7 +9,7 @@ use sqlx::{Executor, PgPool, postgres::PgPoolOptions, raw_sql}; use tokio::sync::{OnceCell, RwLock}; use uuid::Uuid; -use crate::app_state::App; +use crate::app::App; const MAX_CONNECTIONS: u32 = 4; const IDLE_SECONDS: u64 = 3600; diff --git a/interim-server/src/base_user_perms.rs b/interim-server/src/workspace_user_perms.rs similarity index 100% rename from interim-server/src/base_user_perms.rs rename to interim-server/src/workspace_user_perms.rs diff --git a/interim-server/templates/lens.html b/interim-server/templates/portal_table.html similarity index 100% rename from interim-server/templates/lens.html rename to interim-server/templates/portal_table.html diff --git a/svelte/src/encodable-editor.svelte b/svelte/src/datum-editor.svelte similarity index 88% rename from svelte/src/encodable-editor.svelte rename to svelte/src/datum-editor.svelte index 2328902..ca88cfe 100644 --- a/svelte/src/encodable-editor.svelte +++ b/svelte/src/datum-editor.svelte @@ -30,12 +30,12 @@ } -
+
{#if assignable_fields.length > 0} -
+
{#each assignable_fields as assignable_field_info} @@ -58,7 +58,7 @@
{/if} -
+
{#if field_info.field.presentation.t === "Text" || field_info.field.presentation.t === "Uuid"} {:else if field_info.field.presentation.t === "Timestamp"} diff --git a/svelte/src/encodable.svelte.ts b/svelte/src/datum.svelte.ts similarity index 51% rename from svelte/src/encodable.svelte.ts rename to svelte/src/datum.svelte.ts index c8edf64..213d7e7 100644 --- a/svelte/src/encodable.svelte.ts +++ b/svelte/src/datum.svelte.ts @@ -2,9 +2,7 @@ import { z } from "zod"; type Assert<_T extends true> = void; -// -------- Encodable -------- // - -export const all_encodable_tags = [ +export const all_datum_tags = [ "Text", "Timestamp", "Uuid", @@ -12,28 +10,28 @@ export const all_encodable_tags = [ // Type checking to ensure that all valid enum tags are included. type _ = Assert< - Encodable["t"] extends (typeof all_encodable_tags)[number] ? true : false + Datum["t"] extends (typeof all_datum_tags)[number] ? true : false >; -const encodable_text_schema = z.object({ +const datum_text_schema = z.object({ t: z.literal("Text"), c: z.string().nullish().transform((x) => x ?? undefined), }); -const encodable_timestamp_schema = z.object({ +const datum_timestamp_schema = z.object({ t: z.literal("Timestamp"), c: z.coerce.date().nullish().transform((x) => x ?? undefined), }); -const encodable_uuid_schema = z.object({ +const datum_uuid_schema = z.object({ t: z.literal("Uuid"), c: z.string().nullish().transform((x) => x ?? undefined), }); -export const encodable_schema = z.union([ - encodable_text_schema, - encodable_timestamp_schema, - encodable_uuid_schema, +export const datum_schema = z.union([ + datum_text_schema, + datum_timestamp_schema, + datum_uuid_schema, ]); -export type Encodable = z.infer; +export type Datum = z.infer; diff --git a/svelte/src/editor-state.svelte.ts b/svelte/src/editor-state.svelte.ts index 6909498..358a617 100644 --- a/svelte/src/editor-state.svelte.ts +++ b/svelte/src/editor-state.svelte.ts @@ -1,6 +1,6 @@ import * as uuid from "uuid"; -import { type Encodable } from "./encodable.svelte.ts"; +import { type Datum } from "./datum.svelte.ts"; import { type Presentation } from "./presentation.svelte.ts"; type Assert<_T extends true> = void; @@ -22,7 +22,7 @@ export const DEFAULT_EDITOR_STATE: EditorState = { is_null: false, }; -export function editor_state_from_encodable(value: Encodable): EditorState { +export function editor_state_from_datum(value: Datum): EditorState { if (value.t === "Text") { return { ...DEFAULT_EDITOR_STATE, @@ -53,10 +53,10 @@ export function editor_state_from_encodable(value: Encodable): EditorState { throw new Error("this should be unreachable"); } -export function encodable_from_editor_state( +export function datum_from_editor_state( value: EditorState, presentation: Presentation, -): Encodable | undefined { +): Datum | undefined { if (presentation.t === "Text") { return { t: "Text", c: value.text_value }; } diff --git a/svelte/src/expression-editor.webc.svelte b/svelte/src/expression-editor.webc.svelte index 31b48ec..16083d8 100644 --- a/svelte/src/expression-editor.webc.svelte +++ b/svelte/src/expression-editor.webc.svelte @@ -10,15 +10,15 @@ />