feat(server): fix migration not working
This commit is contained in:
parent
b7daa77c02
commit
8fed8c753e
|
|
@ -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;
|
||||||
|
|
|
||||||
51
src/main.rs
51
src/main.rs
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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>,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue