405 lines
13 KiB
SQL

-- CreateSchema
CREATE SCHEMA IF NOT EXISTS "rebreak";
-- CreateEnum
CREATE TYPE "rebreak"."FeedbackStatus" AS ENUM ('PENDING', 'REVIEWING', 'PLANNED', 'SHIPPED', 'REJECTED');
-- CreateEnum
CREATE TYPE "rebreak"."GameChallengeStatus" AS ENUM ('OPEN', 'ACTIVE', 'FINISHED', 'CANCELLED');
-- CreateTable
CREATE TABLE "rebreak"."profiles" (
"id" UUID NOT NULL,
"username" TEXT,
"nickname" TEXT,
"avatar" TEXT,
"plan" TEXT NOT NULL DEFAULT 'free',
"streak" INTEGER NOT NULL DEFAULT 0,
"followers_count" INTEGER NOT NULL DEFAULT 0,
"stripe_customer_id" TEXT,
"stripe_subscription_id" TEXT,
"premium_until" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "profiles_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."streaks" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"start_date" DATE NOT NULL,
"current_days" INTEGER NOT NULL DEFAULT 0,
"longest_days" INTEGER NOT NULL DEFAULT 0,
"avg_monthly_savings" DOUBLE PRECISION,
"is_active" BOOLEAN NOT NULL DEFAULT true,
CONSTRAINT "streaks_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."streak_events" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"type" TEXT NOT NULL,
"meta" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "streak_events_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."urge_logs" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"emotion" TEXT NOT NULL,
"was_overcome" BOOLEAN NOT NULL DEFAULT false,
"breathing_done" BOOLEAN NOT NULL DEFAULT false,
CONSTRAINT "urge_logs_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."community_posts" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"category" TEXT NOT NULL,
"content" TEXT NOT NULL,
"image_url" TEXT,
"upvotes" INTEGER NOT NULL DEFAULT 0,
"likes_count" INTEGER NOT NULL DEFAULT 0,
"dislikes_count" INTEGER NOT NULL DEFAULT 0,
"comments_count" INTEGER NOT NULL DEFAULT 0,
"reposts_count" INTEGER NOT NULL DEFAULT 0,
"is_anonymous" BOOLEAN NOT NULL DEFAULT false,
"is_moderated" BOOLEAN NOT NULL DEFAULT false,
"repost_of_id" UUID,
"challenge_id" UUID,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "community_posts_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."post_likes" (
"user_id" UUID NOT NULL,
"post_id" UUID NOT NULL,
"type" TEXT NOT NULL,
CONSTRAINT "post_likes_pkey" PRIMARY KEY ("user_id","post_id")
);
-- CreateTable
CREATE TABLE "rebreak"."community_replies" (
"id" UUID NOT NULL,
"post_id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"content" TEXT NOT NULL,
"parent_reply_id" UUID,
"is_anonymous" BOOLEAN NOT NULL DEFAULT false,
"likes_count" INTEGER NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "community_replies_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."comment_likes" (
"user_id" UUID NOT NULL,
"comment_id" UUID NOT NULL,
CONSTRAINT "comment_likes_pkey" PRIMARY KEY ("user_id","comment_id")
);
-- CreateTable
CREATE TABLE "rebreak"."chat_messages" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"content" TEXT NOT NULL,
"room_id" UUID,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "chat_messages_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."direct_messages" (
"id" UUID NOT NULL,
"sender_id" UUID NOT NULL,
"receiver_id" UUID NOT NULL,
"content" TEXT NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"read_at" TIMESTAMP(3),
CONSTRAINT "direct_messages_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."user_follows" (
"follower_id" UUID NOT NULL,
"following_id" UUID NOT NULL,
CONSTRAINT "user_follows_pkey" PRIMARY KEY ("follower_id","following_id")
);
-- CreateTable
CREATE TABLE "rebreak"."user_scores" (
"user_id" UUID NOT NULL,
"total_points" INTEGER NOT NULL DEFAULT 0,
"tier" TEXT NOT NULL DEFAULT 'beginner',
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "user_scores_pkey" PRIMARY KEY ("user_id")
);
-- CreateTable
CREATE TABLE "rebreak"."score_events" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"event_type" TEXT NOT NULL,
"points" INTEGER NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"meta" JSONB,
CONSTRAINT "score_events_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."user_custom_domains" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"domain" TEXT NOT NULL,
"source" TEXT NOT NULL DEFAULT 'manual',
"status" TEXT NOT NULL DEFAULT 'active',
"post_id" UUID,
"added_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "user_custom_domains_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."domain_submissions" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"domain" TEXT NOT NULL,
"custom_domain_id" UUID NOT NULL,
"post_id" UUID,
"status" TEXT NOT NULL DEFAULT 'pending',
"yes_votes" INTEGER NOT NULL DEFAULT 0,
"no_votes" INTEGER NOT NULL DEFAULT 0,
"review_note" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"reviewed_at" TIMESTAMP(3),
CONSTRAINT "domain_submissions_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."domain_votes" (
"user_id" UUID NOT NULL,
"submission_id" UUID NOT NULL,
"vote" TEXT NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "domain_votes_pkey" PRIMARY KEY ("user_id","submission_id")
);
-- CreateTable
CREATE TABLE "rebreak"."feedback_items" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"content" TEXT NOT NULL,
"category" TEXT,
"status" "rebreak"."FeedbackStatus" NOT NULL DEFAULT 'PENDING',
"admin_note" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "feedback_items_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."blocklist_domains" (
"id" UUID NOT NULL,
"domain" TEXT NOT NULL,
"source" TEXT NOT NULL,
"is_active" BOOLEAN NOT NULL DEFAULT true,
"report_count" INTEGER NOT NULL DEFAULT 0,
CONSTRAINT "blocklist_domains_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."trusted_contacts" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"name" TEXT NOT NULL,
"phone" TEXT,
"email" TEXT,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "trusted_contacts_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."coach_sessions" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"content" JSONB NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "coach_sessions_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."mail_connections" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"email" TEXT NOT NULL,
"provider" TEXT NOT NULL DEFAULT 'imap',
"provider_name" TEXT,
"imap_host" TEXT NOT NULL,
"imap_port" INTEGER NOT NULL,
"password_encrypted" TEXT NOT NULL,
"is_active" BOOLEAN NOT NULL DEFAULT true,
"scan_interval" INTEGER NOT NULL DEFAULT 24,
"last_scanned_at" TIMESTAMP(3),
"next_scan_at" TIMESTAMP(3),
"emails_blocked" INTEGER NOT NULL DEFAULT 0,
"emails_scanned" INTEGER NOT NULL DEFAULT 0,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "mail_connections_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."game_challenges" (
"id" UUID NOT NULL,
"challenger_id" UUID NOT NULL,
"challenger_name" TEXT NOT NULL,
"opponent_id" UUID,
"opponent_name" TEXT,
"status" "rebreak"."GameChallengeStatus" NOT NULL DEFAULT 'OPEN',
"board" TEXT NOT NULL DEFAULT '---------',
"current_turn" TEXT NOT NULL DEFAULT 'X',
"winner" TEXT,
"post_id" UUID,
"game_type" TEXT NOT NULL DEFAULT 'tictactoe',
"is_live" BOOLEAN NOT NULL DEFAULT false,
"memory_state" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "game_challenges_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."notifications" (
"id" UUID NOT NULL,
"recipient_id" UUID NOT NULL,
"type" TEXT NOT NULL,
"actor_name" TEXT NOT NULL,
"post_id" UUID,
"preview" TEXT,
"read_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "notifications_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."game_scores" (
"user_id" UUID NOT NULL,
"player_name" TEXT NOT NULL,
"wins" INTEGER NOT NULL DEFAULT 0,
"losses" INTEGER NOT NULL DEFAULT 0,
"draws" INTEGER NOT NULL DEFAULT 0,
"points" INTEGER NOT NULL DEFAULT 0,
"updated_at" TIMESTAMP(3) NOT NULL,
CONSTRAINT "game_scores_pkey" PRIMARY KEY ("user_id")
);
-- CreateTable
CREATE TABLE "rebreak"."mail_blocked" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"connection_id" UUID NOT NULL,
"gmail_message_id" TEXT NOT NULL,
"sender_email" TEXT NOT NULL,
"sender_name" TEXT,
"subject" TEXT NOT NULL,
"received_at" TIMESTAMP(3) NOT NULL,
"action" TEXT NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "mail_blocked_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "rebreak"."imap_proxy_accounts" (
"id" UUID NOT NULL,
"user_id" UUID NOT NULL,
"proxy_username" TEXT NOT NULL,
"proxy_password" TEXT NOT NULL,
"connection_id" UUID NOT NULL,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "imap_proxy_accounts_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "user_custom_domains_user_id_domain_key" ON "rebreak"."user_custom_domains"("user_id", "domain");
-- CreateIndex
CREATE UNIQUE INDEX "domain_submissions_custom_domain_id_key" ON "rebreak"."domain_submissions"("custom_domain_id");
-- CreateIndex
CREATE UNIQUE INDEX "blocklist_domains_domain_key" ON "rebreak"."blocklist_domains"("domain");
-- CreateIndex
CREATE UNIQUE INDEX "mail_connections_user_id_email_key" ON "rebreak"."mail_connections"("user_id", "email");
-- CreateIndex
CREATE INDEX "notifications_recipient_id_read_at_idx" ON "rebreak"."notifications"("recipient_id", "read_at");
-- CreateIndex
CREATE UNIQUE INDEX "mail_blocked_gmail_message_id_user_id_key" ON "rebreak"."mail_blocked"("gmail_message_id", "user_id");
-- CreateIndex
CREATE UNIQUE INDEX "imap_proxy_accounts_proxy_username_key" ON "rebreak"."imap_proxy_accounts"("proxy_username");
-- CreateIndex
CREATE UNIQUE INDEX "imap_proxy_accounts_connection_id_key" ON "rebreak"."imap_proxy_accounts"("connection_id");
-- AddForeignKey
ALTER TABLE "rebreak"."community_posts" ADD CONSTRAINT "community_posts_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "rebreak"."profiles"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "rebreak"."community_posts" ADD CONSTRAINT "community_posts_repost_of_id_fkey" FOREIGN KEY ("repost_of_id") REFERENCES "rebreak"."community_posts"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "rebreak"."post_likes" ADD CONSTRAINT "post_likes_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "rebreak"."community_posts"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "rebreak"."community_replies" ADD CONSTRAINT "community_replies_post_id_fkey" FOREIGN KEY ("post_id") REFERENCES "rebreak"."community_posts"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "rebreak"."community_replies" ADD CONSTRAINT "community_replies_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "rebreak"."profiles"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "rebreak"."comment_likes" ADD CONSTRAINT "comment_likes_comment_id_fkey" FOREIGN KEY ("comment_id") REFERENCES "rebreak"."community_replies"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "rebreak"."domain_submissions" ADD CONSTRAINT "domain_submissions_custom_domain_id_fkey" FOREIGN KEY ("custom_domain_id") REFERENCES "rebreak"."user_custom_domains"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "rebreak"."domain_votes" ADD CONSTRAINT "domain_votes_submission_id_fkey" FOREIGN KEY ("submission_id") REFERENCES "rebreak"."domain_submissions"("id") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "rebreak"."mail_blocked" ADD CONSTRAINT "mail_blocked_connection_id_fkey" FOREIGN KEY ("connection_id") REFERENCES "rebreak"."mail_connections"("id") ON DELETE CASCADE ON UPDATE CASCADE;