diff --git a/backend/src/activitypub/peers.ts b/backend/src/activitypub/peers.ts index 3f05220..bd2a6b0 100644 --- a/backend/src/activitypub/peers.ts +++ b/backend/src/activitypub/peers.ts @@ -9,10 +9,9 @@ export async function getPeers(db: Database): Promise> { } export async function addPeer(db: Database, domain: string): Promise { - const query = ` - INSERT OR IGNORE INTO peers (domain) - VALUES (?) - ` + const query = db.qb.insertOrIgnore(` + INTO peers (domain) VALUES (?) + `) const out = await db.prepare(query).bind(domain).run() if (!out.success) { diff --git a/backend/src/database/d1.ts b/backend/src/database/d1.ts index 41c7fe4..101b0da 100644 --- a/backend/src/database/d1.ts +++ b/backend/src/database/d1.ts @@ -17,6 +17,10 @@ const qb: QueryBuilder = { epoch(): string { return '00-00-00 00:00:00' }, + + insertOrIgnore(q: string): string { + return `INSERT OR IGNORE ${q}` + }, } export default function make({ DATABASE }: Pick): Database { diff --git a/backend/src/database/index.ts b/backend/src/database/index.ts index 4d92787..f516827 100644 --- a/backend/src/database/index.ts +++ b/backend/src/database/index.ts @@ -29,6 +29,7 @@ export interface QueryBuilder { jsonExtractIsNull(obj: string, prop: string): string set(array: string): string epoch(): string + insertOrIgnore(q: string): string } export async function getDatabase(env: Pick): Promise { diff --git a/backend/src/mastodon/follow.ts b/backend/src/mastodon/follow.ts index 49f0552..db563a3 100644 --- a/backend/src/mastodon/follow.ts +++ b/backend/src/mastodon/follow.ts @@ -10,11 +10,12 @@ const STATE_ACCEPTED = 'accepted' // During a migration we move the followers from the old Actor to the new export async function moveFollowers(db: Database, actor: Actor, followers: Array): Promise { const batch = [] - const stmt = db.prepare(` - INSERT OR IGNORE + const stmt = db.prepare( + db.qb.insertOrIgnore(` INTO actor_following (id, actor_id, target_actor_id, target_actor_acct, state) - VALUES (?1, ?2, ?3, ?4, 'accepted'); + VALUES (?1, ?2, ?3, ?4, 'accepted') `) + ) const actorId = actor.id.toString() const actorAcc = urlToHandle(actor.id) @@ -32,11 +33,12 @@ export async function moveFollowers(db: Database, actor: Actor, followers: Array export async function moveFollowing(db: Database, actor: Actor, followingActors: Array): Promise { const batch = [] - const stmt = db.prepare(` - INSERT OR IGNORE + const stmt = db.prepare( + db.qb.insertOrIgnore(` INTO actor_following (id, actor_id, target_actor_id, target_actor_acct, state) - VALUES (?1, ?2, ?3, ?4, 'accepted'); + VALUES (?1, ?2, ?3, ?4, 'accepted') `) + ) const actorId = actor.id.toString() @@ -56,10 +58,10 @@ export async function moveFollowing(db: Database, actor: Actor, followingActors: export async function addFollowing(db: Database, actor: Actor, target: Actor, targetAcct: string): Promise { const id = crypto.randomUUID() - const query = ` - INSERT OR IGNORE INTO actor_following (id, actor_id, target_actor_id, state, target_actor_acct) + const query = db.qb.insertOrIgnore(` + INTO actor_following (id, actor_id, target_actor_id, state, target_actor_acct) VALUES (?, ?, ?, ?, ?) - ` + `) const out = await db .prepare(query)