Stage M7
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "ReviewStatus" AS ENUM ('PENDING', 'APPROVED', 'REJECTED');
|
||||
|
||||
-- NOTE: Prisma's diff wanted to DROP INDEX "search_documents_document_idx" and
|
||||
-- ALTER "search_documents"."document" DROP DEFAULT here. Both are removed on
|
||||
-- purpose and must be removed from every future migration too.
|
||||
--
|
||||
-- `document` is a GENERATED tsvector column created by raw SQL in the M6
|
||||
-- migration. Prisma's schema cannot express a generated column, so it sees one
|
||||
-- it does not know about and proposes undoing it. Applying that drops the GIN
|
||||
-- index behind every search query and silently degrades /search to nothing.
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "products" ADD COLUMN "rating_count" INTEGER NOT NULL DEFAULT 0,
|
||||
ADD COLUMN "rating_sum" INTEGER NOT NULL DEFAULT 0;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "reviews" (
|
||||
"id" UUID NOT NULL,
|
||||
"product_id" UUID NOT NULL,
|
||||
"order_line_id" UUID NOT NULL,
|
||||
"rating" INTEGER NOT NULL,
|
||||
"title" VARCHAR(140),
|
||||
"body" VARCHAR(2000),
|
||||
"author_name" VARCHAR(120) NOT NULL,
|
||||
"status" "ReviewStatus" NOT NULL DEFAULT 'PENDING',
|
||||
"moderated_at" TIMESTAMPTZ(3),
|
||||
"moderated_by_user_id" UUID,
|
||||
"moderation_note" VARCHAR(500),
|
||||
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updated_at" TIMESTAMPTZ(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "reviews_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "reviews_order_line_id_key" ON "reviews"("order_line_id");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "reviews_product_id_status_created_at_idx" ON "reviews"("product_id", "status", "created_at");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "reviews_status_created_at_idx" ON "reviews"("status", "created_at");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "reviews" ADD CONSTRAINT "reviews_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "reviews" ADD CONSTRAINT "reviews_order_line_id_fkey" FOREIGN KEY ("order_line_id") REFERENCES "order_lines"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "reviews" ADD CONSTRAINT "reviews_moderated_by_user_id_fkey" FOREIGN KEY ("moderated_by_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- Validation belongs in the schema as well as the DTO: `rating` feeds a stored
|
||||
-- SUM, so one bad row silently skews a product's average forever. Zod checks
|
||||
-- the request; this checks the table.
|
||||
ALTER TABLE "reviews" ADD CONSTRAINT "reviews_rating_range" CHECK ("rating" BETWEEN 1 AND 5);
|
||||
Reference in New Issue
Block a user