This commit is contained in:
2025-11-06 12:26:29 +01:00
parent 4027ac66cb
commit a6f79dbc75
12 changed files with 344 additions and 199 deletions
+10 -9
View File
@@ -18,9 +18,10 @@ use crate::auth::{
TenantScopedConn,
};
use crate::error::{AppError, AppResult};
use crate::http::responders::{created_json, no_content, ok_json, JsonResponse};
use crate::models::ApiToken;
use crate::state::{AppState, PgPooledConnection};
use crate::utils::{db::no_content, time::to_iso};
use crate::utils::time::to_iso;
#[derive(Debug, Serialize, ToSchema)]
pub struct ApiTokenResponse {
@@ -71,14 +72,14 @@ pub async fn list_passkeys(
TenantScopedConn {
mut conn, user_id, ..
}: TenantScopedConn,
) -> AppResult<Json<Vec<PasskeySummary>>> {
) -> AppResult<JsonResponse<Vec<PasskeySummary>>> {
let service = state
.passkeys
.as_ref()
.ok_or_else(|| AppError::bad_request("passkey support is disabled"))?;
let passkeys = service.list_for_user(&mut conn, user_id)?;
Ok(Json(passkeys))
ok_json(passkeys)
}
#[utoipa::path(
@@ -94,10 +95,10 @@ pub async fn list_api_tokens(
user_id,
..
}: TenantScopedConn,
) -> AppResult<Json<Vec<ApiTokenResponse>>> {
) -> AppResult<JsonResponse<Vec<ApiTokenResponse>>> {
let tokens = load_tokens(&mut conn, user_id, Some(tenant_id))?;
let responses = tokens.into_iter().map(api_token_to_response).collect();
Ok(Json(responses))
ok_json(responses)
}
#[utoipa::path(
@@ -115,7 +116,7 @@ pub async fn create_api_token(
..
}: TenantScopedConn,
Json(payload): Json<CreateApiTokenRequest>,
) -> AppResult<(StatusCode, Json<ApiTokenCreatedResponse>)> {
) -> AppResult<JsonResponse<ApiTokenCreatedResponse>> {
let expires_at = match payload.expires_at {
Some(ref value) => Some(parse_timestamp(value)?),
None => None,
@@ -140,7 +141,7 @@ pub async fn create_api_token(
token_info,
};
Ok((StatusCode::CREATED, Json(response)))
created_json(response)
}
#[utoipa::path(
@@ -158,7 +159,7 @@ pub async fn regenerate_api_token(
..
}: TenantScopedConn,
Path(token_id): Path<Uuid>,
) -> AppResult<Json<ApiTokenCreatedResponse>> {
) -> AppResult<JsonResponse<ApiTokenCreatedResponse>> {
let issued = rotate_token(&mut conn, token_id, user_id, Some(tenant_id))?;
let token_info = api_token_to_response(issued.record);
let response = ApiTokenCreatedResponse {
@@ -166,7 +167,7 @@ pub async fn regenerate_api_token(
token_info,
};
Ok(Json(response))
ok_json(response)
}
#[utoipa::path(