diff --git a/src/main.rs b/src/main.rs index c494df2..b07076e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -323,7 +323,11 @@ async fn webservice(server_config: ServerConfig) -> std::io::Result<()> { web::post().to(views::process_edit_profile), ), ) - .route("/set_admin/{user_id}", web::get().to(views::toggle_admin)), + .route("/set_admin/{user_id}", web::get().to(views::toggle_admin)) + .route( + "/set_language/{language}", + web::get().to(views::set_language), + ), ) .service( web::scope("/delete").service( diff --git a/src/models.rs b/src/models.rs index d1e85cd..ba7bbb4 100644 --- a/src/models.rs +++ b/src/models.rs @@ -63,6 +63,7 @@ impl User { .await?; Ok(()) } + pub(crate) async fn toggle_admin( self, server_config: &ServerConfig, @@ -74,6 +75,21 @@ impl User { Ok(()) } + pub(crate) async fn set_language( + self, + server_config: &ServerConfig, + new_language: &str, + ) -> Result<(), ServerError> { + sqlx::query!( + "UPDATE users SET language = ? where id = ?", + new_language, + self.id + ) + .execute(&server_config.db_pool) + .await?; + Ok(()) + } + pub(crate) async fn count_admins(server_config: &ServerConfig) -> Result { let num = sqlx::query_as!(Count, "select count(*) as number from users where role = 2") .fetch_one(&server_config.db_pool) diff --git a/src/queries.rs b/src/queries.rs index 849f05f..c30c348 100644 --- a/src/queries.rs +++ b/src/queries.rs @@ -305,6 +305,26 @@ pub(crate) async fn toggle_admin( } } +pub(crate) async fn set_language( + id: &Identity, + lang_code: &str, + server_config: &ServerConfig, +) -> Result<(), ServerError> { + match lang_code { + "de" | "en" => match authenticate(id, server_config).await? { + Role::Admin { user } | Role::Regular { user } => { + user.set_language(server_config, lang_code).await + } + Role::Disabled | Role::NotAuthenticated => { + Err(ServerError::User("Not Allowed".to_owned())) + } + }, + _ => Err(ServerError::User( + "This language is not supported!".to_owned(), + )), + } +} + /// Get one link if permissions are accordingly. pub(crate) async fn get_link( id: &Identity, diff --git a/src/views.rs b/src/views.rs index 5dcafca..e0b0573 100644 --- a/src/views.rs +++ b/src/views.rs @@ -282,6 +282,15 @@ pub(crate) async fn toggle_admin( ))) } +pub(crate) async fn set_language( + data: web::Path, + config: web::Data, + id: Identity, +) -> Result { + queries::set_language(&id, &data.0, &config).await?; + Ok(redirect_builder("/admin/index/")) +} + pub(crate) async fn login( tera: web::Data, id: Identity, diff --git a/templates/admin.html b/templates/admin.html index fe55a15..8f6bb65 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -22,6 +22,8 @@
{{ fluent(key="welcome-user", lang=user.language, username=user.username) }}
+
  • en
  • +
  • de
  • {% block admin %}