upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/nostr/builder.rs
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2026-02-13 13:24:46 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2026-02-13 17:29:23 +0000
commit1d09e4bdea7e328cf2740818df9df660c5532a99 (patch)
treedcb758a70a2e9b84709df247cc685a2f6423094e /src/nostr/builder.rs
parenta2a99d5a4137b57e4141cf2840f2f51b38035cfa (diff)
feat: implement announcement purgatory core (breaks archive sync test)
Route new announcements to purgatory instead of accepting immediately. Announcements are promoted to the database when git data arrives, ensuring we only serve announcements for repos with actual content. Implemented: - AnnouncementPurgatoryEntry type and DashMap store - Route new announcements to purgatory (replacement announcements skip) - Promote announcements on git data arrival (process_purgatory_announcements) - Authorization checks purgatory announcements (fetch_repository_data_with_purgatory) - State policy uses purgatory announcements for maintainer validation - Cleanup task handles announcement expiry - Updated count()/cleanup() to 3-tuples Known broken: - test_archive_read_only_creates_bare_repo fails: sync module does not treat purgatory announcements as confirmed repos, so per-repo sync (state events, PRs) is never triggered for purgatory announcements - Announcement persistence (save/restore) not implemented - SyncLevel (StateOnly vs Full) not implemented - Soft expiry two-phase not implemented - Expiry extension on state event / git auth not wired up
Diffstat (limited to 'src/nostr/builder.rs')
-rw-r--r--src/nostr/builder.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/nostr/builder.rs b/src/nostr/builder.rs
index 34014db..aff12a6 100644
--- a/src/nostr/builder.rs
+++ b/src/nostr/builder.rs
@@ -138,6 +138,29 @@ impl Nip34WritePolicy {
138 } 138 }
139 } 139 }
140 } 140 }
141 AnnouncementResult::AcceptPurgatory => {
142 // New announcement - add to purgatory
143 match self.announcement_policy.add_to_purgatory(event) {
144 Ok(()) => {
145 tracing::info!(
146 "Accepted announcement to purgatory: {} (waiting for git data)",
147 event_id_str
148 );
149 WritePolicyResult::Reject {
150 status: true, // Client sees OK
151 message: "purgatory: won't be served until git data arrives".into(),
152 }
153 }
154 Err(e) => {
155 tracing::warn!(
156 "Failed to add announcement to purgatory {}: {}",
157 event_id_str,
158 e
159 );
160 WritePolicyResult::reject(e)
161 }
162 }
163 }
141 AnnouncementResult::AcceptMaintainer => { 164 AnnouncementResult::AcceptMaintainer => {
142 // Parse announcement to get details for logging 165 // Parse announcement to get details for logging
143 match RepositoryAnnouncement::from_event(event.clone()) { 166 match RepositoryAnnouncement::from_event(event.clone()) {