feat(server): fix migration not working

This commit is contained in:
perf3ct 2025-06-14 22:57:43 +00:00
parent b7daa77c02
commit 8fed8c753e
5 changed files with 20 additions and 42 deletions

View File

@ -14,6 +14,7 @@ pub mod ocr_queue;
pub mod ocr_tests; pub mod ocr_tests;
pub mod routes; pub mod routes;
pub mod seed; pub mod seed;
pub mod swagger;
pub mod watcher; pub mod watcher;
pub mod webdav_service; pub mod webdav_service;
pub mod webdav_scheduler; pub mod webdav_scheduler;

View File

@ -9,34 +9,11 @@ use std::sync::Arc;
use tower_http::{cors::CorsLayer, services::{ServeDir, ServeFile}}; use tower_http::{cors::CorsLayer, services::{ServeDir, ServeFile}};
use tracing::{info, error}; use tracing::{info, error};
mod auth; use readur::{config::Config, db::Database, AppState, *};
mod batch_ingest;
mod config;
mod db;
mod enhanced_ocr;
mod file_service;
mod models;
mod ocr;
mod ocr_queue;
mod routes;
mod seed;
mod swagger;
mod watcher;
mod webdav_service;
mod webdav_scheduler;
mod webdav_xml_parser;
#[cfg(test)] #[cfg(test)]
mod tests; mod tests;
use config::Config;
use db::Database;
#[derive(Clone)]
pub struct AppState {
pub db: Database,
pub config: Config,
}
#[tokio::main] #[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> { async fn main() -> Result<(), Box<dyn std::error::Error>> {
@ -144,16 +121,16 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let app = Router::new() let app = Router::new()
.route("/api/health", get(readur::health_check)) .route("/api/health", get(readur::health_check))
.nest("/api/auth", routes::auth::router()) .nest("/api/auth", readur::routes::auth::router())
.nest("/api/documents", routes::documents::router()) .nest("/api/documents", readur::routes::documents::router())
.nest("/api/metrics", routes::metrics::router()) .nest("/api/metrics", readur::routes::metrics::router())
.nest("/api/notifications", routes::notifications::router()) .nest("/api/notifications", readur::routes::notifications::router())
.nest("/api/queue", routes::queue::router()) .nest("/api/queue", readur::routes::queue::router())
.nest("/api/search", routes::search::router()) .nest("/api/search", readur::routes::search::router())
.nest("/api/settings", routes::settings::router()) .nest("/api/settings", readur::routes::settings::router())
.nest("/api/users", routes::users::router()) .nest("/api/users", readur::routes::users::router())
.nest("/api/webdav", routes::webdav::router()) .nest("/api/webdav", readur::routes::webdav::router())
.merge(swagger::create_swagger_router()) .merge(readur::swagger::create_swagger_router())
.nest_service("/", ServeDir::new("/app/frontend").fallback(ServeFile::new("/app/frontend/index.html"))) .nest_service("/", ServeDir::new("/app/frontend").fallback(ServeFile::new("/app/frontend/index.html")))
.fallback(serve_spa) .fallback(serve_spa)
.layer(CorsLayer::permissive()) .layer(CorsLayer::permissive())
@ -161,7 +138,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let watcher_config = config.clone(); let watcher_config = config.clone();
tokio::spawn(async move { tokio::spawn(async move {
if let Err(e) = watcher::start_folder_watcher(watcher_config).await { if let Err(e) = readur::watcher::start_folder_watcher(watcher_config).await {
error!("Folder watcher error: {}", e); error!("Folder watcher error: {}", e);
} }
}); });
@ -170,7 +147,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let queue_db = Database::new(&config.database_url).await?; let queue_db = Database::new(&config.database_url).await?;
let queue_pool = sqlx::PgPool::connect(&config.database_url).await?; let queue_pool = sqlx::PgPool::connect(&config.database_url).await?;
let concurrent_jobs = 4; // TODO: Get from config/settings let concurrent_jobs = 4; // TODO: Get from config/settings
let queue_service = Arc::new(ocr_queue::OcrQueueService::new(queue_db, queue_pool, concurrent_jobs)); let queue_service = Arc::new(readur::ocr_queue::OcrQueueService::new(queue_db, queue_pool, concurrent_jobs));
let queue_worker = queue_service.clone(); let queue_worker = queue_service.clone();
tokio::spawn(async move { tokio::spawn(async move {
@ -199,7 +176,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
}); });
// Start WebDAV background sync scheduler // Start WebDAV background sync scheduler
let webdav_scheduler = webdav_scheduler::WebDAVScheduler::new(state.clone()); let webdav_scheduler = readur::webdav_scheduler::WebDAVScheduler::new(state.clone());
tokio::spawn(async move { tokio::spawn(async move {
info!("Starting WebDAV background sync scheduler"); info!("Starting WebDAV background sync scheduler");
webdav_scheduler.start().await; webdav_scheduler.start().await;

View File

@ -26,9 +26,9 @@ impl OcrService {
{ {
// Perform health checks first // Perform health checks first
self.health_checker.check_tesseract_installation() self.health_checker.check_tesseract_installation()
.map_err(|e| anyhow!(e))?; .map_err(|e: OcrError| anyhow!(e))?;
self.health_checker.check_language_data(lang) self.health_checker.check_language_data(lang)
.map_err(|e| anyhow!(e))?; .map_err(|e: OcrError| anyhow!(e))?;
let mut tesseract = Tesseract::new(None, Some(lang)) let mut tesseract = Tesseract::new(None, Some(lang))
.map_err(|e| anyhow!(OcrError::InitializationFailed { .map_err(|e| anyhow!(OcrError::InitializationFailed {

View File

@ -9,7 +9,7 @@ use axum::{
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Serialize)] #[derive(Serialize)]
struct OcrHealthResponse { pub struct OcrHealthResponse {
status: String, status: String,
tesseract_installed: bool, tesseract_installed: bool,
available_languages: Vec<String>, available_languages: Vec<String>,
@ -18,7 +18,7 @@ struct OcrHealthResponse {
} }
#[derive(Serialize)] #[derive(Serialize)]
struct OcrErrorResponse { pub struct OcrErrorResponse {
error: String, error: String,
error_code: String, error_code: String,
details: Option<String>, details: Option<String>,
@ -26,7 +26,7 @@ struct OcrErrorResponse {
} }
#[derive(Deserialize)] #[derive(Deserialize)]
struct OcrRequest { pub struct OcrRequest {
file_path: String, file_path: String,
language: Option<String>, language: Option<String>,
use_fallback: Option<bool>, use_fallback: Option<bool>,