mirror of
https://github.com/flibusta-apps/services_manager_server.git
synced 2026-03-02 22:55:25 +01:00
Run SQLx migrations at startup
Add an initial services table migration and enable the sqlx "migrate" feature. Introduce run_migrations in db.rs, run migrations on startup, and pass the PgPool into the router.
This commit is contained in:
@@ -34,4 +34,4 @@ tracing-subscriber = { version = "0.3.19", features = ["env-filter"]}
|
||||
sentry-tracing = "0.42.0"
|
||||
tower-http = { version = "0.6.2", features = ["trace"] }
|
||||
|
||||
sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres", "macros", "chrono"] }
|
||||
sqlx = { version = "0.8.3", features = ["runtime-tokio", "postgres", "macros", "chrono", "migrate"] }
|
||||
|
||||
27
migrations/20260116092854_initial_schema.sql
Normal file
27
migrations/20260116092854_initial_schema.sql
Normal file
@@ -0,0 +1,27 @@
|
||||
-- Initial schema migration for services table
|
||||
-- This migration is idempotent and safe to run on existing databases
|
||||
|
||||
-- Create services table if it doesn't exist
|
||||
CREATE TABLE IF NOT EXISTS services (
|
||||
id SERIAL PRIMARY KEY,
|
||||
token VARCHAR(128) NOT NULL UNIQUE,
|
||||
"user" BIGINT NOT NULL,
|
||||
status VARCHAR(12) NOT NULL,
|
||||
created_time TIMESTAMPTZ NOT NULL,
|
||||
cache VARCHAR(12) NOT NULL,
|
||||
username VARCHAR(64) NOT NULL
|
||||
);
|
||||
|
||||
-- Create unique index on token if it doesn't exist
|
||||
-- Note: The UNIQUE constraint already creates an index, but we ensure it exists
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_indexes
|
||||
WHERE tablename = 'services'
|
||||
AND indexname = 'services_token_key'
|
||||
) THEN
|
||||
CREATE UNIQUE INDEX services_token_key ON services(token);
|
||||
END IF;
|
||||
END
|
||||
$$;
|
||||
10
src/db.rs
10
src/db.rs
@@ -1,6 +1,16 @@
|
||||
use crate::config::CONFIG;
|
||||
|
||||
use sqlx::{postgres::PgPoolOptions, PgPool};
|
||||
use tracing::info;
|
||||
|
||||
pub async fn run_migrations(pool: &PgPool) {
|
||||
info!("Running database migrations...");
|
||||
sqlx::migrate!("./migrations")
|
||||
.run(pool)
|
||||
.await
|
||||
.expect("Failed to run migrations");
|
||||
info!("Database migrations completed successfully");
|
||||
}
|
||||
|
||||
pub async fn get_pg_pool() -> PgPool {
|
||||
let database_url: String = format!(
|
||||
|
||||
@@ -10,7 +10,13 @@ use tracing_subscriber::{filter, layer::SubscriberExt, util::SubscriberInitExt};
|
||||
use std::{net::SocketAddr, str::FromStr};
|
||||
|
||||
async fn start_app() {
|
||||
let app = views::get_router().await;
|
||||
// Initialize database pool
|
||||
let pool = db::get_pg_pool().await;
|
||||
|
||||
// Run migrations
|
||||
db::run_migrations(&pool).await;
|
||||
|
||||
let app = views::get_router(pool).await;
|
||||
|
||||
let addr = SocketAddr::from(([0, 0, 0, 0], 8080));
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ use sqlx::PgPool;
|
||||
use tower_http::trace::{self, TraceLayer};
|
||||
use tracing::Level;
|
||||
|
||||
use crate::{config::CONFIG, db::get_pg_pool};
|
||||
use crate::config::CONFIG;
|
||||
|
||||
pub type Database = Extension<PgPool>;
|
||||
|
||||
@@ -218,9 +218,7 @@ async fn auth(req: Request<axum::body::Body>, next: Next) -> Result<Response, St
|
||||
Ok(next.run(req).await)
|
||||
}
|
||||
|
||||
pub async fn get_router() -> Router {
|
||||
let client = get_pg_pool().await;
|
||||
|
||||
pub async fn get_router(client: PgPool) -> Router {
|
||||
let (prometheus_layer, metric_handle) = PrometheusMetricLayer::pair();
|
||||
|
||||
let app_router = Router::new()
|
||||
|
||||
Reference in New Issue
Block a user