Select the types of activity you want to include in your feed.
add clearSliceRecords procedure to empty the index for a slice, add cascade delete funciton to clean up slice records on delete and on lexicon delete, add button to slice settings page
···778778779779 // Also delete from local database (from all slices)
780780 let uri = format!("at://{}/{}/{}", repo, collection, rkey);
781781+782782+ // Handle cascade deletion before deleting the record
783783+ if let Err(e) = state.database.handle_cascade_deletion(&uri, &collection).await {
784784+ tracing::warn!("Cascade deletion failed for {}: {}", uri, e);
785785+ }
786786+781787 let _ = state.database.delete_record_by_uri(&uri, None).await;
782788783789 Ok(Json(serde_json::json!({})))
+27
api/src/database/actors.rs
···224224 .await?;
225225 Ok(result.rows_affected())
226226 }
227227+228228+ /// Deletes all actors for a specific slice.
229229+ ///
230230+ /// This is a destructive operation that removes all tracked actors
231231+ /// from the specified slice. Actors will be recreated when records
232232+ /// are re-indexed during sync.
233233+ ///
234234+ /// # Arguments
235235+ /// * `slice_uri` - AT-URI of the slice to clear
236236+ ///
237237+ /// # Returns
238238+ /// Number of actors deleted
239239+ pub async fn delete_all_actors_for_slice(
240240+ &self,
241241+ slice_uri: &str,
242242+ ) -> Result<u64, DatabaseError> {
243243+ let result = sqlx::query!(
244244+ r#"
245245+ DELETE FROM actor
246246+ WHERE slice_uri = $1
247247+ "#,
248248+ slice_uri
249249+ )
250250+ .execute(&self.pool)
251251+ .await?;
252252+ Ok(result.rows_affected())
253253+ }
227254}
228255229256/// Builds WHERE conditions specifically for actor queries.
+96
api/src/database/records.rs
···481481 Ok(result.rows_affected())
482482 }
483483484484+ /// Deletes all records for a specific slice.
485485+ ///
486486+ /// This is a destructive operation that removes all indexed records
487487+ /// from the specified slice. Records can be recovered by re-syncing.
488488+ ///
489489+ /// # Arguments
490490+ /// * `slice_uri` - AT-URI of the slice to clear
491491+ ///
492492+ /// # Returns
493493+ /// Number of records deleted
494494+ pub async fn delete_all_records_for_slice(
495495+ &self,
496496+ slice_uri: &str,
497497+ ) -> Result<u64, DatabaseError> {
498498+ let result = sqlx::query("DELETE FROM record WHERE slice_uri = $1")
499499+ .bind(slice_uri)
500500+ .execute(&self.pool)
501501+ .await?;
502502+ Ok(result.rows_affected())
503503+ }
504504+505505+ /// Deletes all records of a specific collection from a slice.
506506+ ///
507507+ /// Used when a lexicon is deleted to clean up all records of that type.
508508+ ///
509509+ /// # Arguments
510510+ /// * `slice_uri` - AT-URI of the slice
511511+ /// * `collection` - Collection name (NSID) to delete
512512+ ///
513513+ /// # Returns
514514+ /// Number of records deleted
515515+ pub async fn delete_records_by_collection(
516516+ &self,
517517+ slice_uri: &str,
518518+ collection: &str,
519519+ ) -> Result<u64, DatabaseError> {
520520+ let result = sqlx::query("DELETE FROM record WHERE slice_uri = $1 AND collection = $2")
521521+ .bind(slice_uri)
522522+ .bind(collection)
523523+ .execute(&self.pool)
524524+ .await?;
525525+ Ok(result.rows_affected())
526526+ }
527527+528528+ /// Handles cascade deletion based on record type.
529529+ ///
530530+ /// When certain records are deleted, related data should be cleaned up:
531531+ /// - Lexicon deletion: removes all records of that collection type
532532+ /// - Slice deletion: removes all records and actors for that slice
533533+ ///
534534+ /// # Arguments
535535+ /// * `uri` - AT-URI of the deleted record
536536+ /// * `collection` - Collection name (e.g., "network.slices.lexicon")
537537+ pub async fn handle_cascade_deletion(&self, uri: &str, collection: &str) -> Result<(), DatabaseError> {
538538+ match collection {
539539+ "network.slices.lexicon" => {
540540+ // Get the lexicon record to extract collection name and slice URI
541541+ if let Ok(Some(lexicon_record)) = self.get_record(uri).await
542542+ && let (Some(nsid), Some(slice_uri_from_record)) = (
543543+ lexicon_record.value.get("nsid").and_then(|v| v.as_str()),
544544+ lexicon_record.value.get("slice").and_then(|v| v.as_str())
545545+ )
546546+ {
547547+ // Delete all records of this collection type from the slice
548548+ let deleted = self.delete_records_by_collection(slice_uri_from_record, nsid).await?;
549549+ tracing::info!(
550550+ "Cascade delete: removed {} records of collection {} from slice {}",
551551+ deleted, nsid, slice_uri_from_record
552552+ );
553553+ }
554554+ }
555555+ "network.slices.slice" => {
556556+ // The URI itself is the slice URI
557557+ let slice_uri = uri;
558558+559559+ // Delete all records for this slice
560560+ let records_deleted = self.delete_all_records_for_slice(slice_uri).await?;
561561+ tracing::info!(
562562+ "Cascade delete: removed {} records from slice {}",
563563+ records_deleted, slice_uri
564564+ );
565565+566566+ // Delete all actors for this slice
567567+ let actors_deleted = super::client::Database::delete_all_actors_for_slice(self, slice_uri).await?;
568568+ tracing::info!(
569569+ "Cascade delete: removed {} actors from slice {}",
570570+ actors_deleted, slice_uri
571571+ );
572572+ }
573573+ _ => {
574574+ // No cascade deletion needed for other collections
575575+ }
576576+ }
577577+ Ok(())
578578+ }
579579+484580 /// Inserts or updates a record atomically.
485581 ///
486582 /// # Returns
+5
api/src/jetstream.rs
···622622 return Ok(());
623623 }
624624625625+ // Handle cascade deletion before deleting the record
626626+ if let Err(e) = self.database.handle_cascade_deletion(&uri, &commit.collection).await {
627627+ warn!("Cascade deletion failed for {}: {}", uri, e);
628628+ }
629629+625630 // Delete the record and log only for relevant slices
626631 match self.database.delete_record_by_uri(&uri, None).await {
627632 Ok(rows_affected) => {
···7878 hx-target="#lexicon-list"
7979 hx-swap="outerHTML"
8080 hx-include="input[name='lexicon_rkey']:checked"
8181- hx-confirm="Are you sure you want to delete the selected lexicons?"
8181+ hx-confirm="Are you sure you want to delete the selected lexicons? This will also delete all records of those collection types from the index."
8282 >
8383 <span className="flex items-center">Delete Selected</span>
8484 </Button>