From 315c08262898de54b342c72666eb35192a702cfd Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Fri, 3 Nov 2023 01:27:15 +0100 Subject: [PATCH 1/7] existing homecommunity with uuid as prerequisit for createUser --- .../graphql/resolver/EmailOptinCodes.test.ts | 3 +++ .../src/graphql/resolver/UserResolver.test.ts | 8 +++++++- backend/src/graphql/resolver/UserResolver.ts | 4 ++++ .../src/graphql/resolver/util/communities.ts | 20 +++++++++++++++++++ backend/src/seeds/factory/user.ts | 4 +++- 5 files changed, 37 insertions(+), 2 deletions(-) diff --git a/backend/src/graphql/resolver/EmailOptinCodes.test.ts b/backend/src/graphql/resolver/EmailOptinCodes.test.ts index 640faad17..731d4a395 100644 --- a/backend/src/graphql/resolver/EmailOptinCodes.test.ts +++ b/backend/src/graphql/resolver/EmailOptinCodes.test.ts @@ -11,6 +11,8 @@ import { CONFIG } from '@/config' import { createUser, setPassword, forgotPassword } from '@/seeds/graphql/mutations' import { queryOptIn } from '@/seeds/graphql/queries' +import { createHomeCommunity } from './util/communities' + let mutate: ApolloServerTestClient['mutate'], query: ApolloServerTestClient['query'], con: Connection @@ -46,6 +48,7 @@ describe('EmailOptinCodes', () => { lastName: 'Lustig', language: 'de', } + await createHomeCommunity() const { data: { createUser: user }, } = await mutate({ mutation: createUser, variables }) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index a9c50553e..fd9a85790 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -67,6 +67,8 @@ import { stephenHawking } from '@/seeds/users/stephen-hawking' import { printTimeDuration } from '@/util/time' import { objectValuesToArray } from '@/util/utilities' +import { createHomeCommunity } from './util/communities' + jest.mock('@/emails/sendEmailVariants', () => { const originalModule = jest.requireActual('@/emails/sendEmailVariants') return { @@ -125,9 +127,11 @@ describe('UserResolver', () => { let result: any let emailVerificationCode: string let user: User[] + let homeCom: DbCommunity beforeAll(async () => { jest.clearAllMocks() + homeCom = await createHomeCommunity() result = await mutate({ mutation: createUser, variables }) }) @@ -172,7 +176,7 @@ describe('UserResolver', () => { referrerId: null, contributionLinkId: null, passwordEncryptionType: PasswordEncryptionType.NO_PASSWORD, - communityUuid: null, + communityUuid: homeCom.communityUuid, foreign: false, }, ]) @@ -542,6 +546,7 @@ describe('UserResolver', () => { let newUser: User beforeAll(async () => { + await createHomeCommunity() await mutate({ mutation: createUser, variables: createUserVariables }) const emailContact = await UserContact.findOneOrFail({ where: { email: createUserVariables.email }, @@ -586,6 +591,7 @@ describe('UserResolver', () => { describe('no valid password', () => { beforeAll(async () => { + await createHomeCommunity() await mutate({ mutation: createUser, variables: createUserVariables }) const emailContact = await UserContact.findOneOrFail({ where: { email: createUserVariables.email }, diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 45ccd720e..1f21abbb9 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -275,6 +275,10 @@ export class UserResolver { { id: 0 } as DbUser, ) let dbUser = new DbUser() + const homeCom = await getHomeCommunity() + if (homeCom.communityUuid) { + dbUser.communityUuid = homeCom.communityUuid + } dbUser.gradidoID = gradidoID dbUser.firstName = firstName dbUser.lastName = lastName diff --git a/backend/src/graphql/resolver/util/communities.ts b/backend/src/graphql/resolver/util/communities.ts index 0c0023a19..9a271066d 100644 --- a/backend/src/graphql/resolver/util/communities.ts +++ b/backend/src/graphql/resolver/util/communities.ts @@ -63,3 +63,23 @@ export async function getCommunity(communityUuid: string): Promise { + let homeCom: DbCommunity + try { + return await getHomeCommunity() + } catch (err) { + homeCom = DbCommunity.create() + homeCom.foreign = false + homeCom.url = 'http://localhost/api' + homeCom.publicKey = Buffer.from('publicKey-HomeCommunity') + homeCom.privateKey = Buffer.from('privateKey-HomeCommunity') + homeCom.communityUuid = 'HomeCom-UUID' + homeCom.authenticatedAt = new Date() + homeCom.name = 'HomeCommunity-name' + homeCom.description = 'HomeCommunity-description' + homeCom.creationDate = new Date() + await DbCommunity.insert(homeCom) + return homeCom + } +} diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index 65b0ff3bb..321e9db17 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -5,7 +5,7 @@ import { ApolloServerTestClient } from 'apollo-server-testing' import { RoleNames } from '@enum/RoleNames' -import { getHomeCommunity } from '@/graphql/resolver/util/communities' +import { createHomeCommunity, getHomeCommunity } from '@/graphql/resolver/util/communities' import { setUserRole } from '@/graphql/resolver/util/modifyUserRole' import { createUser, setPassword } from '@/seeds/graphql/mutations' import { UserInterface } from '@/seeds/users/UserInterface' @@ -16,6 +16,8 @@ export const userFactory = async ( ): Promise => { const { mutate } = client + await createHomeCommunity() + const { data: { createUser: { id }, From f521a38a1ca93aae255ea4e99d9cf512d9a9b797 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Fri, 3 Nov 2023 01:56:04 +0100 Subject: [PATCH 2/7] mirgation to correct missing communityUuid in users --- ...74-insert_communityuuid in_existing_users.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 database/migrations/0074-insert_communityuuid in_existing_users.ts diff --git a/database/migrations/0074-insert_communityuuid in_existing_users.ts b/database/migrations/0074-insert_communityuuid in_existing_users.ts new file mode 100644 index 000000000..eac93832d --- /dev/null +++ b/database/migrations/0074-insert_communityuuid in_existing_users.ts @@ -0,0 +1,17 @@ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // read the community uuid of the homeCommunity + const result = await queryFn(`SELECT c.community_uuid from communities as c WHERE c.foreign = 0`) + // and if uuid exists enter the home_community_uuid for all local users + if (result && result[0]) { + await queryFn( + `UPDATE users as u SET u.community_uuid = "${result[0].community_uuid}" WHERE u.foreign = 0 AND u.community_uuid IS NULL`, + ) + } +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn('SELECT * FROM dual;') +} From 1b5601c7af627c247dbf0e56e3a17ab53d69cab5 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Fri, 3 Nov 2023 02:26:55 +0100 Subject: [PATCH 3/7] correct sql statement --- .../migrations/0074-insert_communityuuid in_existing_users.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/migrations/0074-insert_communityuuid in_existing_users.ts b/database/migrations/0074-insert_communityuuid in_existing_users.ts index eac93832d..d03462b49 100644 --- a/database/migrations/0074-insert_communityuuid in_existing_users.ts +++ b/database/migrations/0074-insert_communityuuid in_existing_users.ts @@ -13,5 +13,5 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn('SELECT * FROM dual;') + await queryFn('') } From acea79c2bf0febf53e1bb6158f443d7f1316bfb2 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Mon, 6 Nov 2023 22:03:54 +0100 Subject: [PATCH 4/7] add dummy statement for downgrade --- .../migrations/0074-insert_communityuuid in_existing_users.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/database/migrations/0074-insert_communityuuid in_existing_users.ts b/database/migrations/0074-insert_communityuuid in_existing_users.ts index d03462b49..11ddf7096 100644 --- a/database/migrations/0074-insert_communityuuid in_existing_users.ts +++ b/database/migrations/0074-insert_communityuuid in_existing_users.ts @@ -13,5 +13,6 @@ export async function upgrade(queryFn: (query: string, values?: any[]) => Promis } export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - await queryFn('') + // dummy statement to satisfy linter and queryFn + await queryFn('select count(*) from communities') } From 8c898490fb345d031685f47a7c0f8d1b53ca4050 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Mon, 6 Nov 2023 22:06:15 +0100 Subject: [PATCH 5/7] upgrade db-version in modules --- backend/src/config/index.ts | 2 +- dht-node/src/config/index.ts | 2 +- federation/src/config/index.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 25e901491..7ad0271ea 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -12,7 +12,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0073-introduce_foreign_user_in_users_table', + DB_VERSION: '0074-insert_communityuuid in_existing_users', 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 diff --git a/dht-node/src/config/index.ts b/dht-node/src/config/index.ts index 2d88e0f92..7aed88ccd 100644 --- a/dht-node/src/config/index.ts +++ b/dht-node/src/config/index.ts @@ -4,7 +4,7 @@ import dotenv from 'dotenv' dotenv.config() const constants = { - DB_VERSION: '0073-introduce_foreign_user_in_users_table', + DB_VERSION: '0074-insert_communityuuid in_existing_users', LOG4JS_CONFIG: 'log4js-config.json', // default log level on production should be info LOG_LEVEL: process.env.LOG_LEVEL || 'info', diff --git a/federation/src/config/index.ts b/federation/src/config/index.ts index 7cc9ef37e..2770ada06 100644 --- a/federation/src/config/index.ts +++ b/federation/src/config/index.ts @@ -10,7 +10,7 @@ Decimal.set({ }) const constants = { - DB_VERSION: '0073-introduce_foreign_user_in_users_table', + DB_VERSION: '0074-insert_communityuuid in_existing_users', 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 63d7f754e84d244677d994734f5e1f05fb35b910 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Tue, 7 Nov 2023 21:34:04 +0100 Subject: [PATCH 6/7] shift homecommunity creation for tests in seed directory-tree --- .../graphql/resolver/EmailOptinCodes.test.ts | 5 ++-- .../src/graphql/resolver/UserResolver.test.ts | 9 +++---- .../src/graphql/resolver/util/communities.ts | 20 --------------- backend/src/seeds/community/index.ts | 25 ++++++++++++++++++- backend/src/seeds/factory/user.ts | 5 ++-- 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/backend/src/graphql/resolver/EmailOptinCodes.test.ts b/backend/src/graphql/resolver/EmailOptinCodes.test.ts index 731d4a395..09ad743fe 100644 --- a/backend/src/graphql/resolver/EmailOptinCodes.test.ts +++ b/backend/src/graphql/resolver/EmailOptinCodes.test.ts @@ -8,11 +8,10 @@ import { GraphQLError } from 'graphql' import { testEnvironment, cleanDB } from '@test/helpers' import { CONFIG } from '@/config' +import { writeHomeCommunityEntry } from '@/seeds/community' import { createUser, setPassword, forgotPassword } from '@/seeds/graphql/mutations' import { queryOptIn } from '@/seeds/graphql/queries' -import { createHomeCommunity } from './util/communities' - let mutate: ApolloServerTestClient['mutate'], query: ApolloServerTestClient['query'], con: Connection @@ -48,7 +47,7 @@ describe('EmailOptinCodes', () => { lastName: 'Lustig', language: 'de', } - await createHomeCommunity() + await writeHomeCommunityEntry() const { data: { createUser: user }, } = await mutate({ mutation: createUser, variables }) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index fd9a85790..e16e0f0fc 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -34,6 +34,7 @@ import { import { EventType } from '@/event/Events' import { SecretKeyCryptographyCreateKey } from '@/password/EncryptorUtils' import { encryptPassword } from '@/password/PasswordEncryptor' +import { writeHomeCommunityEntry } from '@/seeds/community' import { contributionLinkFactory } from '@/seeds/factory/contributionLink' import { transactionLinkFactory } from '@/seeds/factory/transactionLink' import { userFactory } from '@/seeds/factory/user' @@ -67,8 +68,6 @@ import { stephenHawking } from '@/seeds/users/stephen-hawking' import { printTimeDuration } from '@/util/time' import { objectValuesToArray } from '@/util/utilities' -import { createHomeCommunity } from './util/communities' - jest.mock('@/emails/sendEmailVariants', () => { const originalModule = jest.requireActual('@/emails/sendEmailVariants') return { @@ -131,7 +130,7 @@ describe('UserResolver', () => { beforeAll(async () => { jest.clearAllMocks() - homeCom = await createHomeCommunity() + homeCom = await writeHomeCommunityEntry() result = await mutate({ mutation: createUser, variables }) }) @@ -546,7 +545,7 @@ describe('UserResolver', () => { let newUser: User beforeAll(async () => { - await createHomeCommunity() + await writeHomeCommunityEntry() await mutate({ mutation: createUser, variables: createUserVariables }) const emailContact = await UserContact.findOneOrFail({ where: { email: createUserVariables.email }, @@ -591,7 +590,7 @@ describe('UserResolver', () => { describe('no valid password', () => { beforeAll(async () => { - await createHomeCommunity() + await writeHomeCommunityEntry() await mutate({ mutation: createUser, variables: createUserVariables }) const emailContact = await UserContact.findOneOrFail({ where: { email: createUserVariables.email }, diff --git a/backend/src/graphql/resolver/util/communities.ts b/backend/src/graphql/resolver/util/communities.ts index 9a271066d..0c0023a19 100644 --- a/backend/src/graphql/resolver/util/communities.ts +++ b/backend/src/graphql/resolver/util/communities.ts @@ -63,23 +63,3 @@ export async function getCommunity(communityUuid: string): Promise { - let homeCom: DbCommunity - try { - return await getHomeCommunity() - } catch (err) { - homeCom = DbCommunity.create() - homeCom.foreign = false - homeCom.url = 'http://localhost/api' - homeCom.publicKey = Buffer.from('publicKey-HomeCommunity') - homeCom.privateKey = Buffer.from('privateKey-HomeCommunity') - homeCom.communityUuid = 'HomeCom-UUID' - homeCom.authenticatedAt = new Date() - homeCom.name = 'HomeCommunity-name' - homeCom.description = 'HomeCommunity-description' - homeCom.creationDate = new Date() - await DbCommunity.insert(homeCom) - return homeCom - } -} diff --git a/backend/src/seeds/community/index.ts b/backend/src/seeds/community/index.ts index 6a639ee44..e3b420d00 100644 --- a/backend/src/seeds/community/index.ts +++ b/backend/src/seeds/community/index.ts @@ -3,7 +3,7 @@ import { v4 as uuidv4 } from 'uuid' import { CONFIG } from '@/config' -export async function writeHomeCommunityEntry(): Promise { +export async function writeHomeCommunityEntry(): Promise { try { // check for existing homeCommunity entry let homeCom = await DbCommunity.findOne({ where: { foreign: false } }) @@ -28,7 +28,30 @@ export async function writeHomeCommunityEntry(): Promise { homeCom.creationDate = new Date() await DbCommunity.insert(homeCom) } + return homeCom } catch (err) { throw new Error(`Seeding: Error writing HomeCommunity-Entry`) // : ${err}`) } } + +export async function createHomeCommunity(): Promise { + let homeCom: DbCommunity + try { + return await DbCommunity.findOneOrFail({ + where: [{ foreign: false }], + }) + } catch (err) { + homeCom = DbCommunity.create() + homeCom.foreign = false + homeCom.url = 'http://localhost/api' + homeCom.publicKey = Buffer.from('publicKey-HomeCommunity') + homeCom.privateKey = Buffer.from('privateKey-HomeCommunity') + homeCom.communityUuid = 'HomeCom-UUID' + homeCom.authenticatedAt = new Date() + homeCom.name = 'HomeCommunity-name' + homeCom.description = 'HomeCommunity-description' + homeCom.creationDate = new Date() + await DbCommunity.insert(homeCom) + return homeCom + } +} diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index 321e9db17..3ddddf336 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -5,8 +5,8 @@ import { ApolloServerTestClient } from 'apollo-server-testing' import { RoleNames } from '@enum/RoleNames' -import { createHomeCommunity, getHomeCommunity } from '@/graphql/resolver/util/communities' import { setUserRole } from '@/graphql/resolver/util/modifyUserRole' +import { writeHomeCommunityEntry } from '@/seeds/community' import { createUser, setPassword } from '@/seeds/graphql/mutations' import { UserInterface } from '@/seeds/users/UserInterface' @@ -16,7 +16,7 @@ export const userFactory = async ( ): Promise => { const { mutate } = client - await createHomeCommunity() + const homeCom = await writeHomeCommunityEntry() const { data: { @@ -47,7 +47,6 @@ export const userFactory = async ( await dbUser.save() } try { - const homeCom = await getHomeCommunity() if (homeCom.communityUuid) { dbUser.communityUuid = homeCom.communityUuid await User.save(dbUser) From 0cc6614cd830a5f03262e0a176e8074b5a4fe716 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Tue, 7 Nov 2023 21:38:22 +0100 Subject: [PATCH 7/7] remove unused function --- backend/src/seeds/community/index.ts | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/backend/src/seeds/community/index.ts b/backend/src/seeds/community/index.ts index e3b420d00..84542e002 100644 --- a/backend/src/seeds/community/index.ts +++ b/backend/src/seeds/community/index.ts @@ -33,25 +33,3 @@ export async function writeHomeCommunityEntry(): Promise { throw new Error(`Seeding: Error writing HomeCommunity-Entry`) // : ${err}`) } } - -export async function createHomeCommunity(): Promise { - let homeCom: DbCommunity - try { - return await DbCommunity.findOneOrFail({ - where: [{ foreign: false }], - }) - } catch (err) { - homeCom = DbCommunity.create() - homeCom.foreign = false - homeCom.url = 'http://localhost/api' - homeCom.publicKey = Buffer.from('publicKey-HomeCommunity') - homeCom.privateKey = Buffer.from('privateKey-HomeCommunity') - homeCom.communityUuid = 'HomeCom-UUID' - homeCom.authenticatedAt = new Date() - homeCom.name = 'HomeCommunity-name' - homeCom.description = 'HomeCommunity-description' - homeCom.creationDate = new Date() - await DbCommunity.insert(homeCom) - return homeCom - } -}