use models::{pages::SearchRequest, user_details::UserDetail};
use crate::prelude::*;
#[instrument(skip(pool))]
pub async fn get_user_details(
user: AuthUser,
pool: web::Data<PgPool>,
user_id: web::Path<Uuid>,
) -> ControllerResult<web::Json<UserDetail>> {
let mut conn = pool.acquire().await?;
let token = authorize(
&mut conn,
Act::ViewUserProgressOrDetails,
Some(user.id),
Res::GlobalPermissions,
)
.await?;
let res = models::user_details::get_user_details_by_user_id(&mut conn, *user_id).await?;
token.authorized_ok(web::Json(res))
}
#[instrument(skip(pool))]
pub async fn search_users_by_email(
user: AuthUser,
pool: web::Data<PgPool>,
payload: web::Json<SearchRequest>,
) -> ControllerResult<web::Json<Vec<UserDetail>>> {
let mut conn = pool.acquire().await?;
let token = authorize(
&mut conn,
Act::ViewUserProgressOrDetails,
Some(user.id),
Res::GlobalPermissions,
)
.await?;
let res =
models::user_details::search_for_user_details_by_email(&mut conn, &payload.query).await?;
token.authorized_ok(web::Json(res))
}
#[instrument(skip(pool))]
pub async fn search_users_by_other_details(
user: AuthUser,
pool: web::Data<PgPool>,
payload: web::Json<SearchRequest>,
) -> ControllerResult<web::Json<Vec<UserDetail>>> {
let mut conn = pool.acquire().await?;
let token = authorize(
&mut conn,
Act::ViewUserProgressOrDetails,
Some(user.id),
Res::GlobalPermissions,
)
.await?;
let res =
models::user_details::search_for_user_details_by_other_details(&mut conn, &payload.query)
.await?;
token.authorized_ok(web::Json(res))
}
#[instrument(skip(pool))]
pub async fn search_users_fuzzy_match(
user: AuthUser,
pool: web::Data<PgPool>,
payload: web::Json<SearchRequest>,
) -> ControllerResult<web::Json<Vec<UserDetail>>> {
let mut conn = pool.acquire().await?;
let token = authorize(
&mut conn,
Act::ViewUserProgressOrDetails,
Some(user.id),
Res::GlobalPermissions,
)
.await?;
let res = models::user_details::search_for_user_details_fuzzy_match(&mut conn, &payload.query)
.await?;
token.authorized_ok(web::Json(res))
}
pub fn _add_routes(cfg: &mut ServiceConfig) {
cfg.route("/search-by-email", web::post().to(search_users_by_email))
.route(
"/search-by-other-details",
web::post().to(search_users_by_other_details),
)
.route(
"/search-fuzzy-match",
web::post().to(search_users_fuzzy_match),
)
.route("/{user_id}", web::get().to(get_user_details));
}