import _ from 'lodash'; import { Op } from 'sequelize'; import type { FindOptions, Attributes, Order, WhereOptions } from 'sequelize/types'; import { Meta } from '@nextgenleads/dnc'; /** Parse query params in GRPC request into sequelize friendly options */ export function parseGRPCQuery(params: Partial): FindOptions> { const result: FindOptions> = {}; if (params.omit) { _.set(result, 'attributes.exclude', params.omit); } if (params.pluck) { _.set(result, 'attributes.include', params.pluck); } if (params.sort) { const sort = params.sort.properties.map((s) => [ s.property, s.sort === Meta.Query_Sort_Sort.SORT_DESCENDING ? 'DESC' : 'ASC', ]) as Order; result.order = sort; _.set(result, 'attributes.sort', sort); } if (!params.pagination && params.limit) { result.limit = params.limit; } if (!params.pagination && params.skip) { result.offset = params.skip; } if (params.filter && Array.isArray(params.filter.filters) && params.filter.filters.length > 0) { const where = result.where || ({} as WhereOptions); params.filter.filters.forEach((filter) => { const dFilter = Meta.decodeQueryFilterFilterProperty(filter); if (dFilter.operator) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const value = { [Op[dFilter.operator as never]]: dFilter.value }; _.set(where, dFilter.key, value); } else { _.set(where, dFilter.key, dFilter.value); } }); result.where = where; } return result; }