Files
ratel/deleteevent.go
2024-09-11 11:19:58 +01:00

80 lines
1.8 KiB
Go

package ratel
import (
"github.com/dgraph-io/badger/v4"
. "nostr.mleku.dev"
"nostr.mleku.dev/codec/event"
"nostr.mleku.dev/codec/eventid"
"ratel.mleku.dev/keys"
"ratel.mleku.dev/keys/id"
"ratel.mleku.dev/keys/index"
"ratel.mleku.dev/keys/serial"
)
func (r *T) DeleteEvent(c Ctx, eid *eventid.T) (err E) {
var foundSerial []byte
seri := serial.New(nil)
err = r.View(func(txn *badger.Txn) (err error) {
// query event by id to ensure we don't try to save duplicates
prf := index.Id.Key(id.New(eid))
it := txn.NewIterator(badger.IteratorOptions{})
defer it.Close()
it.Seek(prf)
if it.ValidForPrefix(prf) {
var k []byte
// get the serial
k = it.Item().Key()
// copy serial out
keys.Read(k, index.Empty(), id.New(eventid.New()), seri)
// save into foundSerial
foundSerial = seri.Val
}
return
})
if Chk.E(err) {
return
}
if foundSerial == nil {
return
}
var indexKeys []B
ev := &event.T{}
var evKey, evb, counterKey B
// fetch the event to get its index keys
err = r.View(func(txn *badger.Txn) (err error) {
// retrieve the event record
evKey = keys.Write(index.New(index.Event), seri)
it := txn.NewIterator(badger.IteratorOptions{})
defer it.Close()
it.Seek(evKey)
if it.ValidForPrefix(evKey) {
if evb, err = it.Item().ValueCopy(evb); Chk.E(err) {
return
}
if _, err = ev.MarshalJSON(evb); Chk.E(err) {
return
}
indexKeys = GetIndexKeysForEvent(ev, seri)
counterKey = GetCounterKey(seri)
return
}
return
})
if Chk.E(err) {
return
}
err = r.Update(func(txn *badger.Txn) (err E) {
if err = txn.Delete(evKey); Chk.E(err) {
}
for _, key := range indexKeys {
if err = txn.Delete(key); Chk.E(err) {
}
}
if err = txn.Delete(counterKey); Chk.E(err) {
return
}
return
})
return
}