54 lines
1.6 KiB
TypeScript
54 lines
1.6 KiB
TypeScript
import {
|
|
index,
|
|
pgEnum,
|
|
pgTable,
|
|
text,
|
|
timestamp,
|
|
uniqueIndex,
|
|
} from "drizzle-orm/pg-core"
|
|
import { games } from "./games"
|
|
import { user } from "./auth"
|
|
|
|
export const suggestionStatusEnum = pgEnum("suggestion_status", [
|
|
"pending",
|
|
"approved",
|
|
"rejected",
|
|
])
|
|
|
|
export const communitySuggestions = pgTable(
|
|
"community_suggestions",
|
|
{
|
|
id: text("id")
|
|
.primaryKey()
|
|
.$defaultFn(() => crypto.randomUUID()),
|
|
gameId: text("game_id")
|
|
.notNull()
|
|
.references(() => games.id, { onDelete: "cascade" }),
|
|
userId: text("user_id")
|
|
.notNull()
|
|
.references(() => user.id, { onDelete: "cascade" }),
|
|
fieldName: text("field_name").notNull(), // e.g. "title", "description", "developer"
|
|
currentValue: text("current_value"), // current value (snapshot)
|
|
proposedValue: text("proposed_value").notNull(), // proposed new value
|
|
reason: text("reason"), // optional explanation
|
|
status: suggestionStatusEnum("status").default("pending").notNull(),
|
|
reviewedBy: text("reviewed_by").references(() => user.id, {
|
|
onDelete: "set null",
|
|
}),
|
|
reviewedAt: timestamp("reviewed_at"),
|
|
reviewNote: text("review_note"), // reviewer's note
|
|
createdAt: timestamp("created_at").defaultNow().notNull(),
|
|
updatedAt: timestamp("updated_at")
|
|
.defaultNow()
|
|
.$onUpdate(() => new Date())
|
|
.notNull(),
|
|
},
|
|
(table) => [
|
|
uniqueIndex("community_suggestions_game_field_user").on(
|
|
table.gameId,
|
|
table.fieldName,
|
|
table.userId,
|
|
),
|
|
index("suggestions_status_idx").on(table.status),
|
|
],
|
|
) |