covert_kv/
lib.rs

1#![forbid(unsafe_code)]
2#![forbid(clippy::unwrap_used)]
3#![deny(clippy::pedantic)]
4#![deny(clippy::get_unwrap)]
5#![allow(clippy::module_name_repetitions)]
6
7mod config;
8mod context;
9mod create_secret;
10mod domain;
11mod error;
12mod hard_delete_secret;
13mod soft_delete_secret;
14mod store;
15
16use std::sync::Arc;
17
18use context::Context;
19use covert_storage::{
20    migrator::{migration_scripts, MigrationError},
21    BackendStoragePool,
22};
23use rust_embed::RustEmbed;
24
25use self::{
26    config::{read_config, set_config},
27    create_secret::{add_secret, read_secret},
28    hard_delete_secret::hard_delete_secret,
29    soft_delete_secret::{path_undelete_write, soft_delete_secret},
30};
31use covert_framework::{create, extract::Extension, read, Backend, Router};
32use covert_types::backend::{BackendCategory, BackendType};
33
34#[derive(RustEmbed)]
35#[folder = "migrations/"]
36struct Migrations;
37
38/// Returns a new versioned KV secret engine.
39///
40/// # Errors
41///
42/// Returns an error if it fails to read the migration scripts.
43pub fn new_versioned_kv_backend(storage: BackendStoragePool) -> Result<Backend, MigrationError> {
44    let ctx = Context::new(storage);
45
46    let router = Router::new()
47        .route(
48            "/config",
49            read(read_config).update(set_config).create(set_config),
50        )
51        .route(
52            "/data/*path",
53            read(read_secret).create(add_secret).update(add_secret),
54        )
55        .route(
56            "/delete/*path",
57            create(soft_delete_secret).update(soft_delete_secret),
58        )
59        .route(
60            "/undelete/*path",
61            create(path_undelete_write).update(path_undelete_write),
62        )
63        .route(
64            "/destroy/*path",
65            create(hard_delete_secret).update(hard_delete_secret),
66        )
67        .layer(Extension(Arc::new(ctx)))
68        .build()
69        .into_service();
70
71    let migrations = migration_scripts::<Migrations>()?;
72
73    Ok(Backend {
74        handler: router,
75        category: BackendCategory::Logical,
76        variant: BackendType::Kv,
77        migrations,
78    })
79}