OceanSlim on Nostr: Finally got around to this! I wasn't replacing previous events with the same a tag. ...
Finally got around to this! I wasn't replacing previous events with the same a tag. So, this bug should now be squashed! TYSM
Here's the handler if interested:
package kinds
import (
"context"
"fmt"
"grain/server/handlers/response"
relay "grain/server/types"
"strings"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"golang.org/x/net/websocket"
)
func HandleKind5(ctx context.Context, evt relay.Event, dbClient *mongo.Client, ws *websocket.Conn) error {
for _, tag := range evt.Tags {
if len(tag) < 2 {
continue
}
if tag[0] == "e" {
eventID := tag[1]
if err := deleteEventByID(ctx, eventID, evt.PubKey, dbClient); err != nil {
response.SendOK(ws, evt.ID, false, fmt.Sprintf("error: %v", err))
return fmt.Errorf("error deleting event with ID %s: %v", eventID, err)
}
} else if tag[0] == "a" {
parts := splitTagA(tag[1])
if len(parts) == 3 {
kind := parts[0]
pubKey := parts[1]
dID := parts[2]
// Delete previous kind 5 events with the same "a" tag if they exist
if err := deletePreviousKind5Events(ctx, kind, pubKey, dID, dbClient); err != nil {
response.SendOK(ws, evt.ID, false, fmt.Sprintf("error: %v", err))
return fmt.Errorf("error deleting previous kind 5 events: %v", err)
}
// Delete target events by kind, pubKey, and dID
if err := deleteEventByKindPubKeyDID(ctx, kind, pubKey, dID, evt.CreatedAt, dbClient); err != nil {
response.SendOK(ws, evt.ID, false, fmt.Sprintf("error: %v", err))
return fmt.Errorf("error deleting events with kind %s, pubkey %s, and dID %s: %v", kind, pubKey, dID, err)
}
}
}
}
// Store the deletion event
if err := storeEvent(ctx, evt, dbClient); err != nil {
response.SendOK(ws, evt.ID, false, fmt.Sprintf("error: %v", err))
return fmt.Errorf("error storing deletion event: %v", err)
}
response.SendOK(ws, evt.ID, true, "")
return nil
}
func deletePreviousKind5Events(ctx context.Context, kind string, pubKey string, dID string, dbClient *mongo.Client) error {
collection := dbClient.Database("grain").Collection("event-kind5")
filter := bson.M{
"tags": bson.M{
"$elemMatch": bson.M{
"0": "a",
"1": fmt.Sprintf("%s:%s:%s", kind, pubKey, dID),
},
},
}
_, err := collection.DeleteMany(ctx, filter)
if err != nil {
return fmt.Errorf("error deleting previous kind 5 events from collection event-kind5: %v", err)
}
fmt.Printf("Deleted previous kind 5 events for kind %s, pubkey %s, and dID %s\n", kind, pubKey, dID)
return nil
}
func deleteEventByID(ctx context.Context, eventID string, pubKey string, dbClient *mongo.Client) error {
collections, err := dbClient.Database("grain").ListCollectionNames(ctx, bson.M{})
if err != nil {
return fmt.Errorf("error listing collections: %v", err)
}
for _, collectionName := range collections {
filter := bson.M{"id": eventID, "pubkey": pubKey}
result, err := dbClient.Database("grain").Collection(collectionName).DeleteOne(ctx, filter)
if err != nil {
return fmt.Errorf("error deleting event from collection %s: %v", collectionName, err)
}
if result.DeletedCount > 0 {
fmt.Printf("Deleted event %s from collection %s\n", eventID, collectionName)
return nil
}
}
return nil
}
func splitTagA(tagA string) []string {
return strings.Split(tagA, ":")
}
func deleteEventByKindPubKeyDID(ctx context.Context, kind string, pubKey string, dID string, createdAt int64, dbClient *mongo.Client) error {
filter := bson.M{"kind": kind, "pubkey": pubKey, "tags.d": dID, "createdat": bson.M{"$lte": createdAt}}
collections, err := dbClient.Database("grain").ListCollectionNames(ctx, bson.M{})
if err != nil {
return fmt.Errorf("error listing collections: %v", err)
}
for _, collectionName := range collections {
_, err := dbClient.Database("grain").Collection(collectionName).DeleteMany(ctx, filter)
if err != nil {
return fmt.Errorf("error deleting events from collection %s: %v", collectionName, err)
}
fmt.Printf("Deleted events with kind %s, pubkey %s, and dID %s from collection %s\n", kind, pubKey, dID, collectionName)
}
return nil
}
func storeEvent(ctx context.Context, evt relay.Event, dbClient *mongo.Client) error {
_, err := dbClient.Database("grain").Collection("event-kind5").InsertOne(ctx, evt)
if err != nil {
return fmt.Errorf("error inserting deletion event: %v", err)
}
fmt.Printf("Stored deletion event %s\n", evt.ID)
return nil
}
Published at
2024-08-08 11:59:17Event JSON
{
"id": "8f7f093c6196a71e4ad8320ce96f213936e3954ba084d29398cd628b1e9b36dd",
"pubkey": "16f1a0100d4cfffbcc4230e8e0e4290cc5849c1adc64d6653fda07c031b1074b",
"created_at": 1723118357,
"kind": 1,
"tags": [
[
"e",
"5d5a8c08d60a336720c5ced9c65780441657683f4487cbd7e44a4703b03a27ac",
"wss://nostr.happytavern.co/",
"root"
],
[
"e",
"b04de9f631e6dcafd1dddd3a48a42b3ab3aad8d935c59514fd5ec26a5e74aed3",
"wss://relay.damus.io/",
"reply"
],
[
"p",
"460c25e682fda7832b52d1f22d3d22b3176d972f60dcdc3212ed8c92ef85065c",
"",
"mention"
]
],
"content": "Finally got around to this! I wasn't replacing previous events with the same a tag. So, this bug should now be squashed! TYSM\n\nHere's the handler if interested: \n\npackage kinds\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"grain/server/handlers/response\"\n\trelay \"grain/server/types\"\n\t\"strings\"\n\n\t\"go.mongodb.org/mongo-driver/bson\"\n\t\"go.mongodb.org/mongo-driver/mongo\"\n\t\"golang.org/x/net/websocket\"\n)\n\nfunc HandleKind5(ctx context.Context, evt relay.Event, dbClient *mongo.Client, ws *websocket.Conn) error {\n\tfor _, tag := range evt.Tags {\n\t\tif len(tag) \u003c 2 {\n\t\t\tcontinue\n\t\t}\n\t\tif tag[0] == \"e\" {\n\t\t\teventID := tag[1]\n\t\t\tif err := deleteEventByID(ctx, eventID, evt.PubKey, dbClient); err != nil {\n\t\t\t\tresponse.SendOK(ws, evt.ID, false, fmt.Sprintf(\"error: %v\", err))\n\t\t\t\treturn fmt.Errorf(\"error deleting event with ID %s: %v\", eventID, err)\n\t\t\t}\n\t\t} else if tag[0] == \"a\" {\n\t\t\tparts := splitTagA(tag[1])\n\t\t\tif len(parts) == 3 {\n\t\t\t\tkind := parts[0]\n\t\t\t\tpubKey := parts[1]\n\t\t\t\tdID := parts[2]\n\n\t\t\t\t// Delete previous kind 5 events with the same \"a\" tag if they exist\n\t\t\t\tif err := deletePreviousKind5Events(ctx, kind, pubKey, dID, dbClient); err != nil {\n\t\t\t\t\tresponse.SendOK(ws, evt.ID, false, fmt.Sprintf(\"error: %v\", err))\n\t\t\t\t\treturn fmt.Errorf(\"error deleting previous kind 5 events: %v\", err)\n\t\t\t\t}\n\n\t\t\t\t// Delete target events by kind, pubKey, and dID\n\t\t\t\tif err := deleteEventByKindPubKeyDID(ctx, kind, pubKey, dID, evt.CreatedAt, dbClient); err != nil {\n\t\t\t\t\tresponse.SendOK(ws, evt.ID, false, fmt.Sprintf(\"error: %v\", err))\n\t\t\t\t\treturn fmt.Errorf(\"error deleting events with kind %s, pubkey %s, and dID %s: %v\", kind, pubKey, dID, err)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Store the deletion event\n\tif err := storeEvent(ctx, evt, dbClient); err != nil {\n\t\tresponse.SendOK(ws, evt.ID, false, fmt.Sprintf(\"error: %v\", err))\n\t\treturn fmt.Errorf(\"error storing deletion event: %v\", err)\n\t}\n\n\tresponse.SendOK(ws, evt.ID, true, \"\")\n\treturn nil\n}\n\nfunc deletePreviousKind5Events(ctx context.Context, kind string, pubKey string, dID string, dbClient *mongo.Client) error {\n\tcollection := dbClient.Database(\"grain\").Collection(\"event-kind5\")\n\tfilter := bson.M{\n\t\t\"tags\": bson.M{\n\t\t\t\"$elemMatch\": bson.M{\n\t\t\t\t\"0\": \"a\",\n\t\t\t\t\"1\": fmt.Sprintf(\"%s:%s:%s\", kind, pubKey, dID),\n\t\t\t},\n\t\t},\n\t}\n\n\t_, err := collection.DeleteMany(ctx, filter)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error deleting previous kind 5 events from collection event-kind5: %v\", err)\n\t}\n\n\tfmt.Printf(\"Deleted previous kind 5 events for kind %s, pubkey %s, and dID %s\\n\", kind, pubKey, dID)\n\treturn nil\n}\n\nfunc deleteEventByID(ctx context.Context, eventID string, pubKey string, dbClient *mongo.Client) error {\n\tcollections, err := dbClient.Database(\"grain\").ListCollectionNames(ctx, bson.M{})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error listing collections: %v\", err)\n\t}\n\n\tfor _, collectionName := range collections {\n\t\tfilter := bson.M{\"id\": eventID, \"pubkey\": pubKey}\n\t\tresult, err := dbClient.Database(\"grain\").Collection(collectionName).DeleteOne(ctx, filter)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error deleting event from collection %s: %v\", collectionName, err)\n\t\t}\n\t\tif result.DeletedCount \u003e 0 {\n\t\t\tfmt.Printf(\"Deleted event %s from collection %s\\n\", eventID, collectionName)\n\t\t\treturn nil\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc splitTagA(tagA string) []string {\n\treturn strings.Split(tagA, \":\")\n}\n\nfunc deleteEventByKindPubKeyDID(ctx context.Context, kind string, pubKey string, dID string, createdAt int64, dbClient *mongo.Client) error {\n\tfilter := bson.M{\"kind\": kind, \"pubkey\": pubKey, \"tags.d\": dID, \"createdat\": bson.M{\"$lte\": createdAt}}\n\tcollections, err := dbClient.Database(\"grain\").ListCollectionNames(ctx, bson.M{})\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error listing collections: %v\", err)\n\t}\n\n\tfor _, collectionName := range collections {\n\t\t_, err := dbClient.Database(\"grain\").Collection(collectionName).DeleteMany(ctx, filter)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error deleting events from collection %s: %v\", collectionName, err)\n\t\t}\n\t\tfmt.Printf(\"Deleted events with kind %s, pubkey %s, and dID %s from collection %s\\n\", kind, pubKey, dID, collectionName)\n\t}\n\n\treturn nil\n}\n\nfunc storeEvent(ctx context.Context, evt relay.Event, dbClient *mongo.Client) error {\n\t_, err := dbClient.Database(\"grain\").Collection(\"event-kind5\").InsertOne(ctx, evt)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error inserting deletion event: %v\", err)\n\t}\n\tfmt.Printf(\"Stored deletion event %s\\n\", evt.ID)\n\treturn nil\n}\n",
"sig": "9007c8c71b92591e604443cf465ea0374f693d906a828fadad21bb1896b44c1a33d45c21fad8d865f6780e53bf04f27fa609095c0369372dad790a0563ee0300"
}