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 ¶ms.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}