mirror of
https://github.com/hex248/sprint.git
synced 2026-02-07 18:23:03 +00:00
Subscription, Payment and User.plan
This commit is contained in:
30
packages/backend/drizzle/0026_stale_shocker.sql
Normal file
30
packages/backend/drizzle/0026_stale_shocker.sql
Normal file
@@ -0,0 +1,30 @@
|
||||
CREATE TABLE "Payment" (
|
||||
"id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "Payment_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
||||
"subscriptionId" integer NOT NULL,
|
||||
"stripePaymentIntentId" varchar(255),
|
||||
"amount" integer NOT NULL,
|
||||
"currency" varchar(3) DEFAULT 'gbp' NOT NULL,
|
||||
"status" varchar(32) NOT NULL,
|
||||
"createdAt" timestamp DEFAULT now()
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE "Subscription" (
|
||||
"id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "Subscription_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
|
||||
"userId" integer NOT NULL,
|
||||
"stripeCustomerId" varchar(255),
|
||||
"stripeSubscriptionId" varchar(255),
|
||||
"stripeSubscriptionItemId" varchar(255),
|
||||
"stripePriceId" varchar(255),
|
||||
"status" varchar(32) DEFAULT 'incomplete' NOT NULL,
|
||||
"currentPeriodStart" timestamp,
|
||||
"currentPeriodEnd" timestamp,
|
||||
"cancelAtPeriodEnd" boolean DEFAULT false NOT NULL,
|
||||
"trialEnd" timestamp,
|
||||
"quantity" integer DEFAULT 1 NOT NULL,
|
||||
"createdAt" timestamp DEFAULT now(),
|
||||
"updatedAt" timestamp DEFAULT now()
|
||||
);
|
||||
--> statement-breakpoint
|
||||
ALTER TABLE "User" ADD COLUMN "plan" varchar(32) DEFAULT 'free' NOT NULL;--> statement-breakpoint
|
||||
ALTER TABLE "Payment" ADD CONSTRAINT "Payment_subscriptionId_Subscription_id_fk" FOREIGN KEY ("subscriptionId") REFERENCES "public"."Subscription"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
||||
ALTER TABLE "Subscription" ADD CONSTRAINT "Subscription_userId_User_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE no action ON UPDATE no action;
|
||||
1146
packages/backend/drizzle/meta/0026_snapshot.json
Normal file
1146
packages/backend/drizzle/meta/0026_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -183,6 +183,13 @@
|
||||
"when": 1769549697892,
|
||||
"tag": "0025_sharp_quicksilver",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 26,
|
||||
"version": "7",
|
||||
"when": 1769615487574,
|
||||
"tag": "0026_stale_shocker",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import { integer, json, pgTable, timestamp, uniqueIndex, varchar } from "drizzle-orm/pg-core";
|
||||
import { boolean, integer, json, pgTable, timestamp, uniqueIndex, varchar } from "drizzle-orm/pg-core";
|
||||
import { createInsertSchema, createSelectSchema } from "drizzle-zod";
|
||||
import type { z } from "zod";
|
||||
import {
|
||||
@@ -59,6 +59,7 @@ export const User = pgTable("User", {
|
||||
passwordHash: varchar({ length: 255 }).notNull(),
|
||||
avatarURL: varchar({ length: 512 }),
|
||||
iconPreference: varchar({ length: 10 }).notNull().default("pixel").$type<IconStyle>(),
|
||||
plan: varchar({ length: 32 }).notNull().default("free"),
|
||||
createdAt: timestamp({ withTimezone: false }).defaultNow(),
|
||||
updatedAt: timestamp({ withTimezone: false }).defaultNow(),
|
||||
});
|
||||
@@ -295,3 +296,50 @@ export type TimerState = {
|
||||
timestamps: string[];
|
||||
endedAt: string | null;
|
||||
} | null;
|
||||
|
||||
// Subscription table - tracks user subscriptions
|
||||
export const Subscription = pgTable("Subscription", {
|
||||
id: integer().primaryKey().generatedAlwaysAsIdentity(),
|
||||
userId: integer()
|
||||
.notNull()
|
||||
.references(() => User.id),
|
||||
stripeCustomerId: varchar({ length: 255 }),
|
||||
stripeSubscriptionId: varchar({ length: 255 }),
|
||||
stripeSubscriptionItemId: varchar({ length: 255 }),
|
||||
stripePriceId: varchar({ length: 255 }),
|
||||
status: varchar({ length: 32 }).notNull().default("incomplete"),
|
||||
currentPeriodStart: timestamp({ withTimezone: false }),
|
||||
currentPeriodEnd: timestamp({ withTimezone: false }),
|
||||
cancelAtPeriodEnd: boolean().notNull().default(false),
|
||||
trialEnd: timestamp({ withTimezone: false }),
|
||||
quantity: integer().notNull().default(1),
|
||||
createdAt: timestamp({ withTimezone: false }).defaultNow(),
|
||||
updatedAt: timestamp({ withTimezone: false }).defaultNow(),
|
||||
});
|
||||
|
||||
// Payment history table
|
||||
export const Payment = pgTable("Payment", {
|
||||
id: integer().primaryKey().generatedAlwaysAsIdentity(),
|
||||
subscriptionId: integer()
|
||||
.notNull()
|
||||
.references(() => Subscription.id),
|
||||
stripePaymentIntentId: varchar({ length: 255 }),
|
||||
amount: integer().notNull(),
|
||||
currency: varchar({ length: 3 }).notNull().default("gbp"),
|
||||
status: varchar({ length: 32 }).notNull(),
|
||||
createdAt: timestamp({ withTimezone: false }).defaultNow(),
|
||||
});
|
||||
|
||||
// Zod schemas for Subscription and Payment
|
||||
export const SubscriptionSelectSchema = createSelectSchema(Subscription);
|
||||
export const SubscriptionInsertSchema = createInsertSchema(Subscription);
|
||||
|
||||
export const PaymentSelectSchema = createSelectSchema(Payment);
|
||||
export const PaymentInsertSchema = createInsertSchema(Payment);
|
||||
|
||||
// Types for Subscription and Payment
|
||||
export type SubscriptionRecord = z.infer<typeof SubscriptionSelectSchema>;
|
||||
export type SubscriptionInsert = z.infer<typeof SubscriptionInsertSchema>;
|
||||
|
||||
export type PaymentRecord = z.infer<typeof PaymentSelectSchema>;
|
||||
export type PaymentInsert = z.infer<typeof PaymentInsertSchema>;
|
||||
|
||||
Reference in New Issue
Block a user