added vibecoded swagger documentation with utoipa

This commit is contained in:
2026-07-06 12:35:20 +02:00
parent 19fffc8b30
commit 7f9ddf69d6
13 changed files with 828 additions and 157 deletions
+89
View File
@@ -21,6 +21,8 @@ use tower_http::{
trace::{DefaultMakeSpan, DefaultOnResponse, TraceLayer},
};
use tracing::Level;
use utoipa::OpenApi;
use utoipa_swagger_ui::SwaggerUi;
const MAX_USERNAME_LENGTH: usize = 35;
const MAX_ROOM_NAME_LENGTH: usize = 35;
@@ -62,6 +64,92 @@ pub struct Cli {
pub verbose: bool,
}
/// Define the OpenAPI specification document structure
#[derive(OpenApi)]
#[openapi(
paths(
auth::validate_token,
routes::friends::list_friends,
routes::friends::list_requests,
routes::friends::send_request,
routes::friends::accept_request,
routes::friends::decline_request,
routes::friends::is_friend,
routes::friends::remove_friend,
routes::messages::list_messages,
routes::messages::create_message,
routes::messages::message_ws_handler,
routes::messages::create_message_with_attachments,
routes::messages::get_upload,
routes::rooms::list_rooms,
routes::rooms::create_room,
routes::rooms::get_room,
routes::rooms::list_invites,
routes::rooms::send_invite,
routes::rooms::accept_request,
routes::rooms::decline_request,
routes::rooms::leave_room,
routes::rooms::transfer_ownership,
routes::rooms::list_members,
routes::rooms::delete_room,
routes::users::login,
routes::users::register_user,
routes::users::update_user,
routes::users::upload_avatar,
routes::users::get_avatar,
routes::voice::voice_ws_handler,
routes::ws::issue_ws_token,
),
components(
schemas(
errors::ErrorResponse,
routes::friends::Friend,
routes::friends::FriendRequest,
routes::friends::SendFriendRequestPayload,
routes::friends::AcceptFriendRequestPayload,
routes::friends::DeclineFriendRequestPayload,
routes::friends::RemoveFriendPayload,
routes::messages::Message,
routes::messages::Attachment,
routes::messages::NewMessagePayload,
routes::rooms::Room,
routes::rooms::NewRoomPayload,
routes::rooms::RoomInvite,
routes::rooms::SendRoomInvitePayload,
routes::rooms::AcceptRoomInvitePayload,
routes::rooms::TransferOwnershipPayload,
routes::users::User,
routes::users::UserProfile,
routes::users::LoginPayload,
routes::users::LoginResponse,
routes::users::NewUserPayload,
routes::users::UpdateUserPayoad,
routes::users::UpdateUserResponse,
routes::ws::WsAuthQuery,
)
),
modifiers(&SecurityAddon)
)]
pub struct ApiDoc;
struct SecurityAddon;
impl utoipa::Modify for SecurityAddon {
fn modify(&self, openapi: &mut utoipa::openapi::OpenApi) {
if let Some(components) = openapi.components.as_mut() {
components.add_security_scheme(
"bearer_auth",
utoipa::openapi::security::SecurityScheme::Http(
utoipa::openapi::security::HttpBuilder::new()
.scheme(utoipa::openapi::security::HttpAuthScheme::Bearer)
.bearer_format("JWT")
.build(),
),
);
}
}
}
/// Create the app with all routes, middleware and extensions
pub fn create_app(
db_pool: sqlx::PgPool,
@@ -99,6 +187,7 @@ pub fn create_app(
.allow_headers([header::AUTHORIZATION, header::CONTENT_TYPE]);
let mut router = Router::new()
.merge(SwaggerUi::new("/swagger-ui").url("/api-docs/openapi.json", ApiDoc::openapi()))
.route("/version", get(get_version))
.merge(routes::users::routes())
.merge(routes::rooms::routes())