Intial code for user administration

This commit is contained in:
Chris Jean-Marie 2024-09-24 17:34:04 +00:00
parent fa317acbbf
commit 75f6b94005
3 changed files with 22 additions and 8 deletions

View File

@ -4,7 +4,8 @@ use axum::{
middleware, response::{Html, IntoResponse, Response}, routing::{get, get_service}, Extension, Router middleware, response::{Html, IntoResponse, Response}, routing::{get, get_service}, Extension, Router
}; };
use http::{Request, StatusCode}; use http::{Request, StatusCode};
use sqlx::{sqlite::SqlitePoolOptions, SqlitePool}; use serde::{Deserialize, Serialize};
use sqlx::{prelude::FromRow, sqlite::SqlitePoolOptions, SqlitePool};
use tower_http::services::ServeDir; use tower_http::services::ServeDir;
mod error_handling; mod error_handling;
@ -49,7 +50,8 @@ pub struct AppState {
pub db_pool: SqlitePool, pub db_pool: SqlitePool,
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug, FromRow)]
#[derive(Serialize, Deserialize)]
pub struct UserData { pub struct UserData {
#[allow(dead_code)] #[allow(dead_code)]
pub user_id: i64, pub user_id: i64,
@ -81,7 +83,7 @@ async fn main() {
//Routes that require authentication //Routes that require authentication
.route("/logout", get(logout)) .route("/logout", get(logout))
.route("/profile", get(profile)) .route("/profile", get(profile))
.route("/useradmin", get(useradmin)) //.route("/useradmin", get(useradmin))
.route_layer(middleware::from_fn_with_state(app_state.clone(), check_auth)) .route_layer(middleware::from_fn_with_state(app_state.clone(), check_auth))
//Routes that don't require authentication //Routes that don't require authentication

View File

@ -1,6 +1,8 @@
use askama_axum::Template; use askama_axum::Template;
use axum::{response::IntoResponse, Extension}; use axum::{extract::State, response::IntoResponse, Extension};
use http::Request; use http::Request;
use serde::{Deserialize, Serialize};
use sqlx::SqlitePool;
use crate::{HtmlTemplate, UserData}; use crate::{HtmlTemplate, UserData};
@ -22,22 +24,32 @@ pub async fn profile<T>(
let template = ProfileTemplate { logged_in, name}; let template = ProfileTemplate { logged_in, name};
HtmlTemplate(template) HtmlTemplate(template)
} }
/*
#[derive(Template)] #[derive(Template)]
#[derive(Serialize, Deserialize)]
#[template(path = "useradmin.html")] #[template(path = "useradmin.html")]
struct UserAdminTemplate { struct UserAdminTemplate {
logged_in: bool, logged_in: bool,
name: String, name: String,
users: Vec<UserData>
} }
pub async fn useradmin<T>( pub async fn useradmin<T>(
Extension(user_data): Extension<Option<UserData>>, Extension(user_data): Extension<Option<UserData>>,
State(db_pool): State<SqlitePool>,
_request: Request<T>, _request: Request<T>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let user_email = user_data.map(|s| s.user_email); let user_email = user_data.map(|s| s.user_email);
let logged_in = user_email.is_some(); let logged_in = user_email.is_some();
let name = user_email.unwrap_or_default(); let name = user_email.unwrap_or_default();
let template = UserAdminTemplate { logged_in, name}; let users = sqlx::query_as::<_, UserData>("SELECT * FROM users")
.fetch_all(&db_pool)
.await
.unwrap();
let template = UserAdminTemplate { logged_in, name, users };
HtmlTemplate(template) HtmlTemplate(template)
} }
*/

View File

@ -2,5 +2,5 @@
{% block title %}User Profile{% endblock %} {% block title %}User Profile{% endblock %}
{% block content %} {% block content %}
This is the user administration page. <br /> This is the user administration page. <br />
Your email address: {{ name }}. {{ users }}
{% endblock %} {% endblock %}