From 825b364a3b979ee26374cbe70dc220e4e2a8e6cd Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Tue, 27 Sep 2022 19:13:32 +0200 Subject: [PATCH] fix user contact migration. Each user must have one contact, forget about that email_opt_in trash data --- .../0049-add_user_contacts_table.ts | 55 ++++--------------- 1 file changed, 10 insertions(+), 45 deletions(-) diff --git a/database/migrations/0049-add_user_contacts_table.ts b/database/migrations/0049-add_user_contacts_table.ts index c3b89ed88..0a6d4c89f 100644 --- a/database/migrations/0049-add_user_contacts_table.ts +++ b/database/migrations/0049-add_user_contacts_table.ts @@ -14,8 +14,8 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis \`type\` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, \`user_id\` int(10) unsigned NOT NULL, \`email\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL UNIQUE, - \`email_verification_code\` bigint(20) unsigned NOT NULL UNIQUE, - \`email_opt_in_type_id\` int NOT NULL, + \`email_verification_code\` bigint(20) unsigned DEFAULT NULL UNIQUE, + \`email_opt_in_type_id\` int DEFAULT NULL, \`email_resend_count\` int DEFAULT '0', \`email_checked\` tinyint(4) NOT NULL DEFAULT 0, \`phone\` varchar(255) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, @@ -41,47 +41,10 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis // merge values from login_email_opt_in table with users.email in new user_contacts table await queryFn(` - INSERT INTO user_contacts - (type, user_id, email, email_verification_code, email_opt_in_type_id, email_resend_count, email_checked, created_at, updated_at, deleted_at) - SELECT - 'EMAIL', - u.id as user_id, - u.email, - e.verification_code as email_verification_code, - e.email_opt_in_type_id, - e.resend_count as email_resend_count, - u.email_checked, - e.created as created_at, - e.updated as updated_at, - u.deletedAt as deleted_at\ - FROM - users as u, - login_email_opt_in as e - WHERE - u.id = e.user_id AND - e.id in ( - WITH opt_in AS ( - SELECT - le.id, le.user_id, le.created, le.updated, ROW_NUMBER() OVER (PARTITION BY le.user_id ORDER BY le.created DESC) AS row_num - FROM - login_email_opt_in as le - ) - SELECT - opt_in.id - FROM - opt_in - WHERE - row_num = 1);`) - /* - // SELECT - // le.id - // FROM - // login_email_opt_in as le - // WHERE - // le.user_id = u.id - // ORDER BY - // le.updated DESC, le.created DESC LIMIT 1);`) - */ + INSERT INTO \`user_contacts\` + (type, user_id, email, email_verification_code, email_opt_in_type_id, email_resend_count, email_checked, created_at, updated_at, deleted_at) + SELECT 'EMAIL', \`users\`.id, \`users\`.email, optin.\`verification_code\`, optin.\`email_opt_in_type_id\`, optin.\`resend_count\`, users.\`email_checked\`, users.created, null, users.deletedAt + FROM users LEFT JOIN (SELECT * FROM \`login_email_opt_in\` ORDER BY created DESC LIMIT 1) AS optin ON users.id = optin.\`user_id\`;`) // insert in users table the email_id of the new created email-contacts const contacts = await queryFn(`SELECT c.id, c.user_id FROM user_contacts as c`) @@ -113,11 +76,13 @@ export async function downgrade(queryFn: (query: string, values?: any[]) => Prom ) // reconstruct the previous email back from contacts to users table - const contacts = await queryFn(`SELECT c.id, c.email, c.user_id FROM user_contacts as c`) + const contacts = await queryFn( + `SELECT c.id, c.email, c.user_id, c.email_checked FROM user_contacts as c`, + ) for (const id in contacts) { const contact = contacts[id] await queryFn( - `UPDATE users SET email = "${contact.email}" WHERE id = "${contact.user_id}" and email_id = "${contact.id}"`, + `UPDATE users SET email = "${contact.email}", email_checked="${contact.email_checked}" WHERE id = "${contact.user_id}" and email_id = "${contact.id}"`, ) } await queryFn('ALTER TABLE users MODIFY COLUMN email varchar(255) NOT NULL UNIQUE;')