A unique constraint has been added to the "slug_name" field in the schema to prevent any duplication. This will ensure data integrity by enforcing uniqueness for each slug_name entry.
174 lines
3.5 KiB
TypeScript
174 lines
3.5 KiB
TypeScript
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);
|