add auth system: users, login, JWT, protected routes
Domain: User entity, AuthPort/PasswordHashPort/SecretStore ports. Adapters: auth (argon2 hashing, JWT tokens), secret-store (env-based), config-sqlite user repository, http-api auth routes + extractors. Application: auth_service. SPA: login page, auth client, protected router.
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
use crate::AppState;
|
||||
use crate::extractors::AuthUser;
|
||||
use api_types::{CreateWidgetDto, WidgetDto};
|
||||
use application::ConfigService;
|
||||
use axum::{
|
||||
@@ -8,10 +9,11 @@ use axum::{
|
||||
};
|
||||
use domain::{ConfigRepository, EventPublisher, WidgetStateReader};
|
||||
|
||||
type S<C, E, W, B, R> = State<AppState<C, E, W, B, R>>;
|
||||
type S<C, E, W, B, R, A, H> = State<AppState<C, E, W, B, R, A, H>>;
|
||||
|
||||
pub async fn list_widgets<C, E, W, B, R>(
|
||||
State(state): S<C, E, W, B, R>,
|
||||
pub async fn list_widgets<C, E, W, B, R, A, H>(
|
||||
_auth: AuthUser,
|
||||
State(state): S<C, E, W, B, R, A, H>,
|
||||
) -> Result<Json<Vec<WidgetDto>>, StatusCode>
|
||||
where
|
||||
C: ConfigRepository,
|
||||
@@ -27,8 +29,9 @@ where
|
||||
Ok(Json(widgets.iter().map(WidgetDto::from).collect()))
|
||||
}
|
||||
|
||||
pub async fn get_widget<C, E, W, B, R>(
|
||||
State(state): S<C, E, W, B, R>,
|
||||
pub async fn get_widget<C, E, W, B, R, A, H>(
|
||||
_auth: AuthUser,
|
||||
State(state): S<C, E, W, B, R, A, H>,
|
||||
Path(id): Path<u16>,
|
||||
) -> Result<Json<WidgetDto>, StatusCode>
|
||||
where
|
||||
@@ -48,8 +51,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn create_widget<C, E, W, B, R>(
|
||||
State(state): S<C, E, W, B, R>,
|
||||
pub async fn create_widget<C, E, W, B, R, A, H>(
|
||||
_auth: AuthUser,
|
||||
State(state): S<C, E, W, B, R, A, H>,
|
||||
Json(body): Json<CreateWidgetDto>,
|
||||
) -> Result<StatusCode, (StatusCode, String)>
|
||||
where
|
||||
@@ -68,8 +72,9 @@ where
|
||||
Ok(StatusCode::CREATED)
|
||||
}
|
||||
|
||||
pub async fn update_widget<C, E, W, B, R>(
|
||||
State(state): S<C, E, W, B, R>,
|
||||
pub async fn update_widget<C, E, W, B, R, A, H>(
|
||||
_auth: AuthUser,
|
||||
State(state): S<C, E, W, B, R, A, H>,
|
||||
Path(_id): Path<u16>,
|
||||
Json(body): Json<CreateWidgetDto>,
|
||||
) -> Result<StatusCode, (StatusCode, String)>
|
||||
@@ -89,8 +94,9 @@ where
|
||||
Ok(StatusCode::OK)
|
||||
}
|
||||
|
||||
pub async fn delete_widget<C, E, W, B, R>(
|
||||
State(state): S<C, E, W, B, R>,
|
||||
pub async fn delete_widget<C, E, W, B, R, A, H>(
|
||||
_auth: AuthUser,
|
||||
State(state): S<C, E, W, B, R, A, H>,
|
||||
Path(id): Path<u16>,
|
||||
) -> Result<StatusCode, StatusCode>
|
||||
where
|
||||
@@ -106,8 +112,9 @@ where
|
||||
Ok(StatusCode::NO_CONTENT)
|
||||
}
|
||||
|
||||
pub async fn preview_widget<C, E, W, B, R>(
|
||||
State(state): S<C, E, W, B, R>,
|
||||
pub async fn preview_widget<C, E, W, B, R, A, H>(
|
||||
_auth: AuthUser,
|
||||
State(state): S<C, E, W, B, R, A, H>,
|
||||
Path(id): Path<u16>,
|
||||
) -> Result<Json<serde_json::Value>, StatusCode>
|
||||
where
|
||||
|
||||
Reference in New Issue
Block a user