refactor: update migration

This commit is contained in:
Mauricio Siu
2025-02-15 18:13:20 -06:00
parent 6ec60b6bab
commit 1bbb4c9b64
13 changed files with 28 additions and 5609 deletions

View File

@@ -19,7 +19,6 @@ CREATE TABLE "user_temp" (
"email" text NOT NULL,
"email_verified" boolean NOT NULL,
"image" text,
"role" text,
"banned" boolean,
"ban_reason" text,
"ban_expires" timestamp,

View File

@@ -8,7 +8,6 @@ WITH inserted_users AS (
token,
"email_verified",
"updated_at",
role,
"serverIp",
image,
"certificateType",
@@ -34,7 +33,6 @@ WITH inserted_users AS (
COALESCE(auth.token, ''),
true,
CURRENT_TIMESTAMP,
'admin',
a."serverIp",
auth.image,
a."certificateType",
@@ -109,7 +107,6 @@ inserted_members AS (
token,
"email_verified",
"updated_at",
role,
image,
"createdAt",
"canAccessToAPI",
@@ -131,7 +128,6 @@ inserted_members AS (
COALESCE(u.token, ''),
true,
CURRENT_TIMESTAMP,
'user',
auth.image,
NOW(),
COALESCE(u."canAccessToAPI", false),
@@ -176,8 +172,27 @@ inserted_member_accounts AS (
JOIN admin a ON u."adminId" = a."adminId"
JOIN auth ON auth.id = u."authId"
RETURNING *
),
inserted_admin_members AS (
-- Insertar miembros en las organizaciones (admins como owners)
INSERT INTO member (
id,
"organization_id",
"user_id",
role,
"created_at"
)
SELECT
gen_random_uuid(),
o.id,
a."adminId",
'owner',
NOW()
FROM admin a
JOIN inserted_orgs o ON o."owner_id" = a."adminId"
RETURNING *
)
-- Insertar miembros en las organizaciones
-- Insertar miembros regulares en las organizaciones
INSERT INTO member (
id,
"organization_id",
@@ -189,7 +204,7 @@ SELECT
gen_random_uuid(),
o.id,
u."userId",
'admin',
'member',
NOW()
FROM "user" u
JOIN admin a ON u."adminId" = a."adminId"

View File

@@ -0,0 +1,2 @@
ALTER TABLE "user_temp" ALTER COLUMN "token" SET DEFAULT '';--> statement-breakpoint
ALTER TABLE "user_temp" ADD COLUMN "created_at" timestamp DEFAULT now();

View File

@@ -1 +0,0 @@
ALTER TABLE "user_temp" ADD COLUMN "created_at" timestamp DEFAULT now();

View File

@@ -1 +0,0 @@
ALTER TABLE "user_temp" ALTER COLUMN "token" SET DEFAULT '';

View File

@@ -1028,12 +1028,6 @@
"primaryKey": false,
"notNull": false
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": false
},
"banned": {
"name": "banned",
"type": "boolean",

View File

@@ -1028,12 +1028,6 @@
"primaryKey": false,
"notNull": false
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": false
},
"banned": {
"name": "banned",
"type": "boolean",

View File

@@ -1028,12 +1028,6 @@
"primaryKey": false,
"notNull": false
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": false
},
"banned": {
"name": "banned",
"type": "boolean",

View File

@@ -1,5 +1,5 @@
{
"id": "82a6a31d-7611-410d-8a32-31a36ab369c5",
"id": "e0842a94-530d-4a3c-a6b1-16cf37618b8b",
"prevId": "c2e134de-9865-4892-a24d-048aa5be22e8",
"version": "7",
"dialect": "postgresql",
@@ -912,7 +912,8 @@
"name": "token",
"type": "text",
"primaryKey": false,
"notNull": true
"notNull": true,
"default": "''"
},
"isRegistered": {
"name": "isRegistered",
@@ -1035,12 +1036,6 @@
"primaryKey": false,
"notNull": false
},
"role": {
"name": "role",
"type": "text",
"primaryKey": false,
"notNull": false
},
"banned": {
"name": "banned",
"type": "boolean",

File diff suppressed because it is too large Load Diff

View File

@@ -488,15 +488,8 @@
{
"idx": 69,
"version": "7",
"when": 1739432476590,
"tag": "0069_known_aqueduct",
"breakpoints": true
},
{
"idx": 70,
"version": "7",
"when": 1739432513877,
"tag": "0070_overrated_the_stranger",
"when": 1739664410814,
"tag": "0069_broad_ken_ellis",
"breakpoints": true
}
]

View File

@@ -1,278 +0,0 @@
CREATE TABLE "account" (
"id" text PRIMARY KEY NOT NULL,
"account_id" text NOT NULL,
"provider_id" text NOT NULL,
"user_id" text NOT NULL,
"access_token" text,
"refresh_token" text,
"id_token" text,
"access_token_expires_at" timestamp,
"refresh_token_expires_at" timestamp,
"scope" text,
"password" text,
"is2FAEnabled" boolean DEFAULT false NOT NULL,
"created_at" timestamp NOT NULL,
"updated_at" timestamp NOT NULL,
"resetPasswordToken" text,
"resetPasswordExpiresAt" text,
"confirmationToken" text,
"confirmationExpiresAt" text
);
--> statement-breakpoint
CREATE TABLE "verification" (
"id" text PRIMARY KEY NOT NULL,
"identifier" text NOT NULL,
"value" text NOT NULL,
"expires_at" timestamp NOT NULL,
"created_at" timestamp,
"updated_at" timestamp
);
-- Primero eliminar las restricciones NOT NULL y foreign keys
ALTER TABLE "user" ALTER COLUMN "adminId" DROP NOT NULL;
ALTER TABLE "user" ALTER COLUMN "authId" DROP NOT NULL;
ALTER TABLE "user" DROP CONSTRAINT IF EXISTS "user_adminId_admin_adminId_fk";
ALTER TABLE "user" DROP CONSTRAINT IF EXISTS "user_authId_auth_id_fk";
ALTER TABLE "admin" DROP CONSTRAINT IF EXISTS "admin_authId_auth_id_fk";
ALTER TABLE "project" DROP CONSTRAINT IF EXISTS "project_adminId_admin_adminId_fk";
ALTER TABLE "destination" DROP CONSTRAINT IF EXISTS "destination_adminId_admin_adminId_fk";
ALTER TABLE "certificate" DROP CONSTRAINT IF EXISTS "certificate_adminId_admin_adminId_fk";
ALTER TABLE "session" DROP CONSTRAINT IF EXISTS "session_user_id_auth_id_fk";
ALTER TABLE "registry" DROP CONSTRAINT IF EXISTS "registry_adminId_admin_adminId_fk";
ALTER TABLE "notification" DROP CONSTRAINT IF EXISTS "notification_adminId_admin_adminId_fk";
ALTER TABLE "ssh-key" DROP CONSTRAINT IF EXISTS "ssh-key_adminId_admin_adminId_fk";
ALTER TABLE "git_provider" DROP CONSTRAINT IF EXISTS "git_provider_adminId_admin_adminId_fk";
ALTER TABLE "server" DROP CONSTRAINT IF EXISTS "server_adminId_admin_adminId_fk";
-- Luego renombrar las columnas
ALTER TABLE "user" RENAME COLUMN "userId" TO "id";
ALTER TABLE "project" RENAME COLUMN "adminId" TO "userId";
ALTER TABLE "destination" RENAME COLUMN "adminId" TO "userId";
ALTER TABLE "certificate" RENAME COLUMN "adminId" TO "userId";
ALTER TABLE "registry" RENAME COLUMN "adminId" TO "userId";
ALTER TABLE "notification" RENAME COLUMN "adminId" TO "userId";
ALTER TABLE "ssh-key" RENAME COLUMN "adminId" TO "userId";
ALTER TABLE "git_provider" RENAME COLUMN "adminId" TO "userId";
ALTER TABLE "server" RENAME COLUMN "adminId" TO "userId";
-- Primero agregar todas las columnas sin restricciones
ALTER TABLE "user" ADD COLUMN "name" text;
ALTER TABLE "user" ADD COLUMN "email" text;
ALTER TABLE "user" ADD COLUMN "email_verified" boolean;
ALTER TABLE "user" ADD COLUMN "image" text;
ALTER TABLE "user" ADD COLUMN "role" text;
ALTER TABLE "user" ADD COLUMN "banned" boolean;
ALTER TABLE "user" ADD COLUMN "ban_reason" text;
ALTER TABLE "user" ADD COLUMN "ban_expires" timestamp;
ALTER TABLE "user" ADD COLUMN "updated_at" timestamp;
ALTER TABLE "user" ADD COLUMN "serverIp" text;
ALTER TABLE "user" ADD COLUMN "certificateType" "certificateType" DEFAULT 'none';
ALTER TABLE "user" ADD COLUMN "host" text;
ALTER TABLE "user" ADD COLUMN "letsEncryptEmail" text;
ALTER TABLE "user" ADD COLUMN "sshPrivateKey" text;
ALTER TABLE "user" ADD COLUMN "enableDockerCleanup" boolean DEFAULT false;
ALTER TABLE "user" ADD COLUMN "enableLogRotation" boolean DEFAULT false;
ALTER TABLE "user" ADD COLUMN "enablePaidFeatures" boolean DEFAULT false;
ALTER TABLE "user" ADD COLUMN "metricsConfig" jsonb DEFAULT '{"server":{"type":"Dokploy","refreshRate":60,"port":4500,"token":"","retentionDays":2,"cronJob":"","urlCallback":"","thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}';
ALTER TABLE "user" ADD COLUMN "cleanupCacheApplications" boolean DEFAULT false;
ALTER TABLE "user" ADD COLUMN "cleanupCacheOnPreviews" boolean DEFAULT false;
ALTER TABLE "user" ADD COLUMN "cleanupCacheOnCompose" boolean DEFAULT false;
ALTER TABLE "user" ALTER COLUMN "token" SET DEFAULT '';
ALTER TABLE "user" ALTER COLUMN "expirationDate" SET DEFAULT CURRENT_TIMESTAMP + INTERVAL '1 year';
ALTER TABLE "user" ALTER COLUMN "createdAt" SET DEFAULT to_char(CURRENT_TIMESTAMP, 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"');
--> statement-breakpoint
-- Luego actualizar los valores nulos
UPDATE "user" SET token = '' WHERE token IS NULL;
UPDATE "user" SET "expirationDate" = CURRENT_TIMESTAMP + INTERVAL '1 year' WHERE "expirationDate" IS NULL;
UPDATE "user" SET "createdAt" = to_char(CURRENT_TIMESTAMP, 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"') WHERE "createdAt" IS NULL;
UPDATE "user" SET "name" = '' WHERE "name" IS NULL;
-- Generar emails únicos para registros vacíos
UPDATE "user" SET "email" = CONCAT('user_', id, '@dokploy.local') WHERE "email" = '' OR "email" IS NULL;
UPDATE "user" SET "email_verified" = COALESCE("email_verified", false) WHERE true;
UPDATE "user" SET "role" = COALESCE("role", 'user') WHERE true;
UPDATE "user" SET "banned" = COALESCE("banned", false) WHERE true;
UPDATE "user" SET "updated_at" = COALESCE("updated_at", CURRENT_TIMESTAMP) WHERE true;
UPDATE "user" SET "certificateType" = COALESCE("certificateType", 'none') WHERE true;
UPDATE "user" SET "enableDockerCleanup" = COALESCE("enableDockerCleanup", false) WHERE true;
UPDATE "user" SET "enableLogRotation" = COALESCE("enableLogRotation", false) WHERE true;
UPDATE "user" SET "enablePaidFeatures" = COALESCE("enablePaidFeatures", false) WHERE true;
UPDATE "user" SET "metricsConfig" = COALESCE("metricsConfig", '{"server":{"type":"Dokploy","refreshRate":60,"port":4500,"token":"","retentionDays":2,"cronJob":"","urlCallback":"","thresholds":{"cpu":0,"memory":0}},"containers":{"refreshRate":60,"services":{"include":[],"exclude":[]}}}') WHERE true;
UPDATE "user" SET "cleanupCacheApplications" = COALESCE("cleanupCacheApplications", false) WHERE true;
UPDATE "user" SET "cleanupCacheOnPreviews" = COALESCE("cleanupCacheOnPreviews", false) WHERE true;
UPDATE "user" SET "cleanupCacheOnCompose" = COALESCE("cleanupCacheOnCompose", false) WHERE true;
--> statement-breakpoint
-- Migrar datos de auth a user
INSERT INTO "user" (
id,
name,
email,
email_verified,
image,
role,
updated_at
)
SELECT
id,
'' as name,
email,
true as email_verified,
image,
CASE
WHEN rol = 'admin' THEN 'admin'
ELSE 'user'
END as role,
CAST("createdAt" AS timestamp) as updated_at
FROM "auth";
-- Migrar datos de auth a account
INSERT INTO "account" (
id,
account_id,
provider_id,
user_id,
password,
"is2FAEnabled",
created_at,
updated_at
)
SELECT
id as id,
id as account_id,
'credentials' as provider_id,
id as user_id,
password,
"is2FAEnabled",
CAST("createdAt" AS timestamp) as created_at,
CAST("createdAt" AS timestamp) as updated_at
FROM "auth";
-- Migrar datos de admin a user
UPDATE "user" u
SET
"serverIp" = a."serverIp",
"certificateType" = a."certificateType",
"host" = a."host",
"letsEncryptEmail" = a."letsEncryptEmail",
"sshPrivateKey" = a."sshPrivateKey",
"enableDockerCleanup" = a."enableDockerCleanup",
"enableLogRotation" = a."enableLogRotation",
"enablePaidFeatures" = a."enablePaidFeatures",
"metricsConfig" = a."metricsConfig",
"cleanupCacheApplications" = a."cleanupCacheApplications",
"cleanupCacheOnPreviews" = a."cleanupCacheOnPreviews",
"cleanupCacheOnCompose" = a."cleanupCacheOnCompose"
FROM "admin" a
WHERE u.id = a."authId";
-- Actualizar referencias en las tablas relacionadas
UPDATE "project" p
SET "userId" = a."authId"
FROM "admin" a
WHERE p."userId" = a."adminId";
UPDATE "destination" d
SET "userId" = a."authId"
FROM "admin" a
WHERE d."userId" = a."adminId";
UPDATE "certificate" c
SET "userId" = a."authId"
FROM "admin" a
WHERE c."userId" = a."adminId";
UPDATE "registry" r
SET "userId" = a."authId"
FROM "admin" a
WHERE r."userId" = a."adminId";
UPDATE "notification" n
SET "userId" = a."authId"
FROM "admin" a
WHERE n."userId" = a."adminId";
UPDATE "ssh-key" s
SET "userId" = a."authId"
FROM "admin" a
WHERE s."userId" = a."adminId";
UPDATE "git_provider" g
SET "userId" = a."authId"
FROM "admin" a
WHERE g."userId" = a."adminId";
UPDATE "server" s
SET "userId" = a."authId"
FROM "admin" a
WHERE s."userId" = a."adminId";
-- Ahora agregar las restricciones NOT NULL después de migrar los datos
ALTER TABLE "user" ALTER COLUMN "name" SET NOT NULL;
ALTER TABLE "user" ALTER COLUMN "email" SET NOT NULL;
ALTER TABLE "user" ALTER COLUMN "email_verified" SET NOT NULL;
ALTER TABLE "user" ALTER COLUMN "updated_at" SET NOT NULL;
ALTER TABLE "user" ALTER COLUMN "certificateType" SET NOT NULL;
ALTER TABLE "user" ALTER COLUMN "enableDockerCleanup" SET NOT NULL;
ALTER TABLE "user" ALTER COLUMN "enableLogRotation" SET NOT NULL;
ALTER TABLE "user" ALTER COLUMN "enablePaidFeatures" SET NOT NULL;
ALTER TABLE "user" ALTER COLUMN "metricsConfig" SET NOT NULL;
ALTER TABLE "user" ALTER COLUMN "cleanupCacheApplications" SET NOT NULL;
ALTER TABLE "user" ALTER COLUMN "cleanupCacheOnPreviews" SET NOT NULL;
ALTER TABLE "user" ALTER COLUMN "cleanupCacheOnCompose" SET NOT NULL;
-- Modificar session
ALTER TABLE "session" ALTER COLUMN "expires_at" SET DATA TYPE timestamp;
ALTER TABLE "session" ADD COLUMN "token" text;
ALTER TABLE "session" ADD COLUMN "created_at" timestamp;
ALTER TABLE "session" ADD COLUMN "updated_at" timestamp;
ALTER TABLE "session" ADD COLUMN "ip_address" text;
ALTER TABLE "session" ADD COLUMN "user_agent" text;
ALTER TABLE "session" ADD COLUMN "impersonated_by" text;
-- Agregar nuevas restricciones después de migrar todos los datos
ALTER TABLE "account" ADD CONSTRAINT "account_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action;
ALTER TABLE "project" ADD CONSTRAINT "project_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "destination" ADD CONSTRAINT "destination_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "certificate" ADD CONSTRAINT "certificate_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "session" ADD CONSTRAINT "session_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE no action ON UPDATE no action;
ALTER TABLE "registry" ADD CONSTRAINT "registry_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "notification" ADD CONSTRAINT "notification_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "ssh-key" ADD CONSTRAINT "ssh-key_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "git_provider" ADD CONSTRAINT "git_provider_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "server" ADD CONSTRAINT "server_userId_user_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;
-- Agregar restricciones únicas
ALTER TABLE "user" ADD CONSTRAINT "user_email_unique" UNIQUE("email");
ALTER TABLE "session" ADD CONSTRAINT "session_token_unique" UNIQUE("token");
-- Eliminar columnas antiguas
ALTER TABLE "user" DROP COLUMN IF EXISTS "adminId";
ALTER TABLE "user" DROP COLUMN IF EXISTS "authId";
-- Eliminar columnas de admin
ALTER TABLE "admin" DROP COLUMN IF EXISTS "adminId";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "serverIp";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "certificateType";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "host";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "letsEncryptEmail";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "sshPrivateKey";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "enableDockerCleanup";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "enableLogRotation";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "authId";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "createdAt";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "stripeCustomerId";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "stripeSubscriptionId";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "serversQuantity";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "enablePaidFeatures";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "metricsConfig";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "cleanupCacheApplications";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "cleanupCacheOnPreviews";
ALTER TABLE "admin" DROP COLUMN IF EXISTS "cleanupCacheOnCompose";
-- Eliminar tablas antiguas
DROP TABLE IF EXISTS "auth" CASCADE;
DROP TABLE IF EXISTS "admin" CASCADE;

View File

@@ -111,7 +111,6 @@ export const users_temp = pgTable("user_temp", {
email: text("email").notNull().unique(),
emailVerified: boolean("email_verified").notNull(),
image: text("image"),
role: text("role"),
banned: boolean("banned"),
banReason: text("ban_reason"),
banExpires: timestamp("ban_expires"),