refactor: deps cleanup, split openapi, extract api-types crate
This commit is contained in:
12
crates/presentation/src/openapi/auth.rs
Normal file
12
crates/presentation/src/openapi/auth.rs
Normal file
@@ -0,0 +1,12 @@
|
||||
use api_types::{LoginRequest, LoginResponse, RegisterRequest};
|
||||
use utoipa::OpenApi;
|
||||
|
||||
#[derive(OpenApi)]
|
||||
#[openapi(
|
||||
paths(
|
||||
crate::handlers::api::login,
|
||||
crate::handlers::api::register,
|
||||
),
|
||||
components(schemas(LoginRequest, LoginResponse, RegisterRequest)),
|
||||
)]
|
||||
pub struct AuthDoc;
|
||||
22
crates/presentation/src/openapi/diary.rs
Normal file
22
crates/presentation/src/openapi/diary.rs
Normal file
@@ -0,0 +1,22 @@
|
||||
use api_types::{ActivityFeedResponse, DiaryEntryDto, DiaryResponse, FeedEntryDto, LogReviewRequest, ReviewDto};
|
||||
use utoipa::OpenApi;
|
||||
|
||||
#[derive(OpenApi)]
|
||||
#[openapi(
|
||||
paths(
|
||||
crate::handlers::api::get_diary,
|
||||
crate::handlers::api::post_review,
|
||||
crate::handlers::api::delete_review,
|
||||
crate::handlers::api::export_diary,
|
||||
crate::handlers::api::get_activity_feed,
|
||||
),
|
||||
components(schemas(
|
||||
DiaryResponse,
|
||||
DiaryEntryDto,
|
||||
ReviewDto,
|
||||
LogReviewRequest,
|
||||
ActivityFeedResponse,
|
||||
FeedEntryDto,
|
||||
)),
|
||||
)]
|
||||
pub struct DiaryDoc;
|
||||
27
crates/presentation/src/openapi/import.rs
Normal file
27
crates/presentation/src/openapi/import.rs
Normal file
@@ -0,0 +1,27 @@
|
||||
use api_types::{
|
||||
ApiFieldMapping, ApplyMappingRequest, ConfirmRequest, SaveProfileRequest,
|
||||
SessionCreatedResponse, SessionStateResponse,
|
||||
};
|
||||
use utoipa::OpenApi;
|
||||
|
||||
#[derive(OpenApi)]
|
||||
#[openapi(
|
||||
paths(
|
||||
crate::handlers::import::api_post_session,
|
||||
crate::handlers::import::api_get_session,
|
||||
crate::handlers::import::api_put_mapping,
|
||||
crate::handlers::import::api_post_confirm,
|
||||
crate::handlers::import::api_get_profiles,
|
||||
crate::handlers::import::api_post_profile,
|
||||
crate::handlers::import::api_delete_profile,
|
||||
),
|
||||
components(schemas(
|
||||
SessionCreatedResponse,
|
||||
SessionStateResponse,
|
||||
ApiFieldMapping,
|
||||
ApplyMappingRequest,
|
||||
ConfirmRequest,
|
||||
SaveProfileRequest,
|
||||
)),
|
||||
)]
|
||||
pub struct ImportDoc;
|
||||
51
crates/presentation/src/openapi/mod.rs
Normal file
51
crates/presentation/src/openapi/mod.rs
Normal file
@@ -0,0 +1,51 @@
|
||||
mod auth;
|
||||
mod diary;
|
||||
mod import;
|
||||
mod movies;
|
||||
mod social;
|
||||
mod users;
|
||||
|
||||
use axum::Router;
|
||||
use utoipa::{
|
||||
Modify, OpenApi,
|
||||
openapi::security::{Http, HttpAuthScheme, SecurityScheme},
|
||||
};
|
||||
use utoipa_scalar::{Scalar, Servable};
|
||||
use utoipa_swagger_ui::SwaggerUi;
|
||||
|
||||
struct SecurityAddon;
|
||||
|
||||
impl Modify for SecurityAddon {
|
||||
fn modify(&self, openapi: &mut utoipa::openapi::OpenApi) {
|
||||
let components = openapi.components.get_or_insert_with(Default::default);
|
||||
components.add_security_scheme(
|
||||
"bearer_auth",
|
||||
SecurityScheme::Http(Http::new(HttpAuthScheme::Bearer)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
fn build() -> utoipa::openapi::OpenApi {
|
||||
let mut api = auth::AuthDoc::openapi();
|
||||
api.info = utoipa::openapi::InfoBuilder::new()
|
||||
.title("Movies Diary API")
|
||||
.version("1.0.0")
|
||||
.description(Some("REST API for Movies Diary. Authenticate with `POST /api/v1/auth/login` to get a Bearer token."))
|
||||
.build();
|
||||
api.merge(diary::DiaryDoc::openapi());
|
||||
api.merge(movies::MoviesDoc::openapi());
|
||||
api.merge(users::UsersDoc::openapi());
|
||||
api.merge(import::ImportDoc::openapi());
|
||||
#[cfg(feature = "federation")]
|
||||
api.merge(social::SocialDoc::openapi());
|
||||
SecurityAddon.modify(&mut api);
|
||||
api
|
||||
}
|
||||
|
||||
pub fn serve(router: Router) -> Router {
|
||||
tracing::info!("API docs at /docs (Swagger) and /scalar");
|
||||
let spec = build();
|
||||
router
|
||||
.merge(SwaggerUi::new("/docs").url("/openapi.json", spec.clone()))
|
||||
.merge(Scalar::with_url("/scalar", spec))
|
||||
}
|
||||
27
crates/presentation/src/openapi/movies.rs
Normal file
27
crates/presentation/src/openapi/movies.rs
Normal file
@@ -0,0 +1,27 @@
|
||||
use api_types::{
|
||||
DirectorStatDto, MonthActivityDto, MonthlyRatingDto, MovieDetailResponse, MovieDto,
|
||||
MovieStatsDto, ReviewHistoryResponse, SocialFeedResponse, SocialReviewDto, UserTrendsDto,
|
||||
};
|
||||
use utoipa::OpenApi;
|
||||
|
||||
#[derive(OpenApi)]
|
||||
#[openapi(
|
||||
paths(
|
||||
crate::handlers::api::get_movie_detail,
|
||||
crate::handlers::api::get_review_history,
|
||||
crate::handlers::api::sync_poster,
|
||||
),
|
||||
components(schemas(
|
||||
MovieDto,
|
||||
MovieDetailResponse,
|
||||
MovieStatsDto,
|
||||
ReviewHistoryResponse,
|
||||
SocialFeedResponse,
|
||||
SocialReviewDto,
|
||||
MonthActivityDto,
|
||||
MonthlyRatingDto,
|
||||
DirectorStatDto,
|
||||
UserTrendsDto,
|
||||
)),
|
||||
)]
|
||||
pub struct MoviesDoc;
|
||||
38
crates/presentation/src/openapi/social.rs
Normal file
38
crates/presentation/src/openapi/social.rs
Normal file
@@ -0,0 +1,38 @@
|
||||
#[cfg(feature = "federation")]
|
||||
use api_types::{
|
||||
ActorListResponse, ActorUrlRequest, AddBlockedDomainRequest, BlockedActorResponse,
|
||||
BlockedDomainResponse, FollowRequest, RemoteActorDto,
|
||||
};
|
||||
#[cfg(feature = "federation")]
|
||||
use utoipa::OpenApi;
|
||||
|
||||
#[cfg(feature = "federation")]
|
||||
#[derive(OpenApi)]
|
||||
#[openapi(
|
||||
paths(
|
||||
crate::handlers::api::get_following,
|
||||
crate::handlers::api::get_followers,
|
||||
crate::handlers::api::get_pending_followers,
|
||||
crate::handlers::api::follow,
|
||||
crate::handlers::api::unfollow,
|
||||
crate::handlers::api::accept_follower,
|
||||
crate::handlers::api::reject_follower,
|
||||
crate::handlers::api::remove_follower,
|
||||
crate::handlers::api::get_blocked_domains_admin,
|
||||
crate::handlers::api::add_blocked_domain_admin,
|
||||
crate::handlers::api::remove_blocked_domain_admin,
|
||||
crate::handlers::api::block_actor_api,
|
||||
crate::handlers::api::unblock_actor_api,
|
||||
crate::handlers::api::get_blocked_actors_api,
|
||||
),
|
||||
components(schemas(
|
||||
ActorListResponse,
|
||||
RemoteActorDto,
|
||||
FollowRequest,
|
||||
ActorUrlRequest,
|
||||
BlockedDomainResponse,
|
||||
AddBlockedDomainRequest,
|
||||
BlockedActorResponse,
|
||||
)),
|
||||
)]
|
||||
pub struct SocialDoc;
|
||||
20
crates/presentation/src/openapi/users.rs
Normal file
20
crates/presentation/src/openapi/users.rs
Normal file
@@ -0,0 +1,20 @@
|
||||
use api_types::{ProfileResponse, UserProfileResponse, UserStatsDto, UserSummaryDto, UsersResponse};
|
||||
use utoipa::OpenApi;
|
||||
|
||||
#[derive(OpenApi)]
|
||||
#[openapi(
|
||||
paths(
|
||||
crate::handlers::api::list_users,
|
||||
crate::handlers::api::get_user_profile,
|
||||
crate::handlers::api::get_profile,
|
||||
crate::handlers::api::update_profile_handler,
|
||||
),
|
||||
components(schemas(
|
||||
UsersResponse,
|
||||
UserSummaryDto,
|
||||
UserProfileResponse,
|
||||
UserStatsDto,
|
||||
ProfileResponse,
|
||||
)),
|
||||
)]
|
||||
pub struct UsersDoc;
|
||||
Reference in New Issue
Block a user