@feltdb/core 0.8.3 → 0.8.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands.js +4 -1
- package/dist/cli/provisioning-neutrality.js +79 -0
- package/dist/collection.d.ts +43 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +192 -22
- package/dist/create/create.js +25 -21
- package/dist/create/managed-account.js +11 -0
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/Cargo.lock +165 -0
- package/dist/create/server-source/Cargo.toml +9 -0
- package/dist/create/server-source/crates/feltdb/Cargo.toml +3 -0
- package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +44 -44
- package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +12 -24
- package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +7 -13
- package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +13 -10
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +12 -9
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +78 -25
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +16 -13
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +13 -5
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +41 -22
- package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +33 -15
- package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +100 -33
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +56 -20
- package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +116 -41
- package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +186 -55
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +64 -26
- package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +46 -15
- package/dist/create/server-source/crates/feltdb/src/admission.rs +8 -15
- package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +43 -13
- package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +15 -42
- package/dist/create/server-source/crates/feltdb/src/analytics.rs +65 -19
- package/dist/create/server-source/crates/feltdb/src/application.rs +113 -30
- package/dist/create/server-source/crates/feltdb/src/authorization_security_tests.rs +475 -140
- package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +17 -15
- package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +0 -1
- package/dist/create/server-source/crates/feltdb/src/causal_backlog_bound.rs +59 -15
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +266 -114
- package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +25 -7
- package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +10 -15
- package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +3 -11
- package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +14 -5
- package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +21 -25
- package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +14 -11
- package/dist/create/server-source/crates/feltdb/src/dedup_bound_investigation.rs +103 -22
- package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +18 -15
- package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +12 -8
- package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +1 -5
- package/dist/create/server-source/crates/feltdb/src/durable_operation_identity.rs +87 -23
- package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +3 -7
- package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +10 -9
- package/dist/create/server-source/crates/feltdb/src/equality_index.rs +595 -0
- package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +1 -6
- package/dist/create/server-source/crates/feltdb/src/indexing.rs +35 -38
- package/dist/create/server-source/crates/feltdb/src/lib.rs +1050 -117
- package/dist/create/server-source/crates/feltdb/src/managed_cas_tests.rs +4 -1
- package/dist/create/server-source/crates/feltdb/src/metrics.rs +0 -1
- package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +1 -2
- package/dist/create/server-source/crates/feltdb/src/multi_operation_transaction.rs +107 -30
- package/dist/create/server-source/crates/feltdb/src/observability.rs +19 -6
- package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +12 -11
- package/dist/create/server-source/crates/feltdb/src/operation_log.rs +9 -4
- package/dist/create/server-source/crates/feltdb/src/p1_application_atomicity.rs +65 -18
- package/dist/create/server-source/crates/feltdb/src/p1_atomicity_acceptance.rs +193 -57
- package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +37 -27
- package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +38 -10
- package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +20 -14
- package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +394 -229
- package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +8 -6
- package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +11 -13
- package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +90 -72
- package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +3 -3
- package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +33 -11
- package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +6 -6
- package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +14 -56
- package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +29 -27
- package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +35 -17
- package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +8 -2
- package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +59 -15
- package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +70 -17
- package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +23 -6
- package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +12 -3
- package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +41 -11
- package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +56 -25
- package/dist/create/server-source/crates/feltdb/src/policy_evaluation.rs +701 -245
- package/dist/create/server-source/crates/feltdb/src/production_api.rs +31 -13
- package/dist/create/server-source/crates/feltdb/src/query_execution_diagnostics.rs +126 -0
- package/dist/create/server-source/crates/feltdb/src/query_performance.rs +6 -8
- package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +5 -5
- package/dist/create/server-source/crates/feltdb/src/replica_acknowledgements.rs +48 -18
- package/dist/create/server-source/crates/feltdb/src/replica_membership.rs +30 -11
- package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +6 -3
- package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +4 -3
- package/dist/create/server-source/crates/feltdb/src/sharding.rs +36 -10
- package/dist/create/server-source/crates/feltdb/src/state_conflict_contract.rs +516 -0
- package/dist/create/server-source/crates/feltdb/src/state_contract.rs +305 -6
- package/dist/create/server-source/crates/feltdb/src/state_diff_contract.rs +222 -0
- package/dist/create/server-source/crates/feltdb/src/state_facade.rs +82 -54
- package/dist/create/server-source/crates/feltdb/src/state_hash.rs +2 -2
- package/dist/create/server-source/crates/feltdb/src/state_model.rs +1514 -537
- package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +6 -3
- package/dist/create/server-source/crates/feltdb/src/state_trigger.rs +672 -0
- package/dist/create/server-source/crates/feltdb/src/submission.rs +5 -11
- package/dist/create/server-source/crates/feltdb/src/sync.rs +12 -0
- package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +6 -8
- package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +24 -35
- package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +24 -8
- package/dist/create/server-source/crates/feltdb/src/transaction_preconditions.rs +248 -59
- package/dist/create/server-source/crates/feltdb/src/transactions.rs +17 -20
- package/dist/create/server-source/crates/feltdb/src/trigger_contract.rs +749 -0
- package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +1 -0
- package/dist/create/server-source/crates/feltdb/src/workload.rs +512 -4
- package/dist/create/server-source/crates/feltdb/src/workload_diagnostics.rs +442 -0
- package/dist/create/server-source/crates/feltdb/tests/branching_evidence.rs +299 -0
- package/dist/create/server-source/crates/feltdb/tests/current_revision_authority_evidence.rs +288 -0
- package/dist/create/server-source/crates/feltdb/tests/durable_format_compatibility.rs +392 -0
- package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +436 -220
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_conflict_contract_corpus.json +1916 -0
- package/dist/create/server-source/crates/feltdb/tests/fixtures/state_diff_contract_corpus.json +1878 -0
- package/dist/create/server-source/crates/feltdb/tests/fixtures/trigger_contract_corpus.json +1862 -0
- package/dist/create/server-source/crates/feltdb/tests/pr34_query_collection.rs +234 -0
- package/dist/create/server-source/crates/feltdb/tests/pr35_equality_index.rs +947 -0
- package/dist/create/server-source/crates/feltdb/tests/pr7_self_authorization_proof.rs +5 -8
- package/dist/create/server-source/crates/feltdb/tests/pr8_vocabulary_assessment.rs +52 -44
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase2_boundary_tests.rs +33 -16
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3a_path_a_tests.rs +22 -7
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_authorized_mutations.rs +41 -22
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_role_based_authorization.rs +25 -8
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_simple_auth_delete.rs +9 -6
- package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs +120 -69
- package/dist/create/server-source/crates/feltdb/tests/pr9_teams_role_based_access.rs +21 -10
- package/dist/create/server-source/crates/feltdb/tests/production_readiness_contract.rs +1032 -0
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_application.rs +868 -0
- package/dist/create/server-source/crates/feltdb/tests/reconciliation_wire_format_evidence.rs +221 -0
- package/dist/create/server-source/crates/feltdb/tests/resource_scoped_revisions.rs +338 -0
- package/dist/create/server-source/crates/feltdb/tests/revision_identity_contract.rs +1039 -0
- package/dist/create/server-source/crates/feltdb/tests/revision_model_decision.rs +739 -0
- package/dist/create/server-source/crates/feltdb/tests/revision_retention_boundary_evidence.rs +427 -0
- package/dist/create/server-source/crates/feltdb/tests/saas_authorization_integration.rs +3 -3
- package/dist/create/server-source/crates/feltdb/tests/saas_invitation_lifecycle.rs +25 -22
- package/dist/create/server-source/crates/feltdb/tests/state_conflict_contract_conformance.rs +1799 -0
- package/dist/create/server-source/crates/feltdb/tests/state_diff_contract_conformance.rs +1316 -0
- package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +53 -61
- package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +156 -61
- package/dist/create/server-source/crates/feltdb/tests/state_store_boundary_evidence.rs +299 -0
- package/dist/create/server-source/crates/feltdb/tests/sync_divergence_evidence.rs +255 -0
- package/dist/create/server-source/crates/feltdb/tests/three_way_input_boundary_evidence.rs +249 -0
- package/dist/create/server-source/crates/feltdb/tests/trigger_contract_conformance.rs +994 -0
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +2 -1
- package/dist/create/server-source/crates/feltdb-server/src/audit.rs +1137 -29
- package/dist/create/server-source/crates/feltdb-server/src/auth.rs +164 -13
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +800 -34
- package/dist/db.d.ts +33 -34
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +74 -20
- package/dist/deployment.d.ts +30 -0
- package/dist/deployment.d.ts.map +1 -0
- package/dist/deployment.js +130 -0
- package/dist/embedded-transaction.d.ts +22 -4
- package/dist/embedded-transaction.d.ts.map +1 -1
- package/dist/embedded-transaction.js +51 -5
- package/dist/feltdb.d.ts +14 -2
- package/dist/feltdb.d.ts.map +1 -1
- package/dist/file-db.js +1 -1
- package/dist/http-client.d.ts +14 -0
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +23 -5
- package/dist/http-db.d.ts +119 -1
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +346 -31
- package/dist/index-core.d.ts +2 -0
- package/dist/index-core.d.ts.map +1 -1
- package/dist/index-core.js +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/indexeddb-db.d.ts.map +1 -1
- package/dist/indexeddb-db.js +35 -21
- package/dist/managed-recovery.d.ts +192 -0
- package/dist/managed-recovery.d.ts.map +1 -0
- package/dist/managed-recovery.js +242 -0
- package/dist/memory-db.js +1 -1
- package/dist/studio-app/assets/{feltdb_wasm-DB8cX151.js → feltdb_wasm-DaNwCLRX.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-DnsHNv6g.wasm +0 -0
- package/dist/studio-app/assets/index-j8IlhNqJ.js +29 -0
- package/dist/studio-app/index.html +1 -1
- package/dist/transaction.d.ts +30 -0
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +41 -0
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/workload.d.ts +2 -1
- package/dist/workload.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-ClhDHp0S.wasm +0 -0
- package/dist/studio-app/assets/index-B0k4UAlI.js +0 -29
package/dist/create/server-source/crates/feltdb/tests/pr9_phase3c_team_delete_role_authorization.rs
CHANGED
|
@@ -27,14 +27,14 @@
|
|
|
27
27
|
|
|
28
28
|
use feltdb::{
|
|
29
29
|
state_contract::{
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
AuthorizationContext, CollectionSchema, FieldConstraints, FieldSchema, FieldType,
|
|
31
|
+
PrimitiveType, StateSchema,
|
|
32
32
|
},
|
|
33
33
|
FeltDb,
|
|
34
34
|
};
|
|
35
35
|
use serde_json::json;
|
|
36
|
-
use tempfile::TempDir;
|
|
37
36
|
use std::collections::HashMap;
|
|
37
|
+
use tempfile::TempDir;
|
|
38
38
|
|
|
39
39
|
/// Evidence record for each authorization test
|
|
40
40
|
#[derive(Debug, Clone)]
|
|
@@ -95,15 +95,36 @@ impl TeamDeleteAuthTest {
|
|
|
95
95
|
let team_id = "team-backend".to_string();
|
|
96
96
|
|
|
97
97
|
// Create users
|
|
98
|
-
db.insert(
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
db.insert(
|
|
103
|
-
|
|
98
|
+
db.insert(
|
|
99
|
+
"User#user-owner",
|
|
100
|
+
json!({"_id": owner_id, "email": "owner@example.com"}),
|
|
101
|
+
)?;
|
|
102
|
+
db.insert(
|
|
103
|
+
"User#user-admin",
|
|
104
|
+
json!({"_id": admin_id, "email": "admin@example.com"}),
|
|
105
|
+
)?;
|
|
106
|
+
db.insert(
|
|
107
|
+
"User#user-member",
|
|
108
|
+
json!({"_id": member_id, "email": "member@example.com"}),
|
|
109
|
+
)?;
|
|
110
|
+
db.insert(
|
|
111
|
+
"User#user-non-member",
|
|
112
|
+
json!({"_id": non_member_id, "email": "non-member@example.com"}),
|
|
113
|
+
)?;
|
|
114
|
+
db.insert(
|
|
115
|
+
"User#user-revoked",
|
|
116
|
+
json!({"_id": revoked_id, "email": "revoked@example.com"}),
|
|
117
|
+
)?;
|
|
118
|
+
db.insert(
|
|
119
|
+
"User#user-cross-tenant",
|
|
120
|
+
json!({"_id": cross_tenant_id, "email": "cross-tenant@example.com"}),
|
|
121
|
+
)?;
|
|
104
122
|
|
|
105
123
|
// Create organization
|
|
106
|
-
db.insert(
|
|
124
|
+
db.insert(
|
|
125
|
+
"Organization#org-1",
|
|
126
|
+
json!({"_id": org_id, "name": "Org 1"}),
|
|
127
|
+
)?;
|
|
107
128
|
|
|
108
129
|
// Create organization memberships
|
|
109
130
|
// owner, admin, member, revoked: all in organization
|
|
@@ -232,11 +253,17 @@ impl TeamDeleteAuthTest {
|
|
|
232
253
|
println!("AUTHORIZATION EVIDENCE MATRIX");
|
|
233
254
|
println!("───────────────────────────────────────────────────────────────────\n");
|
|
234
255
|
|
|
235
|
-
println!(
|
|
256
|
+
println!(
|
|
257
|
+
"Actor\t\tRole\t\tTeam.owner?\tOrg Mbr?\tExpected\tActual\t\tAuth Path\t\t\tClass"
|
|
258
|
+
);
|
|
236
259
|
println!("────────────────────────────────────────────────────────────────────────────────────────────────────────");
|
|
237
260
|
|
|
238
261
|
for (_, evidence) in &self.evidence {
|
|
239
|
-
let owner_match = if evidence.team_owner == evidence.actor_id {
|
|
262
|
+
let owner_match = if evidence.team_owner == evidence.actor_id {
|
|
263
|
+
"YES"
|
|
264
|
+
} else {
|
|
265
|
+
"NO"
|
|
266
|
+
};
|
|
240
267
|
let org_member = if evidence.is_org_member { "YES" } else { "NO" };
|
|
241
268
|
|
|
242
269
|
println!(
|
|
@@ -286,7 +313,9 @@ impl TeamDeleteAuthTest {
|
|
|
286
313
|
println!("This suggests frozen vocabulary may directly handle role-based auth.\n");
|
|
287
314
|
} else if path_b_candidates > 0 {
|
|
288
315
|
println!("PATH B INDICATOR: Some results suggest workflow pattern could work.");
|
|
289
|
-
println!(
|
|
316
|
+
println!(
|
|
317
|
+
"Different operations with different policies might express the distinction.\n"
|
|
318
|
+
);
|
|
290
319
|
} else {
|
|
291
320
|
println!("PATH C INDICATOR: Results suggest vocabulary gap.");
|
|
292
321
|
println!("Frozen vocabulary may not be able to express this security invariant.\n");
|
|
@@ -325,7 +354,9 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
|
|
|
325
354
|
// Test owner (has Team.owner field and write capability)
|
|
326
355
|
println!("Testing owner delete...");
|
|
327
356
|
let owner_ctx = test.actor_context(&test.owner_id);
|
|
328
|
-
let owner_result = test
|
|
357
|
+
let owner_result = test
|
|
358
|
+
.db
|
|
359
|
+
.delete_with_authorization(&format!("Team#{}", test.team_id), &owner_ctx);
|
|
329
360
|
let owner_actual = match owner_result {
|
|
330
361
|
Ok(_) => "PERMIT".to_string(),
|
|
331
362
|
Err(e) => format!("DENY: {}", e),
|
|
@@ -344,22 +375,26 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
|
|
|
344
375
|
|
|
345
376
|
// Re-insert for subsequent tests
|
|
346
377
|
if owner_actual.contains("PERMIT") {
|
|
347
|
-
test.db
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
378
|
+
test.db
|
|
379
|
+
.insert(
|
|
380
|
+
"Team#team-backend",
|
|
381
|
+
json!({
|
|
382
|
+
"_id": test.team_id,
|
|
383
|
+
"organization": test.org_id,
|
|
384
|
+
"name": "Backend Team",
|
|
385
|
+
"owner": test.owner_id,
|
|
386
|
+
"created_at": "2026-08-22T00:00:00Z"
|
|
387
|
+
}),
|
|
388
|
+
)
|
|
389
|
+
.ok();
|
|
357
390
|
}
|
|
358
391
|
|
|
359
392
|
// Test admin (has TeamMembership.role="admin" and write capability)
|
|
360
393
|
println!("Testing admin delete...");
|
|
361
394
|
let admin_ctx = test.actor_context(&test.admin_id);
|
|
362
|
-
let admin_result = test
|
|
395
|
+
let admin_result = test
|
|
396
|
+
.db
|
|
397
|
+
.delete_with_authorization(&format!("Team#{}", test.team_id), &admin_ctx);
|
|
363
398
|
let admin_actual = match admin_result {
|
|
364
399
|
Ok(_) => "PERMIT".to_string(),
|
|
365
400
|
Err(e) => format!("DENY: {}", e),
|
|
@@ -377,22 +412,26 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
|
|
|
377
412
|
);
|
|
378
413
|
|
|
379
414
|
if admin_actual.contains("PERMIT") {
|
|
380
|
-
test.db
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
415
|
+
test.db
|
|
416
|
+
.insert(
|
|
417
|
+
"Team#team-backend",
|
|
418
|
+
json!({
|
|
419
|
+
"_id": test.team_id,
|
|
420
|
+
"organization": test.org_id,
|
|
421
|
+
"name": "Backend Team",
|
|
422
|
+
"owner": test.owner_id,
|
|
423
|
+
"created_at": "2026-08-22T00:00:00Z"
|
|
424
|
+
}),
|
|
425
|
+
)
|
|
426
|
+
.ok();
|
|
390
427
|
}
|
|
391
428
|
|
|
392
429
|
// Test member (has TeamMembership.role="member" and write capability)
|
|
393
430
|
println!("Testing member delete...");
|
|
394
431
|
let member_ctx = test.actor_context(&test.member_id);
|
|
395
|
-
let member_result = test
|
|
432
|
+
let member_result = test
|
|
433
|
+
.db
|
|
434
|
+
.delete_with_authorization(&format!("Team#{}", test.team_id), &member_ctx);
|
|
396
435
|
let member_actual = match member_result {
|
|
397
436
|
Ok(_) => "PERMIT".to_string(),
|
|
398
437
|
Err(e) => format!("DENY: {}", e),
|
|
@@ -410,22 +449,26 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
|
|
|
410
449
|
);
|
|
411
450
|
|
|
412
451
|
if member_actual.contains("PERMIT") {
|
|
413
|
-
test.db
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
452
|
+
test.db
|
|
453
|
+
.insert(
|
|
454
|
+
"Team#team-backend",
|
|
455
|
+
json!({
|
|
456
|
+
"_id": test.team_id,
|
|
457
|
+
"organization": test.org_id,
|
|
458
|
+
"name": "Backend Team",
|
|
459
|
+
"owner": test.owner_id,
|
|
460
|
+
"created_at": "2026-08-22T00:00:00Z"
|
|
461
|
+
}),
|
|
462
|
+
)
|
|
463
|
+
.ok();
|
|
423
464
|
}
|
|
424
465
|
|
|
425
466
|
// Test non_member (no team membership at all)
|
|
426
467
|
println!("Testing non_member delete...");
|
|
427
468
|
let non_member_ctx = test.actor_context(&test.non_member_id);
|
|
428
|
-
let non_member_result = test
|
|
469
|
+
let non_member_result = test
|
|
470
|
+
.db
|
|
471
|
+
.delete_with_authorization(&format!("Team#{}", test.team_id), &non_member_ctx);
|
|
429
472
|
let non_member_actual = match non_member_result {
|
|
430
473
|
Ok(_) => "PERMIT".to_string(),
|
|
431
474
|
Err(e) => format!("DENY: {}", e),
|
|
@@ -443,22 +486,26 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
|
|
|
443
486
|
);
|
|
444
487
|
|
|
445
488
|
if non_member_actual.contains("PERMIT") {
|
|
446
|
-
test.db
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
489
|
+
test.db
|
|
490
|
+
.insert(
|
|
491
|
+
"Team#team-backend",
|
|
492
|
+
json!({
|
|
493
|
+
"_id": test.team_id,
|
|
494
|
+
"organization": test.org_id,
|
|
495
|
+
"name": "Backend Team",
|
|
496
|
+
"owner": test.owner_id,
|
|
497
|
+
"created_at": "2026-08-22T00:00:00Z"
|
|
498
|
+
}),
|
|
499
|
+
)
|
|
500
|
+
.ok();
|
|
456
501
|
}
|
|
457
502
|
|
|
458
503
|
// Test revoked (org member but revoked from team)
|
|
459
504
|
println!("Testing revoked delete...");
|
|
460
505
|
let revoked_ctx = test.actor_context(&test.revoked_id);
|
|
461
|
-
let revoked_result = test
|
|
506
|
+
let revoked_result = test
|
|
507
|
+
.db
|
|
508
|
+
.delete_with_authorization(&format!("Team#{}", test.team_id), &revoked_ctx);
|
|
462
509
|
let revoked_actual = match revoked_result {
|
|
463
510
|
Ok(_) => "PERMIT".to_string(),
|
|
464
511
|
Err(e) => format!("DENY: {}", e),
|
|
@@ -476,16 +523,18 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
|
|
|
476
523
|
);
|
|
477
524
|
|
|
478
525
|
if revoked_actual.contains("PERMIT") {
|
|
479
|
-
test.db
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
526
|
+
test.db
|
|
527
|
+
.insert(
|
|
528
|
+
"Team#team-backend",
|
|
529
|
+
json!({
|
|
530
|
+
"_id": test.team_id,
|
|
531
|
+
"organization": test.org_id,
|
|
532
|
+
"name": "Backend Team",
|
|
533
|
+
"owner": test.owner_id,
|
|
534
|
+
"created_at": "2026-08-22T00:00:00Z"
|
|
535
|
+
}),
|
|
536
|
+
)
|
|
537
|
+
.ok();
|
|
489
538
|
}
|
|
490
539
|
|
|
491
540
|
// Test cross_tenant (not in tenant)
|
|
@@ -500,7 +549,9 @@ fn pr9_phase3c_team_delete_authorization() -> Result<(), Box<dyn std::error::Err
|
|
|
500
549
|
writable_collections: Default::default(),
|
|
501
550
|
field_projections: Default::default(),
|
|
502
551
|
};
|
|
503
|
-
let cross_tenant_result = test
|
|
552
|
+
let cross_tenant_result = test
|
|
553
|
+
.db
|
|
554
|
+
.delete_with_authorization(&format!("Team#{}", test.team_id), &cross_tenant_ctx);
|
|
504
555
|
let cross_tenant_actual = match cross_tenant_result {
|
|
505
556
|
Ok(_) => "PERMIT".to_string(),
|
|
506
557
|
Err(e) => format!("DENY: {}", e),
|
|
@@ -17,8 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
use feltdb::{
|
|
19
19
|
state_contract::{
|
|
20
|
-
|
|
21
|
-
FieldConstraints,
|
|
20
|
+
CollectionSchema, FieldConstraints, FieldSchema, FieldType, PrimitiveType, StateSchema,
|
|
22
21
|
},
|
|
23
22
|
FeltDb,
|
|
24
23
|
};
|
|
@@ -301,16 +300,28 @@ fn pr9_team_creation_and_basic_access() -> Result<(), Box<dyn std::error::Error>
|
|
|
301
300
|
let team_id = "team-backend";
|
|
302
301
|
|
|
303
302
|
// Setup: Alice, Bob, Charlie
|
|
304
|
-
db.insert(
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
303
|
+
db.insert(
|
|
304
|
+
"User#user-alice",
|
|
305
|
+
json!({ "_id": alice_id, "email": "alice@example.com" }),
|
|
306
|
+
)
|
|
307
|
+
.map_err(|e| format!("{:?}", e))?;
|
|
308
|
+
db.insert(
|
|
309
|
+
"User#user-bob",
|
|
310
|
+
json!({ "_id": bob_id, "email": "bob@example.com" }),
|
|
311
|
+
)
|
|
312
|
+
.map_err(|e| format!("{:?}", e))?;
|
|
313
|
+
db.insert(
|
|
314
|
+
"User#user-charlie",
|
|
315
|
+
json!({ "_id": charlie_id, "email": "charlie@example.com" }),
|
|
316
|
+
)
|
|
317
|
+
.map_err(|e| format!("{:?}", e))?;
|
|
310
318
|
|
|
311
319
|
// Setup: Organization
|
|
312
|
-
db.insert(
|
|
313
|
-
|
|
320
|
+
db.insert(
|
|
321
|
+
"Organization#org-acme",
|
|
322
|
+
json!({ "_id": org_id, "name": "ACME Corp" }),
|
|
323
|
+
)
|
|
324
|
+
.map_err(|e| format!("{:?}", e))?;
|
|
314
325
|
|
|
315
326
|
// Setup: All three are org members (required for team access)
|
|
316
327
|
db.insert(
|