You've already forked AstralRinth
forked from xxxOFFxxx/AstralRinth
* search patch for accurate loader/gv filtering * backup * basic search test * finished test * incomplete commit; backing up * Working multipat reroute backup * working rough draft v3 * most tests passing * works * search v2 conversion * added some tags.rs v2 conversions * Worked through warnings, unwraps, prints * refactors * new search test * version files changes fixes * redesign to revs * removed old caches * removed games * fmt clippy * merge conflicts * fmt, prepare * moved v2 routes over to v3 * fixes; tests passing * project type changes * moved files over * fmt, clippy, prepare, etc * loaders to loader_fields, added tests * fmt, clippy, prepare * fixed sorting bug * reversed back- wrong order for consistency * fmt; clippy; prepare --------- Co-authored-by: Jai A <jaiagr+gpg@pm.me>
66 lines
1.7 KiB
Rust
66 lines
1.7 KiB
Rust
use super::ApiError;
|
|
use crate::database;
|
|
use crate::database::redis::RedisPool;
|
|
use crate::models::projects::ProjectStatus;
|
|
use crate::queue::session::AuthQueue;
|
|
use crate::{auth::check_is_moderator_from_headers, models::pats::Scopes};
|
|
use actix_web::{web, HttpRequest, HttpResponse};
|
|
use serde::Deserialize;
|
|
use sqlx::PgPool;
|
|
|
|
pub fn config(cfg: &mut web::ServiceConfig) {
|
|
cfg.route("moderation/projects", web::get().to(get_projects));
|
|
}
|
|
|
|
#[derive(Deserialize)]
|
|
pub struct ResultCount {
|
|
#[serde(default = "default_count")]
|
|
pub count: i16,
|
|
}
|
|
|
|
fn default_count() -> i16 {
|
|
100
|
|
}
|
|
|
|
pub async fn get_projects(
|
|
req: HttpRequest,
|
|
pool: web::Data<PgPool>,
|
|
redis: web::Data<RedisPool>,
|
|
count: web::Query<ResultCount>,
|
|
session_queue: web::Data<AuthQueue>,
|
|
) -> Result<HttpResponse, ApiError> {
|
|
check_is_moderator_from_headers(
|
|
&req,
|
|
&**pool,
|
|
&redis,
|
|
&session_queue,
|
|
Some(&[Scopes::PROJECT_READ]),
|
|
)
|
|
.await?;
|
|
|
|
use futures::stream::TryStreamExt;
|
|
|
|
let project_ids = sqlx::query!(
|
|
"
|
|
SELECT id FROM mods
|
|
WHERE status = $1
|
|
ORDER BY queued ASC
|
|
LIMIT $2;
|
|
",
|
|
ProjectStatus::Processing.as_str(),
|
|
count.count as i64
|
|
)
|
|
.fetch_many(&**pool)
|
|
.try_filter_map(|e| async { Ok(e.right().map(|m| database::models::ProjectId(m.id))) })
|
|
.try_collect::<Vec<database::models::ProjectId>>()
|
|
.await?;
|
|
|
|
let projects: Vec<_> = database::Project::get_many_ids(&project_ids, &**pool, &redis)
|
|
.await?
|
|
.into_iter()
|
|
.map(crate::models::projects::Project::from)
|
|
.collect();
|
|
|
|
Ok(HttpResponse::Ok().json(projects))
|
|
}
|