import { sql } from "drizzle-orm"; import { integer, sqliteTable, text, uniqueIndex } from "drizzle-orm/sqlite-core"; import { users } from "./auth"; export const rssFeeds = sqliteTable( "rss_feeds", { id: integer().primaryKey(), userId: integer("user_id") .notNull() .references(() => users.id, { onDelete: "cascade" }), feedUrl: text("feed_url").notNull(), title: text(), siteUrl: text("site_url"), lastFetchedAt: integer("last_fetched_at", { mode: "timestamp_ms" }), lastError: text("last_error"), pollIntervalMinutes: integer("poll_interval_minutes"), createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), }, (table) => [uniqueIndex("rss_feeds_user_id_feed_url_unique").on(table.userId, table.feedUrl)], ); export const rssItems = sqliteTable( "rss_items", { id: integer().primaryKey(), userId: integer("user_id") .notNull() .references(() => users.id, { onDelete: "cascade" }), feedId: integer("feed_id") .notNull() .references(() => rssFeeds.id, { onDelete: "cascade" }), guid: text(), canonicalUrl: text("canonical_url").notNull(), title: text(), summary: text(), contentSnippet: text("content_snippet"), author: text(), publishedAt: integer("published_at", { mode: "timestamp_ms" }), visibility: text().notNull().default("private"), shareToken: text("share_token"), createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), }, (table) => [ uniqueIndex("rss_items_feed_id_guid_unique") .on(table.feedId, table.guid) .where(sql`${table.guid} IS NOT NULL`), ], );