headless_lms_server/controllers/main_frontend/
proposed_edits.rsuse std::sync::Arc;
use models::proposed_page_edits::{self, EditProposalInfo, PageProposal, ProposalCount};
use crate::{
domain::{
models_requests::{self, JwtKey},
request_id::RequestId,
},
prelude::*,
};
#[derive(Debug, Deserialize)]
#[cfg_attr(feature = "ts_rs", derive(TS))]
pub struct GetEditProposalsQuery {
pending: bool,
#[serde(flatten)]
pagination: Pagination,
}
#[instrument(skip(pool))]
pub async fn get_edit_proposals(
course_id: web::Path<Uuid>,
pool: web::Data<PgPool>,
query: web::Query<GetEditProposalsQuery>,
user: AuthUser,
) -> ControllerResult<web::Json<Vec<PageProposal>>> {
let mut conn = pool.acquire().await?;
let feedback = proposed_page_edits::get_proposals_for_course(
&mut conn,
*course_id,
query.pending,
query.pagination,
)
.await?;
let token = authorize(
&mut conn,
Act::Teach,
Some(user.id),
Res::Course(*course_id),
)
.await?;
token.authorized_ok(web::Json(feedback))
}
#[instrument(skip(pool))]
pub async fn get_edit_proposal_count(
course_id: web::Path<Uuid>,
pool: web::Data<PgPool>,
user: AuthUser,
) -> ControllerResult<web::Json<ProposalCount>> {
let mut conn = pool.acquire().await?;
let edit_proposal_count =
proposed_page_edits::get_proposal_count_for_course(&mut conn, *course_id).await?;
let token = authorize(
&mut conn,
Act::Teach,
Some(user.id),
Res::Course(*course_id),
)
.await?;
token.authorized_ok(web::Json(edit_proposal_count))
}
#[instrument(skip(pool, app_conf))]
pub async fn process_edit_proposal(
request_id: RequestId,
proposal: web::Json<EditProposalInfo>,
app_conf: web::Data<ApplicationConfiguration>,
user: AuthUser,
pool: web::Data<PgPool>,
jwt_key: web::Data<JwtKey>,
) -> ControllerResult<HttpResponse> {
let mut conn = pool.acquire().await?;
let proposal = proposal.into_inner();
proposed_page_edits::process_proposal(
&mut conn,
proposal.page_id,
proposal.page_proposal_id,
proposal.block_proposals,
user.id,
models_requests::make_spec_fetcher(
app_conf.base_url.clone(),
request_id.0,
Arc::clone(&jwt_key),
),
models_requests::fetch_service_info,
)
.await?;
let token = authorize(
&mut conn,
Act::Edit,
Some(user.id),
Res::Page(proposal.page_id),
)
.await?;
token.authorized_ok(HttpResponse::Ok().finish())
}
pub fn _add_routes(cfg: &mut ServiceConfig) {
cfg.route("/course/{course_id}", web::get().to(get_edit_proposals))
.route(
"/course/{course_id}/count",
web::get().to(get_edit_proposal_count),
)
.route(
"/process-edit-proposal",
web::post().to(process_edit_proposal),
);
}