-- 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;