122 lines
3.8 KiB
TypeScript
122 lines
3.8 KiB
TypeScript
import type { FeedViewType } from "@follow/constants"
|
|
import { sql } from "drizzle-orm"
|
|
import { integer, sqliteTable, text, uniqueIndex } from "drizzle-orm/sqlite-core"
|
|
|
|
import type {
|
|
ActionSettings,
|
|
AttachmentsModel,
|
|
ExtraModel,
|
|
ImageColorsResult,
|
|
MediaModel,
|
|
} from "./types"
|
|
|
|
export const feedsTable = sqliteTable("feeds", {
|
|
id: text("id").primaryKey(),
|
|
title: text("title"),
|
|
url: text("url").notNull(),
|
|
description: text("description"),
|
|
image: text("image"),
|
|
errorAt: text("error_at"),
|
|
siteUrl: text("site_url"),
|
|
ownerUserId: text("owner_user_id"),
|
|
errorMessage: text("error_message"),
|
|
})
|
|
|
|
export const subscriptionsTable = sqliteTable("subscriptions", {
|
|
feedId: text("feed_id"),
|
|
listId: text("list_id"),
|
|
inboxId: text("inbox_id"),
|
|
userId: text("user_id").notNull(),
|
|
view: integer("view").notNull().$type<FeedViewType>(),
|
|
isPrivate: integer("is_private").notNull(),
|
|
title: text("title"),
|
|
category: text("category"),
|
|
createdAt: text("created_at"),
|
|
type: text("type").notNull().$type<"feed" | "list" | "inbox">(),
|
|
id: text("id").primaryKey(),
|
|
})
|
|
|
|
export const inboxesTable = sqliteTable("inboxes", {
|
|
id: text("id").primaryKey(),
|
|
title: text("title"),
|
|
})
|
|
|
|
export const listsTable = sqliteTable("lists", {
|
|
id: text("id").primaryKey(),
|
|
userId: text("user_id").notNull(),
|
|
title: text("title").notNull(),
|
|
feedIds: text("feed_ids", { mode: "json" }).$type<string>(),
|
|
description: text("description"),
|
|
view: integer("view").notNull().$type<FeedViewType>(),
|
|
image: text("image"),
|
|
fee: integer("fee"),
|
|
ownerUserId: text("owner_user_id"),
|
|
})
|
|
|
|
export const unreadTable = sqliteTable("unread", {
|
|
subscriptionId: text("subscription_id").notNull().primaryKey(),
|
|
count: integer("count").notNull(),
|
|
})
|
|
|
|
export const usersTable = sqliteTable("users", {
|
|
id: text("id").primaryKey(),
|
|
email: text("email"),
|
|
handle: text("handle"),
|
|
name: text("name"),
|
|
image: text("image"),
|
|
isMe: integer("is_me").notNull(),
|
|
})
|
|
|
|
export const entriesTable = sqliteTable("entries", {
|
|
id: text("id").primaryKey(),
|
|
title: text("title"),
|
|
url: text("url"),
|
|
content: text("content"),
|
|
readabilityContent: text("source_content"),
|
|
description: text("description"),
|
|
guid: text("guid").notNull(),
|
|
author: text("author"),
|
|
authorUrl: text("author_url"),
|
|
authorAvatar: text("author_avatar"),
|
|
insertedAt: integer("inserted_at", { mode: "timestamp" }).notNull(),
|
|
publishedAt: integer("published_at", { mode: "timestamp" }).notNull(),
|
|
media: text("media", { mode: "json" }).$type<MediaModel[]>(),
|
|
categories: text("categories", { mode: "json" }).$type<string[]>(),
|
|
attachments: text("attachments", { mode: "json" }).$type<AttachmentsModel[]>(),
|
|
extra: text("extra", { mode: "json" }).$type<ExtraModel>(),
|
|
language: text("language"),
|
|
|
|
feedId: text("feed_id"),
|
|
|
|
inboxHandle: text("inbox_handle"),
|
|
read: integer("read", { mode: "boolean" }),
|
|
sources: text("sources", { mode: "json" }).$type<string[]>(),
|
|
settings: text("settings", { mode: "json" }).$type<ActionSettings>(),
|
|
})
|
|
|
|
export const collectionsTable = sqliteTable("collections", {
|
|
feedId: text("feed_id"),
|
|
entryId: text("entry_id").notNull().primaryKey(),
|
|
createdAt: text("created_at"),
|
|
view: integer("view").notNull().$type<FeedViewType>(),
|
|
})
|
|
|
|
export const summariesTable = sqliteTable(
|
|
"summaries",
|
|
{
|
|
entryId: text("entry_id").notNull().primaryKey(),
|
|
summary: text("summary").notNull(),
|
|
createdAt: text("created_at").$defaultFn(() => new Date().toISOString()),
|
|
language: text("language"),
|
|
},
|
|
(table) => ({
|
|
unq: uniqueIndex("unq").on(table.entryId, table.language),
|
|
}),
|
|
)
|
|
|
|
export const imagesTable = sqliteTable("images", (t) => ({
|
|
url: t.text("url").notNull().primaryKey(),
|
|
colors: t.text("colors", { mode: "json" }).$type<ImageColorsResult>().notNull(),
|
|
createdAt: t.integer("created_at", { mode: "timestamp" }).default(sql`(CURRENT_TIMESTAMP)`),
|
|
}))
|