From 1843da8d3f41e67f791fd8721c763d023562df6c Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Sun, 23 Jul 2023 23:31:19 +0200 Subject: [PATCH] Fix --- src/main.rs | 2 +- src/views/donate_notifications.rs | 18 +++++++-------- src/views/languages.rs | 18 +++++++-------- src/views/mod.rs | 13 ++++++++--- src/views/users/mod.rs | 38 ++++++++++++++----------------- src/views/users/utils.rs | 13 +++++------ 6 files changed, 52 insertions(+), 50 deletions(-) diff --git a/src/main.rs b/src/main.rs index 0eccab1..b11b196 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,7 @@ use std::net::SocketAddr; async fn start_app() { - let app = views::get_router(); + let app = views::get_router().await; let addr = SocketAddr::from(([0, 0, 0, 0], 8080)); diff --git a/src/views/donate_notifications.rs b/src/views/donate_notifications.rs index ee22d98..eb7de80 100644 --- a/src/views/donate_notifications.rs +++ b/src/views/donate_notifications.rs @@ -1,17 +1,18 @@ use axum::{Router, response::IntoResponse, routing::{get, post}, extract::Path, Json, http::StatusCode}; use chrono::Duration; -use crate::{prisma::chat_donate_notifications, db::get_prisma_client}; +use crate::prisma::chat_donate_notifications; + +use super::Database; async fn is_need_send( - Path(chat_id): Path + Path(chat_id): Path, + db: Database ) -> impl IntoResponse { const NOTIFICATION_DELTA_DAYS: i64 = 60; - let client = get_prisma_client().await; - - let notification = client.chat_donate_notifications() + let notification = db.chat_donate_notifications() .find_unique(chat_donate_notifications::chat_id::equals(chat_id)) .exec() .await @@ -31,11 +32,10 @@ async fn is_need_send( async fn mark_sended( - Path(chat_id): Path + Path(chat_id): Path, + db: Database ) -> impl IntoResponse { - let client = get_prisma_client().await; - - let _ = client.chat_donate_notifications() + let _ = db.chat_donate_notifications() .upsert( chat_donate_notifications::chat_id::equals(chat_id), chat_donate_notifications::create( diff --git a/src/views/languages.rs b/src/views/languages.rs index 0326004..da0518f 100644 --- a/src/views/languages.rs +++ b/src/views/languages.rs @@ -1,7 +1,8 @@ use axum::{Router, response::IntoResponse, routing::get, Json, extract::Path, http::StatusCode}; use serde::Serialize; -use crate::{prisma::language, db::get_prisma_client}; +use crate::prisma::language; +use super::Database; #[derive(Serialize)] @@ -25,10 +26,10 @@ impl From for LanguageDetail { } -async fn get_languages() -> impl IntoResponse { - let client = get_prisma_client().await; - - let languages: Vec = client.language() +async fn get_languages( + db: Database +) -> impl IntoResponse { + let languages: Vec = db.language() .find_many(vec![]) .exec() .await @@ -42,11 +43,10 @@ async fn get_languages() -> impl IntoResponse { async fn get_language_by_code( - Path(code): Path + Path(code): Path, + db: Database ) -> impl IntoResponse { - let client = get_prisma_client().await; - - let language = client.language() + let language = db.language() .find_unique(language::code::equals(code)) .exec() .await diff --git a/src/views/mod.rs b/src/views/mod.rs index 7e71be5..90e84d5 100644 --- a/src/views/mod.rs +++ b/src/views/mod.rs @@ -1,8 +1,9 @@ -use axum::{Router, response::Response, http::{StatusCode, self, Request}, middleware::{Next, self}}; +use axum::{Router, response::Response, http::{StatusCode, self, Request}, middleware::{Next, self}, Extension}; use tower_http::trace::{TraceLayer, self}; use tracing::Level; +use std::sync::Arc; -use crate::config::CONFIG; +use crate::{config::CONFIG, db::get_prisma_client, prisma::PrismaClient}; pub mod users; pub mod pagination; @@ -10,6 +11,9 @@ pub mod languages; pub mod donate_notifications; +pub type Database = Extension>; + + async fn auth(req: Request, next: Next) -> Result { let auth_header = req.headers() .get(http::header::AUTHORIZATION) @@ -29,7 +33,9 @@ async fn auth(req: Request, next: Next) -> Result } -pub fn get_router() -> Router { +pub async fn get_router() -> Router { + let client = Arc::new(get_prisma_client().await); + Router::new() .nest("/users/", users::get_router()) .nest("/languages/", languages::get_router()) @@ -42,4 +48,5 @@ pub fn get_router() -> Router { .on_response(trace::DefaultOnResponse::new() .level(Level::INFO)), ) + .layer(Extension(client)) } diff --git a/src/views/users/mod.rs b/src/views/users/mod.rs index fcb2e53..4db981d 100644 --- a/src/views/users/mod.rs +++ b/src/views/users/mod.rs @@ -2,27 +2,26 @@ pub mod serializers; pub mod utils; use axum::{Router, response::IntoResponse, routing::{get, post}, extract::{Query, Path, self}, Json, http::StatusCode}; -use crate::{prisma::{user_settings, language_to_user, user_activity}, db::get_prisma_client}; +use crate::prisma::{user_settings, language_to_user, user_activity}; use self::{serializers::{UserDetail, CreateOrUpdateUserData}, utils::update_languages}; -use super::pagination::{Pagination, Page}; +use super::{pagination::{Pagination, Page}, Database}; async fn get_users( - pagination: Query + pagination: Query, + db: Database ) -> impl IntoResponse { let pagination: Pagination = pagination.0; - let client = get_prisma_client().await; - - let users_count = client.user_settings() + let users_count = db.user_settings() .count(vec![]) .exec() .await .unwrap(); - let users: Vec = client.user_settings() + let users: Vec = db.user_settings() .find_many(vec![]) .with( user_settings::languages::fetch(vec![]) @@ -49,11 +48,10 @@ async fn get_users( async fn get_user( - Path(user_id): Path + Path(user_id): Path, + db: Database ) -> impl IntoResponse { - let client = get_prisma_client().await; - - let user = client.user_settings() + let user = db.user_settings() .find_unique(user_settings::user_id::equals(user_id)) .with( user_settings::languages::fetch(vec![]) @@ -74,11 +72,10 @@ async fn get_user( async fn create_or_update_user( - extract::Json(data): extract::Json + db: Database, + extract::Json(data): extract::Json, ) -> impl IntoResponse { - let client = get_prisma_client().await; - - let user = client.user_settings() + let user = db.user_settings() .upsert( user_settings::user_id::equals(data.user_id), user_settings::create( @@ -107,9 +104,9 @@ async fn create_or_update_user( .unwrap(); let user_id = user.id; - update_languages(user, data.allowed_langs).await; + update_languages(user, data.allowed_langs, db.clone()).await; - let user = client.user_settings() + let user = db.user_settings() .find_unique(user_settings::id::equals(user_id)) .with( user_settings::languages::fetch(vec![]) @@ -128,10 +125,9 @@ async fn create_or_update_user( async fn update_activity( Path(user_id): Path, + db: Database ) -> impl IntoResponse { - let client = get_prisma_client().await; - - let user = client.user_settings() + let user = db.user_settings() .find_unique(user_settings::user_id::equals(user_id)) .exec() .await @@ -142,7 +138,7 @@ async fn update_activity( None => return StatusCode::NOT_FOUND.into_response(), }; - let _ = client.user_activity() + let _ = db.user_activity() .upsert( user_activity::user_id::equals(user.id), user_activity::create( diff --git a/src/views/users/utils.rs b/src/views/users/utils.rs index 3ea14d5..eea5173 100644 --- a/src/views/users/utils.rs +++ b/src/views/users/utils.rs @@ -1,14 +1,13 @@ use std::collections::HashMap; -use crate::{prisma::{user_settings, language, language_to_user}, db::get_prisma_client}; +use crate::{prisma::{user_settings, language, language_to_user}, views::Database}; pub async fn update_languages( user: user_settings::Data, - new_langs: Vec + new_langs: Vec, + db: Database ) { - let client = get_prisma_client().await; - // Delete { let need_delete: Vec<_> = user.languages().unwrap() @@ -21,7 +20,7 @@ pub async fn update_languages( .map(|(id, _)| id) .collect(); - let _ = client.language_to_user() + let _ = db.language_to_user() .delete_many( vec![language_to_user::id::in_vec(need_delete)] ) @@ -31,7 +30,7 @@ pub async fn update_languages( // Create { - let languages: HashMap<_, _> = client.language() + let languages: HashMap<_, _> = db.language() .find_many(vec![]) .exec() .await @@ -51,7 +50,7 @@ pub async fn update_languages( .map(|code| *languages.get(&code).unwrap()) .collect(); - let _ = client.language_to_user() + let _ = db.language_to_user() .create_many( need_create .iter()