use axum::{
Router,
extract::{Path, State},
response::Response,
routing::get,
};
use ocre::{Ctx, Error, OptionExt, Result, realtime::WebSocketUpgrade};
use crate::auth::OptionalUser;
use crate::models::event;
pub fn routes() -> Router<Ctx> {
Router::new().route("/realtime/{channel}", get(connect)).merge(ocre::realtime::dev_routes())
}
async fn connect(
State(ctx): State<Ctx>,
Path(channel): Path<String>,
OptionalUser(user): OptionalUser,
upgrade: WebSocketUpgrade,
) -> Result<Response> {
match channel.as_str() {
name => {
let (kind, key) = name.split_once(':').or_404()?;
let record = event::find_by_public_id(&ctx, key).await?.or_404()?;
match kind {
"event" => {}
"host" => {
let user = user.ok_or(Error::Unauthorized)?;
if user.id != record.user_id {
return Err(Error::Forbidden);
}
}
_ => return Err(Error::NotFound),
}
}
}
upgrade.connect(&ctx, &channel).await
}