From 785a5b574992296e187a66412dd42f7b4a686353 Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Tue, 19 Mar 2024 00:33:11 +0000 Subject: Feature: Add support for uploading images and automatically inferring their tags (#2) * feature: Experimental support for asset uploads * feature(web): Add new bookmark type asset * feature: Add support for automatically tagging images * fix: Add support for image assets in preview page * use next Image for fetching the images * Fix auth and error codes in the route handlers * Add support for image uploads on mobile * Fix typing of upload requests * Remove the ugly dragging box * Bump mobile version to 1.3 * Change the editor card placeholder to mention uploading images * Fix a typo * Change ios icon for photo library * Silence typescript error --- packages/db/schema.ts | 95 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 68 insertions(+), 27 deletions(-) (limited to 'packages/db/schema.ts') diff --git a/packages/db/schema.ts b/packages/db/schema.ts index 6063fccc..769632d9 100644 --- a/packages/db/schema.ts +++ b/packages/db/schema.ts @@ -1,14 +1,15 @@ +import type { AdapterAccount } from "@auth/core/adapters"; +import { createId } from "@paralleldrive/cuid2"; +import { relations } from "drizzle-orm"; import { + blob, + index, integer, + primaryKey, sqliteTable, text, - primaryKey, unique, - index, } from "drizzle-orm/sqlite-core"; -import type { AdapterAccount } from "@auth/core/adapters"; -import { createId } from "@paralleldrive/cuid2"; -import { relations } from "drizzle-orm"; function createdAtField() { return integer("createdAt", { mode: "timestamp" }) @@ -96,28 +97,32 @@ export const apiKeys = sqliteTable( }), ); -export const bookmarks = sqliteTable("bookmarks", { - id: text("id") - .notNull() - .primaryKey() - .$defaultFn(() => createId()), - createdAt: createdAtField(), - archived: integer("archived", { mode: "boolean" }).notNull().default(false), - favourited: integer("favourited", { mode: "boolean" }) - .notNull() - .default(false), - userId: text("userId") - .notNull() - .references(() => users.id, { onDelete: "cascade" }), - taggingStatus: text("taggingStatus", { - enum: ["pending", "failure", "success"], - }).default("pending"), -}, (b) => ({ - userIdIdx: index("bookmarks_userId_idx").on(b.userId), - archivedIdx: index("bookmarks_archived_idx").on(b.archived), - favIdx: index("bookmarks_favourited_idx").on(b.favourited), - createdAtIdx: index("bookmarks_createdAt_idx").on(b.createdAt), -})); +export const bookmarks = sqliteTable( + "bookmarks", + { + id: text("id") + .notNull() + .primaryKey() + .$defaultFn(() => createId()), + createdAt: createdAtField(), + archived: integer("archived", { mode: "boolean" }).notNull().default(false), + favourited: integer("favourited", { mode: "boolean" }) + .notNull() + .default(false), + userId: text("userId") + .notNull() + .references(() => users.id, { onDelete: "cascade" }), + taggingStatus: text("taggingStatus", { + enum: ["pending", "failure", "success"], + }).default("pending"), + }, + (b) => ({ + userIdIdx: index("bookmarks_userId_idx").on(b.userId), + archivedIdx: index("bookmarks_archived_idx").on(b.archived), + favIdx: index("bookmarks_favourited_idx").on(b.favourited), + createdAtIdx: index("bookmarks_createdAt_idx").on(b.createdAt), + }), +); export const bookmarkLinks = sqliteTable("bookmarkLinks", { id: text("id") @@ -146,6 +151,18 @@ export const bookmarkTexts = sqliteTable("bookmarkTexts", { text: text("text"), }); +export const bookmarkAssets = sqliteTable("bookmarkAssets", { + id: text("id") + .notNull() + .primaryKey() + .$defaultFn(() => createId()) + .references(() => bookmarks.id, { onDelete: "cascade" }), + assetType: text("assetType", { enum: ["image"] }).notNull(), + assetId: text("assetId") + .notNull() + .references(() => assets.id, { onDelete: "cascade" }), +}); + export const bookmarkTags = sqliteTable( "bookmarkTags", { @@ -208,6 +225,26 @@ export const bookmarkLists = sqliteTable( }), ); +export const assets = sqliteTable( + "assets", + { + id: text("id") + .notNull() + .primaryKey() + .$defaultFn(() => createId()), + userId: text("userId") + .notNull() + .references(() => users.id, { onDelete: "cascade" }), + createdAt: createdAtField(), + contentType: text("contentType").notNull(), + encoding: text("encoding", { enum: ["binary"] }).notNull(), + blob: blob("blob").notNull(), + }, + (a) => ({ + userIdIdx: index("assets_userId_idx").on(a.userId), + }), +); + export const bookmarksInLists = sqliteTable( "bookmarksInLists", { @@ -248,6 +285,10 @@ export const bookmarkRelations = relations(bookmarks, ({ many, one }) => ({ fields: [bookmarks.id], references: [bookmarkTexts.id], }), + asset: one(bookmarkAssets, { + fields: [bookmarks.id], + references: [bookmarkAssets.id], + }), tagsOnBookmarks: many(tagsOnBookmarks), bookmarksInLists: many(bookmarksInLists), })); -- cgit v1.2.3-70-g09d2