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:
Damocles
2026-03-28 01:31:57 +01:00
committed by GitHub
parent c2d4369e16
commit 52ed5100c2
9 changed files with 43 additions and 43 deletions

View File

@@ -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));
}

View File

@@ -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));
}

View File

@@ -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));
}

View File

@@ -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)

View File

@@ -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));

View File

@@ -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,

View File

@@ -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);

View File

@@ -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

View File

@@ -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?;
};