feat(delta): rewrite channel / message fetch
This commit is contained in:
@@ -7,7 +7,7 @@ use schemars::{
|
|||||||
JsonSchema,
|
JsonSchema,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{Bot, Channel, Database, Webhook};
|
use crate::{Bot, Channel, Database, Message, Webhook};
|
||||||
|
|
||||||
/// Reference to some object in the database
|
/// Reference to some object in the database
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
@@ -32,6 +32,11 @@ impl Reference {
|
|||||||
db.fetch_channel(&self.id).await
|
db.fetch_channel(&self.id).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Fetch message from Ref
|
||||||
|
pub async fn as_message(&self, db: &Database) -> Result<Message> {
|
||||||
|
db.fetch_message(&self.id).await
|
||||||
|
}
|
||||||
|
|
||||||
/// Fetch webhook from Ref
|
/// Fetch webhook from Ref
|
||||||
pub async fn as_webhook(&self, db: &Database) -> Result<Webhook> {
|
pub async fn as_webhook(&self, db: &Database) -> Result<Webhook> {
|
||||||
db.fetch_webhook(&self.id).await
|
db.fetch_webhook(&self.id).await
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
use revolt_quark::{
|
use revolt_database::{
|
||||||
models::{Channel, User},
|
util::{permissions::DatabasePermissionQuery, reference::Reference},
|
||||||
perms, Database, Permission, Ref, Result,
|
Database, User,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use revolt_models::v0;
|
||||||
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
|
use revolt_result::Result;
|
||||||
use rocket::{serde::json::Json, State};
|
use rocket::{serde::json::Json, State};
|
||||||
|
|
||||||
/// # Fetch Channel
|
/// # Fetch Channel
|
||||||
@@ -10,12 +13,54 @@ use rocket::{serde::json::Json, State};
|
|||||||
/// Fetch channel by its id.
|
/// Fetch channel by its id.
|
||||||
#[openapi(tag = "Channel Information")]
|
#[openapi(tag = "Channel Information")]
|
||||||
#[get("/<target>")]
|
#[get("/<target>")]
|
||||||
pub async fn req(db: &State<Database>, user: User, target: Ref) -> Result<Json<Channel>> {
|
pub async fn fetch_channel(
|
||||||
|
db: &State<Database>,
|
||||||
|
user: User,
|
||||||
|
target: Reference,
|
||||||
|
) -> Result<Json<v0::Channel>> {
|
||||||
let channel = target.as_channel(db).await?;
|
let channel = target.as_channel(db).await?;
|
||||||
perms(&user)
|
|
||||||
.channel(&channel)
|
|
||||||
.throw_permission(db, Permission::ViewChannel)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
Ok(Json(channel))
|
let mut query = DatabasePermissionQuery::new(db, &user).channel(&channel);
|
||||||
|
calculate_channel_permissions(&mut query)
|
||||||
|
.await
|
||||||
|
.throw_if_lacking_channel_permission(ChannelPermission::ViewChannel)?;
|
||||||
|
|
||||||
|
Ok(Json(channel.into()))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use crate::{rocket, util::test::TestHarness};
|
||||||
|
use revolt_database::Channel;
|
||||||
|
use revolt_models::v0;
|
||||||
|
use rocket::http::{Header, Status};
|
||||||
|
|
||||||
|
#[rocket::async_test]
|
||||||
|
async fn fetch_channel() {
|
||||||
|
let harness = TestHarness::new().await;
|
||||||
|
let (_, session, user) = harness.new_user().await;
|
||||||
|
|
||||||
|
let group = Channel::create_group(
|
||||||
|
&harness.db,
|
||||||
|
v0::DataCreateGroup {
|
||||||
|
name: TestHarness::rand_string(),
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
user.id.to_string(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let response = harness
|
||||||
|
.client
|
||||||
|
.get(format!("/channels/{}", group.id()))
|
||||||
|
.header(Header::new("x-session-token", session.token.to_string()))
|
||||||
|
.dispatch()
|
||||||
|
.await;
|
||||||
|
|
||||||
|
assert_eq!(response.status(), Status::Ok);
|
||||||
|
|
||||||
|
let channel: v0::Channel = response.into_json().await.expect("`Channel`");
|
||||||
|
assert_eq!(channel, group.into());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,34 @@
|
|||||||
use revolt_quark::{
|
use revolt_database::{
|
||||||
models::{Message, User},
|
util::{permissions::DatabasePermissionQuery, reference::Reference},
|
||||||
perms, Db, Error, Permission, Ref, Result,
|
Database, User,
|
||||||
};
|
};
|
||||||
|
use revolt_models::v0;
|
||||||
use rocket::serde::json::Json;
|
use revolt_permissions::{calculate_channel_permissions, ChannelPermission};
|
||||||
|
use revolt_result::{create_error, Result};
|
||||||
|
use rocket::{serde::json::Json, State};
|
||||||
|
|
||||||
/// # Fetch Message
|
/// # Fetch Message
|
||||||
///
|
///
|
||||||
/// Retrieves a message by its id.
|
/// Retrieves a message by its id.
|
||||||
#[openapi(tag = "Messaging")]
|
#[openapi(tag = "Messaging")]
|
||||||
#[get("/<target>/messages/<msg>")]
|
#[get("/<target>/messages/<msg>")]
|
||||||
pub async fn req(db: &Db, user: User, target: Ref, msg: Ref) -> Result<Json<Message>> {
|
pub async fn req(
|
||||||
|
db: &State<Database>,
|
||||||
|
user: User,
|
||||||
|
target: Reference,
|
||||||
|
msg: Reference,
|
||||||
|
) -> Result<Json<v0::Message>> {
|
||||||
let channel = target.as_channel(db).await?;
|
let channel = target.as_channel(db).await?;
|
||||||
perms(&user)
|
|
||||||
.channel(&channel)
|
let mut query = DatabasePermissionQuery::new(db, &user).channel(&channel);
|
||||||
.throw_permission(db, Permission::ViewChannel)
|
calculate_channel_permissions(&mut query)
|
||||||
.await?;
|
.await
|
||||||
|
.throw_if_lacking_channel_permission(ChannelPermission::ViewChannel)?;
|
||||||
|
|
||||||
let message = msg.as_message(db).await?;
|
let message = msg.as_message(db).await?;
|
||||||
if message.channel != channel.as_id() {
|
if message.channel != channel.id() {
|
||||||
return Err(Error::NotFound);
|
return Err(create_error!(NotFound));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Json(message))
|
Ok(Json(message.into()))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ mod webhook_fetch_all;
|
|||||||
pub fn routes() -> (Vec<Route>, OpenApi) {
|
pub fn routes() -> (Vec<Route>, OpenApi) {
|
||||||
openapi_get_routes_spec![
|
openapi_get_routes_spec![
|
||||||
channel_ack::req,
|
channel_ack::req,
|
||||||
channel_fetch::req,
|
channel_fetch::fetch_channel,
|
||||||
members_fetch::req,
|
members_fetch::req,
|
||||||
channel_delete::req,
|
channel_delete::req,
|
||||||
channel_edit::req,
|
channel_edit::req,
|
||||||
|
|||||||
Reference in New Issue
Block a user