Final schema \u2705 #4
@ -1,59 +1,123 @@
|
||||
import {
|
||||
boolean,
|
||||
integer,
|
||||
pgTableCreator,
|
||||
serial,
|
||||
text,
|
||||
timestamp,
|
||||
uniqueIndex,
|
||||
uuid,
|
||||
uuid
|
||||
} from "drizzle-orm/pg-core";
|
||||
import { relations } from "drizzle-orm";
|
||||
|
||||
export const createTable = pgTableCreator((name) => `wine-shop_${name}`);
|
||||
|
||||
// Producer Schema
|
||||
|
||||
export const producers = createTable(
|
||||
"producer",
|
||||
{
|
||||
id: uuid("id").primaryKey().defaultRandom(),
|
||||
id: uuid("id").primaryKey(),
|
||||
name: text("name").notNull(),
|
||||
createdAt: timestamp("createdAt").defaultNow().notNull(),
|
||||
description: text("description").notNull(),
|
||||
imageUrl: text('imageUrl'),
|
||||
country: text("country").notNull(),
|
||||
region: text("region").notNull(),
|
||||
email: text("email").notNull(),
|
||||
createdAt: timestamp("createdAt").defaultNow().notNull(),
|
||||
updatedAt: timestamp("updatedAt").defaultNow(),
|
||||
|
||||
},
|
||||
(producers) => {
|
||||
return {
|
||||
uniqueIdx: uniqueIndex("email").on(producers.email),
|
||||
uniqueIdx: uniqueIndex("producers").on(producers.id),
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
export const producersRelations = relations(producers, ({ many }) => ({
|
||||
// one to man realtion producer -> wines
|
||||
export const producersRelations = relations(producers, ({ many, one }) => ({
|
||||
wines: many(wines),
|
||||
countries: one(countries, {
|
||||
fields: [producers.country],
|
||||
references: [countries.id]
|
||||
})
|
||||
}));
|
||||
|
||||
// Wines schema
|
||||
export const wines = createTable(
|
||||
"wine",
|
||||
{
|
||||
id: uuid("id").primaryKey().defaultRandom(),
|
||||
id: uuid("id").primaryKey(),
|
||||
name: text("name").notNull(),
|
||||
description: text("description"),
|
||||
imageUrl: text('imageUrl'),
|
||||
producer: text("producer").notNull(),
|
||||
region: text("region").notNull(),
|
||||
country: text("country").notNull(),
|
||||
price: integer("price").notNull(),
|
||||
inStock: boolean("inStock").notNull().default(false),
|
||||
createdAt: timestamp("createdAt").defaultNow().notNull(),
|
||||
updatedAt: timestamp("updatedAt").defaultNow(),
|
||||
producer: uuid("producer").notNull(),
|
||||
},
|
||||
(wines) => {
|
||||
return {
|
||||
uniqueIdx: uniqueIndex("unique_idx").on(wines.id),
|
||||
uniqueIdx: uniqueIndex("wines").on(wines.id),
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
//many to one relationship wine -> producer
|
||||
export const winesRelations = relations(wines, ({ one }) => ({
|
||||
producer: one(producers, {
|
||||
fields: [wines.producer],
|
||||
references: [producers.id],
|
||||
}),
|
||||
regions: one(regions, {
|
||||
fields: [wines.region],
|
||||
references: [regions.id]
|
||||
}),
|
||||
countries: one(countries, {
|
||||
fields: [wines.country],
|
||||
references: [countries.id]
|
||||
})
|
||||
}));
|
||||
|
||||
export type SelectWine = typeof wines.$inferSelect;
|
||||
export const regions = createTable(
|
||||
"region",
|
||||
{
|
||||
id: serial("id").primaryKey().notNull(),
|
||||
name: text("name").notNull().unique(),
|
||||
country: text("country").notNull(),
|
||||
},
|
||||
(regions) => {
|
||||
return {
|
||||
uniqueIdx: uniqueIndex("regions").on(regions.id),
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
export type SelectProducer = typeof producers.$inferSelect;
|
||||
export type InsertProducer = typeof producers.$inferInsert;
|
||||
export const regionsRelations = relations(regions, ({ many, one }) => ({
|
||||
wines: many(wines),
|
||||
countries: one(countries, {
|
||||
fields: [regions.country],
|
||||
references: [countries.id]
|
||||
})
|
||||
}));
|
||||
|
||||
export const countries = createTable(
|
||||
"country",
|
||||
{
|
||||
id: serial("id").primaryKey().notNull(),
|
||||
name: text("name").notNull(),
|
||||
},
|
||||
(countries) => {
|
||||
return {
|
||||
uniqueIdx: uniqueIndex("countries").on(countries.id),
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
export const countriesRelations = relations(countries, ({ many }) => ({
|
||||
wines: many(wines),
|
||||
regions: many(regions)
|
||||
})
|
||||
);
|
Loading…
Reference in New Issue
Block a user