Folo/apps/mobile/src/database/schemas/index.ts

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)`),
}))