feat(migrations): try to fix the migrations service
This commit is contained in:
parent
e61db1036e
commit
e1e949cf65
|
|
@ -10,7 +10,7 @@ tower = { version = "0.4", features = ["util"] }
|
||||||
tower-http = { version = "0.5", features = ["cors", "fs"] }
|
tower-http = { version = "0.5", features = ["cors", "fs"] }
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres", "sqlite", "chrono", "uuid"] }
|
sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres", "sqlite", "chrono", "uuid", "migrate"] }
|
||||||
regex = "1.0"
|
regex = "1.0"
|
||||||
uuid = { version = "1", features = ["v4", "serde"] }
|
uuid = { version = "1", features = ["v4", "serde"] }
|
||||||
chrono = { version = "0.4", features = ["serde"] }
|
chrono = { version = "0.4", features = ["serde"] }
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
-- Create extensions
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||||||
|
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
|
||||||
|
|
||||||
|
-- Create users table
|
||||||
|
CREATE TABLE IF NOT EXISTS users (
|
||||||
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||||
|
username VARCHAR(255) UNIQUE NOT NULL,
|
||||||
|
email VARCHAR(255) UNIQUE NOT NULL,
|
||||||
|
password_hash VARCHAR(255) NOT NULL,
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Create documents table
|
||||||
|
CREATE TABLE IF NOT EXISTS documents (
|
||||||
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||||
|
filename VARCHAR(255) NOT NULL,
|
||||||
|
original_filename VARCHAR(255) NOT NULL,
|
||||||
|
file_path VARCHAR(500) NOT NULL,
|
||||||
|
file_size BIGINT NOT NULL,
|
||||||
|
mime_type VARCHAR(100) NOT NULL,
|
||||||
|
content TEXT,
|
||||||
|
ocr_text TEXT,
|
||||||
|
tags TEXT[] DEFAULT '{}',
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
user_id UUID REFERENCES users(id) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Create indexes
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_documents_user_id ON documents(user_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_documents_filename ON documents(filename);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_documents_mime_type ON documents(mime_type);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_documents_tags ON documents USING GIN(tags);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_documents_content_search ON documents USING GIN(to_tsvector('english', COALESCE(content, '') || ' ' || COALESCE(ocr_text, '')));
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_documents_filename_trgm ON documents USING GIN(filename gin_trgm_ops);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_documents_content_trgm ON documents USING GIN((COALESCE(content, '') || ' ' || COALESCE(ocr_text, '')) gin_trgm_ops);
|
||||||
|
|
||||||
|
-- Create settings table
|
||||||
|
CREATE TABLE IF NOT EXISTS settings (
|
||||||
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||||||
|
user_id UUID REFERENCES users(id) ON DELETE CASCADE UNIQUE,
|
||||||
|
ocr_language VARCHAR(10) DEFAULT 'eng',
|
||||||
|
concurrent_ocr_jobs INT DEFAULT 4,
|
||||||
|
ocr_timeout_seconds INT DEFAULT 300,
|
||||||
|
max_file_size_mb INT DEFAULT 50,
|
||||||
|
allowed_file_types TEXT[] DEFAULT ARRAY['pdf', 'png', 'jpg', 'jpeg', 'tiff', 'bmp', 'txt'],
|
||||||
|
auto_rotate_images BOOLEAN DEFAULT TRUE,
|
||||||
|
enable_image_preprocessing BOOLEAN DEFAULT TRUE,
|
||||||
|
search_results_per_page INT DEFAULT 25,
|
||||||
|
search_snippet_length INT DEFAULT 200,
|
||||||
|
fuzzy_search_threshold REAL DEFAULT 0.8,
|
||||||
|
retention_days INT,
|
||||||
|
enable_auto_cleanup BOOLEAN DEFAULT FALSE,
|
||||||
|
enable_compression BOOLEAN DEFAULT FALSE,
|
||||||
|
memory_limit_mb INT DEFAULT 512,
|
||||||
|
cpu_priority VARCHAR(10) DEFAULT 'normal',
|
||||||
|
enable_background_ocr BOOLEAN DEFAULT TRUE,
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW()
|
||||||
|
);
|
||||||
46
src/main.rs
46
src/main.rs
|
|
@ -4,6 +4,7 @@ use axum::{
|
||||||
routing::get,
|
routing::get,
|
||||||
Router,
|
Router,
|
||||||
};
|
};
|
||||||
|
use sqlx::Row;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use tower_http::{cors::CorsLayer, services::ServeDir};
|
use tower_http::{cors::CorsLayer, services::ServeDir};
|
||||||
use tracing::{info, error};
|
use tracing::{info, error};
|
||||||
|
|
@ -41,16 +42,45 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
let config = Config::from_env()?;
|
let config = Config::from_env()?;
|
||||||
let db = Database::new(&config.database_url).await?;
|
let db = Database::new(&config.database_url).await?;
|
||||||
|
|
||||||
db.migrate().await?;
|
// Don't run the old migration system - let SQLx handle everything
|
||||||
|
// db.migrate().await?;
|
||||||
|
|
||||||
// Run SQLx migrations
|
// Run SQLx migrations
|
||||||
sqlx::migrate!("./migrations")
|
info!("Running SQLx migrations...");
|
||||||
.run(&db.pool)
|
let migrations = sqlx::migrate!("./migrations");
|
||||||
.await
|
info!("Found {} migrations", migrations.migrations.len());
|
||||||
.map_err(|e| {
|
|
||||||
error!("Failed to run migrations: {}", e);
|
for migration in migrations.migrations.iter() {
|
||||||
e
|
info!("Migration available: {} - {}", migration.version, migration.description);
|
||||||
})?;
|
}
|
||||||
|
|
||||||
|
// Check current migration status
|
||||||
|
let applied_result = sqlx::query("SELECT version, description FROM _sqlx_migrations ORDER BY version")
|
||||||
|
.fetch_all(&db.pool)
|
||||||
|
.await;
|
||||||
|
|
||||||
|
match applied_result {
|
||||||
|
Ok(rows) => {
|
||||||
|
info!("Currently applied migrations:");
|
||||||
|
for row in rows {
|
||||||
|
let version: i64 = row.get("version");
|
||||||
|
let description: String = row.get("description");
|
||||||
|
info!(" - {} {}", version, description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
info!("No existing migrations found (this is normal for first run): {}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = migrations.run(&db.pool).await;
|
||||||
|
match result {
|
||||||
|
Ok(_) => info!("SQLx migrations completed successfully"),
|
||||||
|
Err(e) => {
|
||||||
|
error!("Failed to run SQLx migrations: {}", e);
|
||||||
|
return Err(e.into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Seed admin user
|
// Seed admin user
|
||||||
seed::seed_admin_user(&db).await?;
|
seed::seed_admin_user(&db).await?;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue