This commit is contained in:
2023-07-23 23:31:19 +02:00
parent bb5699a2bb
commit 1843da8d3f
6 changed files with 52 additions and 50 deletions

View File

@@ -9,7 +9,7 @@ use std::net::SocketAddr;
async fn start_app() { async fn start_app() {
let app = views::get_router(); let app = views::get_router().await;
let addr = SocketAddr::from(([0, 0, 0, 0], 8080)); let addr = SocketAddr::from(([0, 0, 0, 0], 8080));

View File

@@ -1,17 +1,18 @@
use axum::{Router, response::IntoResponse, routing::{get, post}, extract::Path, Json, http::StatusCode}; use axum::{Router, response::IntoResponse, routing::{get, post}, extract::Path, Json, http::StatusCode};
use chrono::Duration; 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( async fn is_need_send(
Path(chat_id): Path<i64> Path(chat_id): Path<i64>,
db: Database
) -> impl IntoResponse { ) -> impl IntoResponse {
const NOTIFICATION_DELTA_DAYS: i64 = 60; const NOTIFICATION_DELTA_DAYS: i64 = 60;
let client = get_prisma_client().await; let notification = db.chat_donate_notifications()
let notification = client.chat_donate_notifications()
.find_unique(chat_donate_notifications::chat_id::equals(chat_id)) .find_unique(chat_donate_notifications::chat_id::equals(chat_id))
.exec() .exec()
.await .await
@@ -31,11 +32,10 @@ async fn is_need_send(
async fn mark_sended( async fn mark_sended(
Path(chat_id): Path<i64> Path(chat_id): Path<i64>,
db: Database
) -> impl IntoResponse { ) -> impl IntoResponse {
let client = get_prisma_client().await; let _ = db.chat_donate_notifications()
let _ = client.chat_donate_notifications()
.upsert( .upsert(
chat_donate_notifications::chat_id::equals(chat_id), chat_donate_notifications::chat_id::equals(chat_id),
chat_donate_notifications::create( chat_donate_notifications::create(

View File

@@ -1,7 +1,8 @@
use axum::{Router, response::IntoResponse, routing::get, Json, extract::Path, http::StatusCode}; use axum::{Router, response::IntoResponse, routing::get, Json, extract::Path, http::StatusCode};
use serde::Serialize; use serde::Serialize;
use crate::{prisma::language, db::get_prisma_client}; use crate::prisma::language;
use super::Database;
#[derive(Serialize)] #[derive(Serialize)]
@@ -25,10 +26,10 @@ impl From<language::Data> for LanguageDetail {
} }
async fn get_languages() -> impl IntoResponse { async fn get_languages(
let client = get_prisma_client().await; db: Database
) -> impl IntoResponse {
let languages: Vec<LanguageDetail> = client.language() let languages: Vec<LanguageDetail> = db.language()
.find_many(vec![]) .find_many(vec![])
.exec() .exec()
.await .await
@@ -42,11 +43,10 @@ async fn get_languages() -> impl IntoResponse {
async fn get_language_by_code( async fn get_language_by_code(
Path(code): Path<String> Path(code): Path<String>,
db: Database
) -> impl IntoResponse { ) -> impl IntoResponse {
let client = get_prisma_client().await; let language = db.language()
let language = client.language()
.find_unique(language::code::equals(code)) .find_unique(language::code::equals(code))
.exec() .exec()
.await .await

View File

@@ -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 tower_http::trace::{TraceLayer, self};
use tracing::Level; 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 users;
pub mod pagination; pub mod pagination;
@@ -10,6 +11,9 @@ pub mod languages;
pub mod donate_notifications; pub mod donate_notifications;
pub type Database = Extension<Arc<PrismaClient>>;
async fn auth<B>(req: Request<B>, next: Next<B>) -> Result<Response, StatusCode> { async fn auth<B>(req: Request<B>, next: Next<B>) -> Result<Response, StatusCode> {
let auth_header = req.headers() let auth_header = req.headers()
.get(http::header::AUTHORIZATION) .get(http::header::AUTHORIZATION)
@@ -29,7 +33,9 @@ async fn auth<B>(req: Request<B>, next: Next<B>) -> Result<Response, StatusCode>
} }
pub fn get_router() -> Router { pub async fn get_router() -> Router {
let client = Arc::new(get_prisma_client().await);
Router::new() Router::new()
.nest("/users/", users::get_router()) .nest("/users/", users::get_router())
.nest("/languages/", languages::get_router()) .nest("/languages/", languages::get_router())
@@ -42,4 +48,5 @@ pub fn get_router() -> Router {
.on_response(trace::DefaultOnResponse::new() .on_response(trace::DefaultOnResponse::new()
.level(Level::INFO)), .level(Level::INFO)),
) )
.layer(Extension(client))
} }

View File

@@ -2,27 +2,26 @@ pub mod serializers;
pub mod utils; pub mod utils;
use axum::{Router, response::IntoResponse, routing::{get, post}, extract::{Query, Path, self}, Json, http::StatusCode}; 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 self::{serializers::{UserDetail, CreateOrUpdateUserData}, utils::update_languages};
use super::pagination::{Pagination, Page}; use super::{pagination::{Pagination, Page}, Database};
async fn get_users( async fn get_users(
pagination: Query<Pagination> pagination: Query<Pagination>,
db: Database
) -> impl IntoResponse { ) -> impl IntoResponse {
let pagination: Pagination = pagination.0; let pagination: Pagination = pagination.0;
let client = get_prisma_client().await; let users_count = db.user_settings()
let users_count = client.user_settings()
.count(vec![]) .count(vec![])
.exec() .exec()
.await .await
.unwrap(); .unwrap();
let users: Vec<UserDetail> = client.user_settings() let users: Vec<UserDetail> = db.user_settings()
.find_many(vec![]) .find_many(vec![])
.with( .with(
user_settings::languages::fetch(vec![]) user_settings::languages::fetch(vec![])
@@ -49,11 +48,10 @@ async fn get_users(
async fn get_user( async fn get_user(
Path(user_id): Path<i64> Path(user_id): Path<i64>,
db: Database
) -> impl IntoResponse { ) -> impl IntoResponse {
let client = get_prisma_client().await; let user = db.user_settings()
let user = client.user_settings()
.find_unique(user_settings::user_id::equals(user_id)) .find_unique(user_settings::user_id::equals(user_id))
.with( .with(
user_settings::languages::fetch(vec![]) user_settings::languages::fetch(vec![])
@@ -74,11 +72,10 @@ async fn get_user(
async fn create_or_update_user( async fn create_or_update_user(
extract::Json(data): extract::Json<CreateOrUpdateUserData> db: Database,
extract::Json(data): extract::Json<CreateOrUpdateUserData>,
) -> impl IntoResponse { ) -> impl IntoResponse {
let client = get_prisma_client().await; let user = db.user_settings()
let user = client.user_settings()
.upsert( .upsert(
user_settings::user_id::equals(data.user_id), user_settings::user_id::equals(data.user_id),
user_settings::create( user_settings::create(
@@ -107,9 +104,9 @@ async fn create_or_update_user(
.unwrap(); .unwrap();
let user_id = user.id; 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)) .find_unique(user_settings::id::equals(user_id))
.with( .with(
user_settings::languages::fetch(vec![]) user_settings::languages::fetch(vec![])
@@ -128,10 +125,9 @@ async fn create_or_update_user(
async fn update_activity( async fn update_activity(
Path(user_id): Path<i64>, Path(user_id): Path<i64>,
db: Database
) -> impl IntoResponse { ) -> impl IntoResponse {
let client = get_prisma_client().await; let user = db.user_settings()
let user = client.user_settings()
.find_unique(user_settings::user_id::equals(user_id)) .find_unique(user_settings::user_id::equals(user_id))
.exec() .exec()
.await .await
@@ -142,7 +138,7 @@ async fn update_activity(
None => return StatusCode::NOT_FOUND.into_response(), None => return StatusCode::NOT_FOUND.into_response(),
}; };
let _ = client.user_activity() let _ = db.user_activity()
.upsert( .upsert(
user_activity::user_id::equals(user.id), user_activity::user_id::equals(user.id),
user_activity::create( user_activity::create(

View File

@@ -1,14 +1,13 @@
use std::collections::HashMap; 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( pub async fn update_languages(
user: user_settings::Data, user: user_settings::Data,
new_langs: Vec<String> new_langs: Vec<String>,
db: Database
) { ) {
let client = get_prisma_client().await;
// Delete // Delete
{ {
let need_delete: Vec<_> = user.languages().unwrap() let need_delete: Vec<_> = user.languages().unwrap()
@@ -21,7 +20,7 @@ pub async fn update_languages(
.map(|(id, _)| id) .map(|(id, _)| id)
.collect(); .collect();
let _ = client.language_to_user() let _ = db.language_to_user()
.delete_many( .delete_many(
vec![language_to_user::id::in_vec(need_delete)] vec![language_to_user::id::in_vec(need_delete)]
) )
@@ -31,7 +30,7 @@ pub async fn update_languages(
// Create // Create
{ {
let languages: HashMap<_, _> = client.language() let languages: HashMap<_, _> = db.language()
.find_many(vec![]) .find_many(vec![])
.exec() .exec()
.await .await
@@ -51,7 +50,7 @@ pub async fn update_languages(
.map(|code| *languages.get(&code).unwrap()) .map(|code| *languages.get(&code).unwrap())
.collect(); .collect();
let _ = client.language_to_user() let _ = db.language_to_user()
.create_many( .create_many(
need_create need_create
.iter() .iter()