225 lines
7.3 KiB
SQL
225 lines
7.3 KiB
SQL
-- 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;
|