source: database/drizzle/schema/builds.ts@ b0685a8

main
Last change on this file since b0685a8 was b0685a8, checked in by Tome <gjorgievtome@…>, 6 months ago

Allow adding multiple components per build

  • Property mode set to 100644
File size: 3.3 KB
Line 
1import {pgTable, serial, integer, text, numeric, boolean, date, primaryKey, check, unique} from "drizzle-orm/pg-core";
2import { usersTable } from "./users";
3import { componentsTable } from "./components";
4import {sql} from "drizzle-orm";
5
6export const buildsTable = pgTable("build", {
7 id: serial("id").primaryKey(),
8 userId: integer("user_id")
9 .notNull()
10 .references(() => usersTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
11 name: text("name").notNull(),
12 createdAt: date("created_at").notNull(),
13 description: text("description"),
14 totalPrice: numeric("total_price").notNull(),
15 isApproved: boolean("is_approved").notNull(),
16});
17
18export const buildComponentsTable = pgTable("build_component", {
19 id: serial("id").primaryKey(),
20 buildId: integer("build_id")
21 .notNull()
22 .references(() => buildsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
23 componentId: integer("component_id")
24 .notNull()
25 .references(() => componentsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
26 },
27);
28
29export const favoriteBuildsTable = pgTable("favorite_build", {
30 buildId: integer("build_id")
31 .notNull()
32 .references(() => buildsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
33 userId: integer("user_id")
34 .notNull()
35 .references(() => usersTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
36 },
37 (t) => ({
38 pk: primaryKey({ columns: [t.buildId, t.userId] }),
39 }),
40);
41
42export const ratingBuildsTable = pgTable("rating_build", {
43 buildId: integer("build_id")
44 .notNull()
45 .references(() => buildsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
46 userId: integer("user_id")
47 .notNull()
48 .references(() => usersTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
49 value: numeric("value", { mode: "number" }).notNull(),
50 },
51 (t) => ({
52 pk: primaryKey({ columns: [t.buildId, t.userId] }),
53 checkValue: check("check_value", sql`${t.value} BETWEEN 1 AND 5`),
54 }),
55);
56
57export const reviewsTable = pgTable("review", {
58 id: serial("id").primaryKey(),
59
60 buildId: integer("build_id")
61 .notNull()
62 .references(() => buildsTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
63 userId: integer("user_id")
64 .notNull()
65 .references(() => usersTable.id, { onDelete: "cascade", onUpdate: "cascade" }),
66 content: text("content").notNull(),
67 createdAt: date("created_at").notNull()
68 },
69 (t) => ({
70 uniqueUserBuild: unique().on(t.buildId, t.userId),
71 }),
72);
73
74export type buildItem = typeof buildsTable.$inferSelect;
75export type buildInsert = typeof buildsTable.$inferInsert;
76
77export type buildComponentItem = typeof buildComponentsTable.$inferSelect;
78export type buildComponentInsert = typeof buildComponentsTable.$inferInsert;
79
80export type favoriteBuildItem = typeof favoriteBuildsTable.$inferSelect;
81export type favoriteBuildInsert = typeof favoriteBuildsTable.$inferInsert;
82
83export type ratingBuildItem = typeof ratingBuildsTable.$inferSelect;
84export type ratingBuildInsert = typeof ratingBuildsTable.$inferInsert;
85
86export type reviewItem = typeof reviewsTable.$inferSelect;
87export type reviewInsert = typeof reviewsTable.$inferInsert;
Note: See TracBrowser for help on using the repository browser.