405 lines
13 KiB
SQL
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;
|
|
|