aboutsummaryrefslogtreecommitdiffstats
path: root/packages/db/schema.ts
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-07-13 09:28:24 +0000
committerMohamed Bassem <me@mbassem.com>2025-07-13 20:44:00 +0000
commitd1d5263486f96db578aad918a59007045c3c077f (patch)
treedf65f062b6eda93364f7d509fc2c52663561097a /packages/db/schema.ts
parent845ccf1ad46c8635782f8e10280b07c48c08eaf5 (diff)
downloadkarakeep-d1d5263486f96db578aad918a59007045c3c077f.tar.zst
feat: Add stripe based subscriptions
Diffstat (limited to 'packages/db/schema.ts')
-rw-r--r--packages/db/schema.ts53
1 files changed, 53 insertions, 0 deletions
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 }) => ({