Подключение к Postgres и тестовый эндпоинт авторизации

This commit is contained in:
2025-03-22 03:20:55 +04:00
parent 3cf42eea8a
commit 9f7460973e
24 changed files with 1091 additions and 47 deletions

2
src/routes/auth/mod.rs Normal file
View File

@@ -0,0 +1,2 @@
pub mod sign_in;
mod schema;

56
src/routes/auth/schema.rs Normal file
View File

@@ -0,0 +1,56 @@
use crate::database::models::User;
use serde::{Deserialize, Serialize, Serializer};
#[derive(Deserialize)]
pub struct SignInDto {
pub username: String,
pub password: String,
}
pub struct SignInResult(Result<SignInOk, SignInErr>);
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SignInOk {
id: String,
access_token: String,
group: String,
}
#[derive(Serialize)]
pub struct SignInErr {
code: SignInErrCode,
}
#[derive(Serialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum SignInErrCode {
IncorrectCredentials,
InvalidVkAccessToken,
}
impl SignInResult {
pub fn ok(user: &User) -> Self {
Self(Ok(SignInOk {
id: user.id.clone(),
access_token: user.access_token.clone(),
group: user.group.clone(),
}))
}
pub fn err(code: SignInErrCode) -> SignInResult {
Self(Err(SignInErr { code }))
}
}
impl Serialize for SignInResult {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match &self.0 {
Ok(ok) => serializer.serialize_some(&ok),
Err(err) => serializer.serialize_some(&err),
}
}
}

View File

@@ -0,0 +1,26 @@
use crate::database::models::User;
use crate::routes::auth::schema::SignInErrCode::IncorrectCredentials;
use crate::routes::auth::schema::{SignInDto, SignInResult};
use crate::AppState;
use actix_web::{post, web};
use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper};
use std::ops::DerefMut;
use web::Json;
#[post("/sign-in")]
pub async fn sign_in(data: Json<SignInDto>, app_state: web::Data<AppState>) -> Json<SignInResult> {
use crate::database::schema::users::dsl::*;
match {
let mut lock = app_state.database.lock().unwrap();
let connection = lock.deref_mut();
users
.filter(username.eq(data.username.clone()))
.select(User::as_select())
.first(connection)
} {
Ok(user) => Json(SignInResult::ok(&user)),
Err(_) => Json(SignInResult::err(IncorrectCredentials)),
}
}

1
src/routes/mod.rs Normal file
View File

@@ -0,0 +1 @@
pub mod auth;