From 3b656898e153afb48c9b9cf19e7bb04a5b7408d6 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 22 Feb 2022 14:45:43 +0100 Subject: [PATCH] add isDeleted in backend, delete and undelete is activ by return --- admin/src/components/DeletedUserFormular.vue | 4 ++++ admin/src/graphql/searchUsers.js | 9 ++++++++- admin/src/pages/UserSearch.vue | 3 +-- backend/src/graphql/arg/SearchUsersArgs.ts | 3 +++ backend/src/graphql/resolver/AdminResolver.ts | 14 ++++++++++++-- backend/src/typeorm/repository/User.ts | 7 +++++-- 6 files changed, 33 insertions(+), 7 deletions(-) diff --git a/admin/src/components/DeletedUserFormular.vue b/admin/src/components/DeletedUserFormular.vue index df91d6d5d..b9661486f 100644 --- a/admin/src/components/DeletedUserFormular.vue +++ b/admin/src/components/DeletedUserFormular.vue @@ -47,6 +47,8 @@ export default { }) .then(() => { this.$toasted.success('user is deleted') + this.item.deletedAt = Date.now() + this.checked = false }) .catch((error) => { this.$toasted.error('user deleted error', error) @@ -62,6 +64,8 @@ export default { }) .then(() => { this.$toasted.success('user is undeleted') + this.item.deletedAt = null + this.checked = false }) .catch((error) => { this.$toasted.error('user undeleted error', error) diff --git a/admin/src/graphql/searchUsers.js b/admin/src/graphql/searchUsers.js index 4ef9f23bc..e28508d1b 100644 --- a/admin/src/graphql/searchUsers.js +++ b/admin/src/graphql/searchUsers.js @@ -1,12 +1,19 @@ import gql from 'graphql-tag' export const searchUsers = gql` - query ($searchText: String!, $currentPage: Int, $pageSize: Int, $notActivated: Boolean) { + query ( + $searchText: String! + $currentPage: Int + $pageSize: Int + $notActivated: Boolean + $isDeleted: Boolean + ) { searchUsers( searchText: $searchText currentPage: $currentPage pageSize: $pageSize notActivated: $notActivated + isDeleted: $isDeleted ) { userCount userList { diff --git a/admin/src/pages/UserSearch.vue b/admin/src/pages/UserSearch.vue index f80654efa..c49e45431 100644 --- a/admin/src/pages/UserSearch.vue +++ b/admin/src/pages/UserSearch.vue @@ -71,7 +71,6 @@ export default { deletedUserSearch() { this.filterDeletedUser = !this.filterDeletedUser this.getUsers() - alert('TODO: deleted user filter in search and check in backend ') }, getUsers() { this.$apollo @@ -82,7 +81,7 @@ export default { currentPage: this.currentPage, pageSize: this.perPage, notActivated: this.filterCheckedEmails, - deletedUser: this.filterDeletedUser, + isDeleted: this.filterDeletedUser, }, }) .then((result) => { diff --git a/backend/src/graphql/arg/SearchUsersArgs.ts b/backend/src/graphql/arg/SearchUsersArgs.ts index 5b40fd9ca..52da77852 100644 --- a/backend/src/graphql/arg/SearchUsersArgs.ts +++ b/backend/src/graphql/arg/SearchUsersArgs.ts @@ -13,4 +13,7 @@ export default class SearchUsersArgs { @Field(() => Boolean, { nullable: true }) notActivated?: boolean + + @Field(() => Boolean, { nullable: true }) + isDeleted?: boolean } diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 78a35f308..6a9eff47c 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -2,7 +2,7 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Resolver, Query, Arg, Args, Authorized, Mutation, Ctx } from 'type-graphql' -import { getCustomRepository, ObjectLiteral, Raw } from '@dbTools/typeorm' +import { getCustomRepository, IsNull, Not, ObjectLiteral, Raw } from '@dbTools/typeorm' import { UserAdmin, SearchUsersResult } from '../model/UserAdmin' import { PendingCreation } from '../model/PendingCreation' import { CreatePendingCreations } from '../model/CreatePendingCreations' @@ -32,7 +32,14 @@ export class AdminResolver { @Authorized([RIGHTS.SEARCH_USERS]) @Query(() => SearchUsersResult) async searchUsers( - @Args() { searchText, currentPage = 1, pageSize = 25, notActivated = false }: SearchUsersArgs, + @Args() + { + searchText, + currentPage = 1, + pageSize = 25, + notActivated = false, + isDeleted = false, + }: SearchUsersArgs, ): Promise { const userRepository = getCustomRepository(UserRepository) @@ -40,6 +47,9 @@ export class AdminResolver { if (notActivated) { filterCriteria.push({ emailChecked: false }) } + if (isDeleted) { + filterCriteria.push({ deletedAt: Not(IsNull()) }) + } // prevent overfetching data from db, select only needed columns // prevent reading and transmitting data from db at least 300 Bytes // one of my example dataset shrink down from 342 Bytes to 42 Bytes, that's ~88% saved db bandwith diff --git a/backend/src/typeorm/repository/User.ts b/backend/src/typeorm/repository/User.ts index 66f285978..92b1b4738 100644 --- a/backend/src/typeorm/repository/User.ts +++ b/backend/src/typeorm/repository/User.ts @@ -24,7 +24,7 @@ export class UserRepository extends Repository { currentPage: number, pageSize: number, ): Promise<[User[], number]> { - return await this.createQueryBuilder('user') + const query = await this.createQueryBuilder('user') .select(select) .withDeleted() .where( @@ -39,7 +39,10 @@ export class UserRepository extends Repository { ) }), ) - .andWhere(filterCriteria) + filterCriteria.forEach((filter) => { + query.andWhere(filter) + }) + return query .take(pageSize) .skip((currentPage - 1) * pageSize) .getManyAndCount()