From d1d5263486f96db578aad918a59007045c3c077f Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sun, 13 Jul 2025 09:28:24 +0000 Subject: feat: Add stripe based subscriptions --- packages/db/schema.ts | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'packages/db/schema.ts') diff --git a/packages/db/schema.ts b/packages/db/schema.ts index 79cf2def..6dacdec6 100644 --- a/packages/db/schema.ts +++ b/packages/db/schema.ts @@ -584,6 +584,51 @@ export const invites = sqliteTable("invites", { .references(() => users.id, { onDelete: "cascade" }), }); +export const subscriptions = sqliteTable( + "subscriptions", + { + id: text("id") + .notNull() + .primaryKey() + .$defaultFn(() => createId()), + userId: text("userId") + .notNull() + .references(() => users.id, { onDelete: "cascade" }) + .unique(), + stripeCustomerId: text("stripeCustomerId").notNull(), + stripeSubscriptionId: text("stripeSubscriptionId"), + status: text("status", { + enum: [ + "active", + "canceled", + "past_due", + "unpaid", + "incomplete", + "trialing", + "incomplete_expired", + "paused", + ], + }).notNull(), + tier: text("tier", { + enum: ["free", "paid"], + }) + .notNull() + .default("free"), + priceId: text("priceId"), + cancelAtPeriodEnd: integer("cancelAtPeriodEnd", { + mode: "boolean", + }).default(false), + startDate: integer("startDate", { mode: "timestamp" }), + endDate: integer("endDate", { mode: "timestamp" }), + createdAt: createdAtField(), + modifiedAt: modifiedAtField(), + }, + (s) => [ + index("subscriptions_userId_idx").on(s.userId), + index("subscriptions_stripeCustomerId_idx").on(s.stripeCustomerId), + ], +); + // Relations export const userRelations = relations(users, ({ many, one }) => ({ @@ -596,6 +641,7 @@ export const userRelations = relations(users, ({ many, one }) => ({ fields: [users.id], references: [userSettings.userId], }), + subscription: one(subscriptions), })); export const bookmarkRelations = relations(bookmarks, ({ many, one }) => ({ @@ -745,6 +791,13 @@ export const invitesRelations = relations(invites, ({ one }) => ({ }), })); +export const subscriptionsRelations = relations(subscriptions, ({ one }) => ({ + user: one(users, { + fields: [subscriptions.userId], + references: [users.id], + }), +})); + export const passwordResetTokensRelations = relations( passwordResetTokens, ({ one }) => ({ -- cgit v1.2.3-70-g09d2