feat: surrealdb queue and remove lapin and rabbitmq

This commit is contained in:
Per Stark
2025-01-09 21:13:42 +01:00
parent 2b1348aae2
commit d77f07c626
28 changed files with 622 additions and 1306 deletions

View File

@@ -44,7 +44,7 @@ pub async fn ingress_data(
let futures: Vec<_> = ingress_objects
.into_iter()
.map(|object| state.rabbitmq_producer.publish(object))
.map(|object| state.job_queue.enqueue(object.clone(), user.id.clone()))
.collect();
try_join_all(futures).await.map_err(AppError::from)?;

View File

@@ -0,0 +1,34 @@
use crate::{error::ApiError, server::AppState, storage::types::user::User};
use axum::{
extract::{Path, State},
http::StatusCode,
response::IntoResponse,
Extension, Json,
};
pub async fn get_queue_tasks(
State(state): State<AppState>,
Extension(user): Extension<User>,
) -> Result<impl IntoResponse, ApiError> {
let user_tasks = state
.job_queue
.get_user_jobs(&user.id)
.await
.map_err(ApiError::from)?;
Ok(Json(user_tasks))
}
pub async fn delete_queue_task(
State(state): State<AppState>,
Extension(user): Extension<User>,
Path(id): Path<String>,
) -> Result<impl IntoResponse, ApiError> {
state
.job_queue
.delete_job(&id, &user.id)
.await
.map_err(ApiError::from)?;
Ok(StatusCode::OK)
}

View File

@@ -1,3 +1,4 @@
pub mod ingress;
pub mod ingress_task;
pub mod query;
pub mod queue_length;

View File

@@ -4,6 +4,7 @@ use tracing::info;
use crate::{
error::{ApiError, AppError},
server::AppState,
storage::{db::get_all_stored_items, types::job::Job},
};
pub async fn queue_length_handler(
@@ -11,11 +12,10 @@ pub async fn queue_length_handler(
) -> Result<impl IntoResponse, ApiError> {
info!("Getting queue length");
let queue_length = state
.rabbitmq_consumer
.get_queue_length()
let queue_length = get_all_stored_items::<Job>(&state.surreal_db_client)
.await
.map_err(AppError::from)?;
.map_err(AppError::from)?
.len();
info!("Queue length: {}", queue_length);

View File

@@ -29,10 +29,11 @@ pub async fn index_handler(
let queue_length = match auth.current_user.is_some() {
true => state
.rabbitmq_consumer
.get_queue_length()
.job_queue
.get_user_jobs(&auth.current_user.clone().unwrap().id)
.await
.map_err(|e| HtmlError::new(AppError::from(e), state.templates.clone()))?,
.map_err(|e| HtmlError::new(e, state.templates.clone()))?
.len(),
false => 0,
};
@@ -47,7 +48,7 @@ pub async fn index_handler(
let output = render_template(
IndexData::template_name(),
IndexData {
queue_length,
queue_length: queue_length.try_into().unwrap(),
gdpr_accepted,
user: auth.current_user,
},

View File

@@ -80,7 +80,7 @@ pub async fn process_ingress_form(
let futures: Vec<_> = ingress_objects
.into_iter()
.map(|object| state.rabbitmq_producer.publish(object))
.map(|object| state.job_queue.enqueue(object.clone(), user.id.clone()))
.collect();
try_join_all(futures)

View File

@@ -0,0 +1,61 @@
use crate::{
error::{AppError, HtmlError},
page_data,
server::AppState,
storage::types::{job::Job, user::User},
};
use axum::{
extract::{Path, State},
response::{Html, IntoResponse, Redirect},
};
use axum_session_auth::AuthSession;
use axum_session_surreal::SessionSurrealPool;
use surrealdb::{engine::any::Any, Surreal};
use super::render_template;
page_data!(ShowQueueTasks, "queue_tasks.html", {jobs: Vec<Job>});
pub async fn show_queue_tasks(
State(state): State<AppState>,
auth: AuthSession<User, String, SessionSurrealPool<Any>, Surreal<Any>>,
) -> Result<impl IntoResponse, HtmlError> {
let user = match auth.current_user {
Some(user) => user,
None => return Ok(Redirect::to("/signin").into_response()),
};
let jobs = state
.job_queue
.get_user_jobs(&user.id)
.await
.map_err(|e| HtmlError::new(e, state.templates.clone()))?;
let rendered = render_template(
ShowQueueTasks::template_name(),
ShowQueueTasks { jobs },
state.templates.clone(),
)
.map_err(|e| HtmlError::new(AppError::from(e), state.templates.clone()))?;
Ok(rendered.into_response())
}
pub async fn delete_task(
State(state): State<AppState>,
auth: AuthSession<User, String, SessionSurrealPool<Any>, Surreal<Any>>,
Path(id): Path<String>,
) -> Result<impl IntoResponse, HtmlError> {
let user = match auth.current_user {
Some(user) => user,
None => return Ok(Redirect::to("/signin").into_response()),
};
state
.job_queue
.delete_job(&id, &user.id)
.await
.map_err(|e| HtmlError::new(e, state.templates.clone()))?;
Ok(Html("").into_response())
}

View File

@@ -8,6 +8,7 @@ pub mod documentation;
pub mod gdpr;
pub mod index;
pub mod ingress;
pub mod ingress_tasks;
pub mod search_result;
pub mod signin;
pub mod signout;