use api::http::{Json, Path, State}; use ::session::AuthedUser; use api::rest::{AppResponseData, NoData}; use serde::{Deserialize, Serialize}; use utoipa::ToSchema; use crate::AuthService; use crate::errors::ApiError; use crate::services::agreements::AcceptAgreementResp; #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct AcceptAgreementCmd { pub version: String, } #[utoipa::path( put, path = "/me/agreements/{key}", tag = "account", description = "记录当前用户已同意指定版本的协议文本。", params( ("key" = String, Path, description = "agreement key") ), request_body = AcceptAgreementCmd, responses( (status = 200, description = "agreement acceptance recorded", body = AppResponseData), (status = 400, description = "request failed validation", body = AppResponseData), (status = 401, description = "authentication required", body = AppResponseData) ) )] pub async fn accept_agreement( State(service): State, AuthedUser(uid): AuthedUser, Path(key): Path, Json(cmd): Json, ) -> Result, ApiError> { let resp = service .accept_agreement(uid, &key, &cmd.version) .await .map_err(ApiError::from)?; Ok(AppResponseData::ok(resp)) }