UPD: initial architecture
CI / quality (push) Waiting to run

This commit is contained in:
Uklonil
2026-07-27 10:23:50 +02:00
parent 63fc0e6771
commit 3aeaed0af2
108 changed files with 11103 additions and 0 deletions
+75
View File
@@ -0,0 +1,75 @@
import {
boolean,
index,
integer,
pgTable,
primaryKey,
text,
timestamp,
uniqueIndex,
} from "drizzle-orm/pg-core";
import { recommendationStatusEnum, recommendationStrengthEnum, reactionTypeEnum } from "./enums";
import { users } from "./auth";
import { mediaItems } from "./media";
import { workspaces } from "./workspaces";
export const recommendations = pgTable(
"recommendation",
{
id: text("id").primaryKey(),
workspaceId: text("workspace_id")
.notNull()
.references(() => workspaces.id, { onDelete: "cascade" }),
mediaItemId: text("media_item_id")
.notNull()
.references(() => mediaItems.id, { onDelete: "restrict" }),
recommendedByUserId: text("recommended_by_user_id")
.notNull()
.references(() => users.id, { onDelete: "restrict" }),
reason: text("reason").notNull(),
audienceNote: text("audience_note"),
strength: recommendationStrengthEnum("strength").notNull().default("NORMAL"),
containsSpoilers: boolean("contains_spoilers").notNull().default(false),
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
deletedAt: timestamp("deleted_at", { withTimezone: true }),
},
(table) => [
uniqueIndex("recommendation_workspace_media_unique").on(table.workspaceId, table.mediaItemId),
index("recommendation_workspace_created_idx").on(table.workspaceId, table.createdAt),
],
);
export const recommendationStatuses = pgTable(
"recommendation_status",
{
recommendationId: text("recommendation_id")
.notNull()
.references(() => recommendations.id, { onDelete: "cascade" }),
userId: text("user_id")
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
status: recommendationStatusEnum("status").notNull().default("PENDING"),
rating: integer("rating"),
review: text("review"),
startedAt: timestamp("started_at", { withTimezone: true }),
completedAt: timestamp("completed_at", { withTimezone: true }),
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
},
(table) => [
primaryKey({ columns: [table.recommendationId, table.userId] }),
index("recommendation_status_user_idx").on(table.userId),
],
);
export const recommendationReactions = pgTable(
"recommendation_reaction",
{
recommendationId: text("recommendation_id")
.notNull()
.references(() => recommendations.id, { onDelete: "cascade" }),
userId: text("user_id")
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
type: reactionTypeEnum("type").notNull(),
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
},
(table) => [primaryKey({ columns: [table.recommendationId, table.userId, table.type] })],
);