rustlog/src/web/admin.rs

65 lines
1.7 KiB
Rust

use crate::{app::App, bot::BotMessage, error::Error};
use axum::{
extract::State,
http::Request,
middleware::Next,
response::{IntoResponse, Response},
Extension, Json,
};
use reqwest::StatusCode;
use schemars::JsonSchema;
use serde::Deserialize;
use tokio::sync::mpsc::Sender;
pub async fn admin_auth<B>(
app: State<App>,
request: Request<B>,
next: Next<B>,
) -> Result<Response, impl IntoResponse> {
if let Some(admin_key) = &app.config.admin_api_key {
if request
.headers()
.get("X-Api-Key")
.and_then(|value| value.to_str().ok())
== Some(admin_key)
{
let response = next.run(request).await;
return Ok(response);
}
}
Err((StatusCode::FORBIDDEN, "No, I don't think so"))
}
#[derive(Deserialize, JsonSchema)]
pub struct ChannelsRequest {
/// List of channel ids
pub channels: Vec<String>,
}
pub async fn add_channels(
Extension(bot_tx): Extension<Sender<BotMessage>>,
app: State<App>,
Json(ChannelsRequest { channels }): Json<ChannelsRequest>,
) -> Result<(), Error> {
let users = app.get_users(channels, vec![]).await?;
let names = users.into_values().collect();
bot_tx.send(BotMessage::JoinChannels(names)).await.unwrap();
Ok(())
}
pub async fn remove_channels(
Extension(bot_tx): Extension<Sender<BotMessage>>,
app: State<App>,
Json(ChannelsRequest { channels }): Json<ChannelsRequest>,
) -> Result<(), Error> {
let users = app.get_users(channels, vec![]).await?;
let names = users.into_values().collect();
bot_tx.send(BotMessage::PartChannels(names)).await.unwrap();
Ok(())
}