mirror of
https://github.com/stoatchat/stoatchat.git
synced 2026-07-14 05:26:59 +00:00
fix: improve generated openapi.json (#584)
* fix: /bots/{bot}
Paths "/bots/{bot}" and "/bots/{target}" must not be equivalent.
Signed-off-by: Damocles078 <hellodamocles078@gmail.com>
* fix: /channels/{group_id}/recipients/{member_id}
Paths "/channels/{group_id}/recipients/{member_id}" and "/channels/{target}/recipients/{member}" must not be equivalent.
Signed-off-by: Damocles078 <hellodamocles078@gmail.com>
* fix: /channels/{channel_id}/webhook
Paths "/channels/{target}/webhooks" and "/channels/{channel_id}/webhooks" must not be equivalent.
Signed-off-by: Damocles078 <hellodamocles078@gmail.com>
* fix: /servers/{server_id}/members/{member_id}
Paths "/servers/{target}/members/{member}" and "/servers/{server}/members/{member}" must not be equivalent.
Signed-off-by: Damocles078 <hellodamocles078@gmail.com>
* fix: /custom/emoji/{emoji_id}
Paths "/custom/emoji/{id}" and "/custom/emoji/{emoji_id}" must not be equivalent.
Signed-off-by: Damocles078 <hellodamocles078@gmail.com>
---------
Signed-off-by: Damocles078 <hellodamocles078@gmail.com>
Signed-off-by: Damocles <106018783+Damocles078@users.noreply.github.com>
This commit is contained in:
@@ -11,14 +11,14 @@ use rocket_empty::EmptyResponse;
|
||||
///
|
||||
/// Delete a bot by its id.
|
||||
#[openapi(tag = "Bots")]
|
||||
#[delete("/<target>")]
|
||||
#[delete("/<bot_id>")]
|
||||
pub async fn delete_bot(
|
||||
db: &State<Database>,
|
||||
voice_client: &State<VoiceClient>,
|
||||
user: User,
|
||||
target: Reference<'_>,
|
||||
bot_id: Reference<'_>,
|
||||
) -> Result<EmptyResponse> {
|
||||
let bot = target.as_bot(db).await?;
|
||||
let bot = bot_id.as_bot(db).await?;
|
||||
if bot.owner != user.id {
|
||||
return Err(create_error!(NotFound));
|
||||
}
|
||||
|
||||
@@ -10,11 +10,11 @@ use validator::Validate;
|
||||
///
|
||||
/// Edit bot details by its id.
|
||||
#[openapi(tag = "Bots")]
|
||||
#[patch("/<target>", data = "<data>")]
|
||||
#[patch("/<bot_id>", data = "<data>")]
|
||||
pub async fn edit_bot(
|
||||
db: &State<Database>,
|
||||
user: User,
|
||||
target: Reference<'_>,
|
||||
bot_id: Reference<'_>,
|
||||
data: Json<DataEditBot>,
|
||||
) -> Result<Json<v0::BotWithUserResponse>> {
|
||||
let data = data.into_inner();
|
||||
@@ -24,7 +24,7 @@ pub async fn edit_bot(
|
||||
})
|
||||
})?;
|
||||
|
||||
let mut bot = target.as_bot(db).await?;
|
||||
let mut bot = bot_id.as_bot(db).await?;
|
||||
if bot.owner != user.id {
|
||||
return Err(create_error!(NotFound));
|
||||
}
|
||||
|
||||
@@ -7,17 +7,17 @@ use rocket::{serde::json::Json, State};
|
||||
///
|
||||
/// Fetch details of a bot you own by its id.
|
||||
#[openapi(tag = "Bots")]
|
||||
#[get("/<bot>")]
|
||||
#[get("/<bot_id>")]
|
||||
pub async fn fetch_bot(
|
||||
db: &State<Database>,
|
||||
user: User,
|
||||
bot: Reference<'_>,
|
||||
bot_id: Reference<'_>,
|
||||
) -> Result<Json<FetchBotResponse>> {
|
||||
if user.bot.is_some() {
|
||||
return Err(create_error!(IsBot));
|
||||
}
|
||||
|
||||
let bot = bot.as_bot(db).await?;
|
||||
let bot = bot_id.as_bot(db).await?;
|
||||
if bot.owner != user.id {
|
||||
return Err(create_error!(NotFound));
|
||||
}
|
||||
|
||||
@@ -11,20 +11,20 @@ use rocket_empty::EmptyResponse;
|
||||
///
|
||||
/// Removes a user from the group.
|
||||
#[openapi(tag = "Groups")]
|
||||
#[delete("/<target>/recipients/<member>")]
|
||||
#[delete("/<group_id>/recipients/<member_id>")]
|
||||
pub async fn remove_member(
|
||||
db: &State<Database>,
|
||||
voice_client: &State<VoiceClient>,
|
||||
amqp: &State<AMQP>,
|
||||
user: User,
|
||||
target: Reference<'_>,
|
||||
member: Reference<'_>,
|
||||
group_id: Reference<'_>,
|
||||
member_id: Reference<'_>,
|
||||
) -> Result<EmptyResponse> {
|
||||
if user.bot.is_some() {
|
||||
return Err(create_error!(IsBot));
|
||||
}
|
||||
|
||||
let channel = target.as_channel(db).await?;
|
||||
let channel = group_id.as_channel(db).await?;
|
||||
|
||||
if let Channel::Group {
|
||||
owner, recipients, ..
|
||||
@@ -36,7 +36,7 @@ pub async fn remove_member(
|
||||
}));
|
||||
}
|
||||
|
||||
let member = member.as_user(db).await?;
|
||||
let member = member_id.as_user(db).await?;
|
||||
if user.id == member.id {
|
||||
return Err(create_error!(CannotRemoveYourself));
|
||||
}
|
||||
@@ -54,8 +54,8 @@ pub async fn remove_member(
|
||||
|
||||
let user_voice_channel = UserVoiceChannel::from_channel(&channel);
|
||||
|
||||
if is_in_voice_channel(member.id, &user_voice_channel).await? {
|
||||
remove_user_from_voice_channel(voice_client, &user_voice_channel, member.id).await?;
|
||||
if is_in_voice_channel(member_id.id, &user_voice_channel).await? {
|
||||
remove_user_from_voice_channel(voice_client, &user_voice_channel, member_id.id).await?;
|
||||
};
|
||||
|
||||
Ok(EmptyResponse)
|
||||
|
||||
@@ -15,11 +15,11 @@ use validator::Validate;
|
||||
///
|
||||
/// Creates a webhook which 3rd party platforms can use to send messages
|
||||
#[openapi(tag = "Webhooks")]
|
||||
#[post("/<target>/webhooks", data = "<data>")]
|
||||
#[post("/<channel_id>/webhooks", data = "<data>")]
|
||||
pub async fn create_webhook(
|
||||
db: &State<Database>,
|
||||
user: User,
|
||||
target: Reference<'_>,
|
||||
channel_id: Reference<'_>,
|
||||
data: Json<v0::CreateWebhookBody>,
|
||||
) -> Result<Json<v0::Webhook>> {
|
||||
let data = data.into_inner();
|
||||
@@ -29,7 +29,7 @@ pub async fn create_webhook(
|
||||
})
|
||||
})?;
|
||||
|
||||
let channel = target.as_channel(db).await?;
|
||||
let channel = channel_id.as_channel(db).await?;
|
||||
|
||||
if !matches!(channel, Channel::TextChannel { .. } | Channel::Group { .. }) {
|
||||
return Err(create_error!(InvalidOperation));
|
||||
|
||||
@@ -11,11 +11,11 @@ use rocket::{serde::json::Json, State};
|
||||
///
|
||||
/// Create an emoji by its Autumn upload id.
|
||||
#[openapi(tag = "Emojis")]
|
||||
#[put("/emoji/<id>", data = "<data>")]
|
||||
#[put("/emoji/<emoji_id>", data = "<data>")]
|
||||
pub async fn create_emoji(
|
||||
db: &State<Database>,
|
||||
user: User,
|
||||
id: String,
|
||||
emoji_id: String,
|
||||
data: Json<v0::DataCreateEmoji>,
|
||||
) -> Result<Json<v0::Emoji>> {
|
||||
let config = config().await;
|
||||
@@ -50,11 +50,11 @@ pub async fn create_emoji(
|
||||
};
|
||||
|
||||
// Find the relevant attachment
|
||||
let attachment = File::use_emoji(db, &id, &id, &user.id).await?;
|
||||
let attachment = File::use_emoji(db, &emoji_id, &emoji_id, &user.id).await?;
|
||||
|
||||
// Create the emoji object
|
||||
let emoji = Emoji {
|
||||
id,
|
||||
id: emoji_id,
|
||||
parent: data.parent.into(),
|
||||
creator_id: user.id,
|
||||
name: data.name,
|
||||
|
||||
@@ -24,13 +24,13 @@ use validator::Validate;
|
||||
///
|
||||
/// Edit a member by their id.
|
||||
#[openapi(tag = "Server Members")]
|
||||
#[patch("/<server>/members/<member>", data = "<data>")]
|
||||
#[patch("/<server_id>/members/<member_id>", data = "<data>")]
|
||||
pub async fn edit(
|
||||
db: &State<Database>,
|
||||
voice_client: &State<VoiceClient>,
|
||||
user: User,
|
||||
server: Reference<'_>,
|
||||
member: Reference<'_>,
|
||||
server_id: Reference<'_>,
|
||||
member_id: Reference<'_>,
|
||||
data: Json<v0::DataMemberEdit>,
|
||||
) -> Result<Json<v0::Member>> {
|
||||
let data = data.into_inner();
|
||||
@@ -41,9 +41,9 @@ pub async fn edit(
|
||||
})?;
|
||||
|
||||
// Fetch server and member
|
||||
let mut server = server.as_server(db).await?;
|
||||
let target_user = member.as_user(db).await?;
|
||||
let mut member = member.as_member(db, &server.id).await?;
|
||||
let mut server = server_id.as_server(db).await?;
|
||||
let target_user = member_id.as_user(db).await?;
|
||||
let mut member = member_id.as_member(db, &server.id).await?;
|
||||
|
||||
// Fetch our currrent permissions
|
||||
let mut query = DatabasePermissionQuery::new(db, &user).server(&server);
|
||||
|
||||
@@ -11,21 +11,21 @@ use rocket::{serde::json::Json, State};
|
||||
///
|
||||
/// Retrieve a member.
|
||||
#[openapi(tag = "Server Members")]
|
||||
#[get("/<target>/members/<member>?<roles>")]
|
||||
#[get("/<server_id>/members/<member_id>?<roles>")]
|
||||
pub async fn fetch(
|
||||
db: &State<Database>,
|
||||
user: User,
|
||||
target: Reference<'_>,
|
||||
member: Reference<'_>,
|
||||
server_id: Reference<'_>,
|
||||
member_id: Reference<'_>,
|
||||
roles: Option<bool>,
|
||||
) -> Result<Json<v0::MemberResponse>> {
|
||||
let server = target.as_server(db).await?;
|
||||
let server = server_id.as_server(db).await?;
|
||||
let mut query = DatabasePermissionQuery::new(db, &user).server(&server);
|
||||
if !query.are_we_a_member().await {
|
||||
return Err(create_error!(NotFound));
|
||||
}
|
||||
|
||||
let member = member.as_member(db, &server.id).await?;
|
||||
let member = member_id.as_member(db, &server.id).await?;
|
||||
if let Some(true) = roles {
|
||||
Ok(Json(v0::MemberResponse::MemberWithRoles {
|
||||
roles: server
|
||||
|
||||
@@ -15,21 +15,21 @@ use rocket_empty::EmptyResponse;
|
||||
///
|
||||
/// Removes a member from the server.
|
||||
#[openapi(tag = "Server Members")]
|
||||
#[delete("/<target>/members/<member>")]
|
||||
#[delete("/<server_id>/members/<member_id>")]
|
||||
pub async fn kick(
|
||||
db: &State<Database>,
|
||||
voice_client: &State<VoiceClient>,
|
||||
user: User,
|
||||
target: Reference<'_>,
|
||||
member: Reference<'_>,
|
||||
server_id: Reference<'_>,
|
||||
member_id: Reference<'_>,
|
||||
) -> Result<EmptyResponse> {
|
||||
let server = target.as_server(db).await?;
|
||||
let server = server_id.as_server(db).await?;
|
||||
|
||||
if member.id == user.id {
|
||||
if member_id.id == user.id {
|
||||
return Err(create_error!(CannotRemoveYourself));
|
||||
}
|
||||
|
||||
if member.id == server.owner {
|
||||
if member_id.id == server.owner {
|
||||
return Err(create_error!(InvalidOperation));
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ pub async fn kick(
|
||||
.await
|
||||
.throw_if_lacking_channel_permission(ChannelPermission::KickMembers)?;
|
||||
|
||||
let member = member.as_member(db, &server.id).await?;
|
||||
let member = member_id.as_member(db, &server.id).await?;
|
||||
if member.get_ranking(query.server_ref().as_ref().unwrap())
|
||||
<= query.get_member_rank().unwrap_or(i64::MIN)
|
||||
{
|
||||
@@ -49,14 +49,14 @@ pub async fn kick(
|
||||
.remove(db, &server, RemovalIntention::Kick, false)
|
||||
.await?;
|
||||
|
||||
if let Some(channel_id) = get_user_voice_channel_in_server(target.id, &server.id).await? {
|
||||
if let Some(channel_id) = get_user_voice_channel_in_server(member_id.id, &server.id).await? {
|
||||
remove_user_from_voice_channel(
|
||||
voice_client,
|
||||
&UserVoiceChannel {
|
||||
id: channel_id,
|
||||
server_id: Some(server.id.clone()),
|
||||
},
|
||||
target.id,
|
||||
member_id.id,
|
||||
)
|
||||
.await?;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user