From bc43c495ad342330dae974c5d13f90ae40719c56 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 17 Feb 2022 10:00:02 +0100 Subject: [PATCH 1/9] 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 d76798e02f477a7c6ac955048372bca88f5adec7 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 17 Feb 2022 10:08:33 +0100 Subject: [PATCH 2/9] 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 3/9] 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 0683ff1999dc5414f89c800ed607d48ef24546f4 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Thu, 17 Feb 2022 10:53:49 +0100 Subject: [PATCH 4/9] fixed backend deletedAt instead of disabled --- backend/src/graphql/resolver/TransactionResolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/graphql/resolver/TransactionResolver.ts b/backend/src/graphql/resolver/TransactionResolver.ts index 6eac816a8..622bf37fe 100644 --- a/backend/src/graphql/resolver/TransactionResolver.ts +++ b/backend/src/graphql/resolver/TransactionResolver.ts @@ -367,7 +367,7 @@ export class TransactionResolver { const recipiantUser = await userRepository.findByPubkeyHex(recipiantPublicKey) if (!recipiantUser) { throw new Error('Cannot find recipiant user by local send coins transaction') - } else if (recipiantUser.disabled) { + } else if (recipiantUser.deletedAt) { throw new Error('recipiant user account is disabled') } From 10090756a13bafdf594dbc16b6af732acf52b1be Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 17 Feb 2022 13:55:45 +0100 Subject: [PATCH 5/9] avoid moment, use minus signs --- frontend/src/components/DecayInformation.vue | 66 +++++----- frontend/src/components/Transaction.vue | 2 +- frontend/src/i18n.js | 8 +- frontend/src/plugins/dashboard-plugin.js | 3 - .../AccountOverview/GddTransactionList.vue | 118 +++++++++--------- frontend/test/testSetup.js | 3 - 6 files changed, 93 insertions(+), 107 deletions(-) diff --git a/frontend/src/components/DecayInformation.vue b/frontend/src/components/DecayInformation.vue index 28af9b2b4..901b8f52b 100644 --- a/frontend/src/components/DecayInformation.vue +++ b/frontend/src/components/DecayInformation.vue @@ -1,7 +1,7 @@ diff --git a/frontend/src/components/Transaction.vue b/frontend/src/components/Transaction.vue index f1deca565..1dcfee13a 100644 --- a/frontend/src/components/Transaction.vue +++ b/frontend/src/components/Transaction.vue @@ -50,7 +50,7 @@ {{ $t('form.date') }} - {{ $d($moment(date), 'long') }} {{ $i18n.locale === 'de' ? 'Uhr' : '' }} + {{ $d(new Date(date), 'long') }} {{ $i18n.locale === 'de' ? 'Uhr' : '' }} diff --git a/frontend/src/i18n.js b/frontend/src/i18n.js index 98e4ec971..0ce43310b 100644 --- a/frontend/src/i18n.js +++ b/frontend/src/i18n.js @@ -69,8 +69,8 @@ const dateTimeFormats = { }, long: { year: 'numeric', - month: 'short', - day: 'numeric', + month: 'long', + day: 'long', weekday: 'short', hour: 'numeric', minute: 'numeric', @@ -84,9 +84,9 @@ const dateTimeFormats = { }, long: { day: 'numeric', - month: 'short', + month: 'long', year: 'numeric', - weekday: 'short', + weekday: 'long', hour: 'numeric', minute: 'numeric', }, diff --git a/frontend/src/plugins/dashboard-plugin.js b/frontend/src/plugins/dashboard-plugin.js index 4825377c7..983210027 100755 --- a/frontend/src/plugins/dashboard-plugin.js +++ b/frontend/src/plugins/dashboard-plugin.js @@ -11,8 +11,6 @@ import '@/assets/scss/gradido.scss' import FlatPickr from 'vue-flatpickr-component' import 'flatpickr/dist/flatpickr.css' -import VueMoment from 'vue-moment' - import Loading from 'vue-loading-overlay' import 'vue-loading-overlay/dist/vue-loading.css' @@ -24,7 +22,6 @@ export default { Vue.use(GlobalDirectives) Vue.use(BootstrapVue) Vue.use(IconsPlugin) - Vue.use(VueMoment) Vue.use(PortalVue) Vue.use(FlatPickr) Vue.use(Loading) diff --git a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue index f6c046fe6..d39d5ea88 100644 --- a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue +++ b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue @@ -77,7 +77,7 @@
- {{ $d($moment(date), 'long') }} {{ $i18n.locale === 'de' ? 'Uhr' : '' }} + {{ $d(new Date(date), 'long') }} {{ $i18n.locale === 'de' ? 'Uhr' : '' }}
@@ -142,66 +142,66 @@