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
38pub 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}