-- CreateExtension CREATE EXTENSION IF NOT EXISTS "pgcrypto"; -- CreateEnum CREATE TYPE "roles" AS ENUM ('admin', 'staff', 'user'); -- CreateEnum CREATE TYPE "status_contact_messages" AS ENUM ('new', 'read', 'replied', 'resolved'); -- CreateEnum CREATE TYPE "crime_rates" AS ENUM ('low', 'medium', 'high'); -- CreateEnum CREATE TYPE "crime_status" AS ENUM ('new', 'in_progress', 'resolved'); -- CreateTable CREATE TABLE "users" ( "id" UUID NOT NULL, "email" VARCHAR(255) NOT NULL, "email_verified" BOOLEAN NOT NULL DEFAULT false, "password" VARCHAR(255), "first_name" VARCHAR(255), "last_name" VARCHAR(255), "avatar" VARCHAR(255), "role" "roles" NOT NULL DEFAULT 'user', "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, "last_signed_in" TIMESTAMP(3), "metadata" JSONB, CONSTRAINT "users_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "profiles" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "user_id" UUID NOT NULL, "bio" TEXT, "phone" VARCHAR(20), "address" VARCHAR(255), "city" VARCHAR(100), "country" VARCHAR(100), "birth_date" TIMESTAMP(3), CONSTRAINT "profiles_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "contact_messages" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "name" VARCHAR(255), "email" VARCHAR(255), "phone" VARCHAR(20), "message_type" VARCHAR(50), "message_type_label" VARCHAR(50), "message" TEXT, "status" "status_contact_messages" NOT NULL DEFAULT 'new', "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), "updated_at" TIMESTAMPTZ(6) NOT NULL, CONSTRAINT "contact_messages_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "cities" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "geographic_id" UUID, "name" VARCHAR(100) NOT NULL, "code" VARCHAR(10) NOT NULL, "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), CONSTRAINT "cities_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "districts" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "city_id" UUID NOT NULL, "name" VARCHAR(100) NOT NULL, "code" VARCHAR(10) NOT NULL, "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), CONSTRAINT "districts_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "geographics" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "district_id" UUID, "latitude" DOUBLE PRECISION, "longitude" DOUBLE PRECISION, "land_area" DOUBLE PRECISION, "polygon" JSONB, "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), CONSTRAINT "geographics_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "demographics" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "district_id" UUID, "city_id" UUID, "province_id" UUID, "year" INTEGER NOT NULL, "population" INTEGER NOT NULL, "population_density" DOUBLE PRECISION NOT NULL, "poverty_rate" DOUBLE PRECISION NOT NULL, "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), CONSTRAINT "demographics_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "crimes" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "district_id" UUID, "city_id" UUID, "year" INTEGER NOT NULL, "number_of_crime" INTEGER NOT NULL, "rate" "crime_rates" NOT NULL DEFAULT 'low', "heat_map" JSONB, "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), CONSTRAINT "crimes_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "crime_cases" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "crime_id" UUID, "crime_category_id" UUID, "date" TIMESTAMPTZ(6) NOT NULL, "time" TIMESTAMPTZ(6) NOT NULL, "location" VARCHAR(255) NOT NULL, "latitude" DOUBLE PRECISION NOT NULL, "longitude" DOUBLE PRECISION NOT NULL, "description" TEXT NOT NULL, "victim_count" INTEGER NOT NULL, "status" "crime_status" NOT NULL DEFAULT 'new', "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), CONSTRAINT "crime_cases_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "crime_categories" ( "id" UUID NOT NULL DEFAULT gen_random_uuid(), "name" VARCHAR(255) NOT NULL, "description" TEXT NOT NULL, "created_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), "updated_at" TIMESTAMPTZ(6) NOT NULL DEFAULT now(), CONSTRAINT "crime_categories_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); -- CreateIndex CREATE INDEX "users_role_idx" ON "users"("role"); -- CreateIndex CREATE UNIQUE INDEX "profiles_user_id_key" ON "profiles"("user_id"); -- CreateIndex CREATE INDEX "profiles_user_id_idx" ON "profiles"("user_id"); -- CreateIndex CREATE INDEX "cities_name_idx" ON "cities"("name"); -- CreateIndex CREATE INDEX "districts_name_idx" ON "districts"("name"); -- CreateIndex CREATE UNIQUE INDEX "geographics_district_id_key" ON "geographics"("district_id"); -- CreateIndex CREATE UNIQUE INDEX "demographics_district_id_year_key" ON "demographics"("district_id", "year"); -- CreateIndex CREATE UNIQUE INDEX "demographics_city_id_year_key" ON "demographics"("city_id", "year"); -- CreateIndex CREATE UNIQUE INDEX "crimes_district_id_year_key" ON "crimes"("district_id", "year"); -- CreateIndex CREATE UNIQUE INDEX "crimes_city_id_year_key" ON "crimes"("city_id", "year"); -- AddForeignKey ALTER TABLE "profiles" ADD CONSTRAINT "profiles_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "cities" ADD CONSTRAINT "cities_geographic_id_fkey" FOREIGN KEY ("geographic_id") REFERENCES "geographics"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "districts" ADD CONSTRAINT "districts_city_id_fkey" FOREIGN KEY ("city_id") REFERENCES "cities"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "geographics" ADD CONSTRAINT "geographics_district_id_fkey" FOREIGN KEY ("district_id") REFERENCES "districts"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "demographics" ADD CONSTRAINT "demographics_district_id_fkey" FOREIGN KEY ("district_id") REFERENCES "districts"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "demographics" ADD CONSTRAINT "demographics_city_id_fkey" FOREIGN KEY ("city_id") REFERENCES "cities"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "crimes" ADD CONSTRAINT "crimes_district_id_fkey" FOREIGN KEY ("district_id") REFERENCES "districts"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "crimes" ADD CONSTRAINT "crimes_city_id_fkey" FOREIGN KEY ("city_id") REFERENCES "cities"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "crime_cases" ADD CONSTRAINT "crime_cases_crime_id_fkey" FOREIGN KEY ("crime_id") REFERENCES "crimes"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "crime_cases" ADD CONSTRAINT "crime_cases_crime_category_id_fkey" FOREIGN KEY ("crime_category_id") REFERENCES "crime_categories"("id") ON DELETE SET NULL ON UPDATE CASCADE;