1
0
mirror of https://github.com/matrix-org/matrix-authentication-service.git synced 2025-08-06 06:02:40 +03:00

doc: auto-generate the API schema in the documentation

This commit is contained in:
Quentin Gliech
2024-07-24 15:44:08 +02:00
parent 76755610cb
commit 43ff6dc9d3
3 changed files with 124 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
// Copyright 2022 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#![forbid(unsafe_code)]
#![deny(
clippy::all,
clippy::str_to_string,
rustdoc::broken_intra_doc_links,
clippy::future_not_send
)]
#![warn(clippy::pedantic)]
use std::io::Write;
/// This is a dummy state, it should never be used.
///
/// We use it to generate the API schema, which doesn't execute any request.
#[derive(Clone)]
struct DummyState;
macro_rules! impl_from_request_parts {
($type:ty) => {
#[axum::async_trait]
impl axum::extract::FromRequestParts<DummyState> for $type {
type Rejection = std::convert::Infallible;
async fn from_request_parts(
_parts: &mut axum::http::request::Parts,
_state: &DummyState,
) -> Result<Self, Self::Rejection> {
unimplemented!("This is a dummy state, it should never be used")
}
}
};
}
macro_rules! impl_from_ref {
($type:ty) => {
impl axum::extract::FromRef<DummyState> for $type {
fn from_ref(_input: &DummyState) -> Self {
unimplemented!("This is a dummy state, it should never be used")
}
}
};
}
impl_from_request_parts!(mas_storage::BoxRepository);
impl_from_request_parts!(mas_storage::BoxClock);
impl_from_request_parts!(mas_handlers::BoundActivityTracker);
impl_from_ref!(mas_keystore::Keystore);
fn main() -> Result<(), Box<dyn std::error::Error>> {
let (api, _) = mas_handlers::admin_api_router::<DummyState>();
let mut stdout = std::io::stdout();
serde_json::to_writer_pretty(&mut stdout, &api)?;
// Make sure we end with a newline
stdout.write_all(b"\n")?;
Ok(())
}

50
docs/api.schema.json Normal file
View File

@@ -0,0 +1,50 @@
{
"openapi": "3.1.0",
"info": {
"title": "Matrix Authentication Service admin API",
"version": ""
},
"servers": [
{
"url": "{base}",
"variables": {
"base": {
"default": "/",
"description": null
}
}
}
],
"paths": {},
"components": {
"securitySchemes": {
"oauth2": {
"type": "oauth2",
"flows": {
"clientCredentials": {
"refreshUrl": "/oauth2/token",
"tokenUrl": "/oauth2/token",
"scopes": {
"urn:mas:admin": "Grant access to the admin API"
}
},
"authorizationCode": {
"authorizationUrl": "/authorize",
"tokenUrl": "/oauth2/token",
"refreshUrl": "/oauth2/token",
"scopes": {
"urn:mas:admin": "Grant access to the admin API"
}
}
}
}
}
},
"security": [
{
"oauth2": [
"urn:mas:admin"
]
}
]
}

View File

@@ -5,12 +5,14 @@ set -eu
export SQLX_OFFLINE=1 export SQLX_OFFLINE=1
BASE_DIR="$(dirname "$0")/.." BASE_DIR="$(dirname "$0")/.."
CONFIG_SCHEMA="${BASE_DIR}/docs/config.schema.json" CONFIG_SCHEMA="${BASE_DIR}/docs/config.schema.json"
API_SCHEMA="${BASE_DIR}/docs/api.schema.json"
GRAPHQL_SCHEMA="${BASE_DIR}/frontend/schema.graphql" GRAPHQL_SCHEMA="${BASE_DIR}/frontend/schema.graphql"
POLICIES_SCHEMA="${BASE_DIR}/policies/schema/" POLICIES_SCHEMA="${BASE_DIR}/policies/schema/"
set -x set -x
cargo run -p mas-config > "${CONFIG_SCHEMA}" cargo run -p mas-config > "${CONFIG_SCHEMA}"
cargo run -p mas-handlers --bin graphql-schema > "${GRAPHQL_SCHEMA}" cargo run -p mas-handlers --bin graphql-schema > "${GRAPHQL_SCHEMA}"
cargo run -p mas-handlers --bin api-schema > "${API_SCHEMA}"
cargo run -p mas-i18n-scan -- --update "${BASE_DIR}/templates/" "${BASE_DIR}/translations/en.json" cargo run -p mas-i18n-scan -- --update "${BASE_DIR}/templates/" "${BASE_DIR}/translations/en.json"
OUT_DIR="${POLICIES_SCHEMA}" cargo run -p mas-policy --features jsonschema OUT_DIR="${POLICIES_SCHEMA}" cargo run -p mas-policy --features jsonschema