Mobile support to come.
mod app_state;
mod auth;
mod bootstrap;
mod error;
mod response;
mod settings;
use http::StatusCode;
use sqlx::PgPool;
use std::sync::Arc;
use std::time::Duration;
use anyhow::Context;
use axum::{Router, routing::get};
use tokio::net;
use tower::ServiceBuilder;
use tower_http::{
cors::CorsLayer,
request_id::{MakeRequestUuid, PropagateRequestIdLayer, SetRequestIdLayer},
timeout::TimeoutLayer,
trace::TraceLayer,
};
use crate::handler::legacy_repository::{get_repository_commit_diffs, get_repository_commit_stats};
use crate::handler::{
create_git_http_router, create_oauth_router, create_organization_router,
create_question_router, create_repository_router, create_user_router,
};
pub use app_state::AppState;
pub use auth::AuthenticatedUser;
pub use error::AppError;
pub use response::AppResponse;
pub use settings::Settings;
pub struct GitdotServer {
router: axum::Router,
listener: net::TcpListener,
}
impl GitdotServer {
pub async fn new() -> anyhow::Result<Self> {
bootstrap::bootstrap()?;
let settings = Arc::new(Settings::new()?);
let pool = PgPool::connect(&settings.database_url).await?;
let state = AppState::new(settings.clone(), pool);
let router = create_router(state);
let listener = tokio::net::TcpListener::bind(&settings.get_server_address())
.await
.unwrap();
Ok(Self { router, listener })
}
pub async fn start(self) -> anyhow::Result<()> {
tracing::info!("Starting server on {}", self.listener.local_addr().unwrap());
axum::serve(self.listener, self.router)
.await
.context("Failed to start server")?;
Ok(())
}
}
fn create_router(app_state: AppState) -> Router {
let git_router = create_git_http_router();
let user_router = create_user_router();
let org_router = create_organization_router();
let repo_router = create_repository_router();
let question_router = create_question_router();
let oauth_router = create_oauth_router();
let old_repo_router = Router::new()
.route(
"/repository/{owner}/{repo}/commits/{sha}/stats",
get(get_repository_commit_stats),
)
.route(
"/repository/{owner}/{repo}/commits/{sha}/diffs",
get(get_repository_commit_diffs),
);
let middleware = ServiceBuilder::new()
.layer(SetRequestIdLayer::x_request_id(MakeRequestUuid))
.layer(TraceLayer::new_for_http())
.layer(CorsLayer::permissive())
.layer(TimeoutLayer::with_status_code(
StatusCode::REQUEST_TIMEOUT,
Duration::from_secs(10),
))
.layer(PropagateRequestIdLayer::x_request_id());
let api_router = Router::new()
.merge(git_router)
.merge(user_router)
.merge(org_router)
.merge(repo_router)
.merge(question_router)
.merge(oauth_router)
.merge(old_repo_router)
.layer(middleware)
.with_state(app_state);
Router::new()
.route("/health", get(|| async { "OK" }))
.merge(api_router)
}
separated health check from api router to avoid polluting logs
mikkel•84262e77d ago
wired up oauth in backend
mikkel•13cdd308d ago
implemented get user and list user repos apis
mike•7ce056912d ago
wired up question apis
mike•4ea4d4014d ago
migrated get_repository_file_commits api
mike•3fe674c15d ago
migrated get commits
mike•7a6a65a16d ago
implemented boilerplate for get repo tree and file api
mike•ec579cb16d ago
move main to src/bin
mike•f8a4d4b16d ago
rewrote create_repository handler
mike•ba2ca1616d ago
rewrote org routers
mike•cb4614116d ago
rewrote git http handlers
mike•d5fa2fb16d ago
migrated git http endpoints to new arch
mike•fbc763320d ago
migrated create_repository to new design
mike•f5802ef20d ago
implemented optional extractor to extract auth user from jwt token in request header
mike•988f77f22d ago
streaming suspense
baepaul•be07af123d ago
prototyped create org handler
mike•38ec76d23d ago
added org server in app state
mike•e95ce8623d ago
renaming to get_repository_commit_diffs
and providing a longer commit message
than i am prone to type for additional context here
baepaul•127919126d ago
implementing get_repository_commit_diff
baepaul•17c154d26d ago
prototyped top-level response and error
mike•fae48ec1mo ago
merging
baepaul•256fc861mo ago
more reorg
mike•9d090a61mo ago
created gitdot lib
mike•d2ec2131mo ago