Rust implementation of OCI Distribution Spec with granular access control
1use utoipa::OpenApi;
2
3use crate::{admin, state};
4
5#[derive(OpenApi)]
6#[openapi(
7 paths(
8 admin::list_users,
9 admin::create_user,
10 admin::delete_user,
11 admin::add_permission
12 ),
13 components(
14 schemas(
15 admin::CreateUserRequest,
16 admin::AddPermissionRequest,
17 state::User,
18 state::Permission
19 )
20 ),
21 tags(
22 (name = "admin", description = "User and permission management endpoints")
23 ),
24 info(
25 title = "Grain Registry - Admin API",
26 version = "0.1.0",
27 description = "Administration API for the Grain registry. Provides endpoints for managing users and their granular tag-level permissions.",
28 contact(
29 name = "Grain Registry",
30 url = "https://github.com/pierrelefevre/grain"
31 ),
32 license(
33 name = "MIT"
34 )
35 ),
36 servers(
37 (url = "/", description = "Local server")
38 ),
39 security(
40 ("basic_auth" = [])
41 ),
42 modifiers(&SecurityAddon)
43)]
44pub struct AdminApiDoc;
45
46struct SecurityAddon;
47
48impl utoipa::Modify for SecurityAddon {
49 fn modify(&self, openapi: &mut utoipa::openapi::OpenApi) {
50 if let Some(components) = openapi.components.as_mut() {
51 components.add_security_scheme(
52 "basic_auth",
53 utoipa::openapi::security::SecurityScheme::Http(
54 utoipa::openapi::security::Http::new(
55 utoipa::openapi::security::HttpAuthScheme::Basic,
56 ),
57 ),
58 );
59 }
60 }
61}