From ed93963af86adf10503aca1aafd43bf46b57240a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Claus-Peter=20H=C3=BCbner?= Date: Tue, 10 Jan 2023 00:13:06 +0100 Subject: [PATCH] remove unused/unnecessary files --- federation/src/auth/CustomJwtPayload.ts | 5 -- federation/src/auth/INALIENABLE_RIGHTS.ts | 12 ---- federation/src/auth/JWT.ts | 19 ------ federation/src/auth/RIGHTS.ts | 56 ---------------- federation/src/auth/ROLES.ts | 40 ----------- federation/src/auth/Role.ts | 15 ----- federation/src/config/index.ts | 41 ++++++------ .../graphql/api/0_1/resolver/TestResolver.ts | 22 ------ .../src/graphql/arg/SearchUsersFilters.ts | 10 --- .../src/graphql/directive/isAuthorized.ts | 55 --------------- federation/src/graphql/schema.ts | 4 +- federation/src/server/createServer.ts | 10 +-- federation/src/server/localization.ts | 28 -------- federation/src/typeorm/repository/User.ts | 67 ------------------- 14 files changed, 27 insertions(+), 357 deletions(-) delete mode 100644 federation/src/auth/CustomJwtPayload.ts delete mode 100644 federation/src/auth/INALIENABLE_RIGHTS.ts delete mode 100644 federation/src/auth/JWT.ts delete mode 100644 federation/src/auth/RIGHTS.ts delete mode 100644 federation/src/auth/ROLES.ts delete mode 100644 federation/src/auth/Role.ts delete mode 100644 federation/src/graphql/api/0_1/resolver/TestResolver.ts delete mode 100644 federation/src/graphql/arg/SearchUsersFilters.ts delete mode 100644 federation/src/graphql/directive/isAuthorized.ts delete mode 100644 federation/src/server/localization.ts delete mode 100644 federation/src/typeorm/repository/User.ts diff --git a/federation/src/auth/CustomJwtPayload.ts b/federation/src/auth/CustomJwtPayload.ts deleted file mode 100644 index 2b52c3cea..000000000 --- a/federation/src/auth/CustomJwtPayload.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { JwtPayload } from 'jsonwebtoken' - -export interface CustomJwtPayload extends JwtPayload { - pubKey: Buffer -} diff --git a/federation/src/auth/INALIENABLE_RIGHTS.ts b/federation/src/auth/INALIENABLE_RIGHTS.ts deleted file mode 100644 index 348cd5b20..000000000 --- a/federation/src/auth/INALIENABLE_RIGHTS.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { RIGHTS } from './RIGHTS' - -export const INALIENABLE_RIGHTS = [ - RIGHTS.LOGIN, - RIGHTS.GET_COMMUNITY_INFO, - RIGHTS.COMMUNITIES, - RIGHTS.CREATE_USER, - RIGHTS.SEND_RESET_PASSWORD_EMAIL, - RIGHTS.SET_PASSWORD, - RIGHTS.QUERY_TRANSACTION_LINK, - RIGHTS.QUERY_OPT_IN, -] diff --git a/federation/src/auth/JWT.ts b/federation/src/auth/JWT.ts deleted file mode 100644 index e32e68223..000000000 --- a/federation/src/auth/JWT.ts +++ /dev/null @@ -1,19 +0,0 @@ -import jwt from 'jsonwebtoken' -import CONFIG from '@/config/' -import { CustomJwtPayload } from './CustomJwtPayload' - -export const decode = (token: string): CustomJwtPayload | null => { - if (!token) throw new Error('401 Unauthorized') - try { - return jwt.verify(token, CONFIG.JWT_SECRET) - } catch (err) { - return null - } -} - -export const encode = (pubKey: Buffer): string => { - const token = jwt.sign({ pubKey }, CONFIG.JWT_SECRET, { - expiresIn: CONFIG.JWT_EXPIRES_IN, - }) - return token -} diff --git a/federation/src/auth/RIGHTS.ts b/federation/src/auth/RIGHTS.ts deleted file mode 100644 index 4f144f1e9..000000000 --- a/federation/src/auth/RIGHTS.ts +++ /dev/null @@ -1,56 +0,0 @@ -export enum RIGHTS { - LOGIN = 'LOGIN', - VERIFY_LOGIN = 'VERIFY_LOGIN', - BALANCE = 'BALANCE', - GET_COMMUNITY_INFO = 'GET_COMMUNITY_INFO', - COMMUNITIES = 'COMMUNITIES', - LIST_GDT_ENTRIES = 'LIST_GDT_ENTRIES', - EXIST_PID = 'EXIST_PID', - GET_KLICKTIPP_USER = 'GET_KLICKTIPP_USER', - GET_KLICKTIPP_TAG_MAP = 'GET_KLICKTIPP_TAG_MAP', - UNSUBSCRIBE_NEWSLETTER = 'UNSUBSCRIBE_NEWSLETTER', - SUBSCRIBE_NEWSLETTER = 'SUBSCRIBE_NEWSLETTER', - TRANSACTION_LIST = 'TRANSACTION_LIST', - SEND_COINS = 'SEND_COINS', - LOGOUT = 'LOGOUT', - CREATE_USER = 'CREATE_USER', - SEND_RESET_PASSWORD_EMAIL = 'SEND_RESET_PASSWORD_EMAIL', - SET_PASSWORD = 'SET_PASSWORD', - QUERY_OPT_IN = 'QUERY_OPT_IN', - UPDATE_USER_INFOS = 'UPDATE_USER_INFOS', - HAS_ELOPAGE = 'HAS_ELOPAGE', - CREATE_TRANSACTION_LINK = 'CREATE_TRANSACTION_LINK', - DELETE_TRANSACTION_LINK = 'DELETE_TRANSACTION_LINK', - QUERY_TRANSACTION_LINK = 'QUERY_TRANSACTION_LINK', - REDEEM_TRANSACTION_LINK = 'REDEEM_TRANSACTION_LINK', - LIST_TRANSACTION_LINKS = 'LIST_TRANSACTION_LINKS', - GDT_BALANCE = 'GDT_BALANCE', - CREATE_CONTRIBUTION = 'CREATE_CONTRIBUTION', - DELETE_CONTRIBUTION = 'DELETE_CONTRIBUTION', - LIST_CONTRIBUTIONS = 'LIST_CONTRIBUTIONS', - LIST_ALL_CONTRIBUTIONS = 'LIST_ALL_CONTRIBUTIONS', - UPDATE_CONTRIBUTION = 'UPDATE_CONTRIBUTION', - LIST_CONTRIBUTION_LINKS = 'LIST_CONTRIBUTION_LINKS', - COMMUNITY_STATISTICS = 'COMMUNITY_STATISTICS', - SEARCH_ADMIN_USERS = 'SEARCH_ADMIN_USERS', - CREATE_CONTRIBUTION_MESSAGE = 'CREATE_CONTRIBUTION_MESSAGE', - LIST_ALL_CONTRIBUTION_MESSAGES = 'LIST_ALL_CONTRIBUTION_MESSAGES', - // Admin - SEARCH_USERS = 'SEARCH_USERS', - SET_USER_ROLE = 'SET_USER_ROLE', - DELETE_USER = 'DELETE_USER', - UNDELETE_USER = 'UNDELETE_USER', - ADMIN_CREATE_CONTRIBUTION = 'ADMIN_CREATE_CONTRIBUTION', - ADMIN_CREATE_CONTRIBUTIONS = 'ADMIN_CREATE_CONTRIBUTIONS', - ADMIN_UPDATE_CONTRIBUTION = 'ADMIN_UPDATE_CONTRIBUTION', - ADMIN_DELETE_CONTRIBUTION = 'ADMIN_DELETE_CONTRIBUTION', - LIST_UNCONFIRMED_CONTRIBUTIONS = 'LIST_UNCONFIRMED_CONTRIBUTIONS', - CONFIRM_CONTRIBUTION = 'CONFIRM_CONTRIBUTION', - SEND_ACTIVATION_EMAIL = 'SEND_ACTIVATION_EMAIL', - CREATION_TRANSACTION_LIST = 'CREATION_TRANSACTION_LIST', - LIST_TRANSACTION_LINKS_ADMIN = 'LIST_TRANSACTION_LINKS_ADMIN', - CREATE_CONTRIBUTION_LINK = 'CREATE_CONTRIBUTION_LINK', - DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK', - UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK', - ADMIN_CREATE_CONTRIBUTION_MESSAGE = 'ADMIN_CREATE_CONTRIBUTION_MESSAGE', -} diff --git a/federation/src/auth/ROLES.ts b/federation/src/auth/ROLES.ts deleted file mode 100644 index eabaf8e99..000000000 --- a/federation/src/auth/ROLES.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { INALIENABLE_RIGHTS } from './INALIENABLE_RIGHTS' -import { RIGHTS } from './RIGHTS' -import { Role } from './Role' - -export const ROLE_UNAUTHORIZED = new Role('unauthorized', INALIENABLE_RIGHTS) -export const ROLE_USER = new Role('user', [ - ...INALIENABLE_RIGHTS, - RIGHTS.VERIFY_LOGIN, - RIGHTS.BALANCE, - RIGHTS.LIST_GDT_ENTRIES, - RIGHTS.EXIST_PID, - RIGHTS.GET_KLICKTIPP_USER, - RIGHTS.GET_KLICKTIPP_TAG_MAP, - RIGHTS.UNSUBSCRIBE_NEWSLETTER, - RIGHTS.SUBSCRIBE_NEWSLETTER, - RIGHTS.TRANSACTION_LIST, - RIGHTS.SEND_COINS, - RIGHTS.LOGOUT, - RIGHTS.UPDATE_USER_INFOS, - RIGHTS.HAS_ELOPAGE, - RIGHTS.CREATE_TRANSACTION_LINK, - RIGHTS.DELETE_TRANSACTION_LINK, - RIGHTS.REDEEM_TRANSACTION_LINK, - RIGHTS.LIST_TRANSACTION_LINKS, - RIGHTS.GDT_BALANCE, - RIGHTS.CREATE_CONTRIBUTION, - RIGHTS.DELETE_CONTRIBUTION, - RIGHTS.LIST_CONTRIBUTIONS, - RIGHTS.LIST_ALL_CONTRIBUTIONS, - RIGHTS.UPDATE_CONTRIBUTION, - RIGHTS.SEARCH_ADMIN_USERS, - RIGHTS.LIST_CONTRIBUTION_LINKS, - RIGHTS.COMMUNITY_STATISTICS, - RIGHTS.CREATE_CONTRIBUTION_MESSAGE, - RIGHTS.LIST_ALL_CONTRIBUTION_MESSAGES, -]) -export const ROLE_ADMIN = new Role('admin', Object.values(RIGHTS)) // all rights - -// TODO from database -export const ROLES = [ROLE_UNAUTHORIZED, ROLE_USER, ROLE_ADMIN] diff --git a/federation/src/auth/Role.ts b/federation/src/auth/Role.ts deleted file mode 100644 index a2f13ec20..000000000 --- a/federation/src/auth/Role.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { RIGHTS } from './RIGHTS' - -export class Role { - id: string - rights: RIGHTS[] - - constructor(id: string, rights: RIGHTS[]) { - this.id = id - this.rights = rights - } - - hasRight = (right: RIGHTS): boolean => { - return this.rights.includes(right) - } -} diff --git a/federation/src/config/index.ts b/federation/src/config/index.ts index 068ffb76a..2fe928935 100644 --- a/federation/src/config/index.ts +++ b/federation/src/config/index.ts @@ -18,20 +18,19 @@ const constants = { LOG_LEVEL: process.env.LOG_LEVEL || 'info', CONFIG_VERSION: { DEFAULT: 'DEFAULT', - EXPECTED: 'v14.2022-11-22', + EXPECTED: 'v1.2023-01-09', CURRENT: '', }, } const server = { PORT: process.env.PORT || 5000, - JWT_SECRET: process.env.JWT_SECRET || 'secret123', - JWT_EXPIRES_IN: process.env.JWT_EXPIRES_IN || '10m', + // JWT_SECRET: process.env.JWT_SECRET || 'secret123', + // JWT_EXPIRES_IN: process.env.JWT_EXPIRES_IN || '10m', GRAPHIQL: process.env.GRAPHIQL === 'true' || false, - GDT_API_URL: process.env.GDT_API_URL || 'https://gdt.gradido.net', + // GDT_API_URL: process.env.GDT_API_URL || 'https://gdt.gradido.net', PRODUCTION: process.env.NODE_ENV === 'production' || false, } - const database = { DB_HOST: process.env.DB_HOST || 'localhost', DB_PORT: process.env.DB_PORT ? parseInt(process.env.DB_PORT) : 3306, @@ -40,25 +39,25 @@ const database = { DB_DATABASE: process.env.DB_DATABASE || 'gradido_community', TYPEORM_LOGGING_RELATIVE_PATH: process.env.TYPEORM_LOGGING_RELATIVE_PATH || 'typeorm.backend.log', } - +/* const community = { - COMMUNITY_NAME: process.env.COMMUNITY_NAME || 'Gradido Entwicklung', - COMMUNITY_URL: process.env.COMMUNITY_URL || 'http://localhost/', - COMMUNITY_REGISTER_URL: process.env.COMMUNITY_REGISTER_URL || 'http://localhost/register', - COMMUNITY_REDEEM_URL: process.env.COMMUNITY_REDEEM_URL || 'http://localhost/redeem/{code}', - COMMUNITY_REDEEM_CONTRIBUTION_URL: - process.env.COMMUNITY_REDEEM_CONTRIBUTION_URL || 'http://localhost/redeem/CL-{code}', - COMMUNITY_DESCRIPTION: - process.env.COMMUNITY_DESCRIPTION || 'Die lokale Entwicklungsumgebung von Gradido.', + COMMUNITY_NAME: process.env.COMMUNITY_NAME || 'Gradido Entwicklung', + COMMUNITY_URL: process.env.COMMUNITY_URL || 'http://localhost/', + COMMUNITY_REGISTER_URL: process.env.COMMUNITY_REGISTER_URL || 'http://localhost/register', + COMMUNITY_REDEEM_URL: process.env.COMMUNITY_REDEEM_URL || 'http://localhost/redeem/{code}', + COMMUNITY_REDEEM_CONTRIBUTION_URL: + process.env.COMMUNITY_REDEEM_CONTRIBUTION_URL || 'http://localhost/redeem/CL-{code}', + COMMUNITY_DESCRIPTION: + process.env.COMMUNITY_DESCRIPTION || 'Die lokale Entwicklungsumgebung von Gradido.', } - -const eventProtocol = { +*/ +// const eventProtocol = { // global switch to enable writing of EventProtocol-Entries - EVENT_PROTOCOL_DISABLED: process.env.EVENT_PROTOCOL_DISABLED === 'true' || false, -} + // EVENT_PROTOCOL_DISABLED: process.env.EVENT_PROTOCOL_DISABLED === 'true' || false, +// } // This is needed by graphql-directive-auth -process.env.APP_SECRET = server.JWT_SECRET +// process.env.APP_SECRET = server.JWT_SECRET // Check config version constants.CONFIG_VERSION.CURRENT = process.env.CONFIG_VERSION || constants.CONFIG_VERSION.DEFAULT @@ -74,7 +73,7 @@ if ( const federation = { // FEDERATION_DHT_TOPIC: process.env.FEDERATION_DHT_TOPIC || null, - FEDERATION_DHT_SEED: process.env.FEDERATION_DHT_SEED || null, + // FEDERATION_DHT_SEED: process.env.FEDERATION_DHT_SEED || null, FEDERATION_PORT: process.env.FEDERATION_PORT || 5000, FEDERATION_API: process.env.FEDERATION_API || '1_0', FEDERATION_COMMUNITY_URL: process.env.FEDERATION_COMMUNITY_URL || null, @@ -84,7 +83,7 @@ const CONFIG = { ...constants, ...server, ...database, - ...community, + //...community, //...eventProtocol, ...federation, } diff --git a/federation/src/graphql/api/0_1/resolver/TestResolver.ts b/federation/src/graphql/api/0_1/resolver/TestResolver.ts deleted file mode 100644 index 75a8a192e..000000000 --- a/federation/src/graphql/api/0_1/resolver/TestResolver.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Field, ObjectType, Query, Resolver } from 'type-graphql' -import { federationLogger as logger } from '@/server/logger' - -@ObjectType() -class GetTestApiResult { - constructor(apiVersion: string) { - this.api = `${apiVersion}` - } - - @Field(() => String) - api: string -} - -@Resolver() -export class TestResolver { - @Query(() => GetTestApiResult) - async test(): Promise { - logger.info(`test api 0_1`) - return new GetTestApiResult("0_1") - } -} - diff --git a/federation/src/graphql/arg/SearchUsersFilters.ts b/federation/src/graphql/arg/SearchUsersFilters.ts deleted file mode 100644 index dc19d456c..000000000 --- a/federation/src/graphql/arg/SearchUsersFilters.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Field, InputType } from 'type-graphql' - -@InputType() -export default class SearchUsersFilters { - @Field(() => Boolean, { nullable: true, defaultValue: null }) - byActivated: boolean - - @Field(() => Boolean, { nullable: true, defaultValue: null }) - byDeleted: boolean -} diff --git a/federation/src/graphql/directive/isAuthorized.ts b/federation/src/graphql/directive/isAuthorized.ts deleted file mode 100644 index c24cde47a..000000000 --- a/federation/src/graphql/directive/isAuthorized.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ - -import { AuthChecker } from 'type-graphql' - -import { decode, encode } from '@/auth/JWT' -import { ROLE_UNAUTHORIZED, ROLE_USER, ROLE_ADMIN } from '@/auth/ROLES' -import { RIGHTS } from '@/auth/RIGHTS' -import { getCustomRepository } from '@dbTools/typeorm' -import { UserRepository } from '@repository/User' -import { INALIENABLE_RIGHTS } from '@/auth/INALIENABLE_RIGHTS' - -const isAuthorized: AuthChecker = async ({ context }, rights) => { - context.role = ROLE_UNAUTHORIZED // unauthorized user - - // is rights an inalienable right? - if ((rights).reduce((acc, right) => acc && INALIENABLE_RIGHTS.includes(right), true)) - return true - - // Do we have a token? - if (!context.token) { - throw new Error('401 Unauthorized') - } - - // Decode the token - const decoded = decode(context.token) - if (!decoded) { - throw new Error('403.13 - Client certificate revoked') - } - // Set context pubKey - context.pubKey = Buffer.from(decoded.pubKey).toString('hex') - - // TODO - load from database dynamically & admin - maybe encode this in the token to prevent many database requests - // TODO this implementation is bullshit - two database queries cause our user identifiers are not aligned and vary between email, id and pubKey - const userRepository = getCustomRepository(UserRepository) - try { - const user = await userRepository.findByPubkeyHex(context.pubKey) - context.user = user - context.role = user.isAdmin ? ROLE_ADMIN : ROLE_USER - } catch { - // in case the database query fails (user deleted) - throw new Error('401 Unauthorized') - } - - // check for correct rights - const missingRights = (rights).filter((right) => !context.role.hasRight(right)) - if (missingRights.length !== 0) { - throw new Error('401 Unauthorized') - } - - // set new header token - context.setHeaders.push({ key: 'token', value: encode(decoded.pubKey) }) - return true -} - -export default isAuthorized diff --git a/federation/src/graphql/schema.ts b/federation/src/graphql/schema.ts index 264eb14c1..92977882b 100644 --- a/federation/src/graphql/schema.ts +++ b/federation/src/graphql/schema.ts @@ -1,7 +1,7 @@ import { GraphQLSchema } from 'graphql' import { buildSchema } from 'type-graphql' -import isAuthorized from './directive/isAuthorized' +// import isAuthorized from './directive/isAuthorized' import DecimalScalar from './scalar/Decimal' import Decimal from 'decimal.js-light' import { getApiResolvers } from './api/schema' @@ -9,7 +9,7 @@ import { getApiResolvers } from './api/schema' const schema = async (): Promise => { return await buildSchema({ resolvers: [getApiResolvers()], - authChecker: isAuthorized, + // authChecker: isAuthorized, scalarsMap: [{ type: Decimal, scalar: DecimalScalar }], }) } diff --git a/federation/src/server/createServer.ts b/federation/src/server/createServer.ts index 5202bed67..a47b6da7f 100644 --- a/federation/src/server/createServer.ts +++ b/federation/src/server/createServer.ts @@ -10,7 +10,7 @@ import { checkDBVersion } from '@/typeorm/DBVersion' // server import cors from './cors' // import serverContext from './context' -// import plugins from './plugins' +import plugins from './plugins' // config import CONFIG from '@/config' @@ -26,7 +26,7 @@ import { apolloLogger } from './logger' import { Logger } from 'log4js' // i18n -import { i18n } from './localization' +// import { i18n } from './localization' // TODO implement // import queryComplexity, { simpleEstimator, fieldConfigEstimator } from "graphql-query-complexity"; @@ -37,7 +37,7 @@ const createServer = async ( // eslint-disable-next-line @typescript-eslint/no-explicit-any // context: any = serverContext, logger: Logger = apolloLogger, - localization: i18n.I18n = i18n, + // localization: i18n.I18n = i18n, ): Promise => { logger.addContext('user', 'unknown') logger.debug('createServer...') @@ -68,7 +68,7 @@ const createServer = async ( app.use(express.urlencoded({ extended: true })) // i18n - app.use(localization.init) + // app.use(localization.init) // Elopage Webhook // app.post('/hook/elopage/' + CONFIG.WEBHOOK_ELOPAGE_SECRET, elopageWebhook) @@ -79,7 +79,7 @@ const createServer = async ( // playground: CONFIG.GRAPHIQL, // introspection: CONFIG.GRAPHIQL, // context, - // plugins, + plugins, logger, }) apollo.applyMiddleware({ app, path: '/' }) diff --git a/federation/src/server/localization.ts b/federation/src/server/localization.ts deleted file mode 100644 index ac17c3a6f..000000000 --- a/federation/src/server/localization.ts +++ /dev/null @@ -1,28 +0,0 @@ -import path from 'path' -import { federationLogger as logger } from './logger' -import i18n from 'i18n' - -i18n.configure({ - locales: ['en', 'de'], - defaultLocale: 'en', - retryInDefaultLocale: false, - directory: path.join(__dirname, '..', 'locales'), - // autoReload: true, // if this is activated the seeding hangs at the very end - updateFiles: false, - objectNotation: true, - logDebugFn: (msg) => logger.debug(msg), - logWarnFn: (msg) => logger.info(msg), - logErrorFn: (msg) => logger.error(msg), - // this api is needed for email-template pug files - api: { - __: 't', // now req.__ becomes req.t - __n: 'tn', // and req.__n can be called as req.tn - }, - register: global, - mustacheConfig: { - tags: ['{', '}'], - disable: false, - }, -}) - -export { i18n } diff --git a/federation/src/typeorm/repository/User.ts b/federation/src/typeorm/repository/User.ts deleted file mode 100644 index c20ef85ff..000000000 --- a/federation/src/typeorm/repository/User.ts +++ /dev/null @@ -1,67 +0,0 @@ -import SearchUsersFilters from '@/graphql/arg/SearchUsersFilters' -import { Brackets, EntityRepository, IsNull, Not, Repository } from '@dbTools/typeorm' -import { User as DbUser } from '@entity/User' - -@EntityRepository(DbUser) -export class UserRepository extends Repository { - async findByPubkeyHex(pubkeyHex: string): Promise { - const dbUser = await this.createQueryBuilder('user') - .leftJoinAndSelect('user.emailContact', 'emailContact') - .where('hex(user.pubKey) = :pubkeyHex', { pubkeyHex }) - .getOneOrFail() - /* - const dbUser = await this.findOneOrFail(`hex(user.pubKey) = { pubkeyHex }`) - const emailContact = await this.query( - `SELECT * from user_contacts where id = { dbUser.emailId }`, - ) - dbUser.emailContact = emailContact - */ - return dbUser - } - - async findBySearchCriteriaPagedFiltered( - select: string[], - searchCriteria: string, - filters: SearchUsersFilters, - currentPage: number, - pageSize: number, - ): Promise<[DbUser[], number]> { - const query = this.createQueryBuilder('user') - .select(select) - .withDeleted() - .leftJoinAndSelect('user.emailContact', 'emailContact') - .where( - new Brackets((qb) => { - qb.where( - 'user.firstName like :name or user.lastName like :lastName or emailContact.email like :email', - { - name: `%${searchCriteria}%`, - lastName: `%${searchCriteria}%`, - email: `%${searchCriteria}%`, - }, - ) - }), - ) - /* - filterCriteria.forEach((filter) => { - query.andWhere(filter) - }) - */ - if (filters) { - if (filters.byActivated !== null) { - query.andWhere('emailContact.emailChecked = :value', { value: filters.byActivated }) - // filterCriteria.push({ 'emailContact.emailChecked': filters.byActivated }) - } - - if (filters.byDeleted !== null) { - // filterCriteria.push({ deletedAt: filters.byDeleted ? Not(IsNull()) : IsNull() }) - query.andWhere({ deletedAt: filters.byDeleted ? Not(IsNull()) : IsNull() }) - } - } - - return query - .take(pageSize) - .skip((currentPage - 1) * pageSize) - .getManyAndCount() - } -}