UNPKG

nexorm

Version:

A powerful TypeScript ORM with advanced features.

155 lines (154 loc) 6.26 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.distinct = distinct; const sequelize_1 = require("sequelize"); const errorHandler_1 = __importDefault(require("../errorHandler")); const errorParser_1 = require("../util/errorParser"); const lodash_1 = __importDefault(require("lodash")); async function distinct(model, field, filter, options, cacheManager, config) { if (!field || field.length == 0) throw new errorHandler_1.default("No field provided.", "#FF0000"); var filterOptions = {}; if (!filter) filter = {}; if (!options) options = {}; var cacheKey = `$distinct:${typeof options.$cache === 'object' ? options.$cache.$key : model.name}:${JSON.stringify(filter)}:${JSON.stringify(field)}:${JSON.stringify(options)}`; if (options.$cache && cacheManager?.$has(cacheKey)) { const result = cacheManager?.$get(cacheKey); return result; } ; if (options.$limit) { if (typeof options.$limit !== 'number') throw new errorHandler_1.default("Invalid value for $limit. Must be a number.", "#FF0000"); if (options.$limit < 1) throw new errorHandler_1.default("Invalid value for $limit. Must be greater than 0.", "#FF0000"); filterOptions.limit = options.$limit; } ; if (options.$sort) { if (typeof options.$sort !== 'object') throw new errorHandler_1.default("Invalid value for $sort. Must be an object.", "#FF0000"); Object.keys(options.$sort).forEach((key) => { if (!options.$sort) return; options.$sort[key] = options.$sort[key] == -1 || options.$sort[key] == false ? 'DESC' : 'ASC'; }); filterOptions.order = Object.entries(options.$sort).map(([key, value]) => [key, value]); } ; /* if (options.$include) { filterOptions.include = options.$include.map((include) => { return { model: include.$model, attributes: include.$attributes as any, as: include.$as || undefined } }); }; */ if (options.$having) { filterOptions.having = options.$having; } ; if (options.$raw) { if (typeof options.$raw !== 'boolean') throw new errorHandler_1.default("Invalid value for $raw. Must be a boolean.", "#FF0000"); filterOptions.raw = options.$raw || false; } ; if (options.$subQuery) { if (typeof options.$subQuery !== 'boolean') throw new errorHandler_1.default("Invalid value for $paginate. Must be a boolean.", "#FF0000"); filterOptions.subQuery = options.$subQuery || false; } ; if (options.$attributes) { var type = typeof options.$attributes; if (lodash_1.default.isArray(options.$attributes) && options.$attributes instanceof Array) { filterOptions.attributes = options.$attributes; } else if (type == 'object' && options.$attributes instanceof Object) { filterOptions.attributes = { exclude: options.$attributes?.$exclude || [], include: options.$attributes?.$include || [] }; } } ; if (options.$group) { if (!lodash_1.default.isArray(options.$group)) throw new errorHandler_1.default("Invalid value for $group. Must be a string.", "#FF0000"); filterOptions.group = options.$group; } ; if (options.$skipLocked) { if (typeof options.$skipLocked !== 'boolean') throw new errorHandler_1.default("Invalid value for $skipLocked. Must be a boolean.", "#FF0000"); filterOptions.skipLocked = options.$skipLocked; } ; if (options.$useMaster) { if (typeof options.$useMaster !== 'boolean') throw new errorHandler_1.default("Invalid value for $useMaster. Must be a boolean.", "#FF0000"); filterOptions.useMaster = options.$useMaster; } ; if (options.$plain) { if (typeof options.$plain !== 'boolean') throw new errorHandler_1.default("Invalid value for $plain. Must be a boolean.", "#FF0000"); filterOptions.plain = options.$plain; } ; if (options.$paranoid) { if (typeof options.$paranoid !== 'boolean') throw new errorHandler_1.default("Invalid value for $paranoid. Must be a boolean.", "#FF0000"); filterOptions.paranoid = options.$paranoid; } ; if (options.$subQuery) { if (typeof options.$subQuery !== 'boolean') throw new errorHandler_1.default("Invalid value for $subQuery. Must be a boolean.", "#FF0000"); filterOptions.subQuery = options.$subQuery; } ; if (options.$logging) { if (!["function", "boolean"].some((types) => types == typeof options.$logging)) throw new errorHandler_1.default("Invalid value for $logging. Must be a Function, Boolean or String.", "#FF0000"); filterOptions.logging = options.$logging; } ; if (options.$lock) { filterOptions.lock = typeof options.$lock == 'boolean' ? options.$lock : { level: options.$lock.$level == 'key_share' ? sequelize_1.LOCK.KEY_SHARE : sequelize_1.LOCK.UPDATE, of: options.$lock.$of }; } ; try { const result = await model.findAll({ where: filter, ...filterOptions, attributes: [...field], transaction: options?.$transaction?.trx, nest: true, benchmark: true, }); if (options.$cache) { cacheManager?.$set(cacheKey, result?.map((item) => { return field.map((x) => item.dataValues[x]); }), typeof options.$cache === 'object' ? options.$cache.$ttl : config?.$cache?.$duration || 60 * 1000); } ; return result ? { ...result.map((x) => { return field.map((y) => x.dataValues[y]); }) } : null; } catch (error) { throw (0, errorParser_1.errorParser)(error); } ; } ;