main
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<AcceptAgreementResp>),
(status = 400, description = "request failed validation", body = AppResponseData<NoData>),
(status = 401, description = "authentication required", body = AppResponseData<NoData>)
)
)]
pub async fn accept_agreement(
State(service): State<AuthService>,
AuthedUser(uid): AuthedUser,
Path(key): Path<String>,
Json(cmd): Json<AcceptAgreementCmd>,
) -> Result<AppResponseData<AcceptAgreementResp>, ApiError> {
let resp = service
.accept_agreement(uid, &key, &cmd.version)
.await
.map_err(ApiError::from)?;
Ok(AppResponseData::ok(resp))
}