From eaa1f1fa74b13559bde8c0a24e82be791e814691 Mon Sep 17 00:00:00 2001 From: Nevil Date: Wed, 27 Dec 2023 18:08:42 +0530 Subject: [PATCH 1/3] optimized queries in entity-type --- src/controllers/v1/entity-type.js | 4 +- src/controllers/v1/questionsSet.js | 2 +- src/database/queries/entityType.js | 71 +++++++++++++++--------------- src/services/entity-type.js | 22 ++++++--- src/services/mentees.js | 5 ++- src/services/mentors.js | 18 ++++---- src/services/questionsSet.js | 7 ++- 7 files changed, 72 insertions(+), 57 deletions(-) diff --git a/src/controllers/v1/entity-type.js b/src/controllers/v1/entity-type.js index d84653f30..15e2d136b 100644 --- a/src/controllers/v1/entity-type.js +++ b/src/controllers/v1/entity-type.js @@ -23,7 +23,7 @@ module.exports = class Entity { * @method * @name update * @param {Object} req - request data. - * @returns {JSON} - entities updation response. + * @returns {JSON} - entities updating response. */ async update(req) { @@ -72,7 +72,7 @@ module.exports = class Entity { async delete(req) { try { - return await entityTypeService.delete(req.params.id) + return await entityTypeService.delete(req.params.id, req.decodedToken.organization_id) } catch (error) { return error } diff --git a/src/controllers/v1/questionsSet.js b/src/controllers/v1/questionsSet.js index e612a8bd9..8602b6308 100644 --- a/src/controllers/v1/questionsSet.js +++ b/src/controllers/v1/questionsSet.js @@ -72,7 +72,7 @@ module.exports = class QuestionsSet { async read(req) { try { - const questionsSetData = await questionsService.read(req.params.id) + const questionsSetData = await questionsService.read(req.params.id, req.body.code) return questionsSetData } catch (error) { return error diff --git a/src/database/queries/entityType.js b/src/database/queries/entityType.js index b320a7a30..bb809c120 100644 --- a/src/database/queries/entityType.js +++ b/src/database/queries/entityType.js @@ -1,7 +1,7 @@ const EntityType = require('../models/index').EntityType const Entity = require('../models/index').Entity const { Op } = require('sequelize') -//const Sequelize = require('../database/models/index').sequelize +//const Sequelize = require('../models/index').sequelize module.exports = class UserEntityData { static async createEntityType(data) { @@ -28,14 +28,7 @@ module.exports = class UserEntityData { try { const entityData = await EntityType.findAll({ where: { - [Op.or]: [ - { - created_by: 0, - }, - { - organization_id: orgId, - }, - ], + organization_id: orgId, ...filter, }, attributes, @@ -50,21 +43,24 @@ module.exports = class UserEntityData { try { const entityTypes = await EntityType.findAll({ where: filter, + raw: true, }) - const result = await Promise.all( - entityTypes.map(async (entityType) => { - const entities = await Entity.findAll({ - where: { entity_type_id: entityType.id }, - //attributes: { exclude: ['entity_type_id'] }, - }) + const entityTypeIds = entityTypes.map((entityType) => entityType.id) - return { - ...entityType.toJSON(), - entities: entities.map((entity) => entity.toJSON()), - } - }) - ) + const entities = await Entity.findAll({ + where: { entity_type_id: entityTypeIds, status: 'ACTIVE' }, + raw: true, + //attributes: { exclude: ['entity_type_id'] }, + }) + + const result = entityTypes.map((entityType) => { + const matchingEntities = entities.filter((entity) => entity.entity_type_id === entityType.id) + return { + ...entityType, + entities: matchingEntities, + } + }) return result } catch (error) { @@ -99,11 +95,12 @@ module.exports = class UserEntityData { } } */ - static async updateOneEntityType(id, update, options = {}) { + static async updateOneEntityType(id, organizationId, update, options = {}) { try { return await EntityType.update(update, { where: { id: id, + organization_id: organizationId, }, ...options, }) @@ -112,11 +109,12 @@ module.exports = class UserEntityData { } } - static async deleteOneEntityType(id) { + static async deleteOneEntityType(id, organizationId) { try { return await EntityType.destroy({ where: { id: id, + organization_id: organizationId, }, individualHooks: true, }) @@ -137,22 +135,25 @@ module.exports = class UserEntityData { try { const entityTypes = await EntityType.findAll({ where: filter, + raw: true, }) - const result = await Promise.all( - entityTypes.map(async (entityType) => { - const entities = await Entity.findAll({ - where: { entity_type_id: entityType.id, status: 'ACTIVE' }, - //attributes: { exclude: ['entity_type_id'] }, - }) + const entityTypeIds = entityTypes.map((entityType) => entityType.id) - return { - ...entityType.toJSON(), - entities: entities.map((entity) => entity.toJSON()), - } - }) - ) + // Fetch all matching entities using the IDs + const entities = await Entity.findAll({ + where: { entity_type_id: entityTypeIds, status: 'ACTIVE' }, + raw: true, + //attributes: { exclude: ['entity_type_id'] }, + }) + const result = entityTypes.map((entityType) => { + const matchingEntities = entities.filter((entity) => entity.entity_type_id === entityType.id) + return { + ...entityType, + entities: matchingEntities, + } + }) return result } catch (error) { return error diff --git a/src/services/entity-type.js b/src/services/entity-type.js index 2dabcee6a..c30c6b6bb 100644 --- a/src/services/entity-type.js +++ b/src/services/entity-type.js @@ -55,12 +55,12 @@ module.exports = class EntityHelper { bodyData.updated_by = loggedInUserId bodyData.organization_id = orgId try { - const [updateCount, updatedEntityType] = await entityTypeQueries.updateOneEntityType(id, bodyData, { + const [updateCount, updatedEntityType] = await entityTypeQueries.updateOneEntityType(id, orgId, bodyData, { returning: true, raw: true, }) - if (updateCount === '0') { + if (updateCount === 0) { return common.failureResponse({ message: 'ENTITY_TYPE_NOT_FOUND', statusCode: httpStatusCode.bad_request, @@ -76,7 +76,7 @@ module.exports = class EntityHelper { } catch (error) { if (error instanceof UniqueConstraintError) { return common.failureResponse({ - message: 'ENTITY_TYPE_ALREADY_DELETED', + message: 'ENTITY_TYPE_ALREADY_EXISTS', statusCode: httpStatusCode.bad_request, responseCode: 'CLIENT_ERROR', }) @@ -89,7 +89,15 @@ module.exports = class EntityHelper { try { const attributes = ['value', 'label', 'id'] - const entities = await entityTypeQueries.findAllEntityTypes(organization_id, attributes) + const defaultOrgId = await getDefaultOrgId() + if (!defaultOrgId) + return common.failureResponse({ + message: 'DEFAULT_ORG_ID_NOT_SET', + statusCode: httpStatusCode.bad_request, + responseCode: 'CLIENT_ERROR', + }) + + const entities = await entityTypeQueries.findAllEntityTypes([organization_id, defaultOrgId], attributes) if (!entities.length) { return common.failureResponse({ @@ -146,10 +154,10 @@ module.exports = class EntityHelper { * @returns {JSON} - Entity deleted response. */ - static async delete(id) { + static async delete(id, organizationId) { try { - const deleteCount = await entityTypeQueries.deleteOneEntityType(id) - if (deleteCount === '0') { + const deleteCount = await entityTypeQueries.deleteOneEntityType(id, organizationId) + if (deleteCount === 0) { return common.failureResponse({ message: 'ENTITY_TYPE_NOT_FOUND', statusCode: httpStatusCode.bad_request, diff --git a/src/services/mentees.js b/src/services/mentees.js index 5ef44856a..4b170d7ce 100644 --- a/src/services/mentees.js +++ b/src/services/mentees.js @@ -322,11 +322,12 @@ module.exports = class MenteesHelper { let validationData = await entityTypeQueries.findAllEntityTypesAndEntities({ status: 'ACTIVE', + allow_filtering: true, }) - let filteredQuery = utils.validateFilters(query, JSON.parse(JSON.stringify(validationData)), 'MentorExtension') + let filteredQuery = utils.validateFilters(query, validationData, sessionQueries.getModelName()) - // Create saas fiter for view query + // Create saas filter for view query const saasFilter = await this.filterSessionsBasedOnSaasPolicy(userId, isAMentor) const sessions = await sessionQueries.getUpcomingSessionsFromView( diff --git a/src/services/mentors.js b/src/services/mentors.js index 04b8b0d08..42576c77c 100644 --- a/src/services/mentors.js +++ b/src/services/mentors.js @@ -32,13 +32,6 @@ module.exports = class MentorsHelper { */ static async upcomingSessions(id, page, limit, search = '', menteeUserId, queryParams, isAMentor) { try { - const query = utils.processQueryParametersWithExclusions(queryParams) - console.log(query) - let validationData = await entityTypeQueries.findAllEntityTypesAndEntities({ - status: 'ACTIVE', - }) - const filteredQuery = utils.validateFilters(query, JSON.parse(JSON.stringify(validationData)), 'sessions') - const mentorsDetails = await mentorQueries.getMentorExtension(id) if (!mentorsDetails) { return common.failureResponse({ @@ -48,6 +41,14 @@ module.exports = class MentorsHelper { }) } + const query = utils.processQueryParametersWithExclusions(queryParams) + + let validationData = await entityTypeQueries.findAllEntityTypesAndEntities({ + status: 'ACTIVE', + allow_filtering: true, + }) + const filteredQuery = utils.validateFilters(query, validationData, await sessionQueries.getModelName()) + // Filter upcoming sessions based on saas policy const saasFilter = await menteesService.filterSessionsBasedOnSaasPolicy(menteeUserId, isAMentor) @@ -686,9 +687,10 @@ module.exports = class MentorsHelper { let validationData = await entityTypeQueries.findAllEntityTypesAndEntities({ status: 'ACTIVE', + allow_filtering: true, }) - const filteredQuery = utils.validateFilters(query, JSON.parse(JSON.stringify(validationData)), 'Session') + const filteredQuery = utils.validateFilters(query, validationData, 'MentorExtension') const userType = common.MENTOR_ROLE const saasFilter = await this.filterMentorListBasedOnSaasPolicy(userId, isAMentor) diff --git a/src/services/questionsSet.js b/src/services/questionsSet.js index e3b295a78..773f05169 100644 --- a/src/services/questionsSet.js +++ b/src/services/questionsSet.js @@ -107,11 +107,14 @@ module.exports = class questionsSetHelper { * @returns {JSON} - Read question set. */ - static async read(questionsSetId) { + static async read(questionsSetId, questionSetCode) { try { - const filter = { + let filter = { id: questionsSetId, } + if (questionSetCode) { + filter.code = questionSetCode + } const questionSet = await questionsSetQueries.findOneQuestionsSet(filter) if (!questionSet) { return common.failureResponse({ From 39bc3074414db2befa91e9d92ff2385da3ef041e Mon Sep 17 00:00:00 2001 From: Nevil Date: Thu, 28 Dec 2023 10:31:01 +0530 Subject: [PATCH 2/3] renamed function params --- src/database/queries/entityType.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/database/queries/entityType.js b/src/database/queries/entityType.js index bb809c120..f253b65e7 100644 --- a/src/database/queries/entityType.js +++ b/src/database/queries/entityType.js @@ -24,11 +24,11 @@ module.exports = class UserEntityData { } } - static async findAllEntityTypes(orgId, attributes, filter = {}) { + static async findAllEntityTypes(orgIds, attributes, filter = {}) { try { const entityData = await EntityType.findAll({ where: { - organization_id: orgId, + organization_id: orgIds, ...filter, }, attributes, From 00f7c3b7bffb21cffc27189744cd89fd140c56cc Mon Sep 17 00:00:00 2001 From: Nevil Date: Thu, 28 Dec 2023 11:55:36 +0530 Subject: [PATCH 3/3] updated variable names --- src/database/queries/entityType.js | 4 ++-- src/services/entity-type.js | 4 ++-- src/services/questionsSet.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/database/queries/entityType.js b/src/database/queries/entityType.js index f253b65e7..7ca041e61 100644 --- a/src/database/queries/entityType.js +++ b/src/database/queries/entityType.js @@ -95,12 +95,12 @@ module.exports = class UserEntityData { } } */ - static async updateOneEntityType(id, organizationId, update, options = {}) { + static async updateOneEntityType(id, orgId, update, options = {}) { try { return await EntityType.update(update, { where: { id: id, - organization_id: organizationId, + organization_id: orgId, }, ...options, }) diff --git a/src/services/entity-type.js b/src/services/entity-type.js index c30c6b6bb..6e506ada8 100644 --- a/src/services/entity-type.js +++ b/src/services/entity-type.js @@ -85,7 +85,7 @@ module.exports = class EntityHelper { } } - static async readAllSystemEntityTypes(organization_id) { + static async readAllSystemEntityTypes(orgId) { try { const attributes = ['value', 'label', 'id'] @@ -97,7 +97,7 @@ module.exports = class EntityHelper { responseCode: 'CLIENT_ERROR', }) - const entities = await entityTypeQueries.findAllEntityTypes([organization_id, defaultOrgId], attributes) + const entities = await entityTypeQueries.findAllEntityTypes([orgId, defaultOrgId], attributes) if (!entities.length) { return common.failureResponse({ diff --git a/src/services/questionsSet.js b/src/services/questionsSet.js index 2e3224be9..889cba3f5 100644 --- a/src/services/questionsSet.js +++ b/src/services/questionsSet.js @@ -109,7 +109,7 @@ module.exports = class questionsSetHelper { static async read(questionsSetId, questionSetCode) { try { - let filter = { + const filter = { id: questionsSetId, } if (questionSetCode) {