import { pgTable } from "drizzle-orm/pg-core"; import * as p from "drizzle-orm/pg-core"; import { createInsertSchema, createSelectSchema } from "drizzle-zod"; import { z } from "zod"; export const UsersTable = pgTable("users", { // Unique identifier on a technical aspect. uuid: p.uuid("uuid").unique().primaryKey().defaultRandom().notNull(), email: p .varchar("email", { length: 64, }) .unique() .notNull(), emailCode: p .varchar("email_code", { length: 6, }) .$defaultFn(() => { return "032745"; }), firstName: p .varchar("first_name", { length: 24, }) .notNull(), lastName: p .varchar("last_name", { length: 24, }) .notNull(), //hash (Argonid2 hash) hash: p .varchar("hash", { length: 97, }) .notNull(), //METADATA iat: p .timestamp("issued_at", { withTimezone: true, }) .defaultNow() .notNull(), gdprAcceptance: p .timestamp("ack_gdpr", { withTimezone: true, }) .defaultNow() .notNull(), isAdmin: p.boolean("is_admin").default(false).notNull(), }); export const UsersTableSelectSchema = createSelectSchema(UsersTable); export const UsersTableInsertSchema = createInsertSchema(UsersTable); export const ProductsTable = pgTable("products", { uuid: p.uuid("uuid").unique().primaryKey().defaultRandom().notNull(), //slugName slugName: p .varchar("slug_name", { length: 32, }) .unique() .notNull(), //displayName displayName: p .varchar("display_name", { length: 64, }) .notNull(), //price price: p .decimal("price", { precision: 10, scale: 2, }) .default("0.0") .notNull(), //imagePath imagePath: p .varchar("image_path", { length: 128, }) .notNull(), //playload of the description element }); export const ProductsTableSelectSchema = createSelectSchema(ProductsTable); export const ProductsTableInsertSchema = createInsertSchema(ProductsTable); export const StocksTable = pgTable("stocks", { productId: p .uuid("product_id") .references(() => ProductsTable.uuid) .notNull(), quantity: p.integer("quantity").default(0).notNull(), }); export const StocksTableSelectSchema = createSelectSchema(StocksTable); export const StocksTableInsertSchema = createInsertSchema(StocksTable); export const CommentsTable = pgTable("comments", { productId: p .uuid("product_id") .references(() => ProductsTable.uuid) .notNull(), authorId: p .uuid("author_id") .references(() => UsersTable.uuid) .notNull(), //notation notation: p.integer("notation").default(0).notNull(), //json payload with the message message: p.jsonb("message").notNull(), //iat iat: p .timestamp("issued_at", { withTimezone: true, }) .defaultNow() .notNull(), }); export const CommentsTableSelectSchema = createSelectSchema(CommentsTable); export const CommentsTableInsertSchema = createInsertSchema(CommentsTable); export const PurchaseHistory = pgTable("purchases", { uuid: p.uuid("uuid").unique().primaryKey().defaultRandom().notNull(), productId: p .uuid("product_id") .references(() => ProductsTable.uuid) .notNull(), unitPrice: p .decimal("unit_price", { precision: 10, scale: 2, }) .default("0.0") .notNull(), quantity: p.integer("quantity").default(0).notNull(), clientId: p .uuid("client_id") .references(() => UsersTable.uuid) .notNull(), timestamp: p .timestamp("timestamp", { withTimezone: true, }) .defaultNow() .notNull(), }); export const PurchaseHistorySelectSchema = createSelectSchema(PurchaseHistory); export const PurchaseHistoryInsertSchema = createInsertSchema(PurchaseHistory);