contributors.rs

 1use std::sync::Arc;
 2
 3use axum::{
 4    Extension, Json, Router,
 5    extract::{self},
 6    routing::get,
 7};
 8use serde::Deserialize;
 9
10use crate::{AppState, Result};
11
12pub fn router() -> Router {
13    Router::new().route("/contributors", get(get_contributors).post(add_contributor))
14}
15
16async fn get_contributors(Extension(app): Extension<Arc<AppState>>) -> Result<Json<Vec<String>>> {
17    Ok(Json(app.db.get_contributors().await?))
18}
19
20#[derive(Debug, Deserialize)]
21struct AddContributorBody {
22    github_user_id: i32,
23    github_login: String,
24    github_email: Option<String>,
25    github_name: Option<String>,
26    github_user_created_at: chrono::DateTime<chrono::Utc>,
27}
28
29async fn add_contributor(
30    Extension(app): Extension<Arc<AppState>>,
31    extract::Json(params): extract::Json<AddContributorBody>,
32) -> Result<()> {
33    let initial_channel_id = app.config.auto_join_channel_id;
34    app.db
35        .add_contributor(
36            &params.github_login,
37            params.github_user_id,
38            params.github_email.as_deref(),
39            params.github_name.as_deref(),
40            params.github_user_created_at,
41            initial_channel_id,
42        )
43        .await
44}