Skip to content

Commit 5f0577a

Browse files
committed
feat: implement data capsule permission system
- Add atomic and molecular permission models based on 数据胶囊权属向量码 spec - Create permission tables with position-based indexing for boolean vectors - Implement 14 atomic permissions mapped to specific vector positions - Implement 10 molecular permissions with boolean vectors matching permission matrix - Add init_permissions binary for clean database initialization - Remove legacy certificate and CA models (moved to separate service) - Refactor user model to simplified structure Breaking changes: - Removed certificate-related tables and models - Changed database initialization flow Technical details: - Atomic permissions use position (0-13) as SurrealDB record ID - Molecular permissions store 14-element boolean vectors - Position field ensures correct mapping between atomic and molecular permissions
1 parent 5debc99 commit 5f0577a

File tree

16 files changed

+738
-738
lines changed

16 files changed

+738
-738
lines changed

crates/capsula-bank/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ version = "0.1.0"
44
edition = "2021"
55
authors = ["ancient <gamesworldcraft@gmail.com>"]
66
description = "Capsula Banking server with REST API"
7+
default-run = "capsula-bank"
78

89
[dependencies]
910
# Capsula crates
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/// 权限数据初始化程序
2+
///
3+
/// 用于初始化数据库中的默认权限数据
4+
/// 通常在以下情况下运行:
5+
/// 1. 首次部署系统
6+
/// 2. 需要重置权限数据到默认状态
7+
/// 3. 升级后需要更新权限定义
8+
///
9+
/// 使用方法:
10+
/// ```bash
11+
/// cargo run --bin init_permissions
12+
/// ```
13+
use capsula_bank::{
14+
db::{create_tables, force_initialize_default_data, get_db, init_db},
15+
settings::Settings,
16+
};
17+
18+
#[tokio::main]
19+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
20+
// 初始化日志
21+
tracing_subscriber::fmt().with_target(false).init();
22+
23+
println!("========================================");
24+
println!(" 权限数据初始化程序");
25+
println!("========================================\n");
26+
27+
// 加载配置
28+
println!("📋 加载配置文件...");
29+
let settings = Settings::load("config/services.toml")?;
30+
println!("✅ 配置加载成功\n");
31+
32+
// 连接数据库
33+
println!("🔌 连接数据库...");
34+
println!(
35+
" Host: {}:{}",
36+
settings.surrealdb.host, settings.surrealdb.port
37+
);
38+
println!(" Namespace: {}", settings.surrealdb.namespace);
39+
println!(" Database: {}", settings.surrealdb.database);
40+
41+
init_db(settings.surrealdb).await?;
42+
println!("✅ 数据库连接成功\n");
43+
44+
// 清理现有表
45+
println!("🗑️ 清理现有表...");
46+
let db = get_db();
47+
db.query("REMOVE TABLE IF EXISTS molecular_permissions").await?;
48+
db.query("REMOVE TABLE IF EXISTS atomic_permissions").await?;
49+
println!("✅ 现有表已清理\n");
50+
51+
// 创建表结构
52+
println!("📊 创建表结构...");
53+
create_tables().await?;
54+
println!("✅ 表结构创建成功\n");
55+
56+
// 初始化权限数据
57+
println!("🔐 初始化权限数据...");
58+
force_initialize_default_data().await?;
59+
60+
println!("\n========================================");
61+
println!("✨ 权限数据初始化完成!");
62+
println!("========================================");
63+
println!("\n现在可以启动 Capsula Bank 服务器了:");
64+
println!("cargo run");
65+
66+
Ok(())
67+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
use crate::{
2+
db::get_db,
3+
error::Result,
4+
models::permission::{get_default_atomic_permissions, AtomicPermission},
5+
};
6+
7+
/// Create atomic permissions table - stores atomic permission definitions
8+
/// 原子权限表:存储原子权限的定义,主要用于文档和展示
9+
pub async fn create_atomic_permissions_table() -> Result<()> {
10+
let query = r#"
11+
-- ---------------------
12+
-- 原子权限表定义
13+
-- ---------------------
14+
DEFINE TABLE IF NOT EXISTS atomic_permissions SCHEMAFULL;
15+
16+
-- 字段定义
17+
DEFINE FIELD IF NOT EXISTS atom_id ON TABLE atomic_permissions TYPE string ASSERT $value != NONE AND $value != "";
18+
DEFINE FIELD IF NOT EXISTS name ON TABLE atomic_permissions TYPE string;
19+
DEFINE FIELD IF NOT EXISTS position ON TABLE atomic_permissions TYPE int ASSERT $value >= 0 AND $value < 14;
20+
DEFINE FIELD IF NOT EXISTS category ON TABLE atomic_permissions TYPE string
21+
ASSERT $value IN ['read_edit', 'usage', 'transfer', 'supervision'];
22+
DEFINE FIELD IF NOT EXISTS description ON TABLE atomic_permissions TYPE string;
23+
DEFINE FIELD IF NOT EXISTS created_at ON TABLE atomic_permissions TYPE int DEFAULT time::unix();
24+
DEFINE FIELD IF NOT EXISTS updated_at ON TABLE atomic_permissions TYPE int DEFAULT time::unix();
25+
26+
-- ---------------------
27+
-- 索引定义
28+
-- ---------------------
29+
DEFINE INDEX IF NOT EXISTS atom_id_idx ON TABLE atomic_permissions COLUMNS atom_id UNIQUE;
30+
DEFINE INDEX IF NOT EXISTS position_idx ON TABLE atomic_permissions COLUMNS position UNIQUE;
31+
DEFINE INDEX IF NOT EXISTS category_idx ON TABLE atomic_permissions COLUMNS category;
32+
"#;
33+
34+
let db = get_db();
35+
db.query(query).await?;
36+
Ok(())
37+
}
38+
39+
/// Initialize default atomic permissions using Rust code
40+
pub async fn initialize_atomic_permissions() -> Result<()> {
41+
let db = get_db();
42+
43+
// 获取默认的原子权限列表
44+
let permissions = get_default_atomic_permissions();
45+
46+
// 批量插入原子权限,使用 position 作为记录ID
47+
for permission in permissions {
48+
let _: Option<AtomicPermission> = db
49+
.create(("atomic_permissions", permission.position as i64))
50+
.content(permission)
51+
.await?;
52+
}
53+
54+
Ok(())
55+
}
56+
57+
/// 查询所有原子权限
58+
#[allow(dead_code)]
59+
pub async fn get_all_atomic_permissions() -> Result<Vec<AtomicPermission>> {
60+
let db = get_db();
61+
let permissions: Vec<AtomicPermission> = db.select("atomic_permissions").await?;
62+
Ok(permissions)
63+
}
64+
65+
/// 根据位置查询原子权限
66+
#[allow(dead_code)]
67+
pub async fn get_atomic_permission_by_position(position: u8) -> Result<Option<AtomicPermission>> {
68+
let db = get_db();
69+
let permission: Option<AtomicPermission> = db.select(("atomic_permissions", position as i64)).await?;
70+
Ok(permission)
71+
}
72+
73+
/// 根据atom_id查询原子权限
74+
#[allow(dead_code)]
75+
pub async fn get_atomic_permission_by_atom_id(atom_id: &str) -> Result<Option<AtomicPermission>> {
76+
let db = get_db();
77+
let query = "SELECT * FROM atomic_permissions WHERE atom_id = $atom_id";
78+
let mut response = db.query(query).bind(("atom_id", atom_id.to_string())).await?;
79+
let permissions: Vec<AtomicPermission> = response.take(0)?;
80+
Ok(permissions.into_iter().next())
81+
}

0 commit comments

Comments
 (0)