From 8b3a4c475f69ddf32351b36d658fed3eac9b6f9e Mon Sep 17 00:00:00 2001 From: Anton Date: Wed, 4 Mar 2026 13:38:07 +0300 Subject: [PATCH] feat: add users and auth tables schema Made-with: Cursor --- src/db/schema/index.ts | 3 +++ src/db/schema/sessions.ts | 18 ++++++++++++++++++ src/db/schema/subscriptions.ts | 21 +++++++++++++++++++++ src/db/schema/users.ts | 21 +++++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 src/db/schema/sessions.ts create mode 100644 src/db/schema/subscriptions.ts create mode 100644 src/db/schema/users.ts diff --git a/src/db/schema/index.ts b/src/db/schema/index.ts index e07cb22..d5c86ad 100644 --- a/src/db/schema/index.ts +++ b/src/db/schema/index.ts @@ -1 +1,4 @@ export * from './enums.js'; +export * from './users.js'; +export * from './sessions.js'; +export * from './subscriptions.js'; diff --git a/src/db/schema/sessions.ts b/src/db/schema/sessions.ts new file mode 100644 index 0000000..954dfca --- /dev/null +++ b/src/db/schema/sessions.ts @@ -0,0 +1,18 @@ +import { pgTable, uuid, varchar, timestamp } from 'drizzle-orm/pg-core'; +import { users } from './users.js'; + +export const sessions = pgTable('sessions', { + id: uuid('id').primaryKey().defaultRandom(), + userId: uuid('user_id') + .notNull() + .references(() => users.id, { onDelete: 'cascade' }), + refreshTokenHash: varchar('refresh_token_hash', { length: 255 }).notNull(), + userAgent: varchar('user_agent', { length: 500 }), + ipAddress: varchar('ip_address', { length: 45 }), + lastActiveAt: timestamp('last_active_at', { withTimezone: true }).notNull().defaultNow(), + expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(), + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), +}); + +export type Session = typeof sessions.$inferSelect; +export type NewSession = typeof sessions.$inferInsert; diff --git a/src/db/schema/subscriptions.ts b/src/db/schema/subscriptions.ts new file mode 100644 index 0000000..cf6c77c --- /dev/null +++ b/src/db/schema/subscriptions.ts @@ -0,0 +1,21 @@ +import { pgTable, uuid, varchar, timestamp } from 'drizzle-orm/pg-core'; +import { planEnum, subscriptionStatusEnum } from './enums.js'; +import { users } from './users.js'; + +export const subscriptions = pgTable('subscriptions', { + id: uuid('id').primaryKey().defaultRandom(), + userId: uuid('user_id') + .notNull() + .references(() => users.id, { onDelete: 'cascade' }) + .unique(), + plan: planEnum('plan').notNull(), + status: subscriptionStatusEnum('status').notNull(), + startedAt: timestamp('started_at', { withTimezone: true }).notNull(), + expiresAt: timestamp('expires_at', { withTimezone: true }), + cancelledAt: timestamp('cancelled_at', { withTimezone: true }), + paymentProvider: varchar('payment_provider', { length: 50 }), + externalId: varchar('external_id', { length: 255 }), +}); + +export type Subscription = typeof subscriptions.$inferSelect; +export type NewSubscription = typeof subscriptions.$inferInsert; diff --git a/src/db/schema/users.ts b/src/db/schema/users.ts new file mode 100644 index 0000000..f863d9d --- /dev/null +++ b/src/db/schema/users.ts @@ -0,0 +1,21 @@ +import { pgTable, uuid, varchar, timestamp, boolean } from 'drizzle-orm/pg-core'; +import { userRoleEnum, selfLevelEnum } from './enums.js'; + +export const users = pgTable('users', { + id: uuid('id').primaryKey().defaultRandom(), + email: varchar('email', { length: 255 }).notNull().unique(), + passwordHash: varchar('password_hash', { length: 255 }).notNull(), + nickname: varchar('nickname', { length: 30 }).notNull(), + avatarUrl: varchar('avatar_url', { length: 500 }), + country: varchar('country', { length: 100 }), + city: varchar('city', { length: 100 }), + selfLevel: selfLevelEnum('self_level'), + isPublic: boolean('is_public').notNull().default(true), + role: userRoleEnum('role').notNull().default('free'), + emailVerifiedAt: timestamp('email_verified_at', { withTimezone: true }), + createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(), + updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(), +}); + +export type User = typeof users.$inferSelect; +export type NewUser = typeof users.$inferInsert;