- Improved logging for delete events in handle-delete.go, including detailed information about the event and its tags. - Added checks for admin and owner deletions, with appropriate logging for each case. - Updated HandleEvent to process delete events more robustly, including success and error logging. - Introduced a new fetchEventById function in nostr.js to verify event deletion. - Updated App.svelte to handle event deletion verification and state management. - Changed favicon references in HTML files to use the new orly-favicon.png. - Added orly-favicon.png to the public and docs directories for consistent branding.
95 lines
2.6 KiB
Go
95 lines
2.6 KiB
Go
package database
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
|
|
"github.com/dgraph-io/badger/v4"
|
|
"lol.mleku.dev/chk"
|
|
"next.orly.dev/pkg/database/indexes"
|
|
"next.orly.dev/pkg/database/indexes/types"
|
|
"next.orly.dev/pkg/encoders/event"
|
|
)
|
|
|
|
// DeleteEvent removes an event from the database identified by `eid`. If
|
|
// noTombstone is false or not provided, a tombstone is created for the event.
|
|
func (d *D) DeleteEvent(c context.Context, eid []byte) (err error) {
|
|
d.Logger.Warningf("deleting event %0x", eid)
|
|
|
|
// Get the serial number for the event ID
|
|
var ser *types.Uint40
|
|
ser, err = d.GetSerialById(eid)
|
|
if chk.E(err) {
|
|
return
|
|
}
|
|
if ser == nil {
|
|
// Event wasn't found, nothing to delete
|
|
return
|
|
}
|
|
// Fetch the event to get its data
|
|
var ev *event.E
|
|
ev, err = d.FetchEventBySerial(ser)
|
|
if chk.E(err) {
|
|
return
|
|
}
|
|
if ev == nil {
|
|
// Event wasn't found, nothing to delete. this shouldn't happen.
|
|
return
|
|
}
|
|
if err = d.DeleteEventBySerial(c, ser, ev); chk.E(err) {
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
func (d *D) DeleteEventBySerial(
|
|
c context.Context, ser *types.Uint40, ev *event.E,
|
|
) (err error) {
|
|
d.Logger.Infof("DeleteEventBySerial: deleting event %0x (serial %d)", ev.ID, ser.Get())
|
|
|
|
// Get all indexes for the event
|
|
var idxs [][]byte
|
|
idxs, err = GetIndexesForEvent(ev, ser.Get())
|
|
if chk.E(err) {
|
|
d.Logger.Errorf("DeleteEventBySerial: failed to get indexes for event %0x: %v", ev.ID, err)
|
|
return
|
|
}
|
|
d.Logger.Infof("DeleteEventBySerial: found %d indexes for event %0x", len(idxs), ev.ID)
|
|
|
|
// Get the event key
|
|
eventKey := new(bytes.Buffer)
|
|
if err = indexes.EventEnc(ser).MarshalWrite(eventKey); chk.E(err) {
|
|
d.Logger.Errorf("DeleteEventBySerial: failed to create event key for %0x: %v", ev.ID, err)
|
|
return
|
|
}
|
|
|
|
// Delete the event and all its indexes in a transaction
|
|
err = d.Update(
|
|
func(txn *badger.Txn) (err error) {
|
|
// Delete the event
|
|
if err = txn.Delete(eventKey.Bytes()); chk.E(err) {
|
|
d.Logger.Errorf("DeleteEventBySerial: failed to delete event %0x: %v", ev.ID, err)
|
|
return
|
|
}
|
|
d.Logger.Infof("DeleteEventBySerial: deleted event %0x", ev.ID)
|
|
|
|
// Delete all indexes
|
|
for i, key := range idxs {
|
|
if err = txn.Delete(key); chk.E(err) {
|
|
d.Logger.Errorf("DeleteEventBySerial: failed to delete index %d for event %0x: %v", i, ev.ID, err)
|
|
return
|
|
}
|
|
}
|
|
d.Logger.Infof("DeleteEventBySerial: deleted %d indexes for event %0x", len(idxs), ev.ID)
|
|
return
|
|
},
|
|
)
|
|
if chk.E(err) {
|
|
d.Logger.Errorf("DeleteEventBySerial: transaction failed for event %0x: %v", ev.ID, err)
|
|
return
|
|
}
|
|
|
|
d.Logger.Infof("DeleteEventBySerial: successfully deleted event %0x and all indexes", ev.ID)
|
|
return
|
|
}
|