brief-08-back/src/schema.ts
Mathis 5ee51daf82
feat(schema): add unique constraint to slug_name of a product.
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.
2024-07-15 11:47:28 +02:00

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);