From c5f4e95847ef7554f2608bbd8756b094e598624e Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 1 Dec 2022 16:54:48 +0100 Subject: [PATCH 1/7] fix(database): create missing users for transactions --- .../0056-consistent_transactions_table.ts | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 database/migrations/0056-consistent_transactions_table.ts diff --git a/database/migrations/0056-consistent_transactions_table.ts b/database/migrations/0056-consistent_transactions_table.ts new file mode 100644 index 000000000..968bcf3b0 --- /dev/null +++ b/database/migrations/0056-consistent_transactions_table.ts @@ -0,0 +1,32 @@ +/* MIGRATION TO add users that have a transaction but do not exist */ + +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { v4 as uuidv4 } from 'uuid' + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + const missingUserIds = await queryFn(` + SELECT user_id FROM transactions + WHERE NOT EXISTS (SELECT id FROM users WHERE id = user_id) GROUP BY user_id;`) + + for (let i = 0; i < missingUserIds.length; i++) { + let gradidoId = null + let countIds = null + do { + gradidoId = uuidv4() + countIds = await queryFn( + `SELECT COUNT(*) FROM \`users\` WHERE \`gradido_id\` = "${gradidoId}"`, + ) + } while (countIds[0] > 0) + + await queryFn(` + INSERT INTO users + (id, gradido_id, first_name, last_name, deleted_at, password_encryption_type, created_at, language) + VALUES + (${missingUserIds[i].user_id}, '${gradidoId}', 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) + } +} + +/* eslint-disable @typescript-eslint/no-empty-function */ +/* eslint-disable-next-line @typescript-eslint/no-unused-vars */ +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) {} From ed3a76dfdcaaa17804eff3af9533acc31e16452f Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 1 Dec 2022 16:56:24 +0100 Subject: [PATCH 2/7] update database version --- backend/src/config/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index ee99ef809..2b79e6a08 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -10,7 +10,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0055-consistent_deleted_users', + DB_VERSION: '0056-consistent_transactions_table', DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0 LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info From 345123af116a79f2aa2f19e3ed46b22d05d0015c Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 1 Dec 2022 17:10:35 +0100 Subject: [PATCH 3/7] add user contact for missing users --- .../migrations/0056-consistent_transactions_table.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/database/migrations/0056-consistent_transactions_table.ts b/database/migrations/0056-consistent_transactions_table.ts index 968bcf3b0..f3db927ba 100644 --- a/database/migrations/0056-consistent_transactions_table.ts +++ b/database/migrations/0056-consistent_transactions_table.ts @@ -19,11 +19,17 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis ) } while (countIds[0] > 0) + const userContact = await queryFn(` + INSERT INTO user_contacts + (type, user_id, email, email_checked, created_at, deleted_at) + VALUES + ('EMAIL', ${missingUserIds[i].user_id}, 'deleted.user${missingUserIds[i].user_id}@gradido.net', 0, NOW(), NOW());`) + await queryFn(` INSERT INTO users - (id, gradido_id, first_name, last_name, deleted_at, password_encryption_type, created_at, language) + (id, gradido_id, email_id, first_name, last_name, deleted_at, password_encryption_type, created_at, language) VALUES - (${missingUserIds[i].user_id}, '${gradidoId}', 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) + (${missingUserIds[i].user_id}, '${gradidoId}', ${userContact.insertId}, 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) } } From 251f87554c96f5172da3d7e3a4aa132b805db8bd Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 1 Dec 2022 17:14:44 +0100 Subject: [PATCH 4/7] kack typescript --- database/migrations/0056-consistent_transactions_table.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/0056-consistent_transactions_table.ts b/database/migrations/0056-consistent_transactions_table.ts index f3db927ba..6cd462552 100644 --- a/database/migrations/0056-consistent_transactions_table.ts +++ b/database/migrations/0056-consistent_transactions_table.ts @@ -29,7 +29,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis INSERT INTO users (id, gradido_id, email_id, first_name, last_name, deleted_at, password_encryption_type, created_at, language) VALUES - (${missingUserIds[i].user_id}, '${gradidoId}', ${userContact.insertId}, 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) + (${missingUserIds[i].user_id}, '${gradidoId}', ${userContact.insertId ? userContact.insertId : 0}, 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) } } From fed61bf8884d016108c9cb8c92f18df28495ec3b Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 1 Dec 2022 17:16:56 +0100 Subject: [PATCH 5/7] kack typescript --- database/migrations/0056-consistent_transactions_table.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/0056-consistent_transactions_table.ts b/database/migrations/0056-consistent_transactions_table.ts index 6cd462552..e8e7111ac 100644 --- a/database/migrations/0056-consistent_transactions_table.ts +++ b/database/migrations/0056-consistent_transactions_table.ts @@ -29,7 +29,7 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis INSERT INTO users (id, gradido_id, email_id, first_name, last_name, deleted_at, password_encryption_type, created_at, language) VALUES - (${missingUserIds[i].user_id}, '${gradidoId}', ${userContact.insertId ? userContact.insertId : 0}, 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) + (${missingUserIds[i].user_id}, '${gradidoId}', ${userContact[0].insertId}, 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) } } From caa16c04881be152a6550f3bac1c56a26bd43f47 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 1 Dec 2022 17:36:17 +0100 Subject: [PATCH 6/7] insert correct email id --- database/migrations/0056-consistent_transactions_table.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/database/migrations/0056-consistent_transactions_table.ts b/database/migrations/0056-consistent_transactions_table.ts index e8e7111ac..af7d8988e 100644 --- a/database/migrations/0056-consistent_transactions_table.ts +++ b/database/migrations/0056-consistent_transactions_table.ts @@ -25,11 +25,13 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis VALUES ('EMAIL', ${missingUserIds[i].user_id}, 'deleted.user${missingUserIds[i].user_id}@gradido.net', 0, NOW(), NOW());`) + const emaiId = Object.values(userContact)[Object.keys(userContact).indexOf('insertId')] + await queryFn(` INSERT INTO users (id, gradido_id, email_id, first_name, last_name, deleted_at, password_encryption_type, created_at, language) VALUES - (${missingUserIds[i].user_id}, '${gradidoId}', ${userContact[0].insertId}, 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) + (${missingUserIds[i].user_id}, '${gradidoId}', ${emaiId}, 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) } } From 97b169da2e701bf4dfed931ad3c53c1b0da2d3c3 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 15 Dec 2022 11:49:28 +0100 Subject: [PATCH 7/7] properly typecast and do thing right --- .../0056-consistent_transactions_table.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/database/migrations/0056-consistent_transactions_table.ts b/database/migrations/0056-consistent_transactions_table.ts index af7d8988e..02ed3b7be 100644 --- a/database/migrations/0056-consistent_transactions_table.ts +++ b/database/migrations/0056-consistent_transactions_table.ts @@ -3,6 +3,7 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/no-explicit-any */ import { v4 as uuidv4 } from 'uuid' +import { OkPacket } from 'mysql' export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { const missingUserIds = await queryFn(` @@ -10,8 +11,8 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis WHERE NOT EXISTS (SELECT id FROM users WHERE id = user_id) GROUP BY user_id;`) for (let i = 0; i < missingUserIds.length; i++) { - let gradidoId = null - let countIds = null + let gradidoId = '' + let countIds: any[] = [] do { gradidoId = uuidv4() countIds = await queryFn( @@ -19,19 +20,17 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis ) } while (countIds[0] > 0) - const userContact = await queryFn(` + const userContact = (await queryFn(` INSERT INTO user_contacts (type, user_id, email, email_checked, created_at, deleted_at) VALUES - ('EMAIL', ${missingUserIds[i].user_id}, 'deleted.user${missingUserIds[i].user_id}@gradido.net', 0, NOW(), NOW());`) - - const emaiId = Object.values(userContact)[Object.keys(userContact).indexOf('insertId')] + ('EMAIL', ${missingUserIds[i].user_id}, 'deleted.user${missingUserIds[i].user_id}@gradido.net', 0, NOW(), NOW());`)) as unknown as OkPacket await queryFn(` INSERT INTO users (id, gradido_id, email_id, first_name, last_name, deleted_at, password_encryption_type, created_at, language) VALUES - (${missingUserIds[i].user_id}, '${gradidoId}', ${emaiId}, 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) + (${missingUserIds[i].user_id}, '${gradidoId}', ${userContact.insertId}, 'DELETED', 'USER', NOW(), 0, NOW(), 'de');`) } }