mirror of
https://gitea.gofwd.group/dstrawsb/ballistic-builder.git
synced 2025-12-06 02:36:44 -05:00
534 lines
22 KiB
TypeScript
534 lines
22 KiB
TypeScript
import { pgTableCreator, integer, varchar, text, numeric, timestamp, unique, check, bigserial, date, boolean, uuid, bigint, real, doublePrecision, primaryKey, pgView, index, serial } from "drizzle-orm/pg-core"
|
|
import { relations, sql } from "drizzle-orm"
|
|
import { DATABASE_PREFIX as prefix } from "@lib/constants";
|
|
|
|
export const pgTable = pgTableCreator((name) => (prefix == "") ? name:`${prefix}_${name}`);
|
|
|
|
export const products = pgTable("products", {
|
|
id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "products_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
name: varchar({ length: 255 }).notNull(),
|
|
description: text().notNull(),
|
|
price: numeric().notNull(),
|
|
resellerId: integer("reseller_id").notNull(),
|
|
categoryId: integer("category_id").notNull(),
|
|
stockQty: integer("stock_qty").default(0),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
});
|
|
|
|
export const categories = pgTable("categories", {
|
|
id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "categories_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
name: varchar({ length: 100 }).notNull(),
|
|
parentCategoryId: integer("parent_category_id"),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
uuid: uuid().defaultRandom(),
|
|
});
|
|
|
|
export const productFeeds = pgTable("product_feeds", {
|
|
id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "productfeeds_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
resellerId: integer("reseller_id").notNull(),
|
|
feedUrl: varchar("feed_url", { length: 255 }).notNull(),
|
|
lastUpdate: timestamp("last_update", { mode: 'string' }),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
uuid: uuid().defaultRandom(),
|
|
}, (table) => {
|
|
return {
|
|
productFeedsUuidUnique: unique("product_feeds_uuid_unique").on(table.uuid),
|
|
}
|
|
});
|
|
|
|
export const userActivityLog = pgTable("user_activity_log", {
|
|
// You can use { mode: "bigint" } if numbers are exceeding js number limitations
|
|
id: bigint({ mode: "number" }).primaryKey().generatedAlwaysAsIdentity({ name: "user_activity_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
// You can use { mode: "bigint" } if numbers are exceeding js number limitations
|
|
userId: bigint("user_id", { mode: "number" }).notNull(),
|
|
activity: text().notNull(),
|
|
timestamp: timestamp({ mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
});
|
|
|
|
export const brands = pgTable("brands", {
|
|
id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "brands_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
name: varchar({ length: 100 }).notNull(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
uuid: uuid().defaultRandom(),
|
|
}, (table) => {
|
|
return {
|
|
brandsUuidUnique: unique("brands_uuid_unique").on(table.uuid),
|
|
}
|
|
});
|
|
|
|
|
|
export const manufacturer = pgTable("manufacturer", {
|
|
id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "manufacturer_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
name: varchar({ length: 100 }).notNull(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
uuid: uuid().defaultRandom(),
|
|
}, (table) => {
|
|
return {
|
|
manufacturerUuidUnique: unique("manufacturer_uuid_unique").on(table.uuid),
|
|
}
|
|
});
|
|
|
|
export const states = pgTable("states", {
|
|
id: integer().primaryKey().generatedByDefaultAsIdentity({ name: "states_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
state: varchar({ length: 50 }),
|
|
abbreviation: varchar({ length: 50 }),
|
|
});
|
|
|
|
export const componentType = pgTable("component_type", {
|
|
id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "component_type_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
name: varchar({ length: 100 }).notNull(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
uuid: uuid().defaultRandom(),
|
|
}, (table) => {
|
|
return {
|
|
componentTypeUuidUnique: unique("component_type_uuid_unique").on(table.uuid),
|
|
}
|
|
});
|
|
|
|
export const aeroPrecision = pgTable("aero_precision", {
|
|
sku: text().primaryKey().notNull(),
|
|
manufacturerId: text("manufacturer_id"),
|
|
brandName: text("brand_name"),
|
|
productName: text("product_name"),
|
|
longDescription: text("long_description"),
|
|
shortDescription: text("short_description"),
|
|
department: text(),
|
|
category: text(),
|
|
subcategory: text(),
|
|
thumbUrl: text("thumb_url"),
|
|
imageUrl: text("image_url"),
|
|
buyLink: text("buy_link"),
|
|
keywords: text(),
|
|
reviews: text(),
|
|
retailPrice: numeric("retail_price"),
|
|
salePrice: numeric("sale_price"),
|
|
brandPageLink: text("brand_page_link"),
|
|
brandLogoImage: text("brand_logo_image"),
|
|
productPageViewTracking: text("product_page_view_tracking"),
|
|
variantsXml: text("variants_xml"),
|
|
mediumImageUrl: text("medium_image_url"),
|
|
productContentWidget: text("product_content_widget"),
|
|
googleCategorization: text("google_categorization"),
|
|
itemBasedCommission: text("item_based_commission"),
|
|
uuid: uuid().defaultRandom(),
|
|
});
|
|
|
|
export const compartment = pgTable("compartment", {
|
|
id: uuid().defaultRandom().primaryKey().notNull(),
|
|
name: varchar({ length: 100 }).notNull(),
|
|
description: varchar({ length: 300 }),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
});
|
|
|
|
export const builds = pgTable("builds", {
|
|
id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "build_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
accountId: integer("account_id").notNull(),
|
|
name: varchar({ length: 255 }).notNull(),
|
|
description: text(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
uuid: uuid().defaultRandom(),
|
|
}, (table) => {
|
|
return {
|
|
buildsUuidUnique: unique("builds_uuid_unique").on(table.uuid),
|
|
}
|
|
});
|
|
|
|
export const bb_products = pgTable("bb_products", {
|
|
uuid: uuid().defaultRandom().primaryKey().notNull(),
|
|
upc: varchar("UPC", { length: 100 }),
|
|
sku: varchar("SKU", { length: 50 }),
|
|
manufacturerId: varchar("MANUFACTURER_ID", { length: 50 }),
|
|
brandName: varchar("BRAND_NAME", { length: 50 }),
|
|
productName: varchar("PRODUCT_NAME", { length: 255 }),
|
|
longDescription: text("LONG_DESCRIPTION"),
|
|
shortDescription: varchar("SHORT_DESCRIPTION", { length: 500 }),
|
|
department: varchar("DEPARTMENT", { length: 100 }),
|
|
category: varchar("CATEGORY", { length: 100 }),
|
|
subcategory: varchar("SUBCATEGORY", { length: 100 }),
|
|
thumbUrl: varchar("THUMB_URL", { length: 500 }),
|
|
imageUrl: varchar("IMAGE_URL", { length: 500 }),
|
|
buyLink: varchar("BUY_LINK", { length: 500 }),
|
|
keywords: varchar("KEYWORDS", { length: 500 }),
|
|
reviews: varchar("REVIEWS", { length: 500 }),
|
|
retailPrice: varchar("RETAIL_PRICE", { length: 50 }),
|
|
salePrice: varchar("SALE_PRICE", { length: 50 }),
|
|
brandPageLink: varchar("BRAND_PAGE_LINK", { length: 500 }),
|
|
brandLogoImage: varchar("BRAND_LOGO_IMAGE", { length: 500 }),
|
|
productPageViewTracking: varchar("PRODUCT_PAGE_VIEW_TRACKING", { length: 500 }),
|
|
parentGroupId: varchar("PARENT_GROUP_ID", { length: 200 }),
|
|
fineline: varchar("FINELINE", { length: 200 }),
|
|
superfineline: varchar("SUPERFINELINE", { length: 200 }),
|
|
modelnumber: varchar("MODELNUMBER", { length: 100 }),
|
|
caliber: varchar("CALIBER", { length: 200 }),
|
|
mediumImageUrl: varchar("MEDIUM_IMAGE_URL", { length: 500 }),
|
|
productContentWidget: varchar("PRODUCT_CONTENT_WIDGET", { length: 500 }),
|
|
googleCategorization: varchar("GOOGLE_CATEGORIZATION", { length: 500 }),
|
|
itemBasedCommission: varchar("ITEM_BASED_COMMISSION", { length: 500 }),
|
|
itemBasedCommissionRate: varchar("ITEM_BASED_COMMISSION RATE", { length: 50 }),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
});
|
|
|
|
export const psa_old = pgTable("psa_old", {
|
|
sku: varchar("SKU", { length: 50 }),
|
|
manufacturerId: varchar("MANUFACTURER_ID", { length: 50 }),
|
|
brandName: varchar("BRAND_NAME", { length: 50 }),
|
|
productName: varchar("PRODUCT_NAME", { length: 255 }),
|
|
longDescription: text("LONG_DESCRIPTION"),
|
|
shortDescription: varchar("SHORT_DESCRIPTION", { length: 50 }),
|
|
department: varchar("DEPARTMENT", { length: 50 }),
|
|
category: varchar("CATEGORY", { length: 50 }),
|
|
subcategory: varchar("SUBCATEGORY", { length: 50 }),
|
|
thumbUrl: varchar("THUMB_URL", { length: 50 }),
|
|
imageUrl: varchar("IMAGE_URL", { length: 50 }),
|
|
buyLink: varchar("BUY_LINK", { length: 128 }),
|
|
keywords: varchar("KEYWORDS", { length: 50 }),
|
|
reviews: varchar("REVIEWS", { length: 50 }),
|
|
retailPrice: real("RETAIL_PRICE"),
|
|
salePrice: real("SALE_PRICE"),
|
|
brandPageLink: varchar("BRAND_PAGE_LINK", { length: 50 }),
|
|
brandLogoImage: varchar("BRAND_LOGO_IMAGE", { length: 50 }),
|
|
productPageViewTracking: varchar("PRODUCT_PAGE_VIEW_TRACKING", { length: 256 }),
|
|
parentGroupId: varchar("PARENT_GROUP_ID", { length: 50 }),
|
|
fineline: varchar("FINELINE", { length: 50 }),
|
|
superfineline: varchar("SUPERFINELINE", { length: 200 }),
|
|
modelnumber: varchar("MODELNUMBER", { length: 50 }),
|
|
caliber: varchar("CALIBER", { length: 200 }),
|
|
upc: varchar("UPC", { length: 100 }),
|
|
mediumImageUrl: varchar("MEDIUM_IMAGE_URL", { length: 50 }),
|
|
productContentWidget: varchar("PRODUCT_CONTENT_WIDGET", { length: 256 }),
|
|
googleCategorization: varchar("GOOGLE_CATEGORIZATION", { length: 50 }),
|
|
itemBasedCommission: varchar("ITEM_BASED_COMMISSION", { length: 50 }),
|
|
uuid: uuid().defaultRandom(),
|
|
});
|
|
export const psa = pgTable("psa", {
|
|
id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "psa_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
sku: varchar("SKU", { length: 50 }),
|
|
manufacturerId: varchar("MANUFACTURER_ID", { length: 50 }),
|
|
brandName: varchar("BRAND_NAME", { length: 50 }),
|
|
productName: varchar("PRODUCT_NAME", { length: 255 }),
|
|
longDescription: text("LONG_DESCRIPTION"),
|
|
shortDescription: varchar("SHORT_DESCRIPTION", { length: 50 }),
|
|
department: varchar("DEPARTMENT", { length: 50 }),
|
|
category: varchar("CATEGORY", { length: 50 }),
|
|
subcategory: varchar("SUBCATEGORY", { length: 50 }),
|
|
thumbUrl: varchar("THUMB_URL", { length: 50 }),
|
|
imageUrl: varchar("IMAGE_URL", { length: 50 }),
|
|
buyLink: varchar("BUY_LINK", { length: 128 }),
|
|
keywords: varchar("KEYWORDS", { length: 50 }),
|
|
reviews: varchar("REVIEWS", { length: 50 }),
|
|
retailPrice: real("RETAIL_PRICE"),
|
|
salePrice: real("SALE_PRICE"),
|
|
brandPageLink: varchar("BRAND_PAGE_LINK", { length: 50 }),
|
|
brandLogoImage: varchar("BRAND_LOGO_IMAGE", { length: 50 }),
|
|
productPageViewTracking: varchar("PRODUCT_PAGE_VIEW_TRACKING", { length: 256 }),
|
|
parentGroupId: varchar("PARENT_GROUP_ID", { length: 50 }),
|
|
fineline: varchar("FINELINE", { length: 50 }),
|
|
superfineline: varchar("SUPERFINELINE", { length: 200 }),
|
|
modelnumber: varchar("MODELNUMBER", { length: 50 }),
|
|
caliber: varchar("CALIBER", { length: 200 }),
|
|
upc: varchar("UPC", { length: 100 }),
|
|
mediumImageUrl: varchar("MEDIUM_IMAGE_URL", { length: 50 }),
|
|
productContentWidget: varchar("PRODUCT_CONTENT_WIDGET", { length: 256 }),
|
|
googleCategorization: varchar("GOOGLE_CATEGORIZATION", { length: 50 }),
|
|
itemBasedCommission: varchar("ITEM_BASED_COMMISSION", { length: 50 }),
|
|
uuid: uuid().defaultRandom(),
|
|
});
|
|
|
|
export const lipseycatalog = pgTable("lipseycatalog", {
|
|
id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "lipseycatalog_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
itemno: varchar({ length: 20 }).notNull(),
|
|
description1: text(),
|
|
description2: text(),
|
|
upc: varchar({ length: 20 }),
|
|
manufacturermodelno: varchar({ length: 30 }),
|
|
msrp: doublePrecision(),
|
|
model: text(),
|
|
calibergauge: text(),
|
|
manufacturer: text(),
|
|
type: text(),
|
|
action: text(),
|
|
barrellength: text(),
|
|
capacity: text(),
|
|
finish: text(),
|
|
overalllength: text(),
|
|
receiver: text(),
|
|
safety: text(),
|
|
sights: text(),
|
|
stockframegrips: text(),
|
|
magazine: text(),
|
|
weight: text(),
|
|
imagename: text(),
|
|
chamber: text(),
|
|
drilledandtapped: text(),
|
|
rateoftwist: text(),
|
|
itemtype: text(),
|
|
additionalfeature1: text(),
|
|
additionalfeature2: text(),
|
|
additionalfeature3: text(),
|
|
shippingweight: text(),
|
|
boundbookmanufacturer: text(),
|
|
boundbookmodel: text(),
|
|
boundbooktype: text(),
|
|
nfathreadpattern: text(),
|
|
nfaattachmentmethod: text(),
|
|
nfabaffletype: text(),
|
|
silencercanbedisassembled: text(),
|
|
silencerconstructionmaterial: text(),
|
|
nfadbreduction: text(),
|
|
silenceroutsidediameter: text(),
|
|
nfaform3Caliber: text(),
|
|
opticmagnification: text(),
|
|
maintubesize: text(),
|
|
adjustableobjective: text(),
|
|
objectivesize: text(),
|
|
opticadjustments: text(),
|
|
illuminatedreticle: text(),
|
|
reticle: text(),
|
|
exclusive: text(),
|
|
quantity: varchar({ length: 10 }).default(sql`NULL`),
|
|
allocated: text(),
|
|
onsale: text(),
|
|
price: doublePrecision(),
|
|
currentprice: doublePrecision(),
|
|
retailmap: doublePrecision(),
|
|
fflrequired: text(),
|
|
sotrequired: text(),
|
|
exclusivetype: text(),
|
|
scopecoverincluded: text(),
|
|
special: text(),
|
|
sightstype: text(),
|
|
case: text(),
|
|
choke: text(),
|
|
dbreduction: text(),
|
|
family: text(),
|
|
finishtype: text(),
|
|
frame: text(),
|
|
griptype: varchar({ length: 30 }),
|
|
handgunslidematerial: text(),
|
|
countryoforigin: varchar({ length: 4 }),
|
|
itemlength: text(),
|
|
itemwidth: text(),
|
|
itemheight: text(),
|
|
packagelength: doublePrecision(),
|
|
packagewidth: doublePrecision(),
|
|
packageheight: doublePrecision(),
|
|
itemgroup: varchar({ length: 40 }),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
});
|
|
|
|
export const buildsComponents = pgTable("builds_components", {
|
|
id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "build_components_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
buildId: integer("build_id").notNull(),
|
|
productId: integer("product_id").notNull(),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
uuid: uuid().defaultRandom(),
|
|
}, (table) => {
|
|
return {
|
|
buildsComponentsUuidUnique: unique("builds_components_uuid_unique").on(table.uuid),
|
|
}
|
|
});
|
|
|
|
export const balResellers = pgTable("bal_resellers", {
|
|
id: integer().primaryKey().generatedAlwaysAsIdentity({ name: "resellers_id_seq", startWith: 1, increment: 1, minValue: 1, maxValue: 2147483647, cache: 1 }),
|
|
name: varchar({ length: 100 }).notNull(),
|
|
websiteUrl: varchar("website_url", { length: 255 }),
|
|
contactEmail: varchar("contact_email", { length: 100 }),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).defaultNow().notNull(),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).defaultNow().notNull(),
|
|
deletedAt: timestamp("deleted_at", { mode: 'string' }),
|
|
uuid: uuid().defaultRandom(),
|
|
}, (table) => {
|
|
return {
|
|
balResellersUuidUnique: unique("bal_resellers_uuid_unique").on(table.uuid),
|
|
}
|
|
});
|
|
|
|
export const verificationTokens = pgTable("verificationTokens", {
|
|
identifier: varchar("identifier").notNull(),
|
|
token: varchar("token").notNull(),
|
|
expires: timestamp("expires").notNull(),
|
|
});
|
|
|
|
export const authenticator = pgTable("authenticator", {
|
|
credentialId: text().notNull(),
|
|
userId: text().notNull(),
|
|
providerAccountId: text().notNull(),
|
|
credentialPublicKey: text().notNull(),
|
|
counter: integer().notNull(),
|
|
credentialDeviceType: text().notNull(),
|
|
credentialBackedUp: boolean().notNull(),
|
|
transports: text(),
|
|
}, (table) => {
|
|
return {
|
|
authenticatorUserIdCredentialIdPk: primaryKey({ columns: [table.credentialId, table.userId], name: "authenticator_userId_credentialID_pk"}),
|
|
authenticatorCredentialIdUnique: unique("authenticator_credentialID_unique").on(table.credentialId),
|
|
}
|
|
});
|
|
|
|
export const accounts = pgTable("accounts", {
|
|
id: uuid("id").primaryKey().defaultRandom(),
|
|
uuid: uuid("uuid").defaultRandom(),
|
|
userId: uuid("user_id").notNull(),
|
|
type: varchar("type").notNull(),
|
|
provider: text().notNull(),
|
|
providerAccountId: varchar("provider_account_id").notNull(),
|
|
refreshToken: text("refresh_token"),
|
|
accessToken: text("access_token"),
|
|
expiresAt: integer("expires_at"),
|
|
tokenType: varchar("token_type"),
|
|
idToken: text("id_token"),
|
|
sessionState: varchar("session_state"),
|
|
scope: text(),
|
|
}
|
|
);
|
|
|
|
/* export const vw_accounts = pgView("vw_accounts", {
|
|
uuid: uuid().defaultRandom(),
|
|
userId: text("user_id").notNull(),
|
|
type: text().notNull(),
|
|
provider: text().notNull(),
|
|
providerAccountId: text("provider_account_id").notNull(),
|
|
refreshToken: text("refresh_token"),
|
|
accessToken: text("access_token"),
|
|
expiresAt: integer("expires_at"),
|
|
tokenType: text("token_type"),
|
|
scope: text(),
|
|
idToken: text("id_token"),
|
|
sessionState: text("session_state"),
|
|
first_name: text("first_name"),
|
|
last_name: text("last_name"),
|
|
|
|
},).existing(); */
|
|
|
|
/* From here down is the authentication library Lusia tables */
|
|
|
|
export const users = pgTable("users",
|
|
{
|
|
id: varchar("id", { length: 21 }).primaryKey(),
|
|
name: varchar("name").notNull(),
|
|
username: varchar({ length: 50 }).notNull(),
|
|
discordId: varchar("discord_id", { length: 255 }).unique(),
|
|
password_hash: varchar("password_hash", { length: 255 }).notNull(),
|
|
email: varchar("email", { length: 255 }).unique().notNull(),
|
|
emailVerified: boolean("email_verified").default(false).notNull(),
|
|
hashedPassword: varchar("hashed_password", { length: 255 }),
|
|
first_name: varchar("first_name", { length: 50 }),
|
|
last_name: varchar("last_name", { length: 50 }),
|
|
full_name: varchar("full_name", { length: 50 }),
|
|
profilePicture: varchar("profile_picture", { length: 255 }),
|
|
image: text("image"),
|
|
dateOfBirth: date("date_of_birth"),
|
|
phoneNumber: varchar("phone_number", { length: 20 }),
|
|
createdAt: timestamp("created_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
updatedAt: timestamp("updated_at", { mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),
|
|
isAdmin: boolean("is_admin").default(false),
|
|
lastLogin: timestamp("last_login", { mode: 'string' }),
|
|
buildPrivacySetting: text("build_privacy_setting").default('public'),
|
|
uuid: uuid().defaultRandom(),
|
|
avatar: varchar("avatar", { length: 255 }),
|
|
stripeSubscriptionId: varchar("stripe_subscription_id", { length: 191 }),
|
|
stripePriceId: varchar("stripe_price_id", { length: 191 }),
|
|
stripeCustomerId: varchar("stripe_customer_id", { length: 191 }),
|
|
stripeCurrentPeriodEnd: timestamp("stripe_current_period_end"),
|
|
}, (table) => ({
|
|
usersUsernameKey: unique("users_username_key").on(table.username),
|
|
usersEmailKey: unique("users_email_key").on(table.email),
|
|
usersBuildPrivacySettingCheck: check("users_build_privacy_setting_check", sql`build_privacy_setting = ANY (ARRAY['private'::text, 'public'::text])`),
|
|
emailIdx: index("user_email_idx").on(table.email),
|
|
discordIdx: index("user_discord_idx").on(table.discordId),
|
|
}),
|
|
);
|
|
export type User = typeof users.$inferSelect;
|
|
export type NewUser = typeof users.$inferInsert;
|
|
|
|
export const sessions = pgTable(
|
|
"sessions",
|
|
{
|
|
id: varchar("id", { length: 255 }).primaryKey(),
|
|
userId: varchar("user_id", { length: 21 }).notNull(),
|
|
expiresAt: timestamp("expires_at", { withTimezone: true, mode: "date" }).notNull(),
|
|
},
|
|
(t) => ({
|
|
userIdx: index("session_user_idx").on(t.userId),
|
|
}),
|
|
);
|
|
|
|
export const emailVerificationCodes = pgTable(
|
|
"email_verification_codes",
|
|
{
|
|
id: serial("id").primaryKey(),
|
|
userId: varchar("user_id", { length: 21 }).unique().notNull(),
|
|
email: varchar("email", { length: 255 }).notNull(),
|
|
code: varchar("code", { length: 8 }).notNull(),
|
|
expiresAt: timestamp("expires_at", { withTimezone: true, mode: "date" }).notNull(),
|
|
},
|
|
(t) => ({
|
|
userIdx: index("verification_code_user_idx").on(t.userId),
|
|
emailIdx: index("verification_code_email_idx").on(t.email),
|
|
}),
|
|
);
|
|
|
|
export const passwordResetTokens = pgTable(
|
|
"password_reset_tokens",
|
|
{
|
|
id: varchar("id", { length: 40 }).primaryKey(),
|
|
userId: varchar("user_id", { length: 21 }).notNull(),
|
|
expiresAt: timestamp("expires_at", { withTimezone: true, mode: "date" }).notNull(),
|
|
},
|
|
(t) => ({
|
|
userIdx: index("password_token_user_idx").on(t.userId),
|
|
}),
|
|
);
|
|
|
|
export const posts = pgTable(
|
|
"posts",
|
|
{
|
|
id: varchar("id", { length: 15 }).primaryKey(),
|
|
userId: varchar("user_id", { length: 255 }).notNull(),
|
|
title: varchar("title", { length: 255 }).notNull(),
|
|
excerpt: varchar("excerpt", { length: 255 }).notNull(),
|
|
content: text("content").notNull(),
|
|
status: varchar("status", { length: 10, enum: ["draft", "published"] })
|
|
.default("draft")
|
|
.notNull(),
|
|
tags: varchar("tags", { length: 255 }),
|
|
createdAt: timestamp("created_at").defaultNow().notNull(),
|
|
updatedAt: timestamp("updated_at", { mode: "date" }).$onUpdate(() => new Date()),
|
|
},
|
|
(t) => ({
|
|
userIdx: index("post_user_idx").on(t.userId),
|
|
createdAtIdx: index("post_created_at_idx").on(t.createdAt),
|
|
}),
|
|
);
|
|
|
|
export const postRelations = relations(posts, ({ one }) => ({
|
|
user: one(users, {
|
|
fields: [posts.userId],
|
|
references: [users.id],
|
|
}),
|
|
}));
|
|
|
|
export type Post = typeof posts.$inferSelect;
|
|
export type NewPost = typeof posts.$inferInsert; |