From 819866330c7e2f535a155d1d7efaf2e12dc15dc2 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Thu, 4 Dec 2025 15:42:00 +0000 Subject: refactor: split Nip34WritePolicy into focused sub-policies Split the ~900 line Nip34WritePolicy into focused sub-policies for improved testability and maintainability: - AnnouncementPolicy - Repository announcement validation - StatePolicy - State event validation + ref alignment - PrEventPolicy - PR/PR Update validation - RelatedEventPolicy - Forward/backward reference checking The main Nip34WritePolicy now delegates to these sub-policies via a shared PolicyContext that provides domain, database, and git_data_path. Also updates: - README.md: Accurate project structure reflecting actual implementation - docs/learnings: Marks this technical debt item as complete --- src/nostr/policy/mod.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/nostr/policy/mod.rs (limited to 'src/nostr/policy/mod.rs') diff --git a/src/nostr/policy/mod.rs b/src/nostr/policy/mod.rs new file mode 100644 index 0000000..6d67394 --- /dev/null +++ b/src/nostr/policy/mod.rs @@ -0,0 +1,41 @@ +/// Policy module for NIP-34 write policies +/// +/// This module splits the large Nip34WritePolicy into focused sub-policies: +/// - `AnnouncementPolicy` - Repository announcement validation +/// - `StatePolicy` - State event validation + ref alignment +/// - `PrEventPolicy` - PR/PR Update validation +/// - `RelatedEventPolicy` - Forward/backward reference checking + +mod announcement; +mod pr_event; +mod related; +mod state; + +pub use announcement::{AnnouncementPolicy, AnnouncementResult}; +pub use pr_event::PrEventPolicy; +pub use related::{ReferenceResult, RelatedEventPolicy}; +pub use state::{AlignmentResult, StatePolicy, StateResult}; + +use super::SharedDatabase; + +/// Shared context for all sub-policies +#[derive(Clone)] +pub struct PolicyContext { + pub domain: String, + pub database: SharedDatabase, + pub git_data_path: std::path::PathBuf, +} + +impl PolicyContext { + pub fn new( + domain: impl Into, + database: SharedDatabase, + git_data_path: impl Into, + ) -> Self { + Self { + domain: domain.into(), + database, + git_data_path: git_data_path.into(), + } + } +} \ No newline at end of file -- cgit v1.2.3