230 lines
8.3 KiB
SQL
230 lines
8.3 KiB
SQL
-- CreateTable
|
|
CREATE TABLE "categories" (
|
|
"id" BIGSERIAL NOT NULL,
|
|
"name" VARCHAR(100) NOT NULL,
|
|
"description" TEXT,
|
|
|
|
CONSTRAINT "categories_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "roles" (
|
|
"id" BIGSERIAL NOT NULL,
|
|
"name" VARCHAR(50) NOT NULL,
|
|
"description" TEXT,
|
|
|
|
CONSTRAINT "roles_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "users" (
|
|
"id" BIGSERIAL NOT NULL,
|
|
"external_uid" VARCHAR(255) NOT NULL,
|
|
"role_id" BIGINT NOT NULL,
|
|
"is_active" BOOLEAN NOT NULL DEFAULT true,
|
|
"created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "tickets" (
|
|
"id" BIGSERIAL NOT NULL,
|
|
"title" VARCHAR(255) NOT NULL,
|
|
"description" TEXT,
|
|
"status" VARCHAR(30) NOT NULL,
|
|
"priority" VARCHAR(30),
|
|
"category_id" BIGINT,
|
|
"created_by_user_id" BIGINT NOT NULL,
|
|
"assigned_to_user_id" BIGINT,
|
|
"created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"closed_at" TIMESTAMPTZ,
|
|
"ticket_number" VARCHAR(30) NOT NULL,
|
|
|
|
CONSTRAINT "tickets_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ticket_messages" (
|
|
"id" BIGSERIAL NOT NULL,
|
|
"ticket_id" BIGINT NOT NULL,
|
|
"author_id" BIGINT NOT NULL,
|
|
"message" TEXT NOT NULL,
|
|
"is_internal" BOOLEAN NOT NULL DEFAULT false,
|
|
"created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ticket_messages_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ticket_attachments" (
|
|
"id" BIGSERIAL NOT NULL,
|
|
"ticket_id" BIGINT NOT NULL,
|
|
"message_id" BIGINT,
|
|
"uploaded_by" BIGINT NOT NULL,
|
|
"file_name" VARCHAR(255),
|
|
"file_url" TEXT NOT NULL,
|
|
"file_size" BIGINT,
|
|
"created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ticket_attachments_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ticket_invitations" (
|
|
"id" BIGSERIAL NOT NULL,
|
|
"ticket_id" BIGINT NOT NULL,
|
|
"inviter_id" BIGINT NOT NULL,
|
|
"invitee_id" BIGINT NOT NULL,
|
|
"status" VARCHAR(20) NOT NULL DEFAULT 'pending',
|
|
"message" TEXT,
|
|
"created_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"responded_at" TIMESTAMPTZ,
|
|
|
|
CONSTRAINT "ticket_invitations_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ticket_participants" (
|
|
"id" BIGSERIAL NOT NULL,
|
|
"ticket_id" BIGINT NOT NULL,
|
|
"user_id" BIGINT NOT NULL,
|
|
"added_by" BIGINT NOT NULL,
|
|
"added_via" VARCHAR(20) NOT NULL,
|
|
"can_edit" BOOLEAN NOT NULL DEFAULT false,
|
|
"can_comment" BOOLEAN NOT NULL DEFAULT true,
|
|
"joined_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ticket_participants_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ticket_status_history" (
|
|
"id" BIGSERIAL NOT NULL,
|
|
"ticket_id" BIGINT NOT NULL,
|
|
"old_status" VARCHAR(30),
|
|
"new_status" VARCHAR(30) NOT NULL,
|
|
"changed_by" BIGINT NOT NULL,
|
|
"changed_at" TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ticket_status_history_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "categories_name_key" ON "categories"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "roles_name_key" ON "roles"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_external_uid_key" ON "users"("external_uid");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_users_external_uid" ON "users"("external_uid");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "tickets_ticket_number_key" ON "tickets"("ticket_number");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_tickets_assigned_to" ON "tickets"("assigned_to_user_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_tickets_created_at" ON "tickets"("created_at");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_tickets_created_by" ON "tickets"("created_by_user_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_tickets_status" ON "tickets"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_tickets_ticket_number" ON "tickets"("ticket_number");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_messages_ticket_id" ON "ticket_messages"("ticket_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_invitations_created_at" ON "ticket_invitations"("created_at");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_invitations_invitee_id" ON "ticket_invitations"("invitee_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_invitations_inviter_id" ON "ticket_invitations"("inviter_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_invitations_status" ON "ticket_invitations"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_invitations_ticket_id" ON "ticket_invitations"("ticket_id");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ticket_invitations_ticket_id_invitee_id_status_key" ON "ticket_invitations"("ticket_id", "invitee_id", "status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_participants_added_by" ON "ticket_participants"("added_by");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_participants_ticket_id" ON "ticket_participants"("ticket_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_participants_user_id" ON "ticket_participants"("user_id");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ticket_participants_ticket_id_user_id_key" ON "ticket_participants"("ticket_id", "user_id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "idx_history_ticket_id" ON "ticket_status_history"("ticket_id");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "users" ADD CONSTRAINT "users_role_id_fkey" FOREIGN KEY ("role_id") REFERENCES "roles"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "tickets" ADD CONSTRAINT "tickets_category_id_fkey" FOREIGN KEY ("category_id") REFERENCES "categories"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "tickets" ADD CONSTRAINT "tickets_created_by_user_id_fkey" FOREIGN KEY ("created_by_user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "tickets" ADD CONSTRAINT "tickets_assigned_to_user_id_fkey" FOREIGN KEY ("assigned_to_user_id") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_messages" ADD CONSTRAINT "ticket_messages_ticket_id_fkey" FOREIGN KEY ("ticket_id") REFERENCES "tickets"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_messages" ADD CONSTRAINT "ticket_messages_author_id_fkey" FOREIGN KEY ("author_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_attachments" ADD CONSTRAINT "ticket_attachments_ticket_id_fkey" FOREIGN KEY ("ticket_id") REFERENCES "tickets"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_attachments" ADD CONSTRAINT "ticket_attachments_message_id_fkey" FOREIGN KEY ("message_id") REFERENCES "ticket_messages"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_attachments" ADD CONSTRAINT "ticket_attachments_uploaded_by_fkey" FOREIGN KEY ("uploaded_by") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_invitations" ADD CONSTRAINT "ticket_invitations_ticket_id_fkey" FOREIGN KEY ("ticket_id") REFERENCES "tickets"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_invitations" ADD CONSTRAINT "ticket_invitations_inviter_id_fkey" FOREIGN KEY ("inviter_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_invitations" ADD CONSTRAINT "ticket_invitations_invitee_id_fkey" FOREIGN KEY ("invitee_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_participants" ADD CONSTRAINT "ticket_participants_ticket_id_fkey" FOREIGN KEY ("ticket_id") REFERENCES "tickets"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_participants" ADD CONSTRAINT "ticket_participants_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_participants" ADD CONSTRAINT "ticket_participants_added_by_fkey" FOREIGN KEY ("added_by") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_status_history" ADD CONSTRAINT "ticket_status_history_ticket_id_fkey" FOREIGN KEY ("ticket_id") REFERENCES "tickets"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ticket_status_history" ADD CONSTRAINT "ticket_status_history_changed_by_fkey" FOREIGN KEY ("changed_by") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|