Merge pull request #4 from OSMA-D/refactor

Refactor
This commit is contained in:
Artemy Egorov 2023-07-12 09:41:03 +03:00 committed by GitHub
commit 50c00bdec2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 64 additions and 17 deletions

View file

@ -35,7 +35,7 @@ impl Core {
salt: env::var("SALT").expect("Hash salt not found"), salt: env::var("SALT").expect("Hash salt not found"),
} }
} }
pub async fn get_apps(&self) -> Vec<Document> { pub async fn get_apps(&self) -> Result<Vec<Document>, serde_json::Value> {
self.get_collection(&self.apps).await self.get_collection(&self.apps).await
} }
@ -154,17 +154,20 @@ impl Core {
.unwrap(); .unwrap();
} }
pub async fn get_reviews(&self, app_id: &String) -> Vec<Document> { pub async fn get_reviews(&self, app_id: &String) -> Result<Vec<Document>, serde_json::Value> {
self.get_collection_with_params(&self.reviews, doc! {"app_id":app_id}) self.get_collection_with_params(&self.reviews, doc! {"app_id":app_id})
.await .await
} }
pub async fn get_apps_by_tag(&self, info: &AppTags) -> Vec<Document> { pub async fn get_apps_by_tag(
&self,
info: &AppTags,
) -> Result<Vec<Document>, serde_json::Value> {
self.get_collection_with_params(&self.apps, doc! {"tags":{"$in":&info.tags}}) self.get_collection_with_params(&self.apps, doc! {"tags":{"$in":&info.tags}})
.await .await
} }
pub async fn get_versions(&self, app_id: &String) -> Vec<Document> { pub async fn get_versions(&self, app_id: &String) -> Result<Vec<Document>, serde_json::Value> {
self.get_collection_with_params_and_sort( self.get_collection_with_params_and_sort(
&self.apps_versions, &self.apps_versions,
doc! {"app_id":app_id}, doc! {"app_id":app_id},
@ -559,40 +562,76 @@ impl Core {
collection: &Collection<Document>, collection: &Collection<Document>,
params: Document, params: Document,
sort_params: Document, sort_params: Document,
) -> Vec<Document> { ) -> Result<Vec<Document>, serde_json::Value> {
let options = FindOptions::builder() let options = FindOptions::builder()
.projection(doc! {"_id" : 0}) .projection(doc! {"_id" : 0})
.sort(sort_params) .sort(sort_params)
.build(); .build();
let cursor = match collection.find(params, options).await { let cursor = match collection.find(params, options).await {
Ok(cursor) => cursor, Ok(cursor) => cursor,
Err(_) => return vec![], Err(_) => {
return Err(json! ({
"code":"err",
"msg":"Error connecting to the database"
}))
}
}; };
cursor.try_collect().await.unwrap_or_else(|_| vec![]) match cursor.try_collect().await {
Ok(collection) => Ok(collection),
Err(_) => Err(json! ({
"code":"err",
"msg":"Error connecting to the database"
})),
}
} }
async fn get_collection_with_params( async fn get_collection_with_params(
&self, &self,
collection: &Collection<Document>, collection: &Collection<Document>,
params: Document, params: Document,
) -> Vec<Document> { ) -> Result<Vec<Document>, serde_json::Value> {
let options = FindOptions::builder().projection(doc! {"_id" : 0}).build(); let options = FindOptions::builder().projection(doc! {"_id" : 0}).build();
let cursor = match collection.find(params, options).await { let cursor = match collection.find(params, options).await {
Ok(cursor) => cursor, Ok(cursor) => cursor,
Err(_) => return vec![], Err(_) => {
return Err(json! ({
"code":"err",
"msg":"Error connecting to the database"
}))
}
}; };
cursor.try_collect().await.unwrap_or_else(|_| vec![]) match cursor.try_collect().await {
Ok(collection) => Ok(collection),
Err(_) => Err(json! ({
"code":"err",
"msg":"Error connecting to the database"
})),
}
} }
async fn get_collection(&self, collection: &Collection<Document>) -> Vec<Document> { async fn get_collection(
&self,
collection: &Collection<Document>,
) -> Result<Vec<Document>, serde_json::Value> {
let options = FindOptions::builder().projection(doc! {"_id" : 0}).build(); let options = FindOptions::builder().projection(doc! {"_id" : 0}).build();
let cursor = match collection.find(None, options).await { let cursor = match collection.find(None, options).await {
Ok(cursor) => cursor, Ok(cursor) => cursor,
Err(_) => return vec![], Err(_) => {
return Err(json! ({
"code":"err",
"msg":"Error connecting to the database"
}))
}
}; };
cursor.try_collect().await.unwrap_or_else(|_| vec![]) match cursor.try_collect().await {
Ok(collection) => Ok(collection),
Err(_) => Err(json! ({
"code":"err",
"msg":"Error connecting to the database"
})),
}
} }
} }

View file

@ -1,6 +1,7 @@
use crate::types::*; use crate::types::*;
use actix_web::{get, post, web, HttpRequest, HttpResponse, Responder}; use actix_web::{get, post, web, HttpRequest, HttpResponse, Responder};
use actix_web_grants::proc_macro::has_any_permission; use actix_web_grants::proc_macro::has_any_permission;
use bson::Document;
#[post("/signup")] #[post("/signup")]
pub async fn signup(app_data: web::Data<crate::AppState>, user: web::Json<User>) -> impl Responder { pub async fn signup(app_data: web::Data<crate::AppState>, user: web::Json<User>) -> impl Responder {
@ -18,7 +19,7 @@ pub async fn signin(
#[get("/apps")] #[get("/apps")]
#[has_any_permission("user", "admin")] #[has_any_permission("user", "admin")]
pub async fn apps(app_data: web::Data<crate::AppState>) -> impl Responder { pub async fn apps(app_data: web::Data<crate::AppState>) -> impl Responder {
HttpResponse::Ok().json(app_data.core.get_apps().await) resolve_collection(app_data.core.get_apps().await)
} }
#[post("/apps_by_tag")] #[post("/apps_by_tag")]
@ -27,7 +28,7 @@ pub async fn apps_by_tags(
app_data: web::Data<crate::AppState>, app_data: web::Data<crate::AppState>,
info: web::Json<AppTags>, info: web::Json<AppTags>,
) -> impl Responder { ) -> impl Responder {
HttpResponse::Ok().json(app_data.core.get_apps_by_tag(&info).await) resolve_collection(app_data.core.get_apps_by_tag(&info).await)
} }
#[get("/reviews/{app_id}")] #[get("/reviews/{app_id}")]
@ -36,7 +37,7 @@ pub async fn reviews(
app_data: web::Data<crate::AppState>, app_data: web::Data<crate::AppState>,
app_id: web::Path<String>, app_id: web::Path<String>,
) -> impl Responder { ) -> impl Responder {
HttpResponse::Ok().json(app_data.core.get_reviews(&app_id).await) resolve_collection(app_data.core.get_reviews(&app_id).await)
} }
#[get("/versions/{app_id}")] #[get("/versions/{app_id}")]
@ -45,7 +46,7 @@ pub async fn versions(
app_data: web::Data<crate::AppState>, app_data: web::Data<crate::AppState>,
app_id: web::Path<String>, app_id: web::Path<String>,
) -> impl Responder { ) -> impl Responder {
HttpResponse::Ok().json(app_data.core.get_versions(&app_id).await) resolve_collection(app_data.core.get_versions(&app_id).await)
} }
#[get("/rating/{app_id}")] #[get("/rating/{app_id}")]
@ -166,6 +167,13 @@ fn username(req: HttpRequest) -> String {
.to_string() .to_string()
} }
fn resolve_collection(resp: Result<Vec<Document>, serde_json::Value>) -> HttpResponse {
match resp {
Ok(resp) => HttpResponse::Ok().json(resp),
Err(e) => HttpResponse::InternalServerError().json(e),
}
}
fn response(result: serde_json::Value) -> impl Responder { fn response(result: serde_json::Value) -> impl Responder {
if result["code"] == "ok" { if result["code"] == "ok" {
HttpResponse::Ok().json(result) HttpResponse::Ok().json(result)