65 lines
1.7 KiB
Rust
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(())
|
|
}
|