Added auth functionality, initial work with views and field types
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- You are about to drop the column `isActive` on the `tenants` table. All the data in the column will be lost.
|
||||
- You are about to drop the `accounts` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `app_pages` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `apps` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `field_definitions` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `object_definitions` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `permissions` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `role_permissions` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `roles` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `user_roles` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `users` table. If the table is not empty, all the data it contains will be lost.
|
||||
- Added the required column `dbHost` to the `tenants` table without a default value. This is not possible if the table is not empty.
|
||||
- Added the required column `dbName` to the `tenants` table without a default value. This is not possible if the table is not empty.
|
||||
- Added the required column `dbPassword` to the `tenants` table without a default value. This is not possible if the table is not empty.
|
||||
- Added the required column `dbUsername` to the `tenants` table without a default value. This is not possible if the table is not empty.
|
||||
|
||||
*/
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `accounts` DROP FOREIGN KEY `accounts_ownerId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `accounts` DROP FOREIGN KEY `accounts_tenantId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `app_pages` DROP FOREIGN KEY `app_pages_appId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `app_pages` DROP FOREIGN KEY `app_pages_objectId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `apps` DROP FOREIGN KEY `apps_tenantId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `field_definitions` DROP FOREIGN KEY `field_definitions_objectId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `object_definitions` DROP FOREIGN KEY `object_definitions_tenantId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `permissions` DROP FOREIGN KEY `permissions_tenantId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `role_permissions` DROP FOREIGN KEY `role_permissions_permissionId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `role_permissions` DROP FOREIGN KEY `role_permissions_roleId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `roles` DROP FOREIGN KEY `roles_tenantId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `user_roles` DROP FOREIGN KEY `user_roles_roleId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `user_roles` DROP FOREIGN KEY `user_roles_userId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `users` DROP FOREIGN KEY `users_tenantId_fkey`;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE `tenants` DROP COLUMN `isActive`,
|
||||
ADD COLUMN `dbHost` VARCHAR(191) NOT NULL,
|
||||
ADD COLUMN `dbName` VARCHAR(191) NOT NULL,
|
||||
ADD COLUMN `dbPassword` VARCHAR(191) NOT NULL,
|
||||
ADD COLUMN `dbPort` INTEGER NOT NULL DEFAULT 3306,
|
||||
ADD COLUMN `dbUsername` VARCHAR(191) NOT NULL,
|
||||
ADD COLUMN `status` VARCHAR(191) NOT NULL DEFAULT 'active';
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `accounts`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `app_pages`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `apps`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `field_definitions`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `object_definitions`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `permissions`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `role_permissions`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `roles`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `user_roles`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `users`;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `domains` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`domain` VARCHAR(191) NOT NULL,
|
||||
`tenantId` VARCHAR(191) NOT NULL,
|
||||
`isPrimary` BOOLEAN NOT NULL DEFAULT false,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
|
||||
UNIQUE INDEX `domains_domain_key`(`domain`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `domains` ADD CONSTRAINT `domains_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
238
backend/prisma/migrations/20251129033827_init/migration.sql
Normal file
238
backend/prisma/migrations/20251129033827_init/migration.sql
Normal file
@@ -0,0 +1,238 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- You are about to drop the column `dbHost` on the `tenants` table. All the data in the column will be lost.
|
||||
- You are about to drop the column `dbName` on the `tenants` table. All the data in the column will be lost.
|
||||
- You are about to drop the column `dbPassword` on the `tenants` table. All the data in the column will be lost.
|
||||
- You are about to drop the column `dbPort` on the `tenants` table. All the data in the column will be lost.
|
||||
- You are about to drop the column `dbUsername` on the `tenants` table. All the data in the column will be lost.
|
||||
- You are about to drop the column `status` on the `tenants` table. All the data in the column will be lost.
|
||||
- You are about to drop the `domains` table. If the table is not empty, all the data it contains will be lost.
|
||||
|
||||
*/
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `domains` DROP FOREIGN KEY `domains_tenantId_fkey`;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE `tenants` DROP COLUMN `dbHost`,
|
||||
DROP COLUMN `dbName`,
|
||||
DROP COLUMN `dbPassword`,
|
||||
DROP COLUMN `dbPort`,
|
||||
DROP COLUMN `dbUsername`,
|
||||
DROP COLUMN `status`,
|
||||
ADD COLUMN `isActive` BOOLEAN NOT NULL DEFAULT true;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `domains`;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `users` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`tenantId` VARCHAR(191) NOT NULL,
|
||||
`email` VARCHAR(191) NOT NULL,
|
||||
`password` VARCHAR(191) NOT NULL,
|
||||
`firstName` VARCHAR(191) NULL,
|
||||
`lastName` VARCHAR(191) NULL,
|
||||
`isActive` BOOLEAN NOT NULL DEFAULT true,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
|
||||
INDEX `users_tenantId_idx`(`tenantId`),
|
||||
UNIQUE INDEX `users_tenantId_email_key`(`tenantId`, `email`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `roles` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`tenantId` VARCHAR(191) NOT NULL,
|
||||
`name` VARCHAR(191) NOT NULL,
|
||||
`guardName` VARCHAR(191) NOT NULL DEFAULT 'api',
|
||||
`description` VARCHAR(191) NULL,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
|
||||
INDEX `roles_tenantId_idx`(`tenantId`),
|
||||
UNIQUE INDEX `roles_tenantId_name_guardName_key`(`tenantId`, `name`, `guardName`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `permissions` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`tenantId` VARCHAR(191) NOT NULL,
|
||||
`name` VARCHAR(191) NOT NULL,
|
||||
`guardName` VARCHAR(191) NOT NULL DEFAULT 'api',
|
||||
`description` VARCHAR(191) NULL,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
|
||||
INDEX `permissions_tenantId_idx`(`tenantId`),
|
||||
UNIQUE INDEX `permissions_tenantId_name_guardName_key`(`tenantId`, `name`, `guardName`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `user_roles` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`userId` VARCHAR(191) NOT NULL,
|
||||
`roleId` VARCHAR(191) NOT NULL,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
|
||||
INDEX `user_roles_userId_idx`(`userId`),
|
||||
INDEX `user_roles_roleId_idx`(`roleId`),
|
||||
UNIQUE INDEX `user_roles_userId_roleId_key`(`userId`, `roleId`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `role_permissions` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`roleId` VARCHAR(191) NOT NULL,
|
||||
`permissionId` VARCHAR(191) NOT NULL,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
|
||||
INDEX `role_permissions_roleId_idx`(`roleId`),
|
||||
INDEX `role_permissions_permissionId_idx`(`permissionId`),
|
||||
UNIQUE INDEX `role_permissions_roleId_permissionId_key`(`roleId`, `permissionId`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `object_definitions` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`tenantId` VARCHAR(191) NOT NULL,
|
||||
`apiName` VARCHAR(191) NOT NULL,
|
||||
`label` VARCHAR(191) NOT NULL,
|
||||
`pluralLabel` VARCHAR(191) NULL,
|
||||
`description` TEXT NULL,
|
||||
`isSystem` BOOLEAN NOT NULL DEFAULT false,
|
||||
`tableName` VARCHAR(191) NULL,
|
||||
`isActive` BOOLEAN NOT NULL DEFAULT true,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
|
||||
INDEX `object_definitions_tenantId_idx`(`tenantId`),
|
||||
UNIQUE INDEX `object_definitions_tenantId_apiName_key`(`tenantId`, `apiName`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `field_definitions` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`objectId` VARCHAR(191) NOT NULL,
|
||||
`apiName` VARCHAR(191) NOT NULL,
|
||||
`label` VARCHAR(191) NOT NULL,
|
||||
`type` VARCHAR(191) NOT NULL,
|
||||
`description` TEXT NULL,
|
||||
`isRequired` BOOLEAN NOT NULL DEFAULT false,
|
||||
`isUnique` BOOLEAN NOT NULL DEFAULT false,
|
||||
`isReadonly` BOOLEAN NOT NULL DEFAULT false,
|
||||
`isLookup` BOOLEAN NOT NULL DEFAULT false,
|
||||
`referenceTo` VARCHAR(191) NULL,
|
||||
`defaultValue` VARCHAR(191) NULL,
|
||||
`options` JSON NULL,
|
||||
`validationRules` JSON NULL,
|
||||
`isActive` BOOLEAN NOT NULL DEFAULT true,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
|
||||
INDEX `field_definitions_objectId_idx`(`objectId`),
|
||||
UNIQUE INDEX `field_definitions_objectId_apiName_key`(`objectId`, `apiName`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `accounts` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`tenantId` VARCHAR(191) NOT NULL,
|
||||
`name` VARCHAR(191) NOT NULL,
|
||||
`status` VARCHAR(191) NOT NULL DEFAULT 'active',
|
||||
`ownerId` VARCHAR(191) NOT NULL,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
|
||||
INDEX `accounts_tenantId_idx`(`tenantId`),
|
||||
INDEX `accounts_ownerId_idx`(`ownerId`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `apps` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`tenantId` VARCHAR(191) NOT NULL,
|
||||
`slug` VARCHAR(191) NOT NULL,
|
||||
`label` VARCHAR(191) NOT NULL,
|
||||
`description` TEXT NULL,
|
||||
`icon` VARCHAR(191) NULL,
|
||||
`isActive` BOOLEAN NOT NULL DEFAULT true,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
|
||||
INDEX `apps_tenantId_idx`(`tenantId`),
|
||||
UNIQUE INDEX `apps_tenantId_slug_key`(`tenantId`, `slug`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `app_pages` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`appId` VARCHAR(191) NOT NULL,
|
||||
`slug` VARCHAR(191) NOT NULL,
|
||||
`label` VARCHAR(191) NOT NULL,
|
||||
`type` VARCHAR(191) NOT NULL,
|
||||
`objectApiName` VARCHAR(191) NULL,
|
||||
`objectId` VARCHAR(191) NULL,
|
||||
`config` JSON NULL,
|
||||
`sortOrder` INTEGER NOT NULL DEFAULT 0,
|
||||
`isActive` BOOLEAN NOT NULL DEFAULT true,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
|
||||
INDEX `app_pages_appId_idx`(`appId`),
|
||||
INDEX `app_pages_objectId_idx`(`objectId`),
|
||||
UNIQUE INDEX `app_pages_appId_slug_key`(`appId`, `slug`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `users` ADD CONSTRAINT `users_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `roles` ADD CONSTRAINT `roles_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `permissions` ADD CONSTRAINT `permissions_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `user_roles` ADD CONSTRAINT `user_roles_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `user_roles` ADD CONSTRAINT `user_roles_roleId_fkey` FOREIGN KEY (`roleId`) REFERENCES `roles`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `role_permissions` ADD CONSTRAINT `role_permissions_roleId_fkey` FOREIGN KEY (`roleId`) REFERENCES `roles`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `role_permissions` ADD CONSTRAINT `role_permissions_permissionId_fkey` FOREIGN KEY (`permissionId`) REFERENCES `permissions`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `object_definitions` ADD CONSTRAINT `object_definitions_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `field_definitions` ADD CONSTRAINT `field_definitions_objectId_fkey` FOREIGN KEY (`objectId`) REFERENCES `object_definitions`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `accounts` ADD CONSTRAINT `accounts_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `accounts` ADD CONSTRAINT `accounts_ownerId_fkey` FOREIGN KEY (`ownerId`) REFERENCES `users`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `apps` ADD CONSTRAINT `apps_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `app_pages` ADD CONSTRAINT `app_pages_appId_fkey` FOREIGN KEY (`appId`) REFERENCES `apps`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `app_pages` ADD CONSTRAINT `app_pages_objectId_fkey` FOREIGN KEY (`objectId`) REFERENCES `object_definitions`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- You are about to drop the column `isActive` on the `tenants` table. All the data in the column will be lost.
|
||||
- You are about to drop the `accounts` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `app_pages` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `apps` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `field_definitions` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `object_definitions` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `permissions` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `role_permissions` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `roles` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `user_roles` table. If the table is not empty, all the data it contains will be lost.
|
||||
- You are about to drop the `users` table. If the table is not empty, all the data it contains will be lost.
|
||||
- Added the required column `dbHost` to the `tenants` table without a default value. This is not possible if the table is not empty.
|
||||
- Added the required column `dbName` to the `tenants` table without a default value. This is not possible if the table is not empty.
|
||||
- Added the required column `dbPassword` to the `tenants` table without a default value. This is not possible if the table is not empty.
|
||||
- Added the required column `dbUsername` to the `tenants` table without a default value. This is not possible if the table is not empty.
|
||||
|
||||
*/
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `accounts` DROP FOREIGN KEY `accounts_ownerId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `accounts` DROP FOREIGN KEY `accounts_tenantId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `app_pages` DROP FOREIGN KEY `app_pages_appId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `app_pages` DROP FOREIGN KEY `app_pages_objectId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `apps` DROP FOREIGN KEY `apps_tenantId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `field_definitions` DROP FOREIGN KEY `field_definitions_objectId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `object_definitions` DROP FOREIGN KEY `object_definitions_tenantId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `permissions` DROP FOREIGN KEY `permissions_tenantId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `role_permissions` DROP FOREIGN KEY `role_permissions_permissionId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `role_permissions` DROP FOREIGN KEY `role_permissions_roleId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `roles` DROP FOREIGN KEY `roles_tenantId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `user_roles` DROP FOREIGN KEY `user_roles_roleId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `user_roles` DROP FOREIGN KEY `user_roles_userId_fkey`;
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE `users` DROP FOREIGN KEY `users_tenantId_fkey`;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE `tenants` DROP COLUMN `isActive`,
|
||||
ADD COLUMN `dbHost` VARCHAR(191) NOT NULL,
|
||||
ADD COLUMN `dbName` VARCHAR(191) NOT NULL,
|
||||
ADD COLUMN `dbPassword` VARCHAR(191) NOT NULL,
|
||||
ADD COLUMN `dbPort` INTEGER NOT NULL DEFAULT 3306,
|
||||
ADD COLUMN `dbUsername` VARCHAR(191) NOT NULL,
|
||||
ADD COLUMN `status` VARCHAR(191) NOT NULL DEFAULT 'active';
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `accounts`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `app_pages`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `apps`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `field_definitions`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `object_definitions`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `permissions`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `role_permissions`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `roles`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `user_roles`;
|
||||
|
||||
-- DropTable
|
||||
DROP TABLE `users`;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE `domains` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`domain` VARCHAR(191) NOT NULL,
|
||||
`tenantId` VARCHAR(191) NOT NULL,
|
||||
`isPrimary` BOOLEAN NOT NULL DEFAULT false,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
|
||||
UNIQUE INDEX `domains_domain_key`(`domain`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE `domains` ADD CONSTRAINT `domains_tenantId_fkey` FOREIGN KEY (`tenantId`) REFERENCES `tenants`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
@@ -0,0 +1,15 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE `users` (
|
||||
`id` VARCHAR(191) NOT NULL,
|
||||
`email` VARCHAR(191) NOT NULL,
|
||||
`password` VARCHAR(191) NOT NULL,
|
||||
`firstName` VARCHAR(191) NULL,
|
||||
`lastName` VARCHAR(191) NULL,
|
||||
`role` VARCHAR(191) NOT NULL DEFAULT 'admin',
|
||||
`isActive` BOOLEAN NOT NULL DEFAULT true,
|
||||
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
`updatedAt` DATETIME(3) NOT NULL,
|
||||
|
||||
UNIQUE INDEX `users_email_key`(`email`),
|
||||
PRIMARY KEY (`id`)
|
||||
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
@@ -1,3 +1,3 @@
|
||||
# Please do not edit this file manually
|
||||
# It should be added in your version-control system (i.e. Git)
|
||||
provider = "mysql"
|
||||
provider = "mysql"
|
||||
54
backend/prisma/schema-central.prisma
Normal file
54
backend/prisma/schema-central.prisma
Normal file
@@ -0,0 +1,54 @@
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
output = "../node_modules/.prisma/central"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "mysql"
|
||||
url = env("CENTRAL_DATABASE_URL")
|
||||
}
|
||||
|
||||
model User {
|
||||
id String @id @default(cuid())
|
||||
email String @unique
|
||||
password String
|
||||
firstName String?
|
||||
lastName String?
|
||||
role String @default("admin") // admin, superadmin
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@map("users")
|
||||
}
|
||||
|
||||
model Tenant {
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
slug String @unique // Used for identification
|
||||
dbHost String // Database host
|
||||
dbPort Int @default(3306)
|
||||
dbName String // Database name
|
||||
dbUsername String // Database username
|
||||
dbPassword String // Encrypted database password
|
||||
status String @default("active") // active, suspended, deleted
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
domains Domain[]
|
||||
|
||||
@@map("tenants")
|
||||
}
|
||||
|
||||
model Domain {
|
||||
id String @id @default(cuid())
|
||||
domain String @unique // e.g., "acme" for acme.yourapp.com
|
||||
tenantId String
|
||||
isPrimary Boolean @default(false)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@map("domains")
|
||||
}
|
||||
@@ -1,39 +1,21 @@
|
||||
// This is your Prisma schema file,
|
||||
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
||||
// Tenant-specific database schema
|
||||
// This schema is applied to each tenant's database
|
||||
// NOTE: Each tenant has its own database, so there is NO tenantId column in these tables
|
||||
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
output = "../node_modules/.prisma/tenant"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "mysql"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
// Multi-tenancy
|
||||
model Tenant {
|
||||
id String @id @default(uuid())
|
||||
name String
|
||||
slug String @unique
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
users User[]
|
||||
objectDefinitions ObjectDefinition[]
|
||||
accounts Account[]
|
||||
apps App[]
|
||||
roles Role[]
|
||||
permissions Permission[]
|
||||
|
||||
@@map("tenants")
|
||||
url = env("TENANT_DATABASE_URL")
|
||||
}
|
||||
|
||||
// User & Auth
|
||||
model User {
|
||||
id String @id @default(uuid())
|
||||
tenantId String
|
||||
email String
|
||||
email String @unique
|
||||
password String
|
||||
firstName String?
|
||||
lastName String?
|
||||
@@ -41,48 +23,39 @@ model User {
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
|
||||
userRoles UserRole[]
|
||||
accounts Account[]
|
||||
|
||||
@@unique([tenantId, email])
|
||||
@@index([tenantId])
|
||||
@@map("users")
|
||||
}
|
||||
|
||||
// RBAC - Spatie-like
|
||||
model Role {
|
||||
id String @id @default(uuid())
|
||||
tenantId String
|
||||
name String
|
||||
guardName String @default("api")
|
||||
description String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
|
||||
userRoles UserRole[]
|
||||
rolePermissions RolePermission[]
|
||||
|
||||
@@unique([tenantId, name, guardName])
|
||||
@@index([tenantId])
|
||||
@@unique([name, guardName])
|
||||
@@map("roles")
|
||||
}
|
||||
|
||||
model Permission {
|
||||
id String @id @default(uuid())
|
||||
tenantId String
|
||||
name String
|
||||
guardName String @default("api")
|
||||
description String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
|
||||
rolePermissions RolePermission[]
|
||||
|
||||
@@unique([tenantId, name, guardName])
|
||||
@@index([tenantId])
|
||||
@@unique([name, guardName])
|
||||
@@map("permissions")
|
||||
}
|
||||
|
||||
@@ -119,66 +92,59 @@ model RolePermission {
|
||||
// Object Definition (Metadata)
|
||||
model ObjectDefinition {
|
||||
id String @id @default(uuid())
|
||||
tenantId String
|
||||
apiName String
|
||||
apiName String @unique
|
||||
label String
|
||||
pluralLabel String?
|
||||
description String? @db.Text
|
||||
isSystem Boolean @default(false)
|
||||
tableName String?
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
isCustom Boolean @default(true)
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
|
||||
fields FieldDefinition[]
|
||||
pages AppPage[]
|
||||
|
||||
@@unique([tenantId, apiName])
|
||||
@@index([tenantId])
|
||||
@@map("object_definitions")
|
||||
}
|
||||
|
||||
model FieldDefinition {
|
||||
id String @id @default(uuid())
|
||||
objectId String
|
||||
apiName String
|
||||
label String
|
||||
type String // text, number, boolean, date, datetime, lookup, picklist, etc.
|
||||
description String? @db.Text
|
||||
isRequired Boolean @default(false)
|
||||
isUnique Boolean @default(false)
|
||||
isReadonly Boolean @default(false)
|
||||
isLookup Boolean @default(false)
|
||||
referenceTo String? // objectApiName for lookup fields
|
||||
defaultValue String?
|
||||
options Json? // for picklist fields
|
||||
validationRules Json? // custom validation rules
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
id String @id @default(uuid())
|
||||
objectDefinitionId String
|
||||
apiName String
|
||||
label String
|
||||
type String // String, Number, Date, Boolean, Reference, etc.
|
||||
length Int?
|
||||
precision Int?
|
||||
scale Int?
|
||||
referenceObject String?
|
||||
defaultValue String? @db.Text
|
||||
description String? @db.Text
|
||||
isRequired Boolean @default(false)
|
||||
isUnique Boolean @default(false)
|
||||
isSystem Boolean @default(false)
|
||||
isCustom Boolean @default(true)
|
||||
displayOrder Int @default(0)
|
||||
createdAt DateTime @default(now()) @map("created_at")
|
||||
updatedAt DateTime @updatedAt @map("updated_at")
|
||||
|
||||
object ObjectDefinition @relation(fields: [objectId], references: [id], onDelete: Cascade)
|
||||
object ObjectDefinition @relation(fields: [objectDefinitionId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([objectId, apiName])
|
||||
@@index([objectId])
|
||||
@@unique([objectDefinitionId, apiName])
|
||||
@@index([objectDefinitionId])
|
||||
@@map("field_definitions")
|
||||
}
|
||||
|
||||
// Example static object: Account
|
||||
model Account {
|
||||
id String @id @default(uuid())
|
||||
tenantId String
|
||||
name String
|
||||
status String @default("active")
|
||||
ownerId String
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
|
||||
owner User @relation(fields: [ownerId], references: [id])
|
||||
|
||||
@@index([tenantId])
|
||||
@@index([ownerId])
|
||||
@@map("accounts")
|
||||
}
|
||||
@@ -186,8 +152,7 @@ model Account {
|
||||
// Application Builder
|
||||
model App {
|
||||
id String @id @default(uuid())
|
||||
tenantId String
|
||||
slug String
|
||||
slug String @unique
|
||||
label String
|
||||
description String? @db.Text
|
||||
icon String?
|
||||
@@ -195,11 +160,8 @@ model App {
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
tenant Tenant @relation(fields: [tenantId], references: [id], onDelete: Cascade)
|
||||
pages AppPage[]
|
||||
|
||||
@@unique([tenantId, slug])
|
||||
@@index([tenantId])
|
||||
@@map("apps")
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user