···1818use sqlx::{SqlitePool, prelude::FromRow};
1919use uuid::Uuid;
20202121-use crate::{api::response::LuminaryResponse, eyre_fmt, obtain};
2121+use crate::{api::response::LuminaryResponse, eyre_fmt, get_user, obtain};
22222323/// Returns a router containing all authentication-related endpoints.
2424pub fn router() -> Router {
···3131 .post(reset_password),
3232 )
3333 .push(
3434- Router::with_hoop(protected).push(
3535- Router::with_path("users")
3636- .get(get_users)
3737- .post(create_user)
3838- .push(Router::with_path("{user}").delete(delete_user)),
3939- ),
3434+ Router::with_hoop(protected)
3535+ .push(Router::with_path("self").get(get_current_user))
3636+ .push(
3737+ Router::with_path("users")
3838+ .get(get_users)
3939+ .post(create_user)
4040+ .push(Router::with_path("{user}").delete(delete_user)),
4141+ ),
4042 );
4343+}
4444+4545+#[endpoint]
4646+async fn get_current_user(depot: &mut Depot) -> LuminaryResponse<LuminaryUser> {
4747+ return Ok(get_user!(depot).clone().into());
4148}
42494350/// Reads username and password from the request body, and returns an authentication token if the credentials are valid.
+1-1
packages/node/src/util.rs
···1414macro_rules! get_user {
1515 ($depot:expr) => {
1616 $depot
1717- .get::<crate::auth::LuminaryUser>("user")
1717+ .get::<crate::api::auth::LuminaryUser>("user")
1818 .ok()
1919 .and_then(|v| Some(v))
2020 .expect("User can not be obtained from a unprotected endpoint.")
+10
packages/panel/src/lib/api/index.ts
···120120 const response = await client.POST("/api/auth/login", { body: credentials });
121121 putToken(response.data!);
122122}
123123+124124+/**
125125+ * Logs the user out by invalidating the token on the backend and removing it from localStorage.
126126+ */
127127+export async function logout() {
128128+ await client.POST("/api/auth/logout");
129129+ putToken(null);
130130+131131+ await goto("/login");
132132+}