diff --git a/admin_frontend/src/main.rs b/admin_frontend/src/main.rs index d99140c3..421b44eb 100644 --- a/admin_frontend/src/main.rs +++ b/admin_frontend/src/main.rs @@ -20,7 +20,7 @@ async fn main() { let state = AppState { gotrue_client }; - let web_app_router = web_app::router(); + let web_app_router = web_app::router().with_state(state.clone()); let web_api_router = web_api::router().with_state(state); let app = Router::new() diff --git a/admin_frontend/src/web_app.rs b/admin_frontend/src/web_app.rs index 75bdcc5a..40f7afc2 100644 --- a/admin_frontend/src/web_app.rs +++ b/admin_frontend/src/web_app.rs @@ -1,13 +1,13 @@ use crate::access_token::WebAccessToken; use crate::error::RenderError; use askama::Template; +use axum::extract::State; use axum::response::Result; use axum::{response::Html, routing::get, Router}; -use axum_extra::extract::cookie::CookieJar; -use crate::templates; +use crate::{templates, AppState}; -pub fn router() -> Router { +pub fn router() -> Router { Router::new() .route("/", get(home_handler)) .route("/home", get(home_handler)) @@ -26,7 +26,11 @@ pub async fn admin_handler(access_token: WebAccessToken) -> Result, Ok(Html(s)) } -pub async fn admin_users_handler(cookies: CookieJar) -> Result, RenderError> { +pub async fn admin_users_handler( + State(state): State, + access_token: WebAccessToken, +) -> Result, RenderError> { + let users = state.gotrue_client.admin_list_user(&access_token.0).await; todo!() } diff --git a/admin_frontend/templates/admin2.html b/admin_frontend/templates/admin2.html new file mode 100644 index 00000000..b3997171 --- /dev/null +++ b/admin_frontend/templates/admin2.html @@ -0,0 +1 @@ +{% extends "home.html" %} diff --git a/libs/gotrue-entity/src/lib.rs b/libs/gotrue-entity/src/lib.rs index 0b44280d..f76ee77e 100644 --- a/libs/gotrue-entity/src/lib.rs +++ b/libs/gotrue-entity/src/lib.rs @@ -13,6 +13,12 @@ pub struct Identity { pub updated_at: String, } +#[derive(Serialize, Deserialize, Debug)] +pub struct AdminListUsersResponse { + pub users: Vec, + pub aud: String, +} + #[derive(Serialize, Deserialize, Debug)] pub struct User { pub id: String, @@ -48,7 +54,7 @@ pub struct User { pub user_metadata: serde_json::Value, pub factors: Option>, - pub identities: Vec, + pub identities: Option>, pub created_at: String, pub updated_at: String, diff --git a/libs/gotrue/src/api.rs b/libs/gotrue/src/api.rs index a63d9f7f..f5816ffe 100644 --- a/libs/gotrue/src/api.rs +++ b/libs/gotrue/src/api.rs @@ -3,7 +3,8 @@ use anyhow::Context; use super::grant::Grant; use gotrue_entity::{ - AccessTokenResponse, GoTrueError, GoTrueSettings, OAuthError, OAuthProvider, SignUpResponse, User, + AccessTokenResponse, AdminListUsersResponse, GoTrueError, GoTrueSettings, OAuthError, + OAuthProvider, SignUpResponse, User, }; use infra::reqwest::{check_response, from_body, from_response}; @@ -117,6 +118,19 @@ impl Client { to_gotrue_result(resp).await } + pub async fn admin_list_user( + &self, + access_token: &str, + ) -> Result { + let resp = self + .client + .get(format!("{}/admin/users", self.base_url)) + .header("Authorization", format!("Bearer {}", access_token)) + .send() + .await?; + to_gotrue_result(resp).await + } + pub async fn admin_add_user( &self, access_token: &str, diff --git a/tests/gotrue/admin.rs b/tests/gotrue/admin.rs index ca29c28d..5838f87a 100644 --- a/tests/gotrue/admin.rs +++ b/tests/gotrue/admin.rs @@ -12,7 +12,7 @@ use crate::{ }; #[tokio::test] -async fn admin_user_create() { +async fn admin_user_create_and_list() { let http_client = reqwest::Client::new(); let gotrue_client = Client::new(http_client, "http://localhost:9998"); let admin_token = gotrue_client @@ -50,6 +50,12 @@ async fn admin_user_create() { .await .unwrap(); assert!(user_token.user.email_confirmed_at.is_some()); + + let users = gotrue_client + .admin_list_user(&admin_token.access_token) + .await + .unwrap(); + panic!("{:?}", users); } #[tokio::test]