forked from jmug/stoatchat
Integrate voso, join_call route for channels.
This commit is contained in:
65
src/routes/channels/join_call.rs
Normal file
65
src/routes/channels/join_call.rs
Normal file
@@ -0,0 +1,65 @@
|
||||
use crate::database::*;
|
||||
use crate::util::result::{Error, Result};
|
||||
use crate::util::variables::{USE_VOSO, VOSO_URL, VOSO_MANAGE_TOKEN};
|
||||
|
||||
use serde::{Serialize, Deserialize};
|
||||
use rocket_contrib::json::JsonValue;
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
struct CreateUserResponse {
|
||||
token: String
|
||||
}
|
||||
|
||||
#[post("/<target>/join_call")]
|
||||
pub async fn req(user: User, target: Ref) -> Result<JsonValue> {
|
||||
if !*USE_VOSO {
|
||||
return Err(Error::VosoUnavailable)
|
||||
}
|
||||
|
||||
let target = target.fetch_channel().await?;
|
||||
let perm = permissions::PermissionCalculator::new(&user)
|
||||
.with_channel(&target)
|
||||
.for_channel()
|
||||
.await?;
|
||||
|
||||
if !perm.get_voice_call() {
|
||||
return Err(Error::MissingPermission)
|
||||
}
|
||||
|
||||
// To join a call:
|
||||
// - Check if the room exists.
|
||||
// - If not, create it.
|
||||
let client = reqwest::Client::new();
|
||||
if let Err(error) = client
|
||||
.get(&format!("{}/room/{}", *VOSO_URL, target.id()))
|
||||
.header(reqwest::header::AUTHORIZATION, VOSO_MANAGE_TOKEN.to_string())
|
||||
.send()
|
||||
.await {
|
||||
if error.status() == Some(reqwest::StatusCode::NOT_FOUND) {
|
||||
if let Err(_) = client
|
||||
.post(&format!("{}/room/{}", *VOSO_URL, target.id()))
|
||||
.header(reqwest::header::AUTHORIZATION, VOSO_MANAGE_TOKEN.to_string())
|
||||
.send()
|
||||
.await {
|
||||
return Err(Error::VosoUnavailable)
|
||||
}
|
||||
} else {
|
||||
return Err(Error::VosoUnavailable)
|
||||
}
|
||||
}
|
||||
|
||||
// Then create a user for the room.
|
||||
if let Ok(response) = client
|
||||
.post(&format!("{}/room/{}/user/{}", *VOSO_URL, target.id(), user.id))
|
||||
.header(reqwest::header::AUTHORIZATION, VOSO_MANAGE_TOKEN.to_string())
|
||||
.send()
|
||||
.await {
|
||||
let res: CreateUserResponse = response.json()
|
||||
.await
|
||||
.map_err(|_| Error::InvalidOperation)?;
|
||||
|
||||
Ok(json!(res))
|
||||
} else {
|
||||
Err(Error::VosoUnavailable)
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ mod fetch_channel;
|
||||
mod group_add_member;
|
||||
mod group_create;
|
||||
mod group_remove_member;
|
||||
mod join_call;
|
||||
mod message_delete;
|
||||
mod message_edit;
|
||||
mod message_fetch;
|
||||
@@ -24,6 +25,7 @@ pub fn routes() -> Vec<Route> {
|
||||
message_delete::req,
|
||||
group_create::req,
|
||||
group_add_member::req,
|
||||
group_remove_member::req
|
||||
group_remove_member::req,
|
||||
join_call::req,
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user