don't delete replaceable events, replace them, and fix bug with tag array returning

This commit is contained in:
Danny Morabito 2025-03-17 23:16:47 +01:00
parent 4c554c91a6
commit 583776d52a
Signed by: dannym
GPG key ID: 7CC8056A5A04557E
2 changed files with 38 additions and 9 deletions

View file

@ -174,9 +174,11 @@ function addEventToDb(
if (existingEvent) throw new EventAlreadyExistsException(); if (existingEvent) throw new EventAlreadyExistsException();
try { try {
db.run("BEGIN TRANSACTION"); db.run("BEGIN TRANSACTION");
if (isReplaceableEvent(decryptedEvent.kind)) { if (isReplaceableEvent(decryptedEvent.kind)) {
sql` sql`
DELETE FROM events UPDATE events
SET replaced = 1
WHERE kind = ${decryptedEvent.kind} WHERE kind = ${decryptedEvent.kind}
AND pubkey = ${decryptedEvent.pubkey} AND pubkey = ${decryptedEvent.pubkey}
AND created_at < ${decryptedEvent.created_at} AND created_at < ${decryptedEvent.created_at}
@ -187,7 +189,8 @@ function addEventToDb(
const dTag = decryptedEvent.tags.find((tag) => tag[0] === "d")?.[1]; const dTag = decryptedEvent.tags.find((tag) => tag[0] === "d")?.[1];
if (dTag) { if (dTag) {
sql` sql`
DELETE FROM events UPDATE events
SET replaced = 1
WHERE kind = ${decryptedEvent.kind} WHERE kind = ${decryptedEvent.kind}
AND pubkey = ${decryptedEvent.pubkey} AND pubkey = ${decryptedEvent.pubkey}
AND created_at < ${decryptedEvent.created_at} AND created_at < ${decryptedEvent.created_at}
@ -386,7 +389,7 @@ function handleRequest(connection: UserConnection, request: NostrClientREQ) {
}`, }`,
); );
let query = sqlPartial`SELECT * FROM events`; let query = sqlPartial`SELECT * FROM events WHERE replaced = 0`;
const filtersAreNotEmpty = filters.some((filter) => { const filtersAreNotEmpty = filters.some((filter) => {
return Object.values(filter).some((value) => { return Object.values(filter).some((value) => {
@ -395,7 +398,7 @@ function handleRequest(connection: UserConnection, request: NostrClientREQ) {
}); });
if (filtersAreNotEmpty) { if (filtersAreNotEmpty) {
query = mixQuery(query, sqlPartial`WHERE`); query = mixQuery(query, sqlPartial`AND`);
for (let i = 0; i < filters.length; i++) { for (let i = 0; i < filters.length; i++) {
// filters act as OR, filter groups act as AND // filters act as OR, filter groups act as AND
@ -548,12 +551,36 @@ function handleRequest(connection: UserConnection, request: NostrClientREQ) {
const rawTags = sql`SELECT * FROM event_tags_view WHERE event_id = ${ const rawTags = sql`SELECT * FROM event_tags_view WHERE event_id = ${
events[i].id events[i].id
}`(connection.db); }`(connection.db);
const tags: { [key: string]: string[] } = {}; const tagsByIndex = new Map<number, {
for (const item of rawTags) { name: string;
if (!tags[item.tag_name]) tags[item.tag_name] = [item.tag_name]; values: Map<number, string>;
tags[item.tag_name].push(item.tag_value); }>();
for (const tag of rawTags) {
let tagData = tagsByIndex.get(tag.tag_index);
if (!tagData) {
tagData = {
name: tag.tag_name,
values: new Map(),
};
tagsByIndex.set(tag.tag_index, tagData);
}
tagData.values.set(tag.tag_value_position, tag.tag_value);
} }
const tagsArray = Object.values(tags);
const tagsArray = Array.from(tagsByIndex.entries())
.sort(([indexA], [indexB]) => indexA - indexB)
.map(([_, tagData]) => {
const { name, values } = tagData;
return [
name,
...Array.from(values.entries())
.sort(([posA], [posB]) => posA - posB)
.map(([_, value]) => value),
];
});
const event = { const event = {
id: events[i].id, id: events[i].id,

View file

@ -0,0 +1,2 @@
ALTER TABLE events
ADD COLUMN replaced INTEGER NOT NULL DEFAULT 0;