From 6e63bacba748c41ad91d7199b467483193b08ff4 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Fri, 11 Feb 2022 10:15:09 +0100 Subject: [PATCH 001/110] let handle mysql the paging --- backend/src/graphql/resolver/AdminResolver.ts | 16 ++++++---- backend/src/typeorm/repository/User.ts | 31 +++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 54fe9335e..2b6138dee 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -32,7 +32,13 @@ export class AdminResolver { @Args() { searchText, currentPage = 1, pageSize = 25, notActivated = false }: SearchUsersArgs, ): Promise { const userRepository = getCustomRepository(UserRepository) - const users = await userRepository.findBySearchCriteria(searchText) + let users: dbUser[] + let count: number + if(notActivated) { + [users, count] = await userRepository.findBySearchCriteriaPagedNotActivated(searchText, currentPage, pageSize) + } else { + [users, count] = await userRepository.findBySearchCriteriaPaged(searchText, currentPage, pageSize) + } let adminUsers = await Promise.all( users.map(async (user) => { const adminUser = new UserAdmin() @@ -41,16 +47,14 @@ export class AdminResolver { adminUser.lastName = user.lastName adminUser.email = user.email adminUser.creation = await getUserCreations(user.id) - adminUser.emailChecked = await hasActivatedEmail(user.email) + adminUser.emailChecked = user.emailChecked adminUser.hasElopage = await hasElopageBuys(user.email) return adminUser }), ) - if (notActivated) adminUsers = adminUsers.filter((u) => !u.emailChecked) - const first = (currentPage - 1) * pageSize return { - userCount: adminUsers.length, - userList: adminUsers.slice(first, first + pageSize), + userCount: count, + userList: adminUsers, } } diff --git a/backend/src/typeorm/repository/User.ts b/backend/src/typeorm/repository/User.ts index 59d6ff465..bf9d55587 100644 --- a/backend/src/typeorm/repository/User.ts +++ b/backend/src/typeorm/repository/User.ts @@ -1,5 +1,6 @@ import { EntityRepository, Repository } from '@dbTools/typeorm' import { User } from '@entity/User' +import internal from 'stream' @EntityRepository(User) export class UserRepository extends Repository { @@ -43,4 +44,34 @@ export class UserRepository extends Repository { ) .getMany() } + async findBySearchCriteriaPaged(searchCriteria: string, currentPage: number, pageSize: number): Promise<[User[], number]> { + return await this.createQueryBuilder('user') + .where( + 'user.firstName like :name or user.lastName like :lastName or user.email like :email', + { + name: `%${searchCriteria}%`, + lastName: `%${searchCriteria}%`, + email: `%${searchCriteria}%`, + }, + ) + .take(pageSize) + .skip((currentPage - 1 ) * pageSize) + .getManyAndCount() + } + + async findBySearchCriteriaPagedNotActivated(searchCriteria: string, currentPage: number, pageSize: number): Promise<[User[], number]> { + return await this.createQueryBuilder('user') + .where( + 'user.firstName like :name or user.lastName like :lastName or user.email like :email', + { + name: `%${searchCriteria}%`, + lastName: `%${searchCriteria}%`, + email: `%${searchCriteria}%`, + emailChecked: false + }, + ) + .take(pageSize) + .skip((currentPage - 1 ) * pageSize) + .getManyAndCount() + } } From 26f537f6e31cda22fe3cec1976a374b9c146f5c5 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 11 Feb 2022 14:00:53 +0100 Subject: [PATCH 002/110] confirm pending creation box, confirmbutton right --- admin/src/components/UserTable.vue | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/admin/src/components/UserTable.vue b/admin/src/components/UserTable.vue index fb24cf0f1..932ea2d22 100644 --- a/admin/src/components/UserTable.vue +++ b/admin/src/components/UserTable.vue @@ -13,18 +13,23 @@

{{ overlayText.text2 }}

- - + + + {{ overlayText.button_cancel }} - - + {{ overlayText.button_ok }} - + + + + + From bc68db6b21301f531a8dac36af2a28a8ee86c40b Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 11 Feb 2022 14:01:31 +0100 Subject: [PATCH 003/110] confirm pending creation box, confirmbutton right, yarn lint --- admin/src/components/UserTable.vue | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/admin/src/components/UserTable.vue b/admin/src/components/UserTable.vue index 932ea2d22..e2222fc0c 100644 --- a/admin/src/components/UserTable.vue +++ b/admin/src/components/UserTable.vue @@ -15,21 +15,23 @@

- - {{ overlayText.button_cancel }} - - - {{ overlayText.button_ok }} - + + + {{ overlayText.button_cancel }} + + + + + {{ overlayText.button_ok }} + + - - From 7834054a77dcb3e47383c4da017112d15afa0fe2 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 11 Feb 2022 15:08:09 +0100 Subject: [PATCH 004/110] add components Overlay.vue, add localize for Overlay.vue --- admin/src/components/Overlay.vue | 66 +++++++++++++++++++++++++++++ admin/src/components/UserTable.vue | 68 ++++-------------------------- admin/src/locales/de.json | 4 +- admin/src/locales/en.json | 3 +- 4 files changed, 80 insertions(+), 61 deletions(-) create mode 100644 admin/src/components/Overlay.vue diff --git a/admin/src/components/Overlay.vue b/admin/src/components/Overlay.vue new file mode 100644 index 000000000..e9af36cdd --- /dev/null +++ b/admin/src/components/Overlay.vue @@ -0,0 +1,66 @@ + + diff --git a/admin/src/components/UserTable.vue b/admin/src/components/UserTable.vue index e2222fc0c..de59cb277 100644 --- a/admin/src/components/UserTable.vue +++ b/admin/src/components/UserTable.vue @@ -1,38 +1,7 @@ From 71e1cd50e987802396f3d4823c282d61814c0c58 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 15 Feb 2022 14:06:45 +0100 Subject: [PATCH 021/110] Update admin/src/pages/CreationConfirm.vue Co-authored-by: Moriz Wahl --- admin/src/pages/CreationConfirm.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/src/pages/CreationConfirm.vue b/admin/src/pages/CreationConfirm.vue index 304d628b5..2334a5a8b 100644 --- a/admin/src/pages/CreationConfirm.vue +++ b/admin/src/pages/CreationConfirm.vue @@ -2,7 +2,7 @@
From 39e38bea2c901f697b9d3af1429d909590528b6c Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 15 Feb 2022 14:06:56 +0100 Subject: [PATCH 022/110] Update admin/src/components/Overlay.vue Co-authored-by: Moriz Wahl --- admin/src/components/Overlay.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/src/components/Overlay.vue b/admin/src/components/Overlay.vue index 25ca9d254..af1c428b4 100644 --- a/admin/src/components/Overlay.vue +++ b/admin/src/components/Overlay.vue @@ -47,7 +47,7 @@ size="md" variant="success" class="m-3 text-right" - @click="$emit('confirm-creation', items)" + @click="$emit('confirm-creation', item)" > {{ $t('overlay.confirm.yes') }} From 0d3efa9900985207a78f2f80ce938a23949dd146 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 15 Feb 2022 14:07:06 +0100 Subject: [PATCH 023/110] Update admin/src/components/Overlay.vue Co-authored-by: Moriz Wahl --- admin/src/components/Overlay.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/src/components/Overlay.vue b/admin/src/components/Overlay.vue index af1c428b4..6a4e3e94a 100644 --- a/admin/src/components/Overlay.vue +++ b/admin/src/components/Overlay.vue @@ -22,7 +22,7 @@ {{ $t('name') }} - {{ items.firstName }} {{ items.lastName }} + {{ item.firstName }} {{ item.lastName }} {{ $t('e_mail') }} From 9f87e7a8c6d0d5d32998247b2b0d536442016396 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 15 Feb 2022 14:07:22 +0100 Subject: [PATCH 024/110] Update admin/src/components/Overlay.vue Co-authored-by: Moriz Wahl --- admin/src/components/Overlay.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/src/components/Overlay.vue b/admin/src/components/Overlay.vue index 6a4e3e94a..b6afb28e4 100644 --- a/admin/src/components/Overlay.vue +++ b/admin/src/components/Overlay.vue @@ -7,7 +7,7 @@ {{ $t('transactionlist.amount') }} - {{ items.amount }} GDD + {{ item.amount }} GDD From e83e65aca73b055722f08e127bf018c2e8014cb0 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 15 Feb 2022 14:07:32 +0100 Subject: [PATCH 025/110] Update admin/src/components/Overlay.vue Co-authored-by: Moriz Wahl --- admin/src/components/Overlay.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/src/components/Overlay.vue b/admin/src/components/Overlay.vue index b6afb28e4..bf477c491 100644 --- a/admin/src/components/Overlay.vue +++ b/admin/src/components/Overlay.vue @@ -13,7 +13,7 @@ {{ $t('creation_for_month') }} - {{ $d(new Date(items.date), 'month') }} {{ $d(new Date(items.date), 'year') }} + {{ $d(new Date(item.date), 'month') }} {{ $d(new Date(item.date), 'year') }} From a3d697182dc88f7973f3148aa84c3db24ba04e0b Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 16 Feb 2022 12:26:27 +0100 Subject: [PATCH 026/110] fix: Backend Unit Tests Running Again --- backend/jest.config.js | 36 +++++++++++++++++------------------- backend/test/testSetup.ts | 6 ++++++ 2 files changed, 23 insertions(+), 19 deletions(-) create mode 100644 backend/test/testSetup.ts diff --git a/backend/jest.config.js b/backend/jest.config.js index 75b674cb1..d9e7065d4 100644 --- a/backend/jest.config.js +++ b/backend/jest.config.js @@ -1,21 +1,19 @@ /** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ -module.exports = async () => { - process.env.TZ = 'UTC' - return { - verbose: true, - preset: 'ts-jest', - collectCoverage: true, - collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**'], - moduleNameMapper: { - '@entity/(.*)': '/../database/build/entity/$1', - // This is hack to fix a problem with the library `ts-mysql-migrate` which does differentiate between its ts/js state - '@dbTools/(.*)': '/../database/src/$1', - /* - '@dbTools/(.*)': - process.env.NODE_ENV === 'development' - ? '/../database/src/$1' - : '/../database/build/src/$1', - */ - }, - } +module.exports = { + verbose: true, + preset: 'ts-jest', + collectCoverage: true, + collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**'], + setupFiles: ['/test/testSetup.ts'], + moduleNameMapper: { + '@entity/(.*)': + process.env.NODE_ENV === 'development' + ? '/../database/entity/$1' + : '/../database/build/entity/$1', + // This is hack to fix a problem with the library `ts-mysql-migrate` which does differentiate between its ts/js state + '@dbTools/(.*)': + process.env.NODE_ENV === 'development' + ? '/../database/src/$1' + : '/../database/build/src/$1', + }, } diff --git a/backend/test/testSetup.ts b/backend/test/testSetup.ts new file mode 100644 index 000000000..ed2c5cf49 --- /dev/null +++ b/backend/test/testSetup.ts @@ -0,0 +1,6 @@ +/* eslint-disable no-console */ + +// disable console.info for apollo log + +// eslint-disable-next-line @typescript-eslint/no-empty-function +console.info = () => {} From fccf64ec3623ba155a850bc0811b4007bca6559c Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 16 Feb 2022 12:29:24 +0100 Subject: [PATCH 027/110] set time zone in package json --- backend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/package.json b/backend/package.json index 7f4cfc239..b72386a68 100644 --- a/backend/package.json +++ b/backend/package.json @@ -14,7 +14,7 @@ "dev": "nodemon -w src --ext ts --exec ts-node src/index.ts", "lint": "eslint . --ext .js,.ts", "CI_workflow_test": "jest --runInBand --coverage ", - "test": "NODE_ENV=development jest --runInBand --coverage " + "test": "TZ=UTC NODE_ENV=development jest --runInBand --coverage " }, "dependencies": { "@types/jest": "^27.0.2", From 1335bb8e26cd9f30ba65f8edeb9e4ac0461c2c92 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 16 Feb 2022 13:18:59 +0100 Subject: [PATCH 028/110] activate UserResolver test again --- .../{UserResolver.test.ts.disabled => UserResolver.test.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename backend/src/graphql/resolver/{UserResolver.test.ts.disabled => UserResolver.test.ts} (100%) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts.disabled b/backend/src/graphql/resolver/UserResolver.test.ts similarity index 100% rename from backend/src/graphql/resolver/UserResolver.test.ts.disabled rename to backend/src/graphql/resolver/UserResolver.test.ts From 631346b63cab4b0f620fc4366e042aa71b645811 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 16 Feb 2022 13:19:27 +0100 Subject: [PATCH 029/110] remove deleted entities --- .../src/graphql/resolver/UserResolver.test.ts | 54 +++------------- backend/src/server/plugins.ts | 64 ++++++++++--------- 2 files changed, 43 insertions(+), 75 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 02e490edd..2ba9374f0 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -7,8 +7,6 @@ import { GraphQLError } from 'graphql' import createServer from '../../server/createServer' import { resetDB, initialize } from '@dbTools/helpers' import { getRepository } from 'typeorm' -import { LoginUser } from '@entity/LoginUser' -import { LoginUserBackup } from '@entity/LoginUserBackup' import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' import { User } from '@entity/User' import CONFIG from '../../config' @@ -84,16 +82,10 @@ describe('UserResolver', () => { }) describe('valid input data', () => { - let loginUser: LoginUser[] let user: User[] - let loginUserBackup: LoginUserBackup[] let loginEmailOptIn: LoginEmailOptIn[] beforeAll(async () => { - loginUser = await getRepository(LoginUser).createQueryBuilder('login_user').getMany() user = await getRepository(User).createQueryBuilder('state_user').getMany() - loginUserBackup = await getRepository(LoginUserBackup) - .createQueryBuilder('login_user_backup') - .getMany() loginEmailOptIn = await getRepository(LoginEmailOptIn) .createQueryBuilder('login_email_optin') .getMany() @@ -102,7 +94,7 @@ describe('UserResolver', () => { describe('filling all tables', () => { it('saves the user in login_user table', () => { - expect(loginUser).toEqual([ + expect(user).toEqual([ { id: expect.any(Number), email: 'peter@lustig.de', @@ -141,22 +133,11 @@ describe('UserResolver', () => { ]) }) - it('saves the user in login_user_backup table', () => { - expect(loginUserBackup).toEqual([ - { - id: expect.any(Number), - passphrase: expect.any(String), - userId: loginUser[0].id, - mnemonicType: 2, - }, - ]) - }) - it('creates an email optin', () => { expect(loginEmailOptIn).toEqual([ { id: expect.any(Number), - userId: loginUser[0].id, + userId: user[0].id, verificationCode: expect.any(String), emailOptInTypeId: 1, createdAt: expect.any(Date), @@ -196,9 +177,7 @@ describe('UserResolver', () => { mutation, variables: { ...variables, email: 'bibi@bloxberg.de', language: 'es' }, }) - await expect( - getRepository(LoginUser).createQueryBuilder('login_user').getMany(), - ).resolves.toEqual( + await expect(getRepository(User).createQueryBuilder('user').getMany()).resolves.toEqual( expect.arrayContaining([ expect.objectContaining({ email: 'bibi@bloxberg.de', @@ -215,9 +194,7 @@ describe('UserResolver', () => { mutation, variables: { ...variables, email: 'raeuber@hotzenplotz.de', publisherId: undefined }, }) - await expect( - getRepository(LoginUser).createQueryBuilder('login_user').getMany(), - ).resolves.toEqual( + await expect(getRepository(User).createQueryBuilder('user').getMany()).resolves.toEqual( expect.arrayContaining([ expect.objectContaining({ email: 'raeuber@hotzenplotz.de', @@ -274,13 +251,11 @@ describe('UserResolver', () => { const loginEmailOptIn = await getRepository(LoginEmailOptIn) .createQueryBuilder('login_email_optin') .getMany() - loginUser = await getRepository(LoginUser).createQueryBuilder('login_user').getMany() emailOptIn = loginEmailOptIn[0].verificationCode.toString() result = await mutate({ mutation: setPasswordMutation, variables: { code: emailOptIn, password: 'Aa12345_' }, }) - newLoginUser = await getRepository(LoginUser).createQueryBuilder('login_user').getMany() newUser = await getRepository(User).createQueryBuilder('state_user').getMany() }) @@ -296,31 +271,22 @@ describe('UserResolver', () => { expect(newLoginUser[0].password).toEqual('3917921995996627700') }) - it('updates the public Key on both user tables', () => { - expect(newLoginUser[0].pubKey).toEqual(expect.any(Buffer)) - expect(newLoginUser[0].pubKey).not.toEqual(loginUser[0].pubKey) - expect(newLoginUser[0].pubKey).toEqual(newUser[0].pubkey) - }) - - it('updates the private Key', () => { - expect(newLoginUser[0].privKey).toEqual(expect.any(Buffer)) - expect(newLoginUser[0].privKey).not.toEqual(loginUser[0].privKey) - }) - it('removes the optin', async () => { await expect( getRepository(LoginEmailOptIn).createQueryBuilder('login_email_optin').getMany(), ).resolves.toHaveLength(0) }) + /* it('calls the klicktipp API', () => { expect(klicktippSignIn).toBeCalledWith( - loginUser[0].email, - loginUser[0].language, - loginUser[0].firstName, - loginUser[0].lastName, + user[0].email, + user[0].language, + user[0].firstName, + user[0].lastName, ) }) + */ it('returns true', () => { expect(result).toBeTruthy() diff --git a/backend/src/server/plugins.ts b/backend/src/server/plugins.ts index 049f63a08..a407135ea 100644 --- a/backend/src/server/plugins.ts +++ b/backend/src/server/plugins.ts @@ -4,40 +4,42 @@ import { ApolloLogPlugin, LogMutateData } from 'apollo-log' import cloneDeep from 'lodash.clonedeep' -const plugins = [ - { - requestDidStart() { - return { - willSendResponse(requestContext: any) { - const { setHeaders = [] } = requestContext.context - setHeaders.forEach(({ key, value }: { [key: string]: string }) => { - if (requestContext.response.http.headers.get(key)) { - requestContext.response.http.headers.set(key, value) - } else { - requestContext.response.http.headers.append(key, value) - } - }) - return requestContext - }, - } - }, +const setHeadersPlugin = { + requestDidStart() { + return { + willSendResponse(requestContext: any) { + const { setHeaders = [] } = requestContext.context + setHeaders.forEach(({ key, value }: { [key: string]: string }) => { + if (requestContext.response.http.headers.get(key)) { + requestContext.response.http.headers.set(key, value) + } else { + requestContext.response.http.headers.append(key, value) + } + }) + return requestContext + }, + } }, - ApolloLogPlugin({ - mutate: (data: LogMutateData) => { - // We need to deep clone the object in order to not modify the actual request - const dataCopy = cloneDeep(data) +} - // mask password if part of the query - if (dataCopy.context.request.variables && dataCopy.context.request.variables.password) { - dataCopy.context.request.variables.password = '***' - } +const apolloLogPlugin = ApolloLogPlugin({ + mutate: (data: LogMutateData) => { + // We need to deep clone the object in order to not modify the actual request + const dataCopy = cloneDeep(data) - // mask token at all times - dataCopy.context.context.token = '***' + // mask password if part of the query + if (dataCopy.context.request.variables && dataCopy.context.request.variables.password) { + dataCopy.context.request.variables.password = '***' + } - return dataCopy - }, - }), -] + // mask token at all times + dataCopy.context.context.token = '***' + + return dataCopy + }, +}) + +const plugins = + process.env.NODE_ENV === 'development' ? [setHeadersPlugin] : [setHeadersPlugin, apolloLogPlugin] export default plugins From fe8546da08d7dee97b1f6c581290f5c70aea0aa5 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 16 Feb 2022 13:19:46 +0100 Subject: [PATCH 030/110] add typeorm package --- backend/package.json | 3 +- backend/yarn.lock | 186 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 184 insertions(+), 5 deletions(-) diff --git a/backend/package.json b/backend/package.json index b72386a68..c9b2fea30 100644 --- a/backend/package.json +++ b/backend/package.json @@ -39,7 +39,8 @@ "reflect-metadata": "^0.1.13", "sodium-native": "^3.3.0", "ts-jest": "^27.0.5", - "type-graphql": "^1.1.1" + "type-graphql": "^1.1.1", + "typeorm": "^0.2.41" }, "devDependencies": { "@types/express": "^4.17.12", diff --git a/backend/yarn.lock b/backend/yarn.lock index 6ef0d5701..bee9cce71 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -677,6 +677,11 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@sqltools/formatter@^1.2.2": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20" + integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg== + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -1019,6 +1024,11 @@ dependencies: "@types/yargs-parser" "*" +"@types/zen-observable@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" + integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== + "@typescript-eslint/eslint-plugin@^4.28.0": version "4.33.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" @@ -1217,6 +1227,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -1423,6 +1438,11 @@ apollo-utilities@^1.0.1, apollo-utilities@^1.3.0: ts-invariant "^0.4.0" tslib "^1.10.0" +app-root-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" + integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -1435,6 +1455,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1560,6 +1585,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -1650,6 +1680,14 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + busboy@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.3.1.tgz#170899274c5bf38aae27d5c62b71268cd585fd1b" @@ -1769,6 +1807,18 @@ cli-boxes@^2.2.1: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== +cli-highlight@^2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" + integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -2092,6 +2142,11 @@ dotenv@^10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +dotenv@^8.2.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -2881,6 +2936,11 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +highlight.js@^10.7.1: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -2972,6 +3032,11 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -3711,6 +3776,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsdom@^16.6.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" @@ -4087,6 +4159,11 @@ minimist@^1.2.0, minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + module-alias@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz#151cdcecc24e25739ff0aa6e51e1c5716974c0e0" @@ -4131,6 +4208,15 @@ mysql2@^2.3.0: seq-queue "^0.0.5" sqlstring "^2.3.2" +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + named-placeholders@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.2.tgz#ceb1fbff50b6b33492b5cf214ccf5e39cef3d0e8" @@ -4240,7 +4326,7 @@ nwsapi@^2.2.0: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -object-assign@^4: +object-assign@^4, object-assign@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -4401,11 +4487,23 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse5@6.0.1: +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@6.0.1, parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + parseurl@^1.3.2, parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -4763,6 +4861,11 @@ safe-buffer@^5.0.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sax@>=0.6.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -5123,6 +5226,20 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + throat@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" @@ -5307,6 +5424,28 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typeorm@^0.2.41: + version "0.2.41" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.41.tgz#88758101ac158dc0a0a903d70eaacea2974281cc" + integrity sha512-/d8CLJJxKPgsnrZWiMyPI0rz2MFZnBQrnQ5XP3Vu3mswv2WPexb58QM6BEtmRmlTMYN5KFWUz8SKluze+wS9xw== + dependencies: + "@sqltools/formatter" "^1.2.2" + app-root-path "^3.0.0" + buffer "^6.0.3" + chalk "^4.1.0" + cli-highlight "^2.1.11" + debug "^4.3.1" + dotenv "^8.2.0" + glob "^7.1.6" + js-yaml "^4.0.0" + mkdirp "^1.0.4" + reflect-metadata "^0.1.13" + sha.js "^2.4.11" + tslib "^2.1.0" + xml2js "^0.4.23" + yargs "^17.0.1" + zen-observable-ts "^1.0.0" + typescript@^4.3.4: version "4.4.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" @@ -5572,6 +5711,19 @@ xml-name-validator@^3.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml2js@^0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" @@ -5605,7 +5757,12 @@ yargs-parser@20.x, yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@^16.2.0: +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== + +yargs@^16.0.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -5618,6 +5775,19 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.0.1: + version "17.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" + integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" @@ -5631,7 +5801,15 @@ zen-observable-ts@^0.8.21: tslib "^1.9.3" zen-observable "^0.8.0" -zen-observable@^0.8.0: +zen-observable-ts@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" + integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== + dependencies: + "@types/zen-observable" "0.8.3" + zen-observable "0.8.15" + +zen-observable@0.8.15, zen-observable@^0.8.0: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== From b514539917051f2dfcdb06e5eca5611062fb8f39 Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 17 Feb 2022 09:03:31 +0100 Subject: [PATCH 031/110] add version in footer --- admin/src/components/ContentFooter.vue | 42 ++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/admin/src/components/ContentFooter.vue b/admin/src/components/ContentFooter.vue index 1e7e20f9e..510318e61 100644 --- a/admin/src/components/ContentFooter.vue +++ b/admin/src/components/ContentFooter.vue @@ -1,15 +1,45 @@ From 68d53bc6bc0dbc236cd1ad2159c14c009d015cbe Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 17 Feb 2022 09:30:17 +0100 Subject: [PATCH 032/110] add go -1 back if 404 page not found in adminarea --- admin/src/components/NotFoundPage.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/admin/src/components/NotFoundPage.vue b/admin/src/components/NotFoundPage.vue index 68a8fb3c4..bc3a02336 100755 --- a/admin/src/components/NotFoundPage.vue +++ b/admin/src/components/NotFoundPage.vue @@ -4,7 +4,7 @@
- +
@@ -1185,6 +1185,9 @@
+
+ zurück +
From f5b533c3fe1b882136b5d312f6f48b7f46df708d Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 17 Feb 2022 09:30:39 +0100 Subject: [PATCH 033/110] add go -1 back if 404 page not found in frontend wallet --- frontend/src/views/NotFoundPage.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/NotFoundPage.vue b/frontend/src/views/NotFoundPage.vue index 68a8fb3c4..ef2359fed 100755 --- a/frontend/src/views/NotFoundPage.vue +++ b/frontend/src/views/NotFoundPage.vue @@ -4,7 +4,7 @@
From e5c9822fbe243fd1eb563a05b20f0b8e665ca3a0 Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 17 Feb 2022 09:37:50 +0100 Subject: [PATCH 036/110] yarn lint --fix and yarn locales fix in adminarea --- admin/src/components/NotFoundPage.vue | 2 +- admin/src/locales/de.json | 1 + admin/src/locales/en.json | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/admin/src/components/NotFoundPage.vue b/admin/src/components/NotFoundPage.vue index afb603b24..2efa6a4dc 100755 --- a/admin/src/components/NotFoundPage.vue +++ b/admin/src/components/NotFoundPage.vue @@ -1186,7 +1186,7 @@
- zurück + {{ $t('back') }}
diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json index 956ad7708..90a60475c 100644 --- a/admin/src/locales/de.json +++ b/admin/src/locales/de.json @@ -1,5 +1,6 @@ { "all_emails": "Alle Nutzer", + "back": "zurück", "bookmark": "bookmark", "confirmed": "bestätigt", "creation": "Schöpfung", diff --git a/admin/src/locales/en.json b/admin/src/locales/en.json index f2795c945..8775393dd 100644 --- a/admin/src/locales/en.json +++ b/admin/src/locales/en.json @@ -1,5 +1,6 @@ { "all_emails": "All users", + "back": "back", "bookmark": "Remember", "confirmed": "confirmed", "creation": "Creation", From ed6ee0f8235c448510a7af3bd8b945fc5f8ba26b Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 17 Feb 2022 09:39:06 +0100 Subject: [PATCH 037/110] add locales on back button in PageNotFound --- frontend/src/views/NotFoundPage.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/views/NotFoundPage.vue b/frontend/src/views/NotFoundPage.vue index afb603b24..2efa6a4dc 100755 --- a/frontend/src/views/NotFoundPage.vue +++ b/frontend/src/views/NotFoundPage.vue @@ -1186,7 +1186,7 @@
- zurück + {{ $t('back') }}
From f7fa134346f673461656a42fa5a7eb5f5786867d Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 17 Feb 2022 09:57:52 +0100 Subject: [PATCH 038/110] yarn test fixed --- frontend/src/views/NotFoundPage.spec.js | 12 ++++++++++-- frontend/src/views/NotFoundPage.vue | 5 ++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/frontend/src/views/NotFoundPage.spec.js b/frontend/src/views/NotFoundPage.spec.js index 709b24807..c14f03b4f 100644 --- a/frontend/src/views/NotFoundPage.spec.js +++ b/frontend/src/views/NotFoundPage.spec.js @@ -3,11 +3,15 @@ import NotFoundPage from './NotFoundPage' const localVue = global.localVue +const mocks = { + $t: jest.fn((t) => t), +} + describe('NotFoundPage', () => { let wrapper const Wrapper = () => { - return mount(NotFoundPage, { localVue }) + return mount(NotFoundPage, { localVue, mocks }) } describe('mount', () => { @@ -16,7 +20,11 @@ describe('NotFoundPage', () => { }) it('has a svg', () => { - expect(wrapper.find('svg').exists()).toBeTruthy() + expect(wrapper.find('svg.test-404').exists()).toBeTruthy() + }) + + it('has a back button', () => { + expect(wrapper.find('.test-back').exists()).toBeTruthy() }) }) }) diff --git a/frontend/src/views/NotFoundPage.vue b/frontend/src/views/NotFoundPage.vue index 2efa6a4dc..3fe01d091 100755 --- a/frontend/src/views/NotFoundPage.vue +++ b/frontend/src/views/NotFoundPage.vue @@ -9,6 +9,7 @@
- {{ $t('back') }} + + {{ $t('back') }} +
From bc43c495ad342330dae974c5d13f90ae40719c56 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 17 Feb 2022 10:00:02 +0100 Subject: [PATCH 039/110] replace `disabled` (flag) with `deletedAt` (date) on `users` --- .../0023-users_disabled_soft_delete/User.ts | 75 +++++++++++++++++++ database/entity/User.ts | 2 +- .../0023-users_disabled_soft_delete.ts | 26 +++++++ 3 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 database/entity/0023-users_disabled_soft_delete/User.ts create mode 100644 database/migrations/0023-users_disabled_soft_delete.ts diff --git a/database/entity/0023-users_disabled_soft_delete/User.ts b/database/entity/0023-users_disabled_soft_delete/User.ts new file mode 100644 index 000000000..107b43f18 --- /dev/null +++ b/database/entity/0023-users_disabled_soft_delete/User.ts @@ -0,0 +1,75 @@ +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + OneToMany, + DeleteDateColumn, +} from 'typeorm' +import { UserSetting } from '../UserSetting' + +@Entity('users', { engine: 'InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci' }) +export class User extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ name: 'public_key', type: 'binary', length: 32, default: null, nullable: true }) + pubKey: Buffer + + @Column({ name: 'privkey', type: 'binary', length: 80, default: null, nullable: true }) + privKey: Buffer + + @Column({ length: 255, unique: true, nullable: false, collation: 'utf8mb4_unicode_ci' }) + email: string + + @Column({ + name: 'first_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + firstName: string + + @Column({ + name: 'last_name', + length: 255, + nullable: true, + default: null, + collation: 'utf8mb4_unicode_ci', + }) + lastName: string + + @DeleteDateColumn() + deletedAt: Date + + @Column({ type: 'bigint', default: 0, unsigned: true }) + password: BigInt + + @Column({ name: 'email_hash', type: 'binary', length: 32, default: null, nullable: true }) + emailHash: Buffer + + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP', nullable: false }) + createdAt: Date + + @Column({ name: 'email_checked', type: 'bool', nullable: false, default: false }) + emailChecked: boolean + + @Column({ length: 4, default: 'de', collation: 'utf8mb4_unicode_ci', nullable: false }) + language: string + + @Column({ name: 'publisher_id', default: 0 }) + publisherId: number + + @Column({ + type: 'text', + name: 'passphrase', + collation: 'utf8mb4_unicode_ci', + nullable: true, + default: null, + }) + passphrase: string + + @OneToMany(() => UserSetting, (userSetting) => userSetting.user) + settings: UserSetting[] +} diff --git a/database/entity/User.ts b/database/entity/User.ts index 867d63112..d2c201c54 100644 --- a/database/entity/User.ts +++ b/database/entity/User.ts @@ -1 +1 @@ -export { User } from './0020-rename_and_clean_state_users/User' +export { User } from './0023-users_disabled_soft_delete/User' diff --git a/database/migrations/0023-users_disabled_soft_delete.ts b/database/migrations/0023-users_disabled_soft_delete.ts new file mode 100644 index 000000000..2e62d4b71 --- /dev/null +++ b/database/migrations/0023-users_disabled_soft_delete.ts @@ -0,0 +1,26 @@ +/* MIGRATION TO IMPLEMENT SOFT DELETE ON THE USERS TABLE + * + * Replace the `disabled` column with `deletedAt` containing + * a date as it is standard for soft delete fields + */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // Create new `deletedAt` column + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `deletedAt` datetime DEFAULT NULL AFTER `disabled`;', + ) + + // Insert a 1.1.2022 as date for those users with `disabled=1` + await queryFn('UPDATE `users` SET `deletedAt` = "2022-01-01 00:00:00" WHERE `disabled` = 1;') + + // Delete `disabled` column + await queryFn('ALTER TABLE `users` DROP COLUMN `disabled`;') +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + await queryFn( + 'ALTER TABLE `users` ADD COLUMN `disabled` tinyint(4) NOT NULL DEFAULT 0 AFTER `deletedAt`;', + ) + await queryFn('UPDATE `users` SET `disabled` = 1 WHERE `deletedAt` IS NOT NULL;') + await queryFn('ALTER TABLE `users` DROP COLUMN `deletedAt`;') +} From f6776576284a19bb110b16744d8e448ef6ba0f25 Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 17 Feb 2022 10:01:19 +0100 Subject: [PATCH 040/110] yarn test fixed adminarea --- admin/src/components/NotFoundPage.spec.js | 10 +++++++++- admin/src/components/NotFoundPage.vue | 4 +++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/admin/src/components/NotFoundPage.spec.js b/admin/src/components/NotFoundPage.spec.js index 709b24807..99eef569b 100644 --- a/admin/src/components/NotFoundPage.spec.js +++ b/admin/src/components/NotFoundPage.spec.js @@ -3,11 +3,15 @@ import NotFoundPage from './NotFoundPage' const localVue = global.localVue +const mocks = { + $t: jest.fn((t) => t), +} + describe('NotFoundPage', () => { let wrapper const Wrapper = () => { - return mount(NotFoundPage, { localVue }) + return mount(NotFoundPage, { localVue, mocks }) } describe('mount', () => { @@ -18,5 +22,9 @@ describe('NotFoundPage', () => { it('has a svg', () => { expect(wrapper.find('svg').exists()).toBeTruthy() }) + + it('has a back button', () => { + expect(wrapper.find('.test-back').exists()).toBeTruthy() + }) }) }) diff --git a/admin/src/components/NotFoundPage.vue b/admin/src/components/NotFoundPage.vue index 2efa6a4dc..b42c3d8bb 100755 --- a/admin/src/components/NotFoundPage.vue +++ b/admin/src/components/NotFoundPage.vue @@ -1186,7 +1186,9 @@
- {{ $t('back') }} + + {{ $t('back') }} +
From a0b8d8266f3fe291d08cb46223ebf3d249edb390 Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 17 Feb 2022 10:01:46 +0100 Subject: [PATCH 041/110] yarn test fixed frontend walet --- frontend/src/views/NotFoundPage.spec.js | 2 +- frontend/src/views/NotFoundPage.vue | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/views/NotFoundPage.spec.js b/frontend/src/views/NotFoundPage.spec.js index c14f03b4f..99eef569b 100644 --- a/frontend/src/views/NotFoundPage.spec.js +++ b/frontend/src/views/NotFoundPage.spec.js @@ -20,7 +20,7 @@ describe('NotFoundPage', () => { }) it('has a svg', () => { - expect(wrapper.find('svg.test-404').exists()).toBeTruthy() + expect(wrapper.find('svg').exists()).toBeTruthy() }) it('has a back button', () => { diff --git a/frontend/src/views/NotFoundPage.vue b/frontend/src/views/NotFoundPage.vue index 3fe01d091..b42c3d8bb 100755 --- a/frontend/src/views/NotFoundPage.vue +++ b/frontend/src/views/NotFoundPage.vue @@ -9,7 +9,6 @@
Date: Thu, 17 Feb 2022 10:08:33 +0100 Subject: [PATCH 042/110] fixed factories --- database/src/factories/user.factory.ts | 2 +- database/src/interface/UserContext.ts | 2 +- database/src/interface/UserInterface.ts | 2 +- database/src/seeds/helpers/user-helpers.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/database/src/factories/user.factory.ts b/database/src/factories/user.factory.ts index 9950ef689..cb2ccb105 100644 --- a/database/src/factories/user.factory.ts +++ b/database/src/factories/user.factory.ts @@ -12,7 +12,7 @@ define(User, (faker: typeof Faker, context?: UserContext) => { user.email = context.email ? context.email : faker.internet.email() user.firstName = context.firstName ? context.firstName : faker.name.firstName() user.lastName = context.lastName ? context.lastName : faker.name.lastName() - user.disabled = context.disabled ? context.disabled : false + user.deletedAt = context.deletedAt ? context.deletedAt : null // TODO Create real password and keys/hash user.password = context.password ? context.password : BigInt(0) user.privKey = context.privKey ? context.privKey : randomBytes(80) diff --git a/database/src/interface/UserContext.ts b/database/src/interface/UserContext.ts index 7ed794793..f3ccaecf4 100644 --- a/database/src/interface/UserContext.ts +++ b/database/src/interface/UserContext.ts @@ -3,7 +3,7 @@ export interface UserContext { email?: string firstName?: string lastName?: string - disabled?: boolean + deletedAt?: Date password?: BigInt privKey?: Buffer emailHash?: Buffer diff --git a/database/src/interface/UserInterface.ts b/database/src/interface/UserInterface.ts index 7e1e2fe48..30b05db38 100644 --- a/database/src/interface/UserInterface.ts +++ b/database/src/interface/UserInterface.ts @@ -10,7 +10,7 @@ export interface UserInterface { createdAt?: Date emailChecked?: boolean language?: string - disabled?: boolean + deletedAt?: Date groupId?: number publisherId?: number passphrase?: string diff --git a/database/src/seeds/helpers/user-helpers.ts b/database/src/seeds/helpers/user-helpers.ts index c40ff1527..74bdd4326 100644 --- a/database/src/seeds/helpers/user-helpers.ts +++ b/database/src/seeds/helpers/user-helpers.ts @@ -42,7 +42,7 @@ const createUserContext = (context: UserInterface): UserContext => { email: context.email, firstName: context.firstName, lastName: context.lastName, - disabled: context.disabled, + deletedAt: context.deletedAt, password: context.password, privKey: context.privKey, emailHash: context.emailHash, From 864f1b085d5ab2e650d9ba5f98e6157b8a445439 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 17 Feb 2022 10:42:31 +0100 Subject: [PATCH 043/110] missing change --- database/entity/0023-users_disabled_soft_delete/User.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/entity/0023-users_disabled_soft_delete/User.ts b/database/entity/0023-users_disabled_soft_delete/User.ts index 107b43f18..95fe1b3f7 100644 --- a/database/entity/0023-users_disabled_soft_delete/User.ts +++ b/database/entity/0023-users_disabled_soft_delete/User.ts @@ -41,7 +41,7 @@ export class User extends BaseEntity { lastName: string @DeleteDateColumn() - deletedAt: Date + deletedAt: Date | null @Column({ type: 'bigint', default: 0, unsigned: true }) password: BigInt From 62260857c5b727edde4b40e31b2806a831882d44 Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 17 Feb 2022 10:41:00 +0100 Subject: [PATCH 044/110] make a function goback() from router go-1 in frontend wallet --- frontend/src/views/NotFoundPage.vue | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/frontend/src/views/NotFoundPage.vue b/frontend/src/views/NotFoundPage.vue index b42c3d8bb..f01f76044 100755 --- a/frontend/src/views/NotFoundPage.vue +++ b/frontend/src/views/NotFoundPage.vue @@ -4,7 +4,7 @@
- +
@@ -1186,7 +1186,7 @@
- + {{ $t('back') }}
@@ -1218,6 +1218,11 @@ export default { }, } }, + methods: { + goback() { + this.$router.go(-1) + }, + }, }