UNPKG

auron

Version:

Interact with your ATProto labeler from your terminal

111 lines (110 loc) 4.87 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.database = void 0; const kysely_1 = require("kysely"); const better_sqlite3_1 = __importDefault(require("better-sqlite3")); const initializers_1 = require("../schemas/initializers"); const transformers_1 = require("./subject/transformers"); // Initialize Kysely with SQLite const db = new kysely_1.Kysely({ dialect: new kysely_1.SqliteDialect({ database: new better_sqlite3_1.default(process.env.LOCAL_DB_PATH || "aurondb.sqlite"), }), }); // Create the subjects table if it doesn't exist exports.database = { async initialize() { await (0, initializers_1.initializeSubjectTable)(db); await (0, initializers_1.initializeRepoTable)(db); await (0, initializers_1.initializeRecordTable)(db); }, async insertSubjects(subjectStatuses) { await this.initialize(); const ids = subjectStatuses.map(({ id }) => id); // This is questionable, probably could do update on conflict or something but quick n dirty for now await db.deleteFrom("subjects").where("id", "in", ids).execute(); const { ref } = db.dynamic; return await db .insertInto("subjects") .values(subjectStatuses) .onConflict((oc) => { return oc.doUpdateSet({ reviewState: (0, kysely_1.sql) `${ref(`excluded.reviewState`)}`, lastReviewedAt: (0, kysely_1.sql) `${ref(`excluded.lastReviewedAt`)}`, lastReportedAt: (0, kysely_1.sql) `${ref(`excluded.lastReportedAt`)}`, updatedAt: (0, kysely_1.sql) `${ref("excluded.updatedAt")}`, lastReviewedBy: (0, kysely_1.sql) `${ref("excluded.lastReviewedBy")}`, takendown: (0, kysely_1.sql) `${ref("excluded.takendown")}`, tags: (0, kysely_1.sql) `${ref("excluded.tags")}`, lastAppealedAt: (0, kysely_1.sql) `${ref("excluded.lastAppealedAt")}`, suspendUntil: (0, kysely_1.sql) `${ref("excluded.suspendUntil")}`, muteUntil: (0, kysely_1.sql) `${ref("excluded.muteUntil")}`, comment: (0, kysely_1.sql) `${ref("excluded.comment")}`, }); }) .execute(); }, async listSubjects({ subjectType, cursor, limit, }) { await this.initialize(); let builder = db .selectFrom("subjects") .leftJoin("repos", "subjects.did", "repos.did") .leftJoin("records", (join) => join.onRef("records.uri", "=", (0, kysely_1.sql) `'at://' || subjects.did || '/' || subjects.recordPath`)) .selectAll(["subjects", "repos", "records"]); if (subjectType === "account") { builder = builder.where("recordPath", "=", ""); } else if (subjectType === "record") { builder = builder.where("recordPath", "!=", ""); } if (limit) { builder = builder.limit(limit); } if (cursor) { builder = builder.where("lastReportedAt", "<", cursor); } const results = await builder.orderBy("lastReportedAt", "desc").execute(); // @ts-ignore return results.map(transformers_1.transformFullStatusFromDatabase); }, async clearSubjects() { await this.initialize(); await db.deleteFrom("subjects").execute(); }, async getMissingRepoDids() { await this.initialize(); const results = await db .selectFrom("subjects") .select("did") .distinct() .where("did", "not in", (qb) => qb.selectFrom("repos").select(["did"])) .execute(); return results.map(({ did }) => did); }, async getMissingRecordUris() { await this.initialize(); const results = await db .selectFrom("subjects") .leftJoin("records", (join) => join.onRef("records.uri", "=", (0, kysely_1.sql) `'at://' || subjects.did || '/' || subjects.recordPath`)) .select(["subjects.did", "subjects.recordPath"]) .where("records.uri", "is", null) .where("subjects.recordPath", "!=", "") .execute(); return results.map(({ did, recordPath }) => `at://${did}/${recordPath}`); }, async saveRepos(repos) { await this.initialize(); await db.insertInto("repos").values(repos).execute(); }, async saveRecords(records) { await this.initialize(); await db.insertInto("records").values(records).execute(); }, async clear() { await db.schema.dropTable("subjects").execute(); await db.schema.dropTable("repos").execute(); }, };