55 lines
1.7 KiB
Rust
55 lines
1.7 KiB
Rust
mod handlers;
|
|
|
|
use axum::{
|
|
routing::{get, post},
|
|
Router,
|
|
};
|
|
use tower_http::cors::{Any, CorsLayer};
|
|
use sqlx::postgres::PgPoolOptions;
|
|
use std::net::SocketAddr;
|
|
use dotenvy::dotenv;
|
|
use std::env;
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
dotenv().ok();
|
|
tracing_subscriber::fmt::init();
|
|
|
|
let db_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
|
|
let pool = PgPoolOptions::new()
|
|
.max_connections(5)
|
|
.connect(&db_url)
|
|
.await
|
|
.expect("Failed to connect to database");
|
|
|
|
// Run migrations automatically
|
|
sqlx::migrate!("./migrations")
|
|
.run(&pool)
|
|
.await
|
|
.expect("Failed to run migrations");
|
|
|
|
let cors = CorsLayer::new()
|
|
.allow_origin(Any)
|
|
.allow_methods(Any)
|
|
.allow_headers(Any);
|
|
|
|
let app = Router::new()
|
|
.route("/catalog", get(handlers::get_course_catalog))
|
|
.route("/enroll", post(handlers::enroll_user))
|
|
.route("/ingest", post(handlers::ingest_course))
|
|
.route("/auth/register", post(handlers::register))
|
|
.route("/auth/login", post(handlers::login))
|
|
.route("/enrollments/{id}", get(handlers::get_user_enrollments))
|
|
.route("/courses/{id}/outline", get(handlers::get_course_outline))
|
|
.route("/lessons/{id}", get(handlers::get_lesson_content))
|
|
.route("/grades", post(handlers::submit_lesson_score))
|
|
.route("/users/{user_id}/courses/{course_id}/grades", get(handlers::get_user_course_grades))
|
|
.layer(cors)
|
|
.with_state(pool);
|
|
|
|
let addr = SocketAddr::from(([0, 0, 0, 0], 3002));
|
|
tracing::info!("LMS Service listening on {}", addr);
|
|
let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
|
|
axum::serve(listener, app).await.unwrap();
|
|
}
|