From 5e86ae705d0564f4198f5283686f5ca2c9e05a59 Mon Sep 17 00:00:00 2001 From: Tolmachev Igor Date: Mon, 15 Sep 2025 02:07:24 +0300 Subject: Add change/username and change/name methods --- src/routers/account.rs | 103 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) (limited to 'src/routers') diff --git a/src/routers/account.rs b/src/routers/account.rs index 0d6d4c1..8e51a69 100644 --- a/src/routers/account.rs +++ b/src/routers/account.rs @@ -81,6 +81,23 @@ struct ChangePasswordRequest { new_password: String, } +#[derive(Deserialize, ToSchema)] +#[schema(description = "Change account password data")] +struct ChangeUsernameRequest { + #[schema(examples("ivanov_ivan", "john_doe"))] + new_username: String, +} + +#[derive(Deserialize, ToSchema)] +#[schema(description = "Change account name data")] +#[serde(rename_all = "snake_case")] +enum ChangeNameRequest { + #[schema(examples("John", "Иван"))] + FirstName(String), + #[schema(examples("Doe", "Иванов"))] + LastName(String), +} + #[derive(Deserialize, ToSchema)] #[schema(description = "Account delete data")] struct DeleteUserRequest { @@ -241,6 +258,90 @@ async fn change_password( })) } +#[utoipa::path( + put, + path = "/change/username", + tag = ACCOUNT, + summary = "Change username", + request_body = ChangeUsernameRequest, + responses( + ( + status = 200, body = SuccessResponse, + description = "Success response with changed account data" + ), + GlobalResponses + ), + security(("auth" = [])) +)] +async fn change_username( + State(state): State, + Auth(user): Auth, + ApiJson(req): ApiJson, +) -> ApiResult { + let user_exists = users::Entity::find() + .filter(users::Column::Username.eq(&req.new_username)) + .one(&state.db) + .await? + .is_some(); + + if user_exists { + return Err(ClientError::UserAlreadyExists { + username: req.new_username, + } + .into()); + } + + let mut active_user = user.into_active_model(); + active_user.username = Set(req.new_username); + + let user = active_user.update(&state.db).await?; + Ok(SuccessResponse::ok(Account { + id: user.id, + username: user.username, + first_name: user.first_name, + last_name: user.last_name, + })) +} + +#[utoipa::path( + put, + path = "/change/name", + tag = ACCOUNT, + summary = "Change name", + request_body = ChangeNameRequest, + responses( + ( + status = 200, body = SuccessResponse, + description = "Success response with changed account data" + ), + GlobalResponses + ), + security(("auth" = [])) +)] +async fn change_name( + State(state): State, + Auth(user): Auth, + ApiJson(req): ApiJson, +) -> ApiResult { + let mut active_user = user.into_active_model(); + match req { + ChangeNameRequest::FirstName(new_first_name) => { + active_user.first_name = Set(new_first_name); + } + ChangeNameRequest::LastName(new_last_name) => { + active_user.first_name = Set(new_last_name); + } + } + + let user = active_user.update(&state.db).await?; + Ok(SuccessResponse::ok(Account { + id: user.id, + username: user.username, + first_name: user.first_name, + last_name: user.last_name, + })) +} + #[utoipa::path( delete, path = "/delete", @@ -281,5 +382,7 @@ pub(crate) fn router() -> OpenApiRouter { .routes(routes!(register)) .routes(routes!(login)) .routes(routes!(change_password)) + .routes(routes!(change_username)) + .routes(routes!(change_name)) .routes(routes!(delete)) } -- cgit v1.2.3