api: refresh + logout endpoints, update login response

This commit is contained in:
2026-06-11 14:37:09 +02:00
parent 55feaa353f
commit 822f3f9d9c
3 changed files with 57 additions and 1 deletions

View File

@@ -17,7 +17,7 @@ use crate::{
render::render_page,
state::AppState,
};
use api_types::{LoginRequest, LoginResponse, RegisterRequest};
use api_types::{LoginRequest, LoginResponse, LogoutRequest, RefreshRequest, RefreshResponse, RegisterRequest};
use application::ports::HtmlPageContext;
use template_askama::{LoginTemplate, RegisterTemplate};
@@ -68,6 +68,7 @@ pub async fn login(
.await?;
Ok(Json(LoginResponse {
token: result.token,
refresh_token: result.refresh_token,
user_id: result.user_id,
email: result.email,
expires_at: result.expires_at.to_rfc3339(),
@@ -100,6 +101,41 @@ pub async fn register(
Ok(StatusCode::CREATED)
}
#[utoipa::path(
post, path = "/api/v1/auth/refresh",
request_body = RefreshRequest,
responses(
(status = 200, body = RefreshResponse),
(status = 401, description = "Invalid or expired refresh token"),
)
)]
pub async fn refresh(
State(state): State<AppState>,
Json(req): Json<RefreshRequest>,
) -> Result<Json<RefreshResponse>, ApiError> {
let result = application::auth::refresh::execute(&state.app_ctx, &req.refresh_token).await?;
Ok(Json(RefreshResponse {
token: result.token,
refresh_token: result.refresh_token,
expires_at: result.expires_at.to_rfc3339(),
}))
}
#[utoipa::path(
post, path = "/api/v1/auth/logout",
request_body = LogoutRequest,
responses(
(status = 204, description = "Logged out"),
)
)]
pub async fn api_logout(
State(state): State<AppState>,
Json(req): Json<LogoutRequest>,
) -> StatusCode {
let _ = application::auth::logout::execute(&state.app_ctx, &req.refresh_token).await;
StatusCode::NO_CONTENT
}
// ── HTML ─────────────────────────────────────────────────────────────────────
pub async fn get_login_page(

View File

@@ -326,6 +326,8 @@ fn api_routes(rate_limit: u64) -> Router<AppState> {
)
.route("/auth/login", routing::post(handlers::auth::login))
.route("/auth/register", routing::post(handlers::auth::register))
.route("/auth/refresh", routing::post(handlers::auth::refresh))
.route("/auth/logout", routing::post(handlers::auth::api_logout))
.route("/diary/export", routing::get(handlers::diary::export_diary))
.route(
"/activity-feed",