164 lines
4.7 KiB
SQL
164 lines
4.7 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "Language" AS ENUM ('vi', 'en');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "Gender" AS ENUM ('Male', 'Female', 'LGBT');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "BookingStatus" AS ENUM ('done', 'pending', 'reject', 'cancel');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "User" (
|
|
"id" SERIAL NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"phone" TEXT,
|
|
"username" TEXT,
|
|
"fullname" TEXT,
|
|
"dob" TIMESTAMP(3),
|
|
"gender" "Gender" NOT NULL DEFAULT 'Female',
|
|
"language" "Language" NOT NULL DEFAULT 'vi',
|
|
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMPTZ(3) NOT NULL,
|
|
"deleted_at" TIMESTAMPTZ(3),
|
|
|
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Booking" (
|
|
"id" SERIAL NOT NULL,
|
|
"path" TEXT,
|
|
"image" TEXT,
|
|
"public" BOOLEAN NOT NULL DEFAULT true,
|
|
"user_id" INTEGER NOT NULL,
|
|
"status" "BookingStatus" NOT NULL DEFAULT 'pending',
|
|
"slot_id" INTEGER NOT NULL,
|
|
"start_at" TIMESTAMPTZ(3) NOT NULL,
|
|
"end_at" TIMESTAMPTZ(3),
|
|
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMPTZ(3) NOT NULL,
|
|
"deleted_at" TIMESTAMPTZ(3),
|
|
|
|
CONSTRAINT "Booking_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Slot" (
|
|
"id" SERIAL NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"lat" DOUBLE PRECISION NOT NULL,
|
|
"lng" DOUBLE PRECISION NOT NULL,
|
|
"address" TEXT NOT NULL,
|
|
"district" TEXT NOT NULL,
|
|
"ward" TEXT NOT NULL,
|
|
"city" TEXT NOT NULL,
|
|
"destination" TEXT,
|
|
"total" INTEGER NOT NULL,
|
|
"empty" INTEGER NOT NULL,
|
|
"published" BOOLEAN NOT NULL DEFAULT false,
|
|
"tenantId" INTEGER NOT NULL,
|
|
"distance" DOUBLE PRECISION NOT NULL,
|
|
"duration" DOUBLE PRECISION NOT NULL,
|
|
"directions" JSONB NOT NULL,
|
|
"created_at" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updated_at" TIMESTAMPTZ(3) NOT NULL,
|
|
"deleted_at" TIMESTAMPTZ(3),
|
|
|
|
CONSTRAINT "Slot_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Admin" (
|
|
"id" SERIAL NOT NULL,
|
|
"username" TEXT NOT NULL,
|
|
"password" TEXT NOT NULL,
|
|
"password_confirmation" TEXT NOT NULL,
|
|
"street" TEXT,
|
|
"city" TEXT,
|
|
"province" TEXT,
|
|
"first_name" TEXT NOT NULL,
|
|
"last_name" TEXT NOT NULL,
|
|
"phone" TEXT NOT NULL,
|
|
"dob" TIMESTAMP(3),
|
|
"language" "Language" NOT NULL DEFAULT 'vi',
|
|
"last_login_at" TIMESTAMP(3),
|
|
"current_login_at" TIMESTAMP(3),
|
|
"last_login_failed_at" TIMESTAMP(3),
|
|
"consecutive_login_penalty" INTEGER NOT NULL DEFAULT 0,
|
|
"avatarUrl" TEXT,
|
|
"active" BOOLEAN NOT NULL DEFAULT true,
|
|
"last_lockout_at" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Admin_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Tenant" (
|
|
"id" SERIAL NOT NULL,
|
|
"email" TEXT,
|
|
"username" TEXT NOT NULL,
|
|
"password" TEXT NOT NULL,
|
|
"password_confirmation" TEXT,
|
|
"street" TEXT,
|
|
"city" TEXT,
|
|
"province" TEXT,
|
|
"postal_code" TEXT,
|
|
"first_name" TEXT NOT NULL,
|
|
"last_name" TEXT NOT NULL,
|
|
"phone" TEXT NOT NULL,
|
|
"language" "Language" NOT NULL DEFAULT 'vi',
|
|
"last_login_at" TIMESTAMP(3),
|
|
"current_login_at" TIMESTAMP(3),
|
|
"last_login_failed_at" TIMESTAMP(3),
|
|
"consecutive_login_penalty" INTEGER NOT NULL DEFAULT 0,
|
|
"avatarUrl" TEXT,
|
|
"active" BOOLEAN NOT NULL DEFAULT true,
|
|
"last_lockout_at" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Tenant_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "History" (
|
|
"id" SERIAL NOT NULL,
|
|
|
|
CONSTRAINT "History_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_username_key" ON "User"("username");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "User_id_email_idx" ON "User"("id", "email");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Booking_user_id_id_idx" ON "Booking"("user_id", "id");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Slot_id_idx" ON "Slot"("id");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Admin_username_key" ON "Admin"("username");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Tenant_email_key" ON "Tenant"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Tenant_username_key" ON "Tenant"("username");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Booking" ADD CONSTRAINT "Booking_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Booking" ADD CONSTRAINT "Booking_slot_id_fkey" FOREIGN KEY ("slot_id") REFERENCES "Slot"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Slot" ADD CONSTRAINT "Slot_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|