@things-factory/shell 9.0.0-beta.71 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist-server/graphql-local-client.js +4 -1
  2. package/dist-server/graphql-local-client.js.map +1 -1
  3. package/dist-server/initializers/database.js +8 -2
  4. package/dist-server/initializers/database.js.map +1 -1
  5. package/dist-server/middlewares/index.js +2 -2
  6. package/dist-server/middlewares/index.js.map +1 -1
  7. package/dist-server/migrations/1000000000000-SeedDomain.js +3 -1
  8. package/dist-server/migrations/1000000000000-SeedDomain.js.map +1 -1
  9. package/dist-server/pubsub-log-transport.js +4 -1
  10. package/dist-server/pubsub-log-transport.js.map +1 -1
  11. package/dist-server/pubsub.js +7 -3
  12. package/dist-server/pubsub.js.map +1 -1
  13. package/dist-server/schema.js +24 -5
  14. package/dist-server/schema.js.map +1 -1
  15. package/dist-server/server-dev.js +5 -3
  16. package/dist-server/server-dev.js.map +1 -1
  17. package/dist-server/server.js +5 -3
  18. package/dist-server/server.js.map +1 -1
  19. package/dist-server/service/attribute-set/attribute-set-item-type.d.ts +2 -2
  20. package/dist-server/service/attribute-set/attribute-set-item-type.js +37 -23
  21. package/dist-server/service/attribute-set/attribute-set-item-type.js.map +1 -1
  22. package/dist-server/service/attribute-set/attribute-set-mutation.js +43 -19
  23. package/dist-server/service/attribute-set/attribute-set-mutation.js.map +1 -1
  24. package/dist-server/service/attribute-set/attribute-set-query.js +13 -5
  25. package/dist-server/service/attribute-set/attribute-set-query.js.map +1 -1
  26. package/dist-server/service/attribute-set/attribute-set-type.js +22 -14
  27. package/dist-server/service/attribute-set/attribute-set-type.js.map +1 -1
  28. package/dist-server/service/attribute-set/attribute-set.js +12 -7
  29. package/dist-server/service/attribute-set/attribute-set.js.map +1 -1
  30. package/dist-server/service/common-types/index.js +2 -0
  31. package/dist-server/service/common-types/index.js.map +1 -1
  32. package/dist-server/service/common-types/list-param.js +17 -16
  33. package/dist-server/service/common-types/list-param.js.map +1 -1
  34. package/dist-server/service/common-types/log.js +5 -5
  35. package/dist-server/service/common-types/log.js.map +1 -1
  36. package/dist-server/service/common-types/object-ref.js +6 -4
  37. package/dist-server/service/common-types/object-ref.js.map +1 -1
  38. package/dist-server/service/common-types/scalar-any.js +1 -1
  39. package/dist-server/service/common-types/scalar-any.js.map +1 -1
  40. package/dist-server/service/common-types/scalar-date.js +1 -1
  41. package/dist-server/service/common-types/scalar-date.js.map +1 -1
  42. package/dist-server/service/common-types/scalar-object.js +1 -1
  43. package/dist-server/service/common-types/scalar-object.js.map +1 -1
  44. package/dist-server/service/directive-transaction/transaction.js +5 -3
  45. package/dist-server/service/directive-transaction/transaction.js.map +1 -1
  46. package/dist-server/service/domain/domain-mutation.js +22 -9
  47. package/dist-server/service/domain/domain-mutation.js.map +1 -1
  48. package/dist-server/service/domain/domain-query.js +14 -5
  49. package/dist-server/service/domain/domain-query.js.map +1 -1
  50. package/dist-server/service/domain/domain-types.js +30 -19
  51. package/dist-server/service/domain/domain-types.js.map +1 -1
  52. package/dist-server/service/domain/domain.js +28 -20
  53. package/dist-server/service/domain/domain.js.map +1 -1
  54. package/dist-server/service/subscription-data/data-resolver.js +5 -5
  55. package/dist-server/service/subscription-data/data-resolver.js.map +1 -1
  56. package/dist-server/service/subscription-data/data-types.js +9 -4
  57. package/dist-server/service/subscription-data/data-types.js.map +1 -1
  58. package/dist-server/service/subscription-data/index.js +3 -0
  59. package/dist-server/service/subscription-data/index.js.map +1 -1
  60. package/dist-server/tsconfig.tsbuildinfo +1 -1
  61. package/dist-server/utils/get-domain.js +6 -8
  62. package/dist-server/utils/get-domain.js.map +1 -1
  63. package/dist-server/utils/get-query-builder-from-list-params.js +4 -5
  64. package/dist-server/utils/get-query-builder-from-list-params.js.map +1 -1
  65. package/dist-server/utils/get-times-for-period.js +2 -2
  66. package/dist-server/utils/get-times-for-period.js.map +1 -1
  67. package/dist-server/utils/list-params-converter.js +9 -6
  68. package/dist-server/utils/list-params-converter.js.map +1 -1
  69. package/dist-server/utils/list-query-builder.js +8 -9
  70. package/dist-server/utils/list-query-builder.js.map +1 -1
  71. package/package.json +12 -12
@@ -59,16 +59,15 @@ function getUrlFromContext(context, path = '') {
59
59
  * @returns {string} The extracted subdomain.
60
60
  */
61
61
  function getSubdomainFromPath(context) {
62
- var _a, _b;
63
62
  var { path } = context;
64
- var subdomain = (_a = (0, utils_1.getPathInfo)(path || '', domainTypes)) === null || _a === void 0 ? void 0 : _a.subdomain;
63
+ var subdomain = (0, utils_1.getPathInfo)(path || '', domainTypes)?.subdomain;
65
64
  if (subdomain) {
66
65
  return subdomain;
67
66
  }
68
67
  var { header: { referer } } = context;
69
68
  if (referer) {
70
69
  var { pathname } = new url_1.URL(referer);
71
- return (_b = (0, utils_1.getPathInfo)(pathname || '', domainTypes)) === null || _b === void 0 ? void 0 : _b.subdomain;
70
+ return (0, utils_1.getPathInfo)(pathname || '', domainTypes)?.subdomain;
72
71
  }
73
72
  }
74
73
  /**
@@ -78,16 +77,15 @@ function getSubdomainFromPath(context) {
78
77
  * @returns The subdomain type if found, otherwise undefined.
79
78
  */
80
79
  function getSubdomainTypeFromPath(context) {
81
- var _a, _b;
82
80
  var { path } = context;
83
- var prefix = (_a = (0, utils_1.getPathInfo)(path || '', domainTypes)) === null || _a === void 0 ? void 0 : _a.prefix;
81
+ var prefix = (0, utils_1.getPathInfo)(path || '', domainTypes)?.prefix;
84
82
  if (prefix) {
85
83
  return prefix;
86
84
  }
87
85
  var { header: { referer } } = context;
88
86
  if (referer) {
89
87
  var { pathname } = new url_1.URL(referer);
90
- return (_b = (0, utils_1.getPathInfo)(pathname || '', domainTypes)) === null || _b === void 0 ? void 0 : _b.prefix;
88
+ return (0, utils_1.getPathInfo)(pathname || '', domainTypes)?.prefix;
91
89
  }
92
90
  }
93
91
  /**
@@ -133,8 +131,8 @@ async function getDomainFromURL(context) {
133
131
  * @returns {string} The generated context path.
134
132
  */
135
133
  function getContextPath(domain) {
136
- const type = (domain === null || domain === void 0 ? void 0 : domain.extType) || 'domain';
137
- return fixed || !domain ? '' : `${type}/${domain === null || domain === void 0 ? void 0 : domain.subdomain}/`;
134
+ const type = domain?.extType || 'domain';
135
+ return fixed || !domain ? '' : `${type}/${domain?.subdomain}/`;
138
136
  }
139
137
  /**
140
138
  * Generates a redirection path considering the subdomain.
@@ -1 +1 @@
1
- {"version":3,"file":"get-domain.js","sourceRoot":"","sources":["../../server/utils/get-domain.ts"],"names":[],"mappings":";;AA0BA,8CA+BC;AAsED,4CAoBC;AAQD,wCAGC;AAUD,4DAqBC;AASD,sDAUC;AAOD,kEAEC;AAQD,0CAEC;AAnOD,6BAAyB;AAEzB,6CAA4C;AAC5C,iDAAmD;AAEnD,uDAAwD;AACxD,qDAAiD;AAEjD,MAAM,QAAQ,GAAW,YAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;AAC/C,MAAM,KAAK,GAAG,YAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;AACrC,MAAM,WAAW,GAAG,YAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAE3D,uDAAuD;AACvD,IAAI,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;IACtC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,wBAAwB,GAAG,eAAe,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAA;AAExE;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,OAAO,EAAE,IAAI,GAAG,EAAE;IAClD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAEhC,IAAI,IAAI,GAAG,IAAI,CAAA;IAEf,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,EAAE,CAAC;QAChC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,SAAG,CAAC,OAAO,CAAC,CAAA;QAC5C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,IAAI,GAAG,OAAO,CAAA;QAChB,CAAC;IACH,CAAC;IAED,IAAI,GAAG,GAAQ,IAAI,SAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAElC,MAAM,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IACxD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAA;IAExD,IAAI,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACjC,GAAG,CAAC,QAAQ,GAAG,QAAQ,IAAI,gBAAgB,CAAA;IAC7C,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,GAAG,CAAC,IAAI,GAAG,YAAY,CAAA;QACvB,IAAI,YAAY,EAAE,CAAC;YACjB,GAAG,CAAC,IAAI,GAAG,YAAY,CAAA;QACzB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,OAAY;;IACxC,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IAEtB,IAAI,SAAS,GAAG,MAAA,IAAA,mBAAW,EAAC,IAAI,IAAI,EAAE,EAAE,WAAW,CAAC,0CAAE,SAAS,CAAA;IAC/D,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,EACF,MAAM,EAAE,EAAE,OAAO,EAAE,EACpB,GAAG,OAAO,CAAA;IAEX,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,SAAG,CAAC,OAAO,CAAC,CAAA;QACnC,OAAO,MAAA,IAAA,mBAAW,EAAC,QAAQ,IAAI,EAAE,EAAE,WAAW,CAAC,0CAAE,SAAS,CAAA;IAC5D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,wBAAwB,CAAC,OAAY;;IAC5C,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IAEtB,IAAI,MAAM,GAAG,MAAA,IAAA,mBAAW,EAAC,IAAI,IAAI,EAAE,EAAE,WAAW,CAAC,0CAAE,MAAM,CAAA;IACzD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAA;IACf,CAAC;IAED,IAAI,EACF,MAAM,EAAE,EAAE,OAAO,EAAE,EACpB,GAAG,OAAO,CAAA;IAEX,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,SAAG,CAAC,OAAO,CAAC,CAAA;QACnC,OAAO,MAAA,IAAA,mBAAW,EAAC,QAAQ,IAAI,EAAE,EAAE,WAAW,CAAC,0CAAE,MAAM,CAAA;IACzD,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,OAAO;IAClC,OAAO,KAAK,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAA;AAC/C,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAO;IACtC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAA;AACvD,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,gBAAgB,CAAC,OAAY;IACjD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAE1B,MAAM,SAAS,GAAG,MAAM,CAAC,yBAAyB,CAAC,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAA;IACnF,MAAM,OAAO,GAAG,MAAM,CAAC,uBAAuB,CAAC,IAAI,uBAAuB,CAAC,OAAO,CAAC,CAAA;IAEnF,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,MAAM,IAAA,wBAAa,EAAC,eAAM,CAAC,CAAC,OAAO,CAAC;YACzC,KAAK,EACH,KAAK,IAAI,OAAO,IAAI,QAAQ,IAAI,CAAC,OAAO;gBACtC,CAAC,CAAC;oBACE,SAAS;iBACV;gBACH,CAAC,CAAC;oBACE,SAAS;oBACT,OAAO;iBACR;YACP,KAAK,EAAE,IAAI;SACZ,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,MAAc;IAC3C,MAAM,IAAI,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,KAAI,QAAQ,CAAA;IACxC,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,SAAS,GAAG,CAAA;AAChE,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAuB,EAAE,aAAqB,GAAG;IACjG,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,UAAU,IAAI,GAAG,CAAA;IAC1B,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAA;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAA;IAE3C,IAAI,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IACnD,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IAEnC,MAAM,WAAW,GAAG,IAAI,IAAI,IAAI,SAAS,EAAE,CAAA;IAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC,CAAA;IAE9D,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAA;IAC3D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,QAAQ,GAAG,GAAG,WAAW,GAAG,QAAQ,EAAE,CAAA;IAC/C,CAAC;IAED,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,qBAAqB,CAAC,OAAO,EAAE,IAAI;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC7C,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IAEzB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,uBAAuB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAA;IAC1F,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAA;AAC1B,CAAC;AAED;;;;GAIG;AACH,SAAgB,2BAA2B;IACzC,OAAO,wBAAwB,CAAA;AACjC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,OAAO;IACrC,OAAO,GAAG,CAAA;AACZ,CAAC","sourcesContent":["import { URL } from 'url'\n\nimport { config } from '@things-factory/env'\nimport { getPathInfo } from '@things-factory/utils'\n\nimport { getRepository } from '../initializers/database'\nimport { Domain } from '../service/domain/domain'\n\nconst protocol: string = config.get('protocol')\nconst fixed = config.get('subdomain')\nconst domainTypes = config.get('domainTypes') || ['domain']\n\n/* 하위 호환성을 위해서, domain prefix가 없는 경우, domain을 추가해준다. */\nif (domainTypes.indexOf('domain') < 0) {\n domainTypes.push('domain')\n}\n\nconst routePrefixForDomainType = `:domainType(${domainTypes.join('|')})`\n\n/**\n * Creates a URL based on the given context and path.\n *\n * @param context {Object} An object containing the current request context information.\n * @param path {string} The path to be added to the created URL (optional).\n * @returns {URL} The generated URL object.\n */\nexport function getUrlFromContext(context, path = '') {\n const { method, href, host, header } = context\n const { referer } = header || {}\n\n var base = href\n\n if (method !== 'GET' && referer) {\n var { host: refererHost } = new URL(referer)\n if (refererHost === host) {\n base = referer\n }\n }\n\n let url: URL = new URL(path, base)\n\n const originalProtocol = context.headers['x-forwarded-proto']\n const originalHost = context.headers['x-forwarded-host']\n const originalPort = context.headers['x-forwarded-port']\n\n if (protocol || originalProtocol) {\n url.protocol = protocol || originalProtocol\n }\n\n if (originalHost) {\n url.host = originalHost\n if (originalPort) {\n url.port = originalPort\n }\n }\n\n return url\n}\n\n/**\n * Extracts a subdomain from the path.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The extracted subdomain.\n */\nfunction getSubdomainFromPath(context: any) {\n var { path } = context\n\n var subdomain = getPathInfo(path || '', domainTypes)?.subdomain\n if (subdomain) {\n return subdomain\n }\n\n var {\n header: { referer }\n } = context\n\n if (referer) {\n var { pathname } = new URL(referer)\n return getPathInfo(pathname || '', domainTypes)?.subdomain\n }\n}\n\n/**\n * Extracts the subdomain type from the given context's path or referer header.\n *\n * @param context - The context object containing path and header information.\n * @returns The subdomain type if found, otherwise undefined.\n */\nfunction getSubdomainTypeFromPath(context: any) {\n var { path } = context\n\n var prefix = getPathInfo(path || '', domainTypes)?.prefix\n if (prefix) {\n return prefix\n }\n\n var {\n header: { referer }\n } = context\n\n if (referer) {\n var { pathname } = new URL(referer)\n return getPathInfo(pathname || '', domainTypes)?.prefix\n }\n}\n\n/**\n * Extracts a subdomain from the URL context.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The extracted subdomain.\n */\nfunction getSubdomainFromURL(context) {\n return fixed || getSubdomainFromPath(context)\n}\n\nfunction getSubdomainTypeFromURL(context) {\n return fixed ? '' : getSubdomainTypeFromPath(context)\n}\n\n/**\n * Asynchronously searches for a domain object based on the URL context.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {Promise<Domain>} A promise that resolves to the domain object.\n */\nexport async function getDomainFromURL(context: any): Promise<Domain> {\n const { header } = context\n\n const subdomain = header['x-things-factory-domain'] || getSubdomainFromURL(context)\n const extType = header['x-things-factory-type'] || getSubdomainTypeFromURL(context)\n\n if (subdomain) {\n return await getRepository(Domain).findOne({\n where:\n fixed || extType == 'domain' || !extType\n ? {\n subdomain\n }\n : {\n subdomain,\n extType\n },\n cache: true\n })\n }\n}\n\n/**\n * Generates a context path based on the subdomain.\n *\n * @param subdomain {string} The subdomain.\n * @returns {string} The generated context path.\n */\nexport function getContextPath(domain: Domain) {\n const type = domain?.extType || 'domain'\n return fixed || !domain ? '' : `${type}/${domain?.subdomain}/`\n}\n\n/**\n * Generates a redirection path considering the subdomain.\n *\n * @param context {Object} An object containing the current request context information.\n * @param subdomain {Domain} The target domain.\n * @param redirectTo {string} The path to redirect to (optional).\n * @returns {string} The generated redirection path.\n */\nexport function getRedirectSubdomainPath(context, domain: Partial<Domain>, redirectTo: string = '/') {\n if (fixed || !domain) {\n return redirectTo || '/'\n }\n\n const type = domain.extType || 'domain'\n const subdomain = domain.subdomain || fixed\n\n var parsed = getUrlFromContext(context, redirectTo)\n var { hostname, pathname } = parsed\n\n const contextPath = `/${type}/${subdomain}`\n const match = pathname.match(new RegExp(`^/${type}/([^\\/]+)`))\n\n if (match) {\n parsed.pathname = pathname.replace(match[0], contextPath)\n } else {\n parsed.pathname = `${contextPath}${pathname}`\n }\n\n return parsed.toString()\n}\n\n/**\n * Finds a subdomain from the given path.\n *\n * @param context {Object} An object containing the current request context information.\n * @param path {string} The path to search in.\n * @returns {string} The found subdomain.\n */\nexport function findSubdomainFromPath(context, path) {\n if (fixed) {\n return fixed\n }\n\n var parsed = getUrlFromContext(context, path)\n var { pathname } = parsed\n\n const match = pathname.match(new RegExp(`^/${getSubdomainTypeFromURL(context)}/([^\\/]+)`))\n return match && match[1]\n}\n\n/**\n * Retrieves the route prefix for a specific domain type.\n *\n * @returns {string} The route prefix associated with the domain type.\n */\nexport function getRoutePrefixForDomainType() {\n return routePrefixForDomainType\n}\n\n/**\n * Generates a site root path based on the current environment.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The generated site root path.\n */\nexport function getSiteRootPath(context) {\n return '/'\n}\n"]}
1
+ {"version":3,"file":"get-domain.js","sourceRoot":"","sources":["../../server/utils/get-domain.ts"],"names":[],"mappings":"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","sourcesContent":["import { URL } from 'url'\n\nimport { config } from '@things-factory/env'\nimport { getPathInfo } from '@things-factory/utils'\n\nimport { getRepository } from '../initializers/database'\nimport { Domain } from '../service/domain/domain'\n\nconst protocol: string = config.get('protocol')\nconst fixed = config.get('subdomain')\nconst domainTypes = config.get('domainTypes') || ['domain']\n\n/* 하위 호환성을 위해서, domain prefix가 없는 경우, domain을 추가해준다. */\nif (domainTypes.indexOf('domain') < 0) {\n domainTypes.push('domain')\n}\n\nconst routePrefixForDomainType = `:domainType(${domainTypes.join('|')})`\n\n/**\n * Creates a URL based on the given context and path.\n *\n * @param context {Object} An object containing the current request context information.\n * @param path {string} The path to be added to the created URL (optional).\n * @returns {URL} The generated URL object.\n */\nexport function getUrlFromContext(context, path = '') {\n const { method, href, host, header } = context\n const { referer } = header || {}\n\n var base = href\n\n if (method !== 'GET' && referer) {\n var { host: refererHost } = new URL(referer)\n if (refererHost === host) {\n base = referer\n }\n }\n\n let url: URL = new URL(path, base)\n\n const originalProtocol = context.headers['x-forwarded-proto']\n const originalHost = context.headers['x-forwarded-host']\n const originalPort = context.headers['x-forwarded-port']\n\n if (protocol || originalProtocol) {\n url.protocol = protocol || originalProtocol\n }\n\n if (originalHost) {\n url.host = originalHost\n if (originalPort) {\n url.port = originalPort\n }\n }\n\n return url\n}\n\n/**\n * Extracts a subdomain from the path.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The extracted subdomain.\n */\nfunction getSubdomainFromPath(context: any) {\n var { path } = context\n\n var subdomain = getPathInfo(path || '', domainTypes)?.subdomain\n if (subdomain) {\n return subdomain\n }\n\n var {\n header: { referer }\n } = context\n\n if (referer) {\n var { pathname } = new URL(referer)\n return getPathInfo(pathname || '', domainTypes)?.subdomain\n }\n}\n\n/**\n * Extracts the subdomain type from the given context's path or referer header.\n *\n * @param context - The context object containing path and header information.\n * @returns The subdomain type if found, otherwise undefined.\n */\nfunction getSubdomainTypeFromPath(context: any) {\n var { path } = context\n\n var prefix = getPathInfo(path || '', domainTypes)?.prefix\n if (prefix) {\n return prefix\n }\n\n var {\n header: { referer }\n } = context\n\n if (referer) {\n var { pathname } = new URL(referer)\n return getPathInfo(pathname || '', domainTypes)?.prefix\n }\n}\n\n/**\n * Extracts a subdomain from the URL context.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The extracted subdomain.\n */\nfunction getSubdomainFromURL(context) {\n return fixed || getSubdomainFromPath(context)\n}\n\nfunction getSubdomainTypeFromURL(context) {\n return fixed ? '' : getSubdomainTypeFromPath(context)\n}\n\n/**\n * Asynchronously searches for a domain object based on the URL context.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {Promise<Domain>} A promise that resolves to the domain object.\n */\nexport async function getDomainFromURL(context: any): Promise<Domain> {\n const { header } = context\n\n const subdomain = header['x-things-factory-domain'] || getSubdomainFromURL(context)\n const extType = header['x-things-factory-type'] || getSubdomainTypeFromURL(context)\n\n if (subdomain) {\n return await getRepository(Domain).findOne({\n where:\n fixed || extType == 'domain' || !extType\n ? {\n subdomain\n }\n : {\n subdomain,\n extType\n },\n cache: true\n })\n }\n}\n\n/**\n * Generates a context path based on the subdomain.\n *\n * @param subdomain {string} The subdomain.\n * @returns {string} The generated context path.\n */\nexport function getContextPath(domain: Domain) {\n const type = domain?.extType || 'domain'\n return fixed || !domain ? '' : `${type}/${domain?.subdomain}/`\n}\n\n/**\n * Generates a redirection path considering the subdomain.\n *\n * @param context {Object} An object containing the current request context information.\n * @param subdomain {Domain} The target domain.\n * @param redirectTo {string} The path to redirect to (optional).\n * @returns {string} The generated redirection path.\n */\nexport function getRedirectSubdomainPath(context, domain: Partial<Domain>, redirectTo: string = '/') {\n if (fixed || !domain) {\n return redirectTo || '/'\n }\n\n const type = domain.extType || 'domain'\n const subdomain = domain.subdomain || fixed\n\n var parsed = getUrlFromContext(context, redirectTo)\n var { hostname, pathname } = parsed\n\n const contextPath = `/${type}/${subdomain}`\n const match = pathname.match(new RegExp(`^/${type}/([^\\/]+)`))\n\n if (match) {\n parsed.pathname = pathname.replace(match[0], contextPath)\n } else {\n parsed.pathname = `${contextPath}${pathname}`\n }\n\n return parsed.toString()\n}\n\n/**\n * Finds a subdomain from the given path.\n *\n * @param context {Object} An object containing the current request context information.\n * @param path {string} The path to search in.\n * @returns {string} The found subdomain.\n */\nexport function findSubdomainFromPath(context, path) {\n if (fixed) {\n return fixed\n }\n\n var parsed = getUrlFromContext(context, path)\n var { pathname } = parsed\n\n const match = pathname.match(new RegExp(`^/${getSubdomainTypeFromURL(context)}/([^\\/]+)`))\n return match && match[1]\n}\n\n/**\n * Retrieves the route prefix for a specific domain type.\n *\n * @returns {string} The route prefix associated with the domain type.\n */\nexport function getRoutePrefixForDomainType() {\n return routePrefixForDomainType\n}\n\n/**\n * Generates a site root path based on the current environment.\n *\n * @param context {Object} An object containing the current request context information.\n * @returns {string} The generated site root path.\n */\nexport function getSiteRootPath(context) {\n return '/'\n}\n"]}
@@ -16,13 +16,12 @@ const list_param_js_1 = require("../service/common-types/list-param.js");
16
16
  * @returns {SelectQueryBuilder<Type>} - The constructed SelectQueryBuilder instance.
17
17
  */
18
18
  function getQueryBuilderFromListParams(options) {
19
- var _a, _b;
20
19
  const { repository, params, domain, alias, searchables, filtersMap = {} } = options;
21
20
  const { inherited = list_param_js_1.InheritedValueType.None } = params || {};
22
21
  const selectQueryBuilder = repository.createQueryBuilder(alias);
23
22
  const entityAlias = selectQueryBuilder.alias;
24
23
  // Apply filters to the query
25
- const columnFilters = ((_a = params.filters) === null || _a === void 0 ? void 0 : _a.filter(filter => {
24
+ const columnFilters = params.filters?.filter(filter => {
26
25
  if (filter.operator === 'search') {
27
26
  return false;
28
27
  }
@@ -31,9 +30,9 @@ function getQueryBuilderFromListParams(options) {
31
30
  return false;
32
31
  }
33
32
  return true;
34
- })) || [];
33
+ }) || [];
35
34
  const searchFilters = searchables instanceof Array
36
- ? ((_b = params.filters) === null || _b === void 0 ? void 0 : _b.filter(filter => {
35
+ ? params.filters?.filter(filter => {
37
36
  if (filter.operator !== 'search') {
38
37
  return false;
39
38
  }
@@ -42,7 +41,7 @@ function getQueryBuilderFromListParams(options) {
42
41
  return false;
43
42
  }
44
43
  return true;
45
- })) || []
44
+ }) || []
46
45
  : [];
47
46
  const pagination = params.pagination;
48
47
  const sortings = params.sortings;
@@ -1 +1 @@
1
- {"version":3,"file":"get-query-builder-from-list-params.js","sourceRoot":"","sources":["../../server/utils/get-query-builder-from-list-params.ts"],"names":[],"mappings":"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","sourcesContent":["import { Brackets, EntityMetadata, Repository, SelectQueryBuilder, WhereExpressionBuilder } from 'typeorm'\nimport { RelationMetadata } from 'typeorm/metadata/RelationMetadata.js'\nimport { Filter, Sorting, Pagination, ListParam, InheritedValueType } from '../service/common-types/list-param.js'\nimport { Domain } from '../service/domain/domain.js'\n\n/**\n * Creates a TypeORM SelectQueryBuilder based on the provided parameters.\n *\n * @param options - An object containing the query building options.\n * @param options.repository - The TypeORM repository for database operations.\n * @param options.params - The ListParam object containing filters, sortings, and pagination.\n * @param [options.domain] - Optional domain object for applying domain-specific filters.\n * @param [options.alias] - The alias to be used in the SQL queries.\n * @param [options.searchables] - List of columns that are searchable.\n * @param [options.filtersMap] - Mapping of filter names to their corresponding columns or relation columns.\n * @returns {SelectQueryBuilder<Type>} - The constructed SelectQueryBuilder instance.\n */\nexport function getQueryBuilderFromListParams<Type>(options: {\n repository: Repository<Type>\n params: ListParam\n domain?: Domain\n alias?: string\n searchables?: string[]\n filtersMap?: { [name: string]: { columnName: string; relationColumn?: string } }\n}): SelectQueryBuilder<Type> {\n const { repository, params, domain, alias, searchables, filtersMap = {} } = options\n const { inherited = InheritedValueType.None } = params || {}\n\n const selectQueryBuilder = repository.createQueryBuilder(alias)\n const entityAlias = selectQueryBuilder.alias\n\n // Apply filters to the query\n const columnFilters =\n params.filters?.filter(filter => {\n if (filter.operator === 'search') {\n return false\n }\n if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {\n console.warn('\"searchables\" setting is required for LIKE searches to avoid heavy database load', filter.name)\n return false\n }\n return true\n }) || []\n\n const searchFilters =\n searchables instanceof Array\n ? params.filters?.filter(filter => {\n if (filter.operator !== 'search') {\n return false\n }\n if (!searchables.includes(filter.name)) {\n console.warn(\n '\"searchables\" setting is required for LIKE searches to avoid heavy database load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n : []\n\n const pagination = params.pagination\n const sortings = params.sortings\n const metadata = repository.metadata\n\n // Apply column filters\n if (columnFilters.length > 0) {\n columnFilters.forEach(filter => {\n addCondition(metadata, selectQueryBuilder, selectQueryBuilder, filter, filtersMap, true)\n })\n }\n\n // Apply search filters\n if (searchFilters.length > 0) {\n selectQueryBuilder.andWhere(\n new Brackets(qb => {\n searchFilters.forEach(filter => {\n addCondition(metadata, selectQueryBuilder, qb, filter, filtersMap, false)\n })\n })\n )\n }\n\n // Apply domain filters\n if (domain) {\n if (!inherited || inherited === InheritedValueType.None) {\n selectQueryBuilder.andWhere(`${entityAlias}.domain = :domain`, { domain: domain.id })\n } else if (inherited === InheritedValueType.Include) {\n selectQueryBuilder.andWhere(`${entityAlias}.domain IN (:...domains)`, {\n domains: [domain.id, domain.parentId].filter(Boolean)\n })\n } else if (inherited === InheritedValueType.Only) {\n selectQueryBuilder.andWhere(`${entityAlias}.domain = :domain`, { domain: domain.parentId || 'Impossible' })\n } else {\n selectQueryBuilder.andWhere(`${entityAlias}.domain = :domain`, { domain: 'Impossible' })\n }\n }\n\n // Apply pagination\n addPagination(selectQueryBuilder, pagination)\n\n // Apply sorting\n if (sortings && sortings.length > 0) {\n addSorting(selectQueryBuilder, sortings, entityAlias, filtersMap, metadata)\n }\n\n return selectQueryBuilder\n}\n\n/**\n * Adds pagination to the SelectQueryBuilder based on the provided Pagination object.\n *\n * @param selectQueryBuilder - The SelectQueryBuilder to which pagination should be applied.\n * @param pagination - The Pagination object containing page and limit information.\n */\nfunction addPagination<T>(selectQueryBuilder: SelectQueryBuilder<T>, pagination?: Pagination) {\n if (pagination) {\n const { page, limit } = pagination\n if (page && limit && page > 0 && limit > 0) {\n selectQueryBuilder.skip(limit * (page - 1)).take(limit)\n } else if (limit && limit > 0) {\n selectQueryBuilder.take(limit)\n }\n }\n}\n\n/**\n * Adds a filtering condition to the SelectQueryBuilder based on the provided filter and mapping options.\n *\n * @param metadata - The EntityMetadata of the TypeORM entity.\n * @param selectQueryBuilder - The SelectQueryBuilder to which the condition will be added.\n * @param whereExpressionBuilder - The WhereExpressionBuilder to construct the where clause.\n * @param filter - The Filter object containing the filter criteria.\n * @param filtersMap - A mapping of filter names to column names and relation column names.\n * @param andCondition - A flag indicating whether to use \"AND\" or \"OR\" for combining conditions.\n */\nfunction addCondition<T>(\n metadata: EntityMetadata,\n selectQueryBuilder: SelectQueryBuilder<T>,\n whereExpressionBuilder: WhereExpressionBuilder,\n filter: Filter,\n filtersMap: { [name: string]: { columnName: string; relationColumn?: string } } = {},\n andCondition: boolean\n): void {\n const { name, operator, value } = filter\n var entityAlias = selectQueryBuilder.alias\n\n var { relationColumn, columnName } = filtersMap[name] || {}\n /*\n 1. relationColumn과 columnName이 지정된 경우 \n - relation inverse 테이블에서, columnName을 찾는다.\n 2. relationColumn만 지정된 경우는 없어야 한다.\n - 이 경우 columnName 은 'name' 이라고 판단한다.\n 3. columnName이 지정된 경우.\n - 이 경우는 columnName 만 적용한다.\n */\n if (relationColumn) {\n const columns = relationColumn.split('.')\n var entityMetadata: EntityMetadata\n var relation: RelationMetadata\n\n for (const rcolumn of columns) {\n if (relation) {\n const { propertyName } = relationColumnMeta\n const property = `${entityAlias}.${propertyName}`\n\n entityAlias = `${entityAlias}-${entityMetadata.tableName}-for-${columnName || 'name'}` as string\n\n if (andCondition) {\n selectQueryBuilder.innerJoin(property, entityAlias)\n } else {\n selectQueryBuilder.leftJoin(property, entityAlias)\n }\n } else {\n entityMetadata = metadata\n }\n\n var relationColumnMeta = entityMetadata.columns.find(column => column.propertyName === rcolumn)\n if (!relationColumnMeta) {\n console.warn(`relationColumn \"${relationColumn}\" in filtersMap for \"${name}\" is not a relation column`)\n return\n }\n\n relation = relationColumnMeta.relationMetadata\n entityMetadata = relation.inverseEntityMetadata\n }\n\n var columnMeta = entityMetadata.columns.find(column => column.propertyName === (columnName || 'name'))\n if (!columnMeta) {\n console.warn(`columnName \"${columnName}\" in filtersMap for \"${name}\" is not a column`)\n return\n }\n } else {\n var columnMeta = metadata.columns.find(column => column.propertyName === (columnName || name))\n if (!columnMeta) {\n /* relationId 에 대한 필터링은 해당 컬럼값 자체의 비교로 한다. */\n var relationIdMeta = metadata.relationIds.find(relationId => relationId.propertyName === (columnName || name))\n if (relationIdMeta) {\n columnMeta = relationIdMeta.relation.joinColumns[0]\n } else {\n columnName\n ? console.warn(`columnName \"${columnName}\" in filtersMap for \"${name}\" is not a column`)\n : console.warn(`name \"${name}\" is not a column`)\n }\n } else {\n var relation = columnMeta.relationMetadata\n }\n\n if (relation) {\n /* filterMap에 의해서 relationColumn 이 지정되지 않았더라도, name 또는 columnName의 column이 relation인 경우에는\n - 조건절 구성을 위한 타겟필드명은 'name' 으로만 한정된다.\n */\n var relationColumnMeta = columnMeta\n var entityMetadata = relation.inverseEntityMetadata\n columnMeta = entityMetadata.columns.find(column => column.propertyName === 'name')\n if (!columnMeta) {\n console.warn(`relation column \"${columnName || name}\" does not have \"name\" column`)\n return\n }\n }\n }\n\n const dbNameForColumn = columnMeta.databaseName\n const alias = relationColumnMeta ? `${name}-filter` : entityAlias\n\n /* relation columne인 경우 name을 alias로 사용한다. */\n const field = `${alias}.${dbNameForColumn}`\n\n var { clause, parameters } = getClauseAndParameters(field, name, operator, value)\n\n if (relationColumnMeta) {\n const { propertyName } = relationColumnMeta\n const property = `${entityAlias}.${propertyName}`\n if (andCondition) {\n selectQueryBuilder.innerJoin(property, alias, clause, parameters)\n } else {\n selectQueryBuilder.leftJoin(property, alias)\n whereExpressionBuilder.orWhere(clause, parameters)\n }\n } else {\n andCondition\n ? whereExpressionBuilder.andWhere(clause, parameters)\n : whereExpressionBuilder.orWhere(clause, parameters)\n }\n}\n\n/**\n * Adds sorting to the SelectQueryBuilder based on the provided Sorting objects.\n *\n * @param selectQueryBuilder - The SelectQueryBuilder to which sorting should be applied.\n * @param sortings - An array of Sorting objects defining the sort order.\n * @param entityAlias - The alias of the entity in the query.\n * @param filtersMap - A mapping of filter names to column names and relation column names.\n * @param metadata - The EntityMetadata of the TypeORM entity.\n */\nfunction addSorting<T>(\n selectQueryBuilder: SelectQueryBuilder<T>,\n sortings: Sorting[],\n entityAlias: string,\n filtersMap: { [name: string]: { columnName: string; relationColumn?: string } },\n metadata: EntityMetadata\n) {\n sortings.forEach((sorting, index) => {\n const sortField = determineSortField(sorting.name, entityAlias, filtersMap, selectQueryBuilder, metadata)\n if (index === 0) {\n selectQueryBuilder.orderBy(sortField, sorting.desc ? 'DESC' : 'ASC')\n } else {\n selectQueryBuilder.addOrderBy(sortField, sorting.desc ? 'DESC' : 'ASC')\n }\n })\n}\n\n/**\n * Determines the sorting field for a given sorting name, considering possible relation columns.\n *\n * @param sortingName - The name of the field to sort by.\n * @param entityAlias - The alias of the entity in the query.\n * @param filtersMap - A mapping of filter names to column names and relation column names.\n * @param selectQueryBuilder - The SelectQueryBuilder instance to apply sorting to.\n * @param metadata - The EntityMetadata of the TypeORM entity.\n * @returns {string} - The fully qualified sorting field.\n */\nfunction determineSortField<T>(\n sortingName: string,\n entityAlias: string,\n filtersMap: { [name: string]: { columnName: string; relationColumn?: string } },\n selectQueryBuilder: SelectQueryBuilder<T>,\n metadata: EntityMetadata\n): string {\n const filter = filtersMap[sortingName]\n\n if (!filter) {\n return sortingName.split('.').length > 1 ? sortingName : `${entityAlias}.${sortingName}`\n }\n\n const { columnName, relationColumn } = filter\n\n if (relationColumn) {\n const relationAlias = applyJoins(\n selectQueryBuilder,\n entityAlias,\n relationColumn,\n metadata,\n 'leftJoin',\n columnName || sortingName,\n true\n )\n return `${relationAlias}.${columnName}`\n } else {\n return `${entityAlias}.${columnName}`\n }\n}\n\n/**\n * Applies the necessary joins to the SelectQueryBuilder based on the relation column.\n *\n * @param selectQueryBuilder - The SelectQueryBuilder where the joins will be applied.\n * @param entityAlias - The current alias of the entity in the query.\n * @param relationColumn - The dot-notated string representing the relation chain (e.g., \"user.profile.address\").\n * @param metadata - The EntityMetadata of the entity.\n * @param joinType - The type of join to use (\"innerJoin\" or \"leftJoin\").\n * @param columnName - The name of the column used for filtering or sorting, default to 'name'.\n * @param selectField - Whether to include the field in the SELECT clause.\n * @returns {string} - The alias to be used for the final field in the relation chain.\n */\nfunction applyJoins<T>(\n selectQueryBuilder: SelectQueryBuilder<T>,\n entityAlias: string,\n relationColumn: string,\n metadata: EntityMetadata,\n joinType: 'innerJoin' | 'leftJoin' = 'leftJoin',\n columnName: string = 'name',\n selectField: boolean = false\n): string {\n const columns = relationColumn.split('.')\n let currentAlias = entityAlias\n let currentMetadata = metadata\n\n for (const column of columns) {\n const relation = currentMetadata.relations.find(rel => rel.propertyName === column)\n\n if (!relation) {\n throw new Error(`Relation not found for column: ${column}`)\n }\n\n const nextAlias = `${currentAlias}_${relation.inverseEntityMetadata.tableName}_for_${columnName}`\n\n if (!selectQueryBuilder.expressionMap.aliases.some(alias => alias.name === nextAlias)) {\n selectQueryBuilder[joinType](`${currentAlias}.${column}`, nextAlias)\n }\n if (selectField && columns.at(-1) == column /* 최종 alias만 추가 */) {\n selectQueryBuilder.addSelect(`${nextAlias}.${columnName}`, `${nextAlias}_${columnName}`)\n }\n\n currentAlias = nextAlias\n currentMetadata = relation.inverseEntityMetadata\n }\n\n return currentAlias\n}\n\n/**\n * Generates the SQL clause and parameters based on the provided filter.\n *\n * @param field - The database field to filter on.\n * @param name - The name of the filter.\n * @param operator - The operator to use in the filter.\n * @param value - The value to filter with.\n * @returns An object containing the SQL clause and the parameters.\n */\nfunction getClauseAndParameters(\n field: string,\n name: string,\n operator: string,\n value: any\n): { clause: string; parameters: { [key: string]: any } } {\n const values = value instanceof Array ? value : [value]\n let clause = ''\n let parameters: { [key: string]: any } = {}\n\n switch (operator) {\n case 'eq':\n clause = `${field} = :${name}`\n parameters = { [name]: value }\n break\n case 'like':\n clause = `${field} LIKE :${name}`\n parameters = { [name]: `%${value}%` }\n break\n case 'search':\n case 'i_like':\n clause = `LOWER(${field}) LIKE :${name}`\n parameters = { [name]: `%${String(value).toLowerCase()}%` }\n break\n case 'nlike':\n clause = `${field} NOT LIKE :${name}`\n parameters = { [name]: `%${value}%` }\n break\n case 'i_nlike':\n clause = `LOWER(${field}) NOT LIKE :${name}`\n parameters = { [name]: `%${String(value).toLowerCase()}%` }\n break\n case 'lt':\n clause = `${field} < :${name}`\n parameters = { [name]: value }\n break\n case 'gt':\n clause = `${field} > :${name}`\n parameters = { [name]: value }\n break\n case 'lte':\n clause = `${field} <= :${name}`\n parameters = { [name]: value }\n break\n case 'gte':\n clause = `${field} >= :${name}`\n parameters = { [name]: value }\n break\n case 'noteq':\n clause = `${field} != :${name}`\n parameters = { [name]: value }\n break\n case 'in':\n clause = `${field} IN (:...${name})`\n parameters = { [name]: values }\n break\n case 'notin':\n clause = `${field} NOT IN (:...${name})`\n parameters = { [name]: values }\n break\n case 'notin_with_null':\n clause = `${field} IS NULL OR ${field} NOT IN (:...${name})`\n parameters = { [name]: values }\n break\n case 'is_null':\n clause = `${field} IS NULL`\n break\n case 'is_not_null':\n clause = `${field} IS NOT NULL`\n break\n case 'is_false':\n clause = `${field} IS FALSE`\n break\n case 'is_true':\n clause = `${field} IS TRUE`\n break\n case 'is_not_false':\n clause = `${field} IS NOT FALSE`\n break\n case 'is_not_true':\n clause = `${field} IS NOT TRUE`\n break\n case 'is_present':\n clause = `${field} IS PRESENT`\n break\n case 'is_blank':\n clause = `${field} IS BLANK`\n break\n case 'is_empty_num_id':\n clause = `${field} IS EMPTY NUMERIC ID`\n break\n case 'between':\n clause = `${field} BETWEEN :${name}_1 AND :${name}_2`\n parameters = { [`${name}_1`]: values[0], [`${name}_2`]: values[1] }\n break\n }\n\n return { clause, parameters }\n}\n"]}
1
+ {"version":3,"file":"get-query-builder-from-list-params.js","sourceRoot":"","sources":["../../server/utils/get-query-builder-from-list-params.ts"],"names":[],"mappings":"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","sourcesContent":["import { Brackets, EntityMetadata, Repository, SelectQueryBuilder, WhereExpressionBuilder } from 'typeorm'\nimport { RelationMetadata } from 'typeorm/metadata/RelationMetadata.js'\nimport { Filter, Sorting, Pagination, ListParam, InheritedValueType } from '../service/common-types/list-param.js'\nimport { Domain } from '../service/domain/domain.js'\n\n/**\n * Creates a TypeORM SelectQueryBuilder based on the provided parameters.\n *\n * @param options - An object containing the query building options.\n * @param options.repository - The TypeORM repository for database operations.\n * @param options.params - The ListParam object containing filters, sortings, and pagination.\n * @param [options.domain] - Optional domain object for applying domain-specific filters.\n * @param [options.alias] - The alias to be used in the SQL queries.\n * @param [options.searchables] - List of columns that are searchable.\n * @param [options.filtersMap] - Mapping of filter names to their corresponding columns or relation columns.\n * @returns {SelectQueryBuilder<Type>} - The constructed SelectQueryBuilder instance.\n */\nexport function getQueryBuilderFromListParams<Type>(options: {\n repository: Repository<Type>\n params: ListParam\n domain?: Domain\n alias?: string\n searchables?: string[]\n filtersMap?: { [name: string]: { columnName: string; relationColumn?: string } }\n}): SelectQueryBuilder<Type> {\n const { repository, params, domain, alias, searchables, filtersMap = {} } = options\n const { inherited = InheritedValueType.None } = params || {}\n\n const selectQueryBuilder = repository.createQueryBuilder(alias)\n const entityAlias = selectQueryBuilder.alias\n\n // Apply filters to the query\n const columnFilters =\n params.filters?.filter(filter => {\n if (filter.operator === 'search') {\n return false\n }\n if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {\n console.warn('\"searchables\" setting is required for LIKE searches to avoid heavy database load', filter.name)\n return false\n }\n return true\n }) || []\n\n const searchFilters =\n searchables instanceof Array\n ? params.filters?.filter(filter => {\n if (filter.operator !== 'search') {\n return false\n }\n if (!searchables.includes(filter.name)) {\n console.warn(\n '\"searchables\" setting is required for LIKE searches to avoid heavy database load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n : []\n\n const pagination = params.pagination\n const sortings = params.sortings\n const metadata = repository.metadata\n\n // Apply column filters\n if (columnFilters.length > 0) {\n columnFilters.forEach(filter => {\n addCondition(metadata, selectQueryBuilder, selectQueryBuilder, filter, filtersMap, true)\n })\n }\n\n // Apply search filters\n if (searchFilters.length > 0) {\n selectQueryBuilder.andWhere(\n new Brackets(qb => {\n searchFilters.forEach(filter => {\n addCondition(metadata, selectQueryBuilder, qb, filter, filtersMap, false)\n })\n })\n )\n }\n\n // Apply domain filters\n if (domain) {\n if (!inherited || inherited === InheritedValueType.None) {\n selectQueryBuilder.andWhere(`${entityAlias}.domain = :domain`, { domain: domain.id })\n } else if (inherited === InheritedValueType.Include) {\n selectQueryBuilder.andWhere(`${entityAlias}.domain IN (:...domains)`, {\n domains: [domain.id, domain.parentId].filter(Boolean)\n })\n } else if (inherited === InheritedValueType.Only) {\n selectQueryBuilder.andWhere(`${entityAlias}.domain = :domain`, { domain: domain.parentId || 'Impossible' })\n } else {\n selectQueryBuilder.andWhere(`${entityAlias}.domain = :domain`, { domain: 'Impossible' })\n }\n }\n\n // Apply pagination\n addPagination(selectQueryBuilder, pagination)\n\n // Apply sorting\n if (sortings && sortings.length > 0) {\n addSorting(selectQueryBuilder, sortings, entityAlias, filtersMap, metadata)\n }\n\n return selectQueryBuilder\n}\n\n/**\n * Adds pagination to the SelectQueryBuilder based on the provided Pagination object.\n *\n * @param selectQueryBuilder - The SelectQueryBuilder to which pagination should be applied.\n * @param pagination - The Pagination object containing page and limit information.\n */\nfunction addPagination<T>(selectQueryBuilder: SelectQueryBuilder<T>, pagination?: Pagination) {\n if (pagination) {\n const { page, limit } = pagination\n if (page && limit && page > 0 && limit > 0) {\n selectQueryBuilder.skip(limit * (page - 1)).take(limit)\n } else if (limit && limit > 0) {\n selectQueryBuilder.take(limit)\n }\n }\n}\n\n/**\n * Adds a filtering condition to the SelectQueryBuilder based on the provided filter and mapping options.\n *\n * @param metadata - The EntityMetadata of the TypeORM entity.\n * @param selectQueryBuilder - The SelectQueryBuilder to which the condition will be added.\n * @param whereExpressionBuilder - The WhereExpressionBuilder to construct the where clause.\n * @param filter - The Filter object containing the filter criteria.\n * @param filtersMap - A mapping of filter names to column names and relation column names.\n * @param andCondition - A flag indicating whether to use \"AND\" or \"OR\" for combining conditions.\n */\nfunction addCondition<T>(\n metadata: EntityMetadata,\n selectQueryBuilder: SelectQueryBuilder<T>,\n whereExpressionBuilder: WhereExpressionBuilder,\n filter: Filter,\n filtersMap: { [name: string]: { columnName: string; relationColumn?: string } } = {},\n andCondition: boolean\n): void {\n const { name, operator, value } = filter\n var entityAlias = selectQueryBuilder.alias\n\n var { relationColumn, columnName } = filtersMap[name] || {}\n /*\n 1. relationColumn과 columnName이 지정된 경우 \n - relation inverse 테이블에서, columnName을 찾는다.\n 2. relationColumn만 지정된 경우는 없어야 한다.\n - 이 경우 columnName 은 'name' 이라고 판단한다.\n 3. columnName이 지정된 경우.\n - 이 경우는 columnName 만 적용한다.\n */\n if (relationColumn) {\n const columns = relationColumn.split('.')\n var entityMetadata: EntityMetadata\n var relation: RelationMetadata\n\n for (const rcolumn of columns) {\n if (relation) {\n const { propertyName } = relationColumnMeta\n const property = `${entityAlias}.${propertyName}`\n\n entityAlias = `${entityAlias}-${entityMetadata.tableName}-for-${columnName || 'name'}` as string\n\n if (andCondition) {\n selectQueryBuilder.innerJoin(property, entityAlias)\n } else {\n selectQueryBuilder.leftJoin(property, entityAlias)\n }\n } else {\n entityMetadata = metadata\n }\n\n var relationColumnMeta = entityMetadata.columns.find(column => column.propertyName === rcolumn)\n if (!relationColumnMeta) {\n console.warn(`relationColumn \"${relationColumn}\" in filtersMap for \"${name}\" is not a relation column`)\n return\n }\n\n relation = relationColumnMeta.relationMetadata\n entityMetadata = relation.inverseEntityMetadata\n }\n\n var columnMeta = entityMetadata.columns.find(column => column.propertyName === (columnName || 'name'))\n if (!columnMeta) {\n console.warn(`columnName \"${columnName}\" in filtersMap for \"${name}\" is not a column`)\n return\n }\n } else {\n var columnMeta = metadata.columns.find(column => column.propertyName === (columnName || name))\n if (!columnMeta) {\n /* relationId 에 대한 필터링은 해당 컬럼값 자체의 비교로 한다. */\n var relationIdMeta = metadata.relationIds.find(relationId => relationId.propertyName === (columnName || name))\n if (relationIdMeta) {\n columnMeta = relationIdMeta.relation.joinColumns[0]\n } else {\n columnName\n ? console.warn(`columnName \"${columnName}\" in filtersMap for \"${name}\" is not a column`)\n : console.warn(`name \"${name}\" is not a column`)\n }\n } else {\n var relation = columnMeta.relationMetadata\n }\n\n if (relation) {\n /* filterMap에 의해서 relationColumn 이 지정되지 않았더라도, name 또는 columnName의 column이 relation인 경우에는\n - 조건절 구성을 위한 타겟필드명은 'name' 으로만 한정된다.\n */\n var relationColumnMeta = columnMeta\n var entityMetadata = relation.inverseEntityMetadata\n columnMeta = entityMetadata.columns.find(column => column.propertyName === 'name')\n if (!columnMeta) {\n console.warn(`relation column \"${columnName || name}\" does not have \"name\" column`)\n return\n }\n }\n }\n\n const dbNameForColumn = columnMeta.databaseName\n const alias = relationColumnMeta ? `${name}-filter` : entityAlias\n\n /* relation columne인 경우 name을 alias로 사용한다. */\n const field = `${alias}.${dbNameForColumn}`\n\n var { clause, parameters } = getClauseAndParameters(field, name, operator, value)\n\n if (relationColumnMeta) {\n const { propertyName } = relationColumnMeta\n const property = `${entityAlias}.${propertyName}`\n if (andCondition) {\n selectQueryBuilder.innerJoin(property, alias, clause, parameters)\n } else {\n selectQueryBuilder.leftJoin(property, alias)\n whereExpressionBuilder.orWhere(clause, parameters)\n }\n } else {\n andCondition\n ? whereExpressionBuilder.andWhere(clause, parameters)\n : whereExpressionBuilder.orWhere(clause, parameters)\n }\n}\n\n/**\n * Adds sorting to the SelectQueryBuilder based on the provided Sorting objects.\n *\n * @param selectQueryBuilder - The SelectQueryBuilder to which sorting should be applied.\n * @param sortings - An array of Sorting objects defining the sort order.\n * @param entityAlias - The alias of the entity in the query.\n * @param filtersMap - A mapping of filter names to column names and relation column names.\n * @param metadata - The EntityMetadata of the TypeORM entity.\n */\nfunction addSorting<T>(\n selectQueryBuilder: SelectQueryBuilder<T>,\n sortings: Sorting[],\n entityAlias: string,\n filtersMap: { [name: string]: { columnName: string; relationColumn?: string } },\n metadata: EntityMetadata\n) {\n sortings.forEach((sorting, index) => {\n const sortField = determineSortField(sorting.name, entityAlias, filtersMap, selectQueryBuilder, metadata)\n if (index === 0) {\n selectQueryBuilder.orderBy(sortField, sorting.desc ? 'DESC' : 'ASC')\n } else {\n selectQueryBuilder.addOrderBy(sortField, sorting.desc ? 'DESC' : 'ASC')\n }\n })\n}\n\n/**\n * Determines the sorting field for a given sorting name, considering possible relation columns.\n *\n * @param sortingName - The name of the field to sort by.\n * @param entityAlias - The alias of the entity in the query.\n * @param filtersMap - A mapping of filter names to column names and relation column names.\n * @param selectQueryBuilder - The SelectQueryBuilder instance to apply sorting to.\n * @param metadata - The EntityMetadata of the TypeORM entity.\n * @returns {string} - The fully qualified sorting field.\n */\nfunction determineSortField<T>(\n sortingName: string,\n entityAlias: string,\n filtersMap: { [name: string]: { columnName: string; relationColumn?: string } },\n selectQueryBuilder: SelectQueryBuilder<T>,\n metadata: EntityMetadata\n): string {\n const filter = filtersMap[sortingName]\n\n if (!filter) {\n return sortingName.split('.').length > 1 ? sortingName : `${entityAlias}.${sortingName}`\n }\n\n const { columnName, relationColumn } = filter\n\n if (relationColumn) {\n const relationAlias = applyJoins(\n selectQueryBuilder,\n entityAlias,\n relationColumn,\n metadata,\n 'leftJoin',\n columnName || sortingName,\n true\n )\n return `${relationAlias}.${columnName}`\n } else {\n return `${entityAlias}.${columnName}`\n }\n}\n\n/**\n * Applies the necessary joins to the SelectQueryBuilder based on the relation column.\n *\n * @param selectQueryBuilder - The SelectQueryBuilder where the joins will be applied.\n * @param entityAlias - The current alias of the entity in the query.\n * @param relationColumn - The dot-notated string representing the relation chain (e.g., \"user.profile.address\").\n * @param metadata - The EntityMetadata of the entity.\n * @param joinType - The type of join to use (\"innerJoin\" or \"leftJoin\").\n * @param columnName - The name of the column used for filtering or sorting, default to 'name'.\n * @param selectField - Whether to include the field in the SELECT clause.\n * @returns {string} - The alias to be used for the final field in the relation chain.\n */\nfunction applyJoins<T>(\n selectQueryBuilder: SelectQueryBuilder<T>,\n entityAlias: string,\n relationColumn: string,\n metadata: EntityMetadata,\n joinType: 'innerJoin' | 'leftJoin' = 'leftJoin',\n columnName: string = 'name',\n selectField: boolean = false\n): string {\n const columns = relationColumn.split('.')\n let currentAlias = entityAlias\n let currentMetadata = metadata\n\n for (const column of columns) {\n const relation = currentMetadata.relations.find(rel => rel.propertyName === column)\n\n if (!relation) {\n throw new Error(`Relation not found for column: ${column}`)\n }\n\n const nextAlias = `${currentAlias}_${relation.inverseEntityMetadata.tableName}_for_${columnName}`\n\n if (!selectQueryBuilder.expressionMap.aliases.some(alias => alias.name === nextAlias)) {\n selectQueryBuilder[joinType](`${currentAlias}.${column}`, nextAlias)\n }\n if (selectField && columns.at(-1) == column /* 최종 alias만 추가 */) {\n selectQueryBuilder.addSelect(`${nextAlias}.${columnName}`, `${nextAlias}_${columnName}`)\n }\n\n currentAlias = nextAlias\n currentMetadata = relation.inverseEntityMetadata\n }\n\n return currentAlias\n}\n\n/**\n * Generates the SQL clause and parameters based on the provided filter.\n *\n * @param field - The database field to filter on.\n * @param name - The name of the filter.\n * @param operator - The operator to use in the filter.\n * @param value - The value to filter with.\n * @returns An object containing the SQL clause and the parameters.\n */\nfunction getClauseAndParameters(\n field: string,\n name: string,\n operator: string,\n value: any\n): { clause: string; parameters: { [key: string]: any } } {\n const values = value instanceof Array ? value : [value]\n let clause = ''\n let parameters: { [key: string]: any } = {}\n\n switch (operator) {\n case 'eq':\n clause = `${field} = :${name}`\n parameters = { [name]: value }\n break\n case 'like':\n clause = `${field} LIKE :${name}`\n parameters = { [name]: `%${value}%` }\n break\n case 'search':\n case 'i_like':\n clause = `LOWER(${field}) LIKE :${name}`\n parameters = { [name]: `%${String(value).toLowerCase()}%` }\n break\n case 'nlike':\n clause = `${field} NOT LIKE :${name}`\n parameters = { [name]: `%${value}%` }\n break\n case 'i_nlike':\n clause = `LOWER(${field}) NOT LIKE :${name}`\n parameters = { [name]: `%${String(value).toLowerCase()}%` }\n break\n case 'lt':\n clause = `${field} < :${name}`\n parameters = { [name]: value }\n break\n case 'gt':\n clause = `${field} > :${name}`\n parameters = { [name]: value }\n break\n case 'lte':\n clause = `${field} <= :${name}`\n parameters = { [name]: value }\n break\n case 'gte':\n clause = `${field} >= :${name}`\n parameters = { [name]: value }\n break\n case 'noteq':\n clause = `${field} != :${name}`\n parameters = { [name]: value }\n break\n case 'in':\n clause = `${field} IN (:...${name})`\n parameters = { [name]: values }\n break\n case 'notin':\n clause = `${field} NOT IN (:...${name})`\n parameters = { [name]: values }\n break\n case 'notin_with_null':\n clause = `${field} IS NULL OR ${field} NOT IN (:...${name})`\n parameters = { [name]: values }\n break\n case 'is_null':\n clause = `${field} IS NULL`\n break\n case 'is_not_null':\n clause = `${field} IS NOT NULL`\n break\n case 'is_false':\n clause = `${field} IS FALSE`\n break\n case 'is_true':\n clause = `${field} IS TRUE`\n break\n case 'is_not_false':\n clause = `${field} IS NOT FALSE`\n break\n case 'is_not_true':\n clause = `${field} IS NOT TRUE`\n break\n case 'is_present':\n clause = `${field} IS PRESENT`\n break\n case 'is_blank':\n clause = `${field} IS BLANK`\n break\n case 'is_empty_num_id':\n clause = `${field} IS EMPTY NUMERIC ID`\n break\n case 'between':\n clause = `${field} BETWEEN :${name}_1 AND :${name}_2`\n parameters = { [`${name}_1`]: values[0], [`${name}_2`]: values[1] }\n break\n }\n\n return { clause, parameters }\n}\n"]}
@@ -47,7 +47,7 @@ async function getTimesForPeriod(period, options = {}, context) {
47
47
  return { from, to };
48
48
  }
49
49
  else if (period == 'date range') {
50
- const [fromDate, toDate] = (options === null || options === void 0 ? void 0 : options.date) || [
50
+ const [fromDate, toDate] = options?.date || [
51
51
  theDate.clone().startOf('month').format('YYYY-MM-DD'),
52
52
  theDate.clone().format('YYYY-MM-DD')
53
53
  ];
@@ -56,7 +56,7 @@ async function getTimesForPeriod(period, options = {}, context) {
56
56
  return { from, to };
57
57
  }
58
58
  else if (period == 'month') {
59
- const monthString = (options === null || options === void 0 ? void 0 : options.month) || theDate.clone().startOf('month').format('YYYY-MM');
59
+ const monthString = options?.month || theDate.clone().startOf('month').format('YYYY-MM');
60
60
  const [year, month] = monthString.split('-').map(Number);
61
61
  const from = moment_timezone_1.default
62
62
  .tz({ year, month: month - 1, day: 1 }, domain.timezone)
@@ -1 +1 @@
1
- {"version":3,"file":"get-times-for-period.js","sourceRoot":"","sources":["../../server/utils/get-times-for-period.ts"],"names":[],"mappings":"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","sourcesContent":["import moment from 'moment-timezone'\n\n/**\n * Get the time range for the specified period relative to the current moment in a specific domain's timezone.\n *\n * @param {('today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month')} period - The time period to calculate the range for.\n * Valid options are 'today', 'this month', '30 days', 'this year', '12 months', 'date range', and 'month'.\n * @param {Object} [options] - Optional parameters for 'date range' and 'month' periods.\n * @param {string[]} [options.date] - The start date and end date for the 'date range' period.\n * @param {string} [options.month] - The month for the 'month' period in 'YYYY-MM' format.\n * @param {Object} context - The context object containing domain information.\n * @param {Object} context.state - The state object containing domain information.\n * @param {Object} context.state.domain - The domain object containing timezone information.\n * @param {string} context.state.domain.timezone - The timezone of the domain.\n * @returns {Promise<{ from: string; to: string }>} - A Promise that resolves to an object containing 'from' and 'to' ISO date strings representing the time range.\n */\nexport async function getTimesForPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month',\n options: { date?: string[]; month?: string } = {},\n context: any\n): Promise<{ from: string; to: string }> {\n const { domain } = context.state\n const theDate = moment.tz(new Date(), domain.timezone)\n\n if (period == 'today') {\n const from = theDate.clone().format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'day').startOf('day').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'this month') {\n const from = theDate.clone().startOf('month').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'month').startOf('month').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == '30 days') {\n const from = theDate.clone().subtract(30, 'day').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'day').startOf('day').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'this year') {\n const from = theDate.clone().startOf('year').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'year').startOf('year').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == '12 months') {\n const from = theDate.clone().subtract(12, 'month').startOf('month').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'month').startOf('month').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'date range') {\n const [fromDate, toDate] = options?.date || [\n theDate.clone().startOf('month').format('YYYY-MM-DD'),\n theDate.clone().format('YYYY-MM-DD')\n ]\n\n const from = moment.tz(fromDate, domain.timezone).startOf('day').format('YYYY-MM-DD')\n const to = moment.tz(toDate, domain.timezone).add(1, 'day').startOf('day').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'month') {\n const monthString = options?.month || theDate.clone().startOf('month').format('YYYY-MM')\n\n const [year, month] = monthString.split('-').map(Number)\n const from = moment\n .tz({ year, month: month - 1, day: 1 }, domain.timezone)\n .startOf('month')\n .format('YYYY-MM-DD')\n const to = moment\n .tz({ year, month: month - 1, day: 1 }, domain.timezone)\n .add(1, 'month')\n .startOf('month')\n .format('YYYY-MM-DD')\n\n return { from, to }\n }\n}\n\n/**\n * Get the ISO date strings for the specified period relative to the current moment in a specific domain's timezone.\n *\n * @param {('today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month')} period - The time period to calculate the range for.\n * Valid options are 'today', 'this month', '30 days', 'this year', '12 months', 'date range', and 'month'.\n * @param {Object} [options] - Optional parameters for 'date range' and 'month' periods.\n * @param {string[]} [options.date] - The start date and end date for the 'date range' period.\n * @param {string} [options.month] - The month for the 'month' period in 'YYYY-MM' format.\n * @param {Object} context - The context object containing domain information.\n * @param {Object} context.state - The state object containing domain information.\n * @param {Object} context.state.domain - The domain object containing timezone information.\n * @param {string} context.state.domain.timezone - The timezone of the domain.\n * @returns {Promise<{ from: string; to: string }>} - A Promise that resolves to an object containing 'from' and 'to' ISO date strings representing the time range.\n */\nexport async function getISOStringsForPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month',\n options: { date?: string[]; month?: string } = {},\n context: any\n): Promise<{ from: string; to: string }> {\n const { domain } = context.state\n const { from, to } = await getTimesForPeriod(period, options, context)\n\n return {\n from: moment.tz(from, domain.timezone).toISOString(),\n to: moment.tz(to, domain.timezone).toISOString()\n }\n}\n"]}
1
+ {"version":3,"file":"get-times-for-period.js","sourceRoot":"","sources":["../../server/utils/get-times-for-period.ts"],"names":[],"mappings":"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","sourcesContent":["import moment from 'moment-timezone'\n\n/**\n * Get the time range for the specified period relative to the current moment in a specific domain's timezone.\n *\n * @param {('today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month')} period - The time period to calculate the range for.\n * Valid options are 'today', 'this month', '30 days', 'this year', '12 months', 'date range', and 'month'.\n * @param {Object} [options] - Optional parameters for 'date range' and 'month' periods.\n * @param {string[]} [options.date] - The start date and end date for the 'date range' period.\n * @param {string} [options.month] - The month for the 'month' period in 'YYYY-MM' format.\n * @param {Object} context - The context object containing domain information.\n * @param {Object} context.state - The state object containing domain information.\n * @param {Object} context.state.domain - The domain object containing timezone information.\n * @param {string} context.state.domain.timezone - The timezone of the domain.\n * @returns {Promise<{ from: string; to: string }>} - A Promise that resolves to an object containing 'from' and 'to' ISO date strings representing the time range.\n */\nexport async function getTimesForPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month',\n options: { date?: string[]; month?: string } = {},\n context: any\n): Promise<{ from: string; to: string }> {\n const { domain } = context.state\n const theDate = moment.tz(new Date(), domain.timezone)\n\n if (period == 'today') {\n const from = theDate.clone().format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'day').startOf('day').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'this month') {\n const from = theDate.clone().startOf('month').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'month').startOf('month').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == '30 days') {\n const from = theDate.clone().subtract(30, 'day').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'day').startOf('day').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'this year') {\n const from = theDate.clone().startOf('year').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'year').startOf('year').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == '12 months') {\n const from = theDate.clone().subtract(12, 'month').startOf('month').format('YYYY-MM-DD')\n const to = theDate.clone().add(1, 'month').startOf('month').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'date range') {\n const [fromDate, toDate] = options?.date || [\n theDate.clone().startOf('month').format('YYYY-MM-DD'),\n theDate.clone().format('YYYY-MM-DD')\n ]\n\n const from = moment.tz(fromDate, domain.timezone).startOf('day').format('YYYY-MM-DD')\n const to = moment.tz(toDate, domain.timezone).add(1, 'day').startOf('day').format('YYYY-MM-DD')\n\n return { from, to }\n } else if (period == 'month') {\n const monthString = options?.month || theDate.clone().startOf('month').format('YYYY-MM')\n\n const [year, month] = monthString.split('-').map(Number)\n const from = moment\n .tz({ year, month: month - 1, day: 1 }, domain.timezone)\n .startOf('month')\n .format('YYYY-MM-DD')\n const to = moment\n .tz({ year, month: month - 1, day: 1 }, domain.timezone)\n .add(1, 'month')\n .startOf('month')\n .format('YYYY-MM-DD')\n\n return { from, to }\n }\n}\n\n/**\n * Get the ISO date strings for the specified period relative to the current moment in a specific domain's timezone.\n *\n * @param {('today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month')} period - The time period to calculate the range for.\n * Valid options are 'today', 'this month', '30 days', 'this year', '12 months', 'date range', and 'month'.\n * @param {Object} [options] - Optional parameters for 'date range' and 'month' periods.\n * @param {string[]} [options.date] - The start date and end date for the 'date range' period.\n * @param {string} [options.month] - The month for the 'month' period in 'YYYY-MM' format.\n * @param {Object} context - The context object containing domain information.\n * @param {Object} context.state - The state object containing domain information.\n * @param {Object} context.state.domain - The domain object containing timezone information.\n * @param {string} context.state.domain.timezone - The timezone of the domain.\n * @returns {Promise<{ from: string; to: string }>} - A Promise that resolves to an object containing 'from' and 'to' ISO date strings representing the time range.\n */\nexport async function getISOStringsForPeriod(\n period: 'today' | 'this month' | '30 days' | 'this year' | '12 months' | 'date range' | 'month',\n options: { date?: string[]; month?: string } = {},\n context: any\n): Promise<{ from: string; to: string }> {\n const { domain } = context.state\n const { from, to } = await getTimesForPeriod(period, options, context)\n\n return {\n from: moment.tz(from, domain.timezone).toISOString(),\n to: moment.tz(to, domain.timezone).toISOString()\n }\n}\n"]}
@@ -83,7 +83,7 @@ function makeSortingParams(sortings) {
83
83
  */
84
84
  function makeFilterParams(filters, searchables) {
85
85
  /* for where AND clauses */
86
- const columnFilters = (filters === null || filters === void 0 ? void 0 : filters.filter(filter => {
86
+ const columnFilters = filters?.filter(filter => {
87
87
  if (filter.operator === 'search') {
88
88
  return false;
89
89
  }
@@ -91,9 +91,9 @@ function makeFilterParams(filters, searchables) {
91
91
  return false;
92
92
  }
93
93
  return true;
94
- })) || [];
94
+ }) || [];
95
95
  const searchFilters = searchables instanceof Array
96
- ? (filters === null || filters === void 0 ? void 0 : filters.filter(filter => {
96
+ ? filters?.filter(filter => {
97
97
  if (filter.operator !== 'search') {
98
98
  return false;
99
99
  }
@@ -102,7 +102,7 @@ function makeFilterParams(filters, searchables) {
102
102
  return false;
103
103
  }
104
104
  return true;
105
- })) || []
105
+ }) || []
106
106
  : [];
107
107
  const columnWhere = columnFilters.reduce((where, f) => {
108
108
  where[f.name] = getOperatorFunction(f);
@@ -115,7 +115,10 @@ function makeFilterParams(filters, searchables) {
115
115
  }
116
116
  /* for fulltext searching ... OR-AND composition */
117
117
  const searchWheres = searchFilters.map(f => {
118
- return Object.assign({ [f.name]: getOperatorFunction(f) }, columnWhere);
118
+ return {
119
+ [f.name]: getOperatorFunction(f),
120
+ ...columnWhere
121
+ };
119
122
  });
120
123
  return {
121
124
  where: searchWheres
@@ -135,7 +138,7 @@ function convertListParams(params, options) {
135
138
  }
136
139
  else {
137
140
  var { domain, searchables } = options;
138
- var domainId = typeof domain === 'string' ? domain : domain === null || domain === void 0 ? void 0 : domain.id;
141
+ var domainId = typeof domain === 'string' ? domain : domain?.id;
139
142
  }
140
143
  }
141
144
  var { pagination, filters = [], sortings } = params;
@@ -1 +1 @@
1
- {"version":3,"file":"list-params-converter.js","sourceRoot":"","sources":["../../server/utils/list-params-converter.ts"],"names":[],"mappings":";;AAgKA,8CA6CC;AA7MD,qCAAyF;AAIzF,qEAAwD;AAExD,MAAM,sBAAsB,GAA8D;IACxF,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,eAAK,EAAC,KAAK,CAAC;IAC7B,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,eAAK,EAAC,KAAK,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,aAAG,EAAC,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC;IACjC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,cAAI,EAAC,KAAK,CAAC;IAC1B,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,eAAK,EAAC,KAAK,CAAC;IAC7B,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,aAAG,EAAC,IAAA,cAAI,EAAC,KAAK,CAAC,CAAC;IAChC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,aAAG,EAAC,IAAA,eAAK,EAAC,KAAK,CAAC,CAAC;IACnC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,aAAG,EAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,MAAM,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAChG,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,aAAG,EAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,MAAM,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAChG,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,aAAG,EAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAClG,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,aAAG,EAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAClG,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,YAAE,EAAC,KAAK,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,aAAG,EAAC,IAAA,YAAE,EAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAA,gBAAM,GAAE;IACvB,WAAW,EAAE,GAAG,EAAE,CAAC,IAAA,aAAG,EAAC,IAAA,gBAAM,GAAE,CAAC;IAChC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,aAAG,EAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,WAAW,CAAC;IACjD,OAAO,EAAE,GAAG,EAAE,CAAC,IAAA,aAAG,EAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,UAAU,CAAC;IAC/C,WAAW,EAAE,GAAG,EAAE,CAAC,IAAA,aAAG,EAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,cAAc,CAAC;IACvD,UAAU,EAAE,GAAG,EAAE,CAAC,IAAA,aAAG,EAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,aAAa,CAAC;IACrD,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAA,aAAG,EAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,WAAW,CAAC;IACjD,eAAe,EAAE,GAAG,EAAE,CAAC,IAAA,aAAG,EAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,sBAAsB,CAAC;IACnE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,IAAA,iBAAO,EAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;CAC9C,CAAA;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAU;IACtD,OAAO,sBAAsB,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAA;AAChD,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,UAAsB;IAClD,IAAI,MAAM,GAAG,EAAsC,CAAA;IACnD,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,EAAE,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,UAAU,CAAA;QACxC,IAAI,IAAI,GAAG,CAAC,CAAA;QACZ,IAAI,IAAI,GAAG,CAAC,CAAA;QAEZ,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAA;YACpC,IAAI,GAAG,KAAK,CAAA;YACZ,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;gBACpB,IAAI;gBACJ,IAAI;aACL,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,QAAmB;IAC5C,IAAI,MAAM,GAAG,EAAoD,CAAA;IACjE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,KAAK,GAAG,EAAwC,CAAA;QACpD,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACnB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;QACzC,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;YACpB,KAAK;SACN,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CACvB,OAAiB,EACjB,WAAsB;IAItB,2BAA2B;IAC3B,MAAM,aAAa,GACjB,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC,MAAM,CAAC,EAAE;QACvB,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC3G,OAAO,KAAK,CAAA;QACd,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAC,KAAI,EAAE,CAAA;IAEV,MAAM,aAAa,GACjB,WAAW,YAAY,KAAK;QAC1B,CAAC,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC,MAAM,CAAC,EAAE;YACvB,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACjC,OAAO,KAAK,CAAA;YACd,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,OAAO,CAAC,IAAI,CACV,sFAAsF,EACtF,MAAM,CAAC,IAAI,CACZ,CAAA;gBACD,OAAO,KAAK,CAAA;YACd,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,KAAI,EAAE;QACV,CAAC,CAAC,EAAE,CAAA;IAER,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CACtC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACX,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAA;QACtC,OAAO,KAAK,CAAA;IACd,CAAC,EACD,EAA2C,CAC5C,CAAA;IAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,KAAK,EAAE,WAAW;SACnB,CAAA;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACzC,uBACE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAC7B,WAAW,EACf;IACH,CAAC,CAAC,CAAA;IAEF,OAAO;QACL,KAAK,EAAE,YAAY;KACpB,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC/B,MAAiB,EACjB,OAKK;IASL,IAAI,QAA4B,CAAA;IAEhC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YACjD,IAAI,QAAQ,GAAG,OAAO,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;YACrC,IAAI,QAAQ,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,EAAE,CAAA;QACjE,CAAC;IACH,CAAC;IAED,IAAI,EAAE,UAAU,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAA;IACnD,IAAI,MAAM,GAAG,EAAE,CAAA;IAEf,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,GAAG,IAAA,sCAAa,EAAC,OAAO,EAAE;YAC/B;gBACE,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,QAAQ;aAChB;SACF,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,UAAU;QAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAA;IACvE,IAAI,QAAQ;QAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAA;IAChE,IAAI,OAAO;QAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAA;IAE1E,OAAO,MAAM,CAAA;AACf,CAAC","sourcesContent":["import { Between, Equal, FindOperator, ILike, In, IsNull, Like, Not, Raw } from 'typeorm'\n\nimport { Filter, ListParam, Pagination, Sorting } from '../service/common-types/list-param.js'\nimport { Domain } from '../service/domain/domain.js'\nimport { adjustFilters } from './list-param-adjuster.js'\n\nconst OPERATION_FUNCTION_MAP: { [operator: string]: (value: any) => FindOperator<any> } = {\n search: value => ILike(value),\n eq: value => Equal(value),\n noteq: value => Not(Equal(value)),\n like: value => Like(value),\n i_like: value => ILike(value),\n nlike: value => Not(Like(value)),\n i_nlike: value => Not(ILike(value)),\n lt: value => Raw(alias => `${alias} < ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gt: value => Raw(alias => `${alias} > ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n lte: value => Raw(alias => `${alias} <= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gte: value => Raw(alias => `${alias} >= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n in: value => In(value),\n notin: value => Not(In(value)),\n is_null: () => IsNull(),\n is_not_null: () => Not(IsNull()),\n is_false: () => Raw(alias => `${alias} IS FALSE`),\n in_true: () => Raw(alias => `${alias} IS TRUE`),\n is_not_true: () => Raw(alias => `${alias} IS NOT TRUE`),\n is_present: () => Raw(alias => `${alias} IS PRESENT`),\n is_blank: () => Raw(alias => `${alias} IS BLANK`),\n is_empty_num_id: () => Raw(alias => `${alias} IS EMPTY NUMERIC ID`),\n between: value => Between(value[0], value[1])\n}\n\n/**\n * Get the TypeORM FindOperator function for a given filter.\n * @param {Filter} filter - The filter object containing operator and value.\n * @returns {FindOperator<any>} - The corresponding FindOperator function.\n */\nfunction getOperatorFunction({ operator, value }: Filter): FindOperator<any> {\n return OPERATION_FUNCTION_MAP[operator](value)\n}\n\n/**\n * Create pagination parameters for a TypeORM query.\n * @param {Pagination} pagination - The pagination object.\n * @returns {{ skip?: number; take?: number }} - The pagination parameters.\n */\nfunction makePaginationParams(pagination: Pagination): { skip?: number; take?: number } {\n var result = {} as { skip?: number; take?: number }\n if (pagination) {\n var { page = 0, limit = 0 } = pagination\n var skip = 0\n var take = 0\n\n if (limit > 0) {\n skip = Math.max(page - 1, 0) * limit\n take = limit\n Object.assign(result, {\n skip,\n take\n })\n }\n }\n\n return result\n}\n\n/**\n * Create sorting parameters for a TypeORM query.\n * @param {Sorting[]} sortings - The array of sorting objects.\n * @returns {{ order?: { [name: string]: 'DESC' | 'ASC' } }} - The sorting parameters.\n */\nfunction makeSortingParams(sortings: Sorting[]): { order?: { [name: string]: 'DESC' | 'ASC' } } {\n var result = {} as { order?: { [name: string]: 'DESC' | 'ASC' } }\n if (sortings) {\n var order = {} as { [name: string]: 'DESC' | 'ASC' }\n sortings.forEach(s => {\n order[s.name] = s.desc ? 'DESC' : 'ASC'\n })\n\n Object.assign(result, {\n order\n })\n }\n\n return result\n}\n\n/**\n * Create filter parameters for a TypeORM query.\n * @param {Filter[]} filters - The array of filter objects.\n * @param {string[]} searchables - The array of searchable field names.\n * @returns {{ where: { [name: string]: FindOperator<any> } | { [name: string]: FindOperator<any> }[] }} - The filter parameters.\n */\nfunction makeFilterParams(\n filters: Filter[],\n searchables?: string[]\n): {\n where: { [name: string]: FindOperator<any> } | { [name: string]: FindOperator<any> }[]\n} {\n /* for where AND clauses */\n const columnFilters =\n filters?.filter(filter => {\n if (filter.operator === 'search') {\n return false\n }\n if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {\n return false\n }\n return true\n }) || []\n\n const searchFilters =\n searchables instanceof Array\n ? filters?.filter(filter => {\n if (filter.operator !== 'search') {\n return false\n }\n if (!searchables.includes(filter.name)) {\n console.warn(\n '\"searchables\" setting is required for like searches with a heavy database query load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n : []\n\n const columnWhere = columnFilters.reduce(\n (where, f) => {\n where[f.name] = getOperatorFunction(f)\n return where\n },\n {} as { [name: string]: FindOperator<any> }\n )\n\n if (searchFilters.length === 0) {\n return {\n where: columnWhere\n }\n }\n\n /* for fulltext searching ... OR-AND composition */\n const searchWheres = searchFilters.map(f => {\n return {\n [f.name]: getOperatorFunction(f),\n ...columnWhere\n }\n })\n\n return {\n where: searchWheres\n }\n}\n\n/**\n * Convert ListParam object to TypeORM query parameters.\n * @param {ListParam} params - The ListParam object containing pagination, sorting, and filtering options.\n * @param {string | { domain?: string | Domain; searchables?: string[] }} options - Optional domain and searchables parameters.\n * @returns {{ where?: { [name: string]: FindOperator<any> }; order?: { [name: string]: 'DESC' | 'ASC' }; skip?: number; take?: number }} - The TypeORM query parameters.\n */\nexport function convertListParams(\n params: ListParam,\n options?:\n | string\n | {\n domain?: string | Domain\n searchables?: string[]\n }\n): {\n where?: { [name: string]: FindOperator<any> }\n order?: {\n [name: string]: 'DESC' | 'ASC'\n }\n skip?: number\n take?: number\n} {\n var domainId: string | undefined\n\n if (options) {\n if (typeof options === 'string' /* for 하위 호환성 */) {\n var domainId = options\n } else {\n var { domain, searchables } = options\n var domainId = typeof domain === 'string' ? domain : domain?.id\n }\n }\n\n var { pagination, filters = [], sortings } = params\n var result = {}\n\n if (domainId) {\n filters = adjustFilters(filters, [\n {\n name: 'domain',\n operator: 'eq',\n value: domainId\n }\n ])\n }\n\n if (pagination) Object.assign(result, makePaginationParams(pagination))\n if (sortings) Object.assign(result, makeSortingParams(sortings))\n if (filters) Object.assign(result, makeFilterParams(filters, searchables))\n\n return result\n}\n"]}
1
+ {"version":3,"file":"list-params-converter.js","sourceRoot":"","sources":["../../server/utils/list-params-converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Between, Equal, FindOperator, ILike, In, IsNull, Like, Not, Raw } from 'typeorm'\n\nimport { Filter, ListParam, Pagination, Sorting } from '../service/common-types/list-param.js'\nimport { Domain } from '../service/domain/domain.js'\nimport { adjustFilters } from './list-param-adjuster.js'\n\nconst OPERATION_FUNCTION_MAP: { [operator: string]: (value: any) => FindOperator<any> } = {\n search: value => ILike(value),\n eq: value => Equal(value),\n noteq: value => Not(Equal(value)),\n like: value => Like(value),\n i_like: value => ILike(value),\n nlike: value => Not(Like(value)),\n i_nlike: value => Not(ILike(value)),\n lt: value => Raw(alias => `${alias} < ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gt: value => Raw(alias => `${alias} > ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n lte: value => Raw(alias => `${alias} <= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n gte: value => Raw(alias => `${alias} >= ${typeof value === 'string' ? \"'\" + value + \"'\" : value}`),\n in: value => In(value),\n notin: value => Not(In(value)),\n is_null: () => IsNull(),\n is_not_null: () => Not(IsNull()),\n is_false: () => Raw(alias => `${alias} IS FALSE`),\n in_true: () => Raw(alias => `${alias} IS TRUE`),\n is_not_true: () => Raw(alias => `${alias} IS NOT TRUE`),\n is_present: () => Raw(alias => `${alias} IS PRESENT`),\n is_blank: () => Raw(alias => `${alias} IS BLANK`),\n is_empty_num_id: () => Raw(alias => `${alias} IS EMPTY NUMERIC ID`),\n between: value => Between(value[0], value[1])\n}\n\n/**\n * Get the TypeORM FindOperator function for a given filter.\n * @param {Filter} filter - The filter object containing operator and value.\n * @returns {FindOperator<any>} - The corresponding FindOperator function.\n */\nfunction getOperatorFunction({ operator, value }: Filter): FindOperator<any> {\n return OPERATION_FUNCTION_MAP[operator](value)\n}\n\n/**\n * Create pagination parameters for a TypeORM query.\n * @param {Pagination} pagination - The pagination object.\n * @returns {{ skip?: number; take?: number }} - The pagination parameters.\n */\nfunction makePaginationParams(pagination: Pagination): { skip?: number; take?: number } {\n var result = {} as { skip?: number; take?: number }\n if (pagination) {\n var { page = 0, limit = 0 } = pagination\n var skip = 0\n var take = 0\n\n if (limit > 0) {\n skip = Math.max(page - 1, 0) * limit\n take = limit\n Object.assign(result, {\n skip,\n take\n })\n }\n }\n\n return result\n}\n\n/**\n * Create sorting parameters for a TypeORM query.\n * @param {Sorting[]} sortings - The array of sorting objects.\n * @returns {{ order?: { [name: string]: 'DESC' | 'ASC' } }} - The sorting parameters.\n */\nfunction makeSortingParams(sortings: Sorting[]): { order?: { [name: string]: 'DESC' | 'ASC' } } {\n var result = {} as { order?: { [name: string]: 'DESC' | 'ASC' } }\n if (sortings) {\n var order = {} as { [name: string]: 'DESC' | 'ASC' }\n sortings.forEach(s => {\n order[s.name] = s.desc ? 'DESC' : 'ASC'\n })\n\n Object.assign(result, {\n order\n })\n }\n\n return result\n}\n\n/**\n * Create filter parameters for a TypeORM query.\n * @param {Filter[]} filters - The array of filter objects.\n * @param {string[]} searchables - The array of searchable field names.\n * @returns {{ where: { [name: string]: FindOperator<any> } | { [name: string]: FindOperator<any> }[] }} - The filter parameters.\n */\nfunction makeFilterParams(\n filters: Filter[],\n searchables?: string[]\n): {\n where: { [name: string]: FindOperator<any> } | { [name: string]: FindOperator<any> }[]\n} {\n /* for where AND clauses */\n const columnFilters =\n filters?.filter(filter => {\n if (filter.operator === 'search') {\n return false\n }\n if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {\n return false\n }\n return true\n }) || []\n\n const searchFilters =\n searchables instanceof Array\n ? filters?.filter(filter => {\n if (filter.operator !== 'search') {\n return false\n }\n if (!searchables.includes(filter.name)) {\n console.warn(\n '\"searchables\" setting is required for like searches with a heavy database query load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n : []\n\n const columnWhere = columnFilters.reduce(\n (where, f) => {\n where[f.name] = getOperatorFunction(f)\n return where\n },\n {} as { [name: string]: FindOperator<any> }\n )\n\n if (searchFilters.length === 0) {\n return {\n where: columnWhere\n }\n }\n\n /* for fulltext searching ... OR-AND composition */\n const searchWheres = searchFilters.map(f => {\n return {\n [f.name]: getOperatorFunction(f),\n ...columnWhere\n }\n })\n\n return {\n where: searchWheres\n }\n}\n\n/**\n * Convert ListParam object to TypeORM query parameters.\n * @param {ListParam} params - The ListParam object containing pagination, sorting, and filtering options.\n * @param {string | { domain?: string | Domain; searchables?: string[] }} options - Optional domain and searchables parameters.\n * @returns {{ where?: { [name: string]: FindOperator<any> }; order?: { [name: string]: 'DESC' | 'ASC' }; skip?: number; take?: number }} - The TypeORM query parameters.\n */\nexport function convertListParams(\n params: ListParam,\n options?:\n | string\n | {\n domain?: string | Domain\n searchables?: string[]\n }\n): {\n where?: { [name: string]: FindOperator<any> }\n order?: {\n [name: string]: 'DESC' | 'ASC'\n }\n skip?: number\n take?: number\n} {\n var domainId: string | undefined\n\n if (options) {\n if (typeof options === 'string' /* for 하위 호환성 */) {\n var domainId = options\n } else {\n var { domain, searchables } = options\n var domainId = typeof domain === 'string' ? domain : domain?.id\n }\n }\n\n var { pagination, filters = [], sortings } = params\n var result = {}\n\n if (domainId) {\n filters = adjustFilters(filters, [\n {\n name: 'domain',\n operator: 'eq',\n value: domainId\n }\n ])\n }\n\n if (pagination) Object.assign(result, makePaginationParams(pagination))\n if (sortings) Object.assign(result, makeSortingParams(sortings))\n if (filters) Object.assign(result, makeFilterParams(filters, searchables))\n\n return result\n}\n"]}
@@ -17,14 +17,13 @@ const list_param_js_1 = require("../service/common-types/list-param.js");
17
17
  * @param {string[]} options.searchables - An array of searchable field names.
18
18
  */
19
19
  const buildQuery = function (queryBuilder, params, context, options) {
20
- var _a, _b;
21
20
  /* default value of domainRef is 'true' */
22
21
  var domainRef = typeof options === 'boolean' ? options : true;
23
22
  /* for backwards compatibility of function spec */
24
23
  if (typeof options === 'object') {
25
24
  var { domainRef = true, searchables } = options;
26
25
  }
27
- const columnFilters = ((_a = params.filters) === null || _a === void 0 ? void 0 : _a.filter(filter => {
26
+ const columnFilters = params.filters?.filter(filter => {
28
27
  if (filter.operator === 'search') {
29
28
  return false;
30
29
  }
@@ -33,9 +32,9 @@ const buildQuery = function (queryBuilder, params, context, options) {
33
32
  return false;
34
33
  }
35
34
  return true;
36
- })) || [];
35
+ }) || [];
37
36
  const searchFilters = searchables instanceof Array
38
- ? ((_b = params.filters) === null || _b === void 0 ? void 0 : _b.filter(filter => {
37
+ ? params.filters?.filter(filter => {
39
38
  if (filter.operator !== 'search') {
40
39
  return false;
41
40
  }
@@ -44,17 +43,17 @@ const buildQuery = function (queryBuilder, params, context, options) {
44
43
  return false;
45
44
  }
46
45
  return true;
47
- })) || []
46
+ }) || []
48
47
  : [];
49
48
  const pagination = params.pagination;
50
49
  const sortings = params.sortings;
51
- const domain = context === null || context === void 0 ? void 0 : context.state.domain;
50
+ const domain = context?.state.domain;
52
51
  if (columnFilters && columnFilters.length > 0) {
53
52
  columnFilters.forEach(filter => {
54
53
  const condition = (0, condition_builder_js_1.buildCondition)(queryBuilder.alias, filter.name, filter.operator, filter.value, filter.relation, Object.keys(queryBuilder.getParameters()).length);
55
- if (condition === null || condition === void 0 ? void 0 : condition.clause)
54
+ if (condition?.clause)
56
55
  queryBuilder.andWhere(condition.clause);
57
- if (condition === null || condition === void 0 ? void 0 : condition.parameters)
56
+ if (condition?.parameters)
58
57
  queryBuilder.setParameters(condition.parameters);
59
58
  });
60
59
  }
@@ -68,7 +67,7 @@ const buildQuery = function (queryBuilder, params, context, options) {
68
67
  }));
69
68
  }
70
69
  if (domainRef) {
71
- const inherited = (params === null || params === void 0 ? void 0 : params.inherited) || list_param_js_1.InheritedValueType.None;
70
+ const inherited = params?.inherited || list_param_js_1.InheritedValueType.None;
72
71
  if (!inherited || inherited == list_param_js_1.InheritedValueType.None) {
73
72
  queryBuilder.andWhere(`${queryBuilder.alias}.domain = :domain`, { domain: domain.id });
74
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"list-query-builder.js","sourceRoot":"","sources":["../../server/utils/list-query-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { Brackets } from 'typeorm'\n\nimport { buildCondition } from './condition-builder.js'\nimport { Filter, ListParam, InheritedValueType } from '../service/common-types/list-param.js'\n\n/**\n * @deprecated This function is recommended to be replaced with the `getQueryBuilderFromListParams` function.\n *\n * Builds a TypeORM query using the provided parameters to filter, paginate, and sort the data.\n *\n * @param {QueryBuilder} queryBuilder - The TypeORM query builder to build the query on.\n * @param {ListParam} params - The list parameters to apply to the query.\n * @param {Object} context - The context object, typically containing information about the user's domain.\n * @param {boolean|Object} options - Additional options for the query builder.\n * @param {boolean} options.domainRef - Indicates whether to include domain reference in the query.\n * @param {string[]} options.searchables - An array of searchable field names.\n */\nexport const buildQuery = function (\n queryBuilder: any,\n params: ListParam,\n context: any,\n options?:\n | boolean\n | {\n domainRef?: boolean\n searchables?: string[]\n }\n) {\n /* default value of domainRef is 'true' */\n var domainRef = typeof options === 'boolean' ? options : true\n\n /* for backwards compatibility of function spec */\n if (typeof options === 'object') {\n var { domainRef = true, searchables } = options\n }\n\n const columnFilters: Filter[] =\n params.filters?.filter(filter => {\n if (filter.operator === 'search') {\n return false\n }\n if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {\n console.warn(\n '\"searchables\" setting is required for like searches with a heavy database query load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n\n const searchFilters =\n searchables instanceof Array\n ? params.filters?.filter(filter => {\n if (filter.operator !== 'search') {\n return false\n }\n if (!searchables.includes(filter.name)) {\n console.warn(\n '\"searchables\" setting is required for like searches with a heavy database query load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n : []\n\n const pagination = params.pagination\n const sortings = params.sortings\n const domain = context?.state.domain\n\n if (columnFilters && columnFilters.length > 0) {\n columnFilters.forEach(filter => {\n const condition = buildCondition(\n queryBuilder.alias,\n filter.name,\n filter.operator,\n filter.value,\n filter.relation,\n Object.keys(queryBuilder.getParameters()).length\n )\n\n if (condition?.clause) queryBuilder.andWhere(condition.clause)\n if (condition?.parameters) queryBuilder.setParameters(condition.parameters)\n })\n }\n\n if (searchFilters.length > 0) {\n queryBuilder.andWhere(\n new Brackets(qb => {\n searchFilters.forEach((filter, index) => {\n const clause = `${queryBuilder.alias}.${filter.name} LIKE :${filter.name}`\n const parameters = { [filter.name]: filter.value }\n\n index === 0 ? qb.where(clause, parameters) : qb.orWhere(clause, parameters)\n })\n })\n )\n }\n\n if (domainRef) {\n const inherited = params?.inherited || InheritedValueType.None\n\n if (!inherited || inherited == InheritedValueType.None) {\n queryBuilder.andWhere(`${queryBuilder.alias}.domain = :domain`, { domain: domain.id })\n } else if (inherited == InheritedValueType.Include) {\n queryBuilder.andWhere(`${queryBuilder.alias}.domain In(:...domains)`, {\n domains: [domain.id, domain.parentId].filter(Boolean)\n })\n } else if (inherited == InheritedValueType.Only) {\n queryBuilder.andWhere(`${queryBuilder.alias}.domain = :domain`, { domain: domain.parentId || 'Impossible' })\n } else {\n queryBuilder.andWhere(`${queryBuilder.alias}.domain = :domain`, { domain: 'Impossible' })\n }\n }\n\n if (pagination && pagination.page > 0 && pagination.limit > 0) {\n queryBuilder.skip(pagination.limit * (pagination.page - 1))\n queryBuilder.take(pagination.limit)\n }\n\n if (sortings && sortings.length > 0) {\n sortings.forEach((sorting, index) => {\n const sortField = sorting.name.split('.').length > 1 ? sorting.name : `${queryBuilder.alias}.${sorting.name}`\n if (index === 0) {\n queryBuilder.orderBy(sortField, sorting.desc ? 'DESC' : 'ASC')\n } else {\n queryBuilder.addOrderBy(sortField, sorting.desc ? 'DESC' : 'ASC')\n }\n })\n }\n}\n"]}
1
+ {"version":3,"file":"list-query-builder.js","sourceRoot":"","sources":["../../server/utils/list-query-builder.ts"],"names":[],"mappings":"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","sourcesContent":["import { Brackets } from 'typeorm'\n\nimport { buildCondition } from './condition-builder.js'\nimport { Filter, ListParam, InheritedValueType } from '../service/common-types/list-param.js'\n\n/**\n * @deprecated This function is recommended to be replaced with the `getQueryBuilderFromListParams` function.\n *\n * Builds a TypeORM query using the provided parameters to filter, paginate, and sort the data.\n *\n * @param {QueryBuilder} queryBuilder - The TypeORM query builder to build the query on.\n * @param {ListParam} params - The list parameters to apply to the query.\n * @param {Object} context - The context object, typically containing information about the user's domain.\n * @param {boolean|Object} options - Additional options for the query builder.\n * @param {boolean} options.domainRef - Indicates whether to include domain reference in the query.\n * @param {string[]} options.searchables - An array of searchable field names.\n */\nexport const buildQuery = function (\n queryBuilder: any,\n params: ListParam,\n context: any,\n options?:\n | boolean\n | {\n domainRef?: boolean\n searchables?: string[]\n }\n) {\n /* default value of domainRef is 'true' */\n var domainRef = typeof options === 'boolean' ? options : true\n\n /* for backwards compatibility of function spec */\n if (typeof options === 'object') {\n var { domainRef = true, searchables } = options\n }\n\n const columnFilters: Filter[] =\n params.filters?.filter(filter => {\n if (filter.operator === 'search') {\n return false\n }\n if (filter.operator.toLowerCase().includes('like') && (!searchables || !searchables.includes(filter.name))) {\n console.warn(\n '\"searchables\" setting is required for like searches with a heavy database query load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n\n const searchFilters =\n searchables instanceof Array\n ? params.filters?.filter(filter => {\n if (filter.operator !== 'search') {\n return false\n }\n if (!searchables.includes(filter.name)) {\n console.warn(\n '\"searchables\" setting is required for like searches with a heavy database query load',\n filter.name\n )\n return false\n }\n return true\n }) || []\n : []\n\n const pagination = params.pagination\n const sortings = params.sortings\n const domain = context?.state.domain\n\n if (columnFilters && columnFilters.length > 0) {\n columnFilters.forEach(filter => {\n const condition = buildCondition(\n queryBuilder.alias,\n filter.name,\n filter.operator,\n filter.value,\n filter.relation,\n Object.keys(queryBuilder.getParameters()).length\n )\n\n if (condition?.clause) queryBuilder.andWhere(condition.clause)\n if (condition?.parameters) queryBuilder.setParameters(condition.parameters)\n })\n }\n\n if (searchFilters.length > 0) {\n queryBuilder.andWhere(\n new Brackets(qb => {\n searchFilters.forEach((filter, index) => {\n const clause = `${queryBuilder.alias}.${filter.name} LIKE :${filter.name}`\n const parameters = { [filter.name]: filter.value }\n\n index === 0 ? qb.where(clause, parameters) : qb.orWhere(clause, parameters)\n })\n })\n )\n }\n\n if (domainRef) {\n const inherited = params?.inherited || InheritedValueType.None\n\n if (!inherited || inherited == InheritedValueType.None) {\n queryBuilder.andWhere(`${queryBuilder.alias}.domain = :domain`, { domain: domain.id })\n } else if (inherited == InheritedValueType.Include) {\n queryBuilder.andWhere(`${queryBuilder.alias}.domain In(:...domains)`, {\n domains: [domain.id, domain.parentId].filter(Boolean)\n })\n } else if (inherited == InheritedValueType.Only) {\n queryBuilder.andWhere(`${queryBuilder.alias}.domain = :domain`, { domain: domain.parentId || 'Impossible' })\n } else {\n queryBuilder.andWhere(`${queryBuilder.alias}.domain = :domain`, { domain: 'Impossible' })\n }\n }\n\n if (pagination && pagination.page > 0 && pagination.limit > 0) {\n queryBuilder.skip(pagination.limit * (pagination.page - 1))\n queryBuilder.take(pagination.limit)\n }\n\n if (sortings && sortings.length > 0) {\n sortings.forEach((sorting, index) => {\n const sortField = sorting.name.split('.').length > 1 ? sorting.name : `${queryBuilder.alias}.${sorting.name}`\n if (index === 0) {\n queryBuilder.orderBy(sortField, sorting.desc ? 'DESC' : 'ASC')\n } else {\n queryBuilder.addOrderBy(sortField, sorting.desc ? 'DESC' : 'ASC')\n }\n })\n }\n}\n"]}