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