Try storing events in new database
This commit is contained in:
parent
91eac97d5c
commit
8ceb63fc89
51
src/db.ts
51
src/db.ts
|
@ -1,4 +1,5 @@
|
||||||
import { Sqlite } from '@/deps.ts';
|
import { Sqlite } from '@/deps.ts';
|
||||||
|
import { SignedEvent } from '@/event.ts';
|
||||||
|
|
||||||
interface User {
|
interface User {
|
||||||
pubkey: string;
|
pubkey: string;
|
||||||
|
@ -13,7 +14,7 @@ class DittoDB {
|
||||||
this.#db = db;
|
this.#db = db;
|
||||||
|
|
||||||
this.#db.execute(`
|
this.#db.execute(`
|
||||||
CREATE TABLE events (
|
CREATE TABLE IF NOT EXISTS events (
|
||||||
id TEXT PRIMARY KEY,
|
id TEXT PRIMARY KEY,
|
||||||
kind INTEGER NOT NULL,
|
kind INTEGER NOT NULL,
|
||||||
pubkey TEXT NOT NULL,
|
pubkey TEXT NOT NULL,
|
||||||
|
@ -23,10 +24,10 @@ class DittoDB {
|
||||||
sig TEXT NOT NULL
|
sig TEXT NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE INDEX idx_events_kind ON events(kind);
|
CREATE INDEX IF NOT EXISTS idx_events_kind ON events(kind);
|
||||||
CREATE INDEX idx_events_pubkey ON events(pubkey);
|
CREATE INDEX IF NOT EXISTS idx_events_pubkey ON events(pubkey);
|
||||||
|
|
||||||
CREATE TABLE tags (
|
CREATE TABLE IF NOT EXISTS tags (
|
||||||
tag TEXT NOT NULL,
|
tag TEXT NOT NULL,
|
||||||
value_1 TEXT,
|
value_1 TEXT,
|
||||||
value_2 TEXT,
|
value_2 TEXT,
|
||||||
|
@ -35,17 +36,17 @@ class DittoDB {
|
||||||
FOREIGN KEY(event_id) REFERENCES events(id) ON DELETE CASCADE
|
FOREIGN KEY(event_id) REFERENCES events(id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE INDEX idx_tags_tag ON tags(tag);
|
CREATE INDEX IF NOT EXISTS idx_tags_tag ON tags(tag);
|
||||||
CREATE INDEX idx_tags_value_1 ON tags(value_1);
|
CREATE INDEX IF NOT EXISTS idx_tags_value_1 ON tags(value_1);
|
||||||
CREATE INDEX idx_tags_event_id ON tags(event_id);
|
CREATE INDEX IF NOT EXISTS idx_tags_event_id ON tags(event_id);
|
||||||
|
|
||||||
CREATE TABLE users (
|
CREATE TABLE IF NOT EXISTS users (
|
||||||
pubkey TEXT PRIMARY KEY,
|
pubkey TEXT PRIMARY KEY,
|
||||||
username TEXT NOT NULL,
|
username TEXT NOT NULL,
|
||||||
inserted_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL
|
inserted_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE UNIQUE INDEX idx_users_username ON users(username);
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
||||||
`);
|
`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,6 +69,38 @@ class DittoDB {
|
||||||
inserted_at: result[2],
|
inserted_at: result[2],
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
insertEvent(event: SignedEvent): void {
|
||||||
|
this.#db.transaction(() => {
|
||||||
|
this.#db.query(
|
||||||
|
`
|
||||||
|
INSERT INTO events(id, kind, pubkey, content, created_at, tags, sig)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
||||||
|
`,
|
||||||
|
[
|
||||||
|
event.id,
|
||||||
|
event.kind,
|
||||||
|
event.pubkey,
|
||||||
|
event.content,
|
||||||
|
event.created_at,
|
||||||
|
JSON.stringify(event.tags),
|
||||||
|
event.sig,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const [tag, value1, value2, value3] of event.tags) {
|
||||||
|
if (['p', 'e', 'q', 'd', 't', 'proxy'].includes(tag)) {
|
||||||
|
this.#db.query(
|
||||||
|
`
|
||||||
|
INSERT INTO tags(event_id, tag, value_1, value_2, value_3)
|
||||||
|
VALUES (?, ?, ?, ?, ?)
|
||||||
|
`,
|
||||||
|
[event.id, tag, value1 || null, value2 || null, value3 || null],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const db = new DittoDB(
|
const db = new DittoDB(
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import { Conf } from '@/config.ts';
|
import { Conf } from '@/config.ts';
|
||||||
|
import { db } from '@/db.ts';
|
||||||
import { RelayPool } from '@/deps.ts';
|
import { RelayPool } from '@/deps.ts';
|
||||||
import { trends } from '@/trends.ts';
|
import { trends } from '@/trends.ts';
|
||||||
import { nostrDate, nostrNow } from '@/utils.ts';
|
import { nostrDate, nostrNow } from '@/utils.ts';
|
||||||
|
|
||||||
import type { Event } from '@/event.ts';
|
import type { SignedEvent } from '@/event.ts';
|
||||||
|
|
||||||
const relay = new RelayPool([Conf.relay]);
|
const relay = new RelayPool([Conf.relay]);
|
||||||
|
|
||||||
|
@ -19,13 +20,14 @@ relay.subscribe(
|
||||||
);
|
);
|
||||||
|
|
||||||
/** Handle events through the loopback pipeline. */
|
/** Handle events through the loopback pipeline. */
|
||||||
function handleEvent(event: Event): void {
|
function handleEvent(event: SignedEvent): void {
|
||||||
console.info('loopback event:', event.id);
|
console.info('loopback event:', event.id);
|
||||||
|
db.insertEvent(event);
|
||||||
trackHashtags(event);
|
trackHashtags(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Track whenever a hashtag is used, for processing trending tags. */
|
/** Track whenever a hashtag is used, for processing trending tags. */
|
||||||
function trackHashtags(event: Event): void {
|
function trackHashtags(event: SignedEvent): void {
|
||||||
const date = nostrDate(event.created_at);
|
const date = nostrDate(event.created_at);
|
||||||
|
|
||||||
const tags = event.tags
|
const tags = event.tags
|
||||||
|
|
Loading…
Reference in New Issue