Files
tweakcn/db/schema.ts
T
Sahaj Jain 4c41596712 AI theme generation just got 10x better (#165)
* feat: Add polar for tweakcn-plus checkout

* migrate to polar nextjs for more control

* chore: save closable chat suggestions state as a preference in local storage

* chore: improve color contrast in user UI message

* feat: add pro features components

* chore: update TextArea styles

* feat: adjust theme generation types, functions and API to support adding an image

* feat: AI components now support and display images

* feat: add support for multiple images

* feat: add support for multiple images to components

* feat: support image only prompts and clean up API code

* chore: save closable chat suggestions state as a preference in local storage

* chore: improve color contrast in user UI message

* feat: add pro features components

* chore: update TextArea styles

* feat: adjust theme generation types, functions and API to support adding an image

* feat: AI components now support and display images

* feat: add support for multiple images

* feat: add support for multiple images to components

* feat: support image only prompts and clean up API code

* add checkout link support

* add ai-usage schema and actions

* feat: dashboard: add AI usage stats with bar chart

* feat: enforce subscription limits and improved error handling for AI theme generation

* feat: Integrate alert-banner with actual usage

* fix: pricing navigation

* feat: Checkout link generation

* feat: add quick action to create a theme from an image in ai page

* feat: add drag and drop for images

* chore: move Image Upload constant vars and update imports

* feat: improve feedback while theme is being generated

* feat: Add pricing page UI

* refactor: Dashboard migration to Settings page

* feat: improve pricing page

* feat: add auth check in checkout and refactor implementation for consistency and typesafety

* refactor: adjust code and API to follow new types and useQuery hook typesafety

* refactor: alert banner displays correctly and uses the new subscription hook

* feat: improve UI feedback for Pro users

* feat: upload images by pasting (cmd/crtl + v)

* feat: add Go Pro dialog, and global store (no implemented in app yet)

* chore(WIP): scaffold of Pro subscription modal show logic

* feat: Add openProModal logic to handleGenerateTheme in chat-interface

* chore: save closable chat suggestions state as a preference in local storage

* chore: improve color contrast in user UI message

* feat: add pro features components

* chore: update TextArea styles

* feat: adjust theme generation types, functions and API to support adding an image

* feat: AI components now support and display images

* feat: add support for multiple images

* feat: add support for multiple images to components

* feat: support image only prompts and clean up API code

* add ai-usage schema and actions

* feat: dashboard: add AI usage stats with bar chart

* feat: enforce subscription limits and improved error handling for AI theme generation

* feat: Integrate alert-banner with actual usage

* fix: pricing navigation

* feat: Checkout link generation

* feat: add quick action to create a theme from an image in ai page

* feat: add drag and drop for images

* chore: move Image Upload constant vars and update imports

* feat: improve feedback while theme is being generated

* feat: Add pricing page UI

* refactor: Dashboard migration to Settings page

* feat: improve pricing page

* feat: add auth check in checkout and refactor implementation for consistency and typesafety

* refactor: adjust code and API to follow new types and useQuery hook typesafety

* refactor: alert banner displays correctly and uses the new subscription hook

* feat: improve UI feedback for Pro users

* feat: upload images by pasting (cmd/crtl + v)

* feat: add Go Pro dialog, and global store (no implemented in app yet)

* chore(WIP): scaffold of Pro subscription modal show logic

* feat: Add openProModal logic to handleGenerateTheme in chat-interface

* refactor: follow naming convention

* chore: refactor components and layout/pages for consistency

* fix: enforce auth checks or redirect in /settings routes

* chore: update Go Pro dialog

* refactor: create reusable theme toggle component

* feat: add Get Pro dialog to header

* chore: rename GoPro dialog to GetPro and update imports

* feat: add AI generation section to Home page and adjust Get Pro dialog

* chore: save closable chat suggestions state as a preference in local storage

* chore: improve color contrast in user UI message

* feat: add pro features components

* chore: update TextArea styles

* feat: adjust theme generation types, functions and API to support adding an image

* feat: AI components now support and display images

* feat: add support for multiple images

* feat: add support for multiple images to components

* feat: support image only prompts and clean up API code

* add ai-usage schema and actions

* feat: dashboard: add AI usage stats with bar chart

* feat: enforce subscription limits and improved error handling for AI theme generation

* feat: Integrate alert-banner with actual usage

* fix: pricing navigation

* feat: Checkout link generation

* feat: add quick action to create a theme from an image in ai page

* feat: add drag and drop for images

* chore: move Image Upload constant vars and update imports

* feat: improve feedback while theme is being generated

* feat: Add pricing page UI

* refactor: Dashboard migration to Settings page

* feat: improve pricing page

* feat: add auth check in checkout and refactor implementation for consistency and typesafety

* refactor: adjust code and API to follow new types and useQuery hook typesafety

* refactor: alert banner displays correctly and uses the new subscription hook

* feat: improve UI feedback for Pro users

* feat: upload images by pasting (cmd/crtl + v)

* feat: add Go Pro dialog, and global store (no implemented in app yet)

* chore(WIP): scaffold of Pro subscription modal show logic

* feat: Add openProModal logic to handleGenerateTheme in chat-interface

* refactor: follow naming convention

* chore: refactor components and layout/pages for consistency

* fix: enforce auth checks or redirect in /settings routes

* chore: update Go Pro dialog

* refactor: create reusable theme toggle component

* feat: add Get Pro dialog to header

* chore: rename GoPro dialog to GetPro and update imports

* feat: add AI generation section to Home page and adjust Get Pro dialog

* feat: Add customer portal

* feat: add chat input draft persistence (not images)

* styles: improve styles for ai generation and alert banner defaults

* feat: Send whole chat context to AI

* fix: silly typo lol

* feat: support images persistence and sync

* feat: edit message (text, mentions and images)

* fix: add eslint-disable for exhaustive-deps warnings

* chore: fix build error & improve text and styles in suggested prompts

* refactor: handle session and subscription checks and handle post login actions

* migrate to turbopack

* refactor: use reducer builder pattern to sync ai-draft-store with image-uploader

* fix: ai-usage computation: account for abort

* feat: Theme limit handling for pro tier

* refactor: remove duplicate code from ai-chat-form and chat-input

* feat: Add faq to pricing page

* fix: /dashboard navigations -> /settings

* feat: update ui for success page

* feat: Migrate ai chat and draft message store to idb-keyval

* feat: move subscription details in-house

* generate migration

* fix: build err

* styles: improve Message UI

* fix: allow scroll in GoPro dialog chat preview

* feat: improve AI usage feedback when theme generation when success or failure

* feat: Message UI enhancement when assistant message is error feedback

* feat: add latest features in /ai page and refactor Core Theme Generation logic hooks

* styles: improve styles and layout for consistency

* styles: improve styles in settings pages for consistency

* cancelled theme doesn't cost requests

* update next to latest (for turbopack compat)

* fail build if polar webhook secret is not set

* update polar sdk and nextjs plugin

* feat: Create customer before creating checkout for them

* chore: save closable chat suggestions state as a preference in local storage

* chore: improve color contrast in user UI message

* feat: add pro features components

* chore: update TextArea styles

* feat: adjust theme generation types, functions and API to support adding an image

* feat: AI components now support and display images

* feat: add support for multiple images

* feat: add support for multiple images to components

* feat: support image only prompts and clean up API code

* add ai-usage schema and actions

* feat: dashboard: add AI usage stats with bar chart

* feat: enforce subscription limits and improved error handling for AI theme generation

* feat: Integrate alert-banner with actual usage

* fix: pricing navigation

* feat: Checkout link generation

* feat: add quick action to create a theme from an image in ai page

* feat: add drag and drop for images

* chore: move Image Upload constant vars and update imports

* feat: improve feedback while theme is being generated

* feat: Add pricing page UI

* refactor: Dashboard migration to Settings page

* feat: improve pricing page

* feat: add auth check in checkout and refactor implementation for consistency and typesafety

* refactor: adjust code and API to follow new types and useQuery hook typesafety

* refactor: alert banner displays correctly and uses the new subscription hook

* feat: improve UI feedback for Pro users

* feat: upload images by pasting (cmd/crtl + v)

* feat: add Go Pro dialog, and global store (no implemented in app yet)

* chore(WIP): scaffold of Pro subscription modal show logic

* feat: Add openProModal logic to handleGenerateTheme in chat-interface

* refactor: follow naming convention

* chore: refactor components and layout/pages for consistency

* fix: enforce auth checks or redirect in /settings routes

* chore: update Go Pro dialog

* refactor: create reusable theme toggle component

* feat: add Get Pro dialog to header

* chore: rename GoPro dialog to GetPro and update imports

* feat: add AI generation section to Home page and adjust Get Pro dialog

* feat: Add customer portal

* feat: add chat input draft persistence (not images)

* styles: improve styles for ai generation and alert banner defaults

* feat: Send whole chat context to AI

* fix: silly typo lol

* feat: support images persistence and sync

* feat: edit message (text, mentions and images)

* fix: add eslint-disable for exhaustive-deps warnings

* chore: fix build error & improve text and styles in suggested prompts

* refactor: handle session and subscription checks and handle post login actions

* migrate to turbopack

* refactor: use reducer builder pattern to sync ai-draft-store with image-uploader

* fix: ai-usage computation: account for abort

* feat: Theme limit handling for pro tier

* refactor: remove duplicate code from ai-chat-form and chat-input

* feat: Add faq to pricing page

* fix: /dashboard navigations -> /settings

* feat: update ui for success page

* feat: Migrate ai chat and draft message store to idb-keyval

* feat: move subscription details in-house

* generate migration

* fix: build err

* styles: improve Message UI

* fix: allow scroll in GoPro dialog chat preview

* feat: improve AI usage feedback when theme generation when success or failure

* feat: Message UI enhancement when assistant message is error feedback

* feat: add latest features in /ai page and refactor Core Theme Generation logic hooks

* styles: improve styles and layout for consistency

* styles: improve styles in settings pages for consistency

* cancelled theme doesn't cost requests

* update next to latest (for turbopack compat)

* fail build if polar webhook secret is not set

* update polar sdk and nextjs plugin

* feat: Create customer before creating checkout for them

---------

Co-authored-by: Luis Llanes <luisllaboj@gmail.com>
2025-07-17 00:00:07 +05:30

102 lines
3.7 KiB
TypeScript

import { ThemeStyles } from "@/types/theme";
import { pgTable, json, timestamp, boolean, text, integer } from "drizzle-orm/pg-core";
export const user = pgTable("user", {
id: text("id").primaryKey(),
name: text("name").notNull(),
email: text("email").notNull().unique(),
emailVerified: boolean("email_verified").notNull(),
image: text("image"),
createdAt: timestamp("created_at").notNull(),
updatedAt: timestamp("updated_at").notNull(),
});
export const session = pgTable("session", {
id: text("id").primaryKey(),
expiresAt: timestamp("expires_at").notNull(),
token: text("token").notNull().unique(),
createdAt: timestamp("created_at").notNull(),
updatedAt: timestamp("updated_at").notNull(),
ipAddress: text("ip_address"),
userAgent: text("user_agent"),
userId: text("user_id")
.notNull()
.references(() => user.id, { onDelete: "cascade" }),
});
export const account = pgTable("account", {
id: text("id").primaryKey(),
accountId: text("account_id").notNull(),
providerId: text("provider_id").notNull(),
userId: text("user_id")
.notNull()
.references(() => user.id, { onDelete: "cascade" }),
accessToken: text("access_token"),
refreshToken: text("refresh_token"),
idToken: text("id_token"),
accessTokenExpiresAt: timestamp("access_token_expires_at"),
refreshTokenExpiresAt: timestamp("refresh_token_expires_at"),
scope: text("scope"),
password: text("password"),
createdAt: timestamp("created_at").notNull(),
updatedAt: timestamp("updated_at").notNull(),
});
export const verification = pgTable("verification", {
id: text("id").primaryKey(),
identifier: text("identifier").notNull(),
value: text("value").notNull(),
expiresAt: timestamp("expires_at").notNull(),
createdAt: timestamp("created_at"),
updatedAt: timestamp("updated_at"),
});
export const theme = pgTable("theme", {
id: text("id").primaryKey(),
userId: text("user_id")
.notNull()
.references(() => user.id, { onDelete: "cascade" }),
name: text("name").notNull(),
styles: json("styles").$type<ThemeStyles>().notNull(),
createdAt: timestamp("created_at").notNull(),
updatedAt: timestamp("updated_at").notNull(),
});
export const aiUsage = pgTable("ai_usage", {
id: text("id").primaryKey(),
userId: text("user_id")
.notNull()
.references(() => user.id, { onDelete: "cascade" }),
modelId: text("model_id").notNull(),
promptTokens: text("prompt_tokens").notNull().default("0"),
completionTokens: text("completion_tokens").notNull().default("0"),
daysSinceEpoch: text("days_since_epoch").notNull(),
createdAt: timestamp("created_at").notNull(),
});
export const subscription = pgTable("subscription", {
id: text("id").primaryKey(),
createdAt: timestamp("createdAt").notNull(),
modifiedAt: timestamp("modifiedAt"),
amount: integer("amount").notNull(),
currency: text("currency").notNull(),
recurringInterval: text("recurringInterval").notNull(),
status: text("status").notNull(),
currentPeriodStart: timestamp("currentPeriodStart").notNull(),
currentPeriodEnd: timestamp("currentPeriodEnd").notNull(),
cancelAtPeriodEnd: boolean("cancelAtPeriodEnd").notNull().default(false),
canceledAt: timestamp("canceledAt"),
startedAt: timestamp("startedAt").notNull(),
endsAt: timestamp("endsAt"),
endedAt: timestamp("endedAt"),
customerId: text("customerId").notNull(),
productId: text("productId").notNull(),
discountId: text("discountId"),
checkoutId: text("checkoutId").notNull(),
customerCancellationReason: text("customerCancellationReason"),
customerCancellationComment: text("customerCancellationComment"),
metadata: text("metadata"), // JSON string
customFieldData: text("customFieldData"), // JSON string
userId: text("userId").references(() => user.id),
});