/
mxtn
/
webapi
Обзор
Документация
Войти
/
mxtn
/
webapi
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/services/user.rs
74 строки
3 KB
Max Talbushkin
Refactoring
10 июл 2025, 15:21
10 июл 2025, 15:21
7614c83
Код
Авторство
О чём код?
use crate::errors::AppError; #[allow(unused_imports)] use crate::models::user::{Claims, LoginRequest, User, UserCreate, UserUpdate}; use crate::repositories::UserRepo; use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, Validation}; use sha2::{Digest, Sha256}; use std::time::{SystemTime, UNIX_EPOCH}; // Сервис для бизнес-логики работы с пользователями pub struct UserService { repo: UserRepo, jwt_secret: String, } impl UserService { // Создаем новый экземпляр сервиса pub fn new(repo: UserRepo, jwt_secret: String) -> Self { Self { repo, jwt_secret } } // Создаем нового пользователя pub async fn create_user(&self, mut user: UserCreate) -> Result<i64, AppError> { // Хешируем пароль асинхронно user.password = hash_password(&user.password).await?; self.repo.create(&user).await } // Авторизуем пользователя и возвращаем JWT-токен pub async fn login(&self, req: LoginRequest) -> Result<String, AppError> { let user = self.repo.find_by_login(&req.login).await?; // Проверяем хеш пароля if hash_password(&req.password).await? != user.password_hash { return Err(AppError::AuthError); } // Создаем JWT-токен let claims = Claims { sub: user.id, exp: (SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_secs() + 3600) as usize, // Токен истекает через 1 час }; let token = encode( &Header::default(), &claims, &EncodingKey::from_secret(self.jwt_secret.as_bytes()), )?; Ok(token) } // Обновляем данные пользователя pub async fn update_user(&self, user_id: i64, update: UserUpdate) -> Result<(), AppError> { self.repo.update(user_id, &update).await } // Проверяем JWT-токен и возвращаем ID пользователя pub fn validate_token(&self, token: &str) -> Result<i64, AppError> { let token_data = decode::<Claims>( token, &DecodingKey::from_secret(self.jwt_secret.as_bytes()), &Validation::default(), )?; Ok(token_data.claims.sub) } } // Асинхронное хеширование пароля с SHA-256 async fn hash_password(password: &str) -> Result<String, AppError> { let mut hasher = Sha256::new(); hasher.update(password); let result = hasher.finalize(); Ok(format!("{result:x}")) }