@infineit-nestjs/services 1.0.26 → 1.0.28

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.
package/package.json CHANGED
@@ -1,7 +1,15 @@
1
1
  {
2
2
  "name": "@infineit-nestjs/services",
3
- "version": "1.0.26",
3
+ "version": "1.0.28",
4
4
  "main": "./dist/cjs/index.js",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/your-org/infineit-nestjs-services.git"
8
+ },
9
+ "bugs": {
10
+ "url": "https://github.com/your-org/infineit-nestjs-services/issues"
11
+ },
12
+ "homepage": "https://github.com/your-org/infineit-nestjs-services#readme",
5
13
  "module": "./dist/es/index.mjs",
6
14
  "exports": {
7
15
  ".": {
@@ -29,16 +37,19 @@
29
37
  "dist/",
30
38
  "README.md",
31
39
  "LICENSE",
32
- "!dist/**/*.map"
40
+ "!dist/**/*.map",
41
+ "!dist/**/*.test.*",
42
+ "!dist/**/*.spec.*"
33
43
  ],
34
44
  "scripts": {
35
45
  "clean": "rimraf types dist lib",
36
46
  "build": "yarn clean && rollup -c",
47
+ "postbuild": "echo '{ \"type\": \"module\" }' > dist/es/package.json",
37
48
  "dev": "concurrently -c blue,red -n tsc,rollup --kill-others \"tsc --watch -p . --preserveWatchOutput\" \"rollup --config --watch --no-watch.clearScreen\""
38
49
  },
39
50
  "dependencies": {
40
- "@infineit-nestjs/types": "1.0.6",
41
- "@infineit-nestjs/utils": "1.0.27",
51
+ "@infineit-nestjs/types": "1.0.7",
52
+ "@infineit-nestjs/utils": "1.0.29",
42
53
  "@infineit/winston-logger": "^1.0.30",
43
54
  "@nestjs/axios": "^4.0.0",
44
55
  "@nestjs/microservices": "^11.1.2",
@@ -98,5 +109,9 @@
98
109
  "publishConfig": {
99
110
  "access": "public"
100
111
  },
101
- "gitHead": "d7b28eee33f964cfa7ab160a6b4cb93601658d3d"
112
+ "engines": {
113
+ "node": ">=18.0.0",
114
+ "npm": ">=9.0.0"
115
+ },
116
+ "gitHead": "5d14ad47ad6686777196145c76cc235743a76632"
102
117
  }
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Argon2Service=void 0;const r=require("tslib"),e=require("@nestjs/common"),t=r.__importStar(require("argon2"));let s=class{constructor(){}async hashPassword(r){try{return await t.hash(r,{type:t.argon2id,hashLength:32,timeCost:3,memoryCost:65536,parallelism:1})}catch(r){throw new Error(`Password hashing failed: ${r instanceof Error?r.message:String(r)}`)}}async verifyPassword(r,e){try{return await t.verify(e,r)}catch(r){throw new Error(`Password verification failed: ${r.message}`)}}};exports.Argon2Service=s,exports.Argon2Service=s=r.__decorate([(0,e.Injectable)(),r.__metadata("design:paramtypes",[])],s);
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.DataTransformerService=void 0;const e=require("tslib"),r=require("worker_threads"),n=require("@nestjs/common");let a=class{async processData(e,r){const n=1e3,a=Math.ceil(e.length/n),t=[],s=[];for(let t=0;t<a;t++){const a=e.slice(t*n,(t+1)*n);s.push(this.processChunkWithWorker(a,r))}return(await Promise.all(s)).forEach((e=>t.push(...e))),t}async processChunkWithWorker(e,n){return new Promise(((a,t)=>{const s=new r.Worker("\n const { parentPort, workerData } = require('worker_threads');\n const { chunk, fieldsToInclude } = workerData;\n\n function transformProcessData(data, fieldsToInclude) {\n return fieldsToInclude.reduce((acc, field) => {\n if (field in data) {\n acc[field] = data[field];\n }\n return acc;\n }, {});\n }\n\n function transformData(chunk, fieldsToInclude) {\n return chunk.map((data) => transformProcessData(data, fieldsToInclude));\n }\n\n const transformedData = transformData(chunk, fieldsToInclude);\n parentPort.postMessage(transformedData);\n\n ",{eval:!0,workerData:{chunk:e,fieldsToInclude:n}});s.on("message",a),s.on("error",t)}))}};exports.DataTransformerService=a,exports.DataTransformerService=a=e.__decorate([(0,n.Injectable)()],a);
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.EntityActionService=void 0;const e=require("tslib"),r=require("@nestjs/common"),t=e.__importDefault(require("p-limit")),i=require("./logger.service"),s=require("./prisma.service");let n=class{constructor(e,r){this.prismaService=e,this.loggerService=r,this.batchSize=parseInt(process.env.BATCH_SIZE??"100",10),this.concurrencyLimit=parseInt(process.env.CONCURRENCY_LIMIT??"3",10)}async handleEntityActions(e,r,i,s){const n=this.capitalize(e),c=(0,t.default)(this.concurrencyLimit);try{const t=[];for(let e=0;e<r.length;e+=this.batchSize){const o=r.slice(e,e+this.batchSize);t.push(c((async()=>{this.loggerService.info(`Processing batch ${e/this.batchSize+1} for ${n}`);return await Promise.all(o.map((async(r,t)=>{const c=e+t;try{r[i.id]=i.value,"edit"===r.action&&(r.id=r[i.id_table_primary_key]);return{success:!0,id_return:(await this.executeQuery(r.action,n,"delete"===r.action?r[i.id_table_primary_key]:r,s[0][r.action])).id_return,data:r,index:c}}catch(e){return this.loggerService.error(`Error in batch operation for ${n}`,{error:e instanceof Error?e:new Error(String(e))}),{success:!1,error:e instanceof Error?e.message:String(e),data:r,index:c,retunrn_entity_name:i.id_return||"unknown_return_entity"}}})))})))}const o=(await Promise.all(t)).flat(),a=o.filter((e=>e.success)),u=o.filter((e=>!e.success));return{entity:e,message:`${n} operations completed.`,success:0===u.length,totalProcessed:r.length,totalFailed:u.length,totalSucceeded:a.length,failedOperations:u,succeededOperations:a}}catch(r){return this.loggerService.error(`Error during ${n} operations`,{error:r instanceof Error?r:new Error(String(r))}),{entity:e,message:"An unexpected error occurred during the operations.",success:!1}}}async processEntities(e){const r=e.filter((e=>!e.success)).reduce(((e,r)=>{const t=r.failedOperations.map((e=>({[e.retunrn_entity_name]:e.id_return,message:e.error,index:e.index})));return e.push({field:r.entity,errors:t}),e}),[]);return r.length>0?{success:!1,errorsByEntity:r}:{success:!0}}async executeQuery(e,r,t,i){try{const e=await this.prismaService.executeRawQuery(i,t);return{success:!0,id_return:e?.id??e?.[0].id??null}}catch(t){throw this.loggerService.error(`Error in ${e} operation for ${r}`,{error:t instanceof Error?t:new Error(String(t))}),new Error(`Error executing ${e} operation: ${r}`)}}capitalize(e){return e.charAt(0).toUpperCase()+e.slice(1)}};exports.EntityActionService=n,exports.EntityActionService=n=e.__decorate([(0,r.Injectable)(),e.__metadata("design:paramtypes",[s.PrismaService,i.LoggerService])],n);
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.HttpServiceClient=void 0;const e=require("tslib"),r=require("@nestjs/common"),t=require("@nestjs/config"),s=e.__importDefault(require("axios")),i=e.__importDefault(require("axios-retry")),o=e.__importDefault(require("opossum")),c=require("prom-client"),a=require("./logger.service");let n=class{constructor(e,r){this.configService=e,this.loggerService=r,this.configureMetrics(),this.configureAxiosRetry(),this.configureCircuitBreaker()}configureMetrics(){this.requestCounter=new c.Counter({name:"service_client_requests_total",help:"Total number of requests made by the service client",labelNames:["service","method","status"]}),this.responseTimeHistogram=new c.Histogram({name:"service_client_response_time_seconds",help:"Response times of service client requests",labelNames:["service","method","status"],buckets:[.1,.5,1,2,5,10]})}configureAxiosRetry(){(0,i.default)(s.default,{retries:this.configService.getOrThrow("httpmicroservice.axios_retry_count"),retryDelay:e=>1e3*Math.pow(2,e),retryCondition:e=>i.default.isNetworkError(e)||!!e.response&&e.response.status>=500,onRetry:(e,r,t)=>{this.loggerService.warn(`Retry attempt #${e} for request to ${t.url}`,{sourceClass:this.constructor.name})}})}configureCircuitBreaker(){this.circuitBreaker=new o.default(this.callService.bind(this),{timeout:this.configService.getOrThrow("httpmicroservice.circuit_breaker_timeout"),errorThresholdPercentage:this.configService.getOrThrow("httpmicroservice.circuit_breaker_error_threshold"),resetTimeout:this.configService.getOrThrow("httpmicroservice.circuit_breaker_reset_timeout")}),this.circuitBreaker.fallback((e=>{this.loggerService.warn("Circuit breaker open. Fallback activated.",{sourceClass:this.constructor.name});const t=e instanceof r.HttpException?e.getResponse():e.message;throw new r.ServiceUnavailableException({message:t,error:e.message})}))}async callService(e,r,t,i){const o={method:r,url:`${e}/${t}`,timeout:this.configService.getOrThrow("httpmicroservice.request_timeout")};"get"===r?o.params=i:o.data=i,this.requestCounter?.labels(e,r,"pending").inc();const c=Date.now();try{const i=await(0,s.default)(o),a=Date.now()-c;return this.responseTimeHistogram?.labels(e,r,"success").observe(a/1e3),this.requestCounter?.labels(e,r,"success").inc(),this.loggerService.info(`Successfully retrieved data from ${t} at ${e} in ${a}ms.`,{sourceClass:this.constructor.name}),i.data}catch(t){const s=Date.now()-c;throw this.responseTimeHistogram?.labels(e,r,"failure").observe(s/1e3),this.loggerService.error(`Error calling service at ${e}: ${t.message}`,{sourceClass:this.constructor.name}),this.handleServiceError(t)}}handleServiceError(e){if(e.response){const{status:t,data:s}=e.response;return new r.HttpException(s||"Service Error",t)}return e.request?new r.HttpException("Network Error",r.HttpStatus.SERVICE_UNAVAILABLE):new r.HttpException("Unexpected Error",r.HttpStatus.INTERNAL_SERVER_ERROR)}async getResource(e,t,s,i){const o=this.getServiceBaseURL(e);try{return await(this.circuitBreaker?.fire(o,t,s,i))}catch(t){const i=t;throw this.loggerService.error(`Error occurred while calling ${e} service at ${o}/${s}: ${i.message||i}`,{sourceClass:this.constructor.name}),new r.HttpException(`Service call to ${e} failed: ${i.message||"Service temporarily unavailable"}`,r.HttpStatus.SERVICE_UNAVAILABLE)}}getServiceBaseURL(e){const r=`httpmicroservice.${e}_microservice_url`,t=this.configService.getOrThrow(r);if(!t)throw new Error(`Service URL not found for service: ${e}. Please check your configuration.`);return t}async getMultipleResources(e,r,t,s){const i=e.map((e=>this.getResource(e,r,t,s)));return await Promise.all(i)}async getMultipleResourcesInBatch(e,t,s,i){let o=[];for(let c=0;c<e.length;c+=5){const a=e.slice(c,c+5);try{const e=a.map((e=>this.getResource(e,t,s,i))),r=await Promise.all(e);o=[...o,...r]}catch(e){throw this.loggerService.error("Error fetching data for batch",{sourceClass:this.constructor.name,error:e instanceof Error?e:new Error(String(e))}),new r.HttpException("Batch request failed",r.HttpStatus.INTERNAL_SERVER_ERROR)}}return o}};exports.HttpServiceClient=n,exports.HttpServiceClient=n=e.__decorate([(0,r.Injectable)(),e.__metadata("design:paramtypes",[t.ConfigService,a.LoggerService])],n);
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.InitKafkaConsumer=async function(o){const t=o.get(r.ConfigService);console.log(t.getOrThrow("kafka",{infer:!0}));const n=t.getOrThrow("kafka.consumerEnable",{infer:!0}),s=t.getOrThrow("kafka.brokers",{infer:!0}),i=t.getOrThrow("kafka.consumerClientId",{infer:!0}),a=t.getOrThrow("kafka.consumer.groupId",{infer:!0}),c=t.getOrThrow("kafka.autoCommit",{infer:!0}),f=t.getOrThrow("kafka.consumer",{infer:!0});try{n&&o.connectMicroservice({transport:e.Transport.KAFKA,options:{client:{clientId:i,brokers:s},consumer:{...f,groupId:a},run:{autoCommit:c}}})}catch(r){console.error("Failed to start Kafka microservice:",r),process.exit(1)}await o.startAllMicroservices()};const r=require("@nestjs/config"),e=require("@nestjs/microservices");
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.LoggerService=exports.LogLevel=void 0;const e=require("tslib"),r=require("@nestjs/common"),o=require("@infineit/winston-logger/logger/domain/logger");var g;!function(e){e.Emergency="emergency",e.Fatal="fatal",e.Error="error",e.Warn="warn",e.Info="info",e.Debug="debug"}(g||(exports.LogLevel=g={}));let t=class{constructor(e){this.logger=e}log(e,r,o,g){this.logger.log(e,r,o,g)}debug(e,r,o){this.logger.debug(e,r,o)}info(e,r,o){this.logger.info(e,r,o)}warn(e,r,o){this.logger.warn(e,r,o)}error(e,r,o){this.logger.error(e,r,o)}fatal(e,r,o){this.logger.fatal(e,r,o)}emergency(e,r,o){this.logger.emergency(e,r,o)}};exports.LoggerService=t,exports.LoggerService=t=e.__decorate([(0,r.Injectable)(),e.__param(0,(0,r.Inject)(o.LoggerKey)),e.__metadata("design:paramtypes",[Object])],t);
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.MergeService=void 0;const e=require("tslib"),t=require("@nestjs/common");let r=class{async mergeEntities(e,t,r,n={}){const s={};for(const[e,n]of Object.entries(t)){const t=r[e]?.foreignKey;t&&(s[e]=new Map(n.map((e=>[String(e[t]),e]))))}const o=[];for(const i of e){let e={...i};for(const[o,c]of Object.entries(r)){const{foreignKey:r,nestedRelationships:f,filters:a}=c,l=String(i[r]);let y=s[o]?.get(l);if(a){Object.keys(a).every((e=>{const t=a[e];return Array.isArray(t)?t.includes(y?.[e]):"function"==typeof t?t(y?.[e]):y?.[e]===t}))||(y=void 0)}if(y&&(n.flatten?e={...e,...y}:e[o]={...y},f))for(const[r,s]of Object.entries(f))try{const i=String(y[s.foreignKey]),c=new Map(t[r].map((e=>[e.id_timezone,e]))).get(i);if(s.filters){if(!Object.keys(s.filters).every((e=>{const t=s.filters?.[e]??void 0,r=c?.[e];return Array.isArray(t)?t.includes(r):"function"==typeof t?t(r):r===t})))continue}c&&(n.flatten?e={...e,...c}:e[o][r]=c)}catch(e){}}o.push(e)}return o}};exports.MergeService=r,exports.MergeService=r=e.__decorate([(0,t.Injectable)()],r);
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.MessageFormatterService=void 0;const e=require("tslib"),t=require("@nestjs/common");let r=class{static capitalizeFirstLetter(e){return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}static toLowerCase(e){return e.toLowerCase()}static formatMessage(e,t){return e.replace(/{{module_label}}/gi,t)}static toSingularOrPlural(e,t){return 1===t?e:`${e}s`}static prepareMessage(e,t,r=!1){const s=r?this.capitalizeFirstLetter(t):this.toLowerCase(t);return this.formatMessage(e,s)}};exports.MessageFormatterService=r,exports.MessageFormatterService=r=e.__decorate([(0,t.Injectable)()],r);
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.PaginationService=void 0;const e=require("tslib"),t=require("@nestjs/common"),i=require("@infineit-nestjs/utils/dto"),a=require("./prisma.service");let n=class{constructor(e){this.prisma=e}async paginate(e,t,a){const{page:n=1,limit:r=10,pagination:s}=a,o=`${e} LIMIT ${r} OFFSET ${(n-1)*r}`,c="all"===s||"paginate"===s,[p,l]=await Promise.all([this.prisma.$queryRawUnsafe(o),c?this.prisma.$queryRawUnsafe(t):[{count:0}]]);return{data:p,meta:c?new i.PaginationMetaDto({paginationQueryDto:a,totalItems:Number(l[0].count)}):void 0,has_next_page:"all"===s||"infinity"===s?p.length===r:void 0}}};exports.PaginationService=n,exports.PaginationService=n=e.__decorate([(0,t.Injectable)(),e.__metadata("design:paramtypes",[a.PrismaService])],n);
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.PrismaService=void 0;const e=require("tslib"),t=require("@nestjs/common"),r=require("@nestjs/config"),s=require("@prisma/client"),a=e.__importStar(require("lodash"));let n=class extends s.PrismaClient{constructor(e){super({datasources:{db:{url:e.get("database.url",{infer:!0})}}}),this.configService=e}async onModuleInit(){await this.$connect()}async onModuleDestroy(){await this.$disconnect()}async executeRawQuery(e,...t){try{let r=[],s=[];Array.isArray(t[t.length-1])&&(r=t.pop()),s=t;const{queryObj:a,sql:n,queryParams:i}=this.getQueryDetails(e,...s),c=r.length>0?this.sanitizeData(i,r):i,o=await this.$queryRawUnsafe(n,...c);let u;return u="SELECT_ONE"===a.type||"INSERT"===a.type?o.length>0?o[0]:null:o,u}catch(e){throw e}}getQueryDetails(e,...t){const r=e(),s=r.syntax(...t),a=r.params(...t);return{queryObj:r,sql:s,queryParams:a}}sanitizeData(e,t){if("object"==typeof e&&null!==e&&!(e instanceof Array)){const r={...e};for(const[e,s]of Object.entries(r))t.includes(e)&&"string"==typeof s&&(r[e]=s.replace(/'/g,"''"));return r}return e}async executeRawQueryOld(e=null,t=null,r=[]){const s=Object.assign({},t);if("object"==typeof t&&t instanceof Object&&!(t instanceof Array))for(const[e,t]of Object.entries(s)){if(r.includes(e)){const r=t;s[e]=r.replace(/'/g,"''")}}let n;n=t?e.syntax("object"==typeof t&&t instanceof Object&&!(t instanceof Array)?s:t):e.syntax();const i=await this.$queryRawUnsafe(n);let c;return c="SELECT_ONE"==e.type||"INSERT"==e.type?a.isEmpty(i)?null:i[0]:i,c}async executeTransaction(e){return this.$transaction(e)}async isHealthy(){try{return await(this.$queryRaw`SELECT 1`),{prisma:{status:"up"}}}catch(e){return{prisma:{status:"down",error:e instanceof Error?e.message:"Unknown error"}}}}};exports.PrismaService=n,exports.PrismaService=n=e.__decorate([(0,t.Injectable)(),e.__metadata("design:paramtypes",[r.ConfigService])],n);
@@ -1 +0,0 @@
1
- "use strict";var e;Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResourceFetchService=exports.MissingDataError=void 0;const t=require("tslib"),r=require("@nestjs/common"),a=require("./data.transformer.service"),i=require("./http.client.service");class s extends Error{constructor(e){super(`No distinct values found for the requested field: ${e}`),this.field=e,this.name="MissingDataError",this.field=e}formatFieldName(){const e=this.field.startsWith("id_")?this.field.slice(3):this.field;return e.charAt(0).toUpperCase()+e.slice(1)}}exports.MissingDataError=s;let n=e=class{constructor(t,a){this.dataTransformerService=t,this.httpServiceClient=a,this.logger=new r.Logger(e.name)}async fetchResourcesDynamic(e){const t=e.map((e=>{const{resource:t,type:r,page:a=1,limit:i=10,version:s="v1",filters:n=[],sort:o=[],pagination:c="all"}=e,l=this.constructRelativePath({resource:t,type:r,page:a,limit:i,version:s,filters:n,sort:o,pagination:c});return this.fetchResources(t,l).then((e=>({[r]:e}))).catch((e=>{throw this.logger.error(`Error fetching resource ${r}: ${e.message}`),e}))}));return(await Promise.all(t)).reduce(((e,t)=>Object.assign(e,t)),{})}async transformMultipleDataSets(e){const t=e.map((({name:e,data:t,fields:r})=>t?this.dataTransformerService.processData(t,r).then((t=>({[e]:t}))):Promise.resolve({[e]:{error:`${e} data is undefined`}})));return(await Promise.all(t)).reduce(((e,t)=>Object.assign(e,t)),{})}async getUniqueFieldValues(e,t){return t.reduce(((t,r)=>(t[r]=[...new Set(e.map((e=>e[r])))],t)),{})}async mergeData(e,t){return e.map((e=>t.reduce(((t,{field:r,data:a,field_name:i,removeField:s})=>{const n=this.getFieldValue(a,r,e[r],{[r]:e[r],name:`Default ${r.charAt(0).toUpperCase()+r.slice(1)}`});return t[i]=n,s&&delete t[r],t}),{...e})))}async generateQueryFunctions(e,t){return e.reduce(((e,{field:r,query:a})=>(e[r]=async e=>{const r=await t(a,e);return Array.isArray(r)?r:[r]},e)),{})}async applyDataTransformations(e,t,r,a){const i=await this.getUniqueFieldValues(e,t),s=await this.fetchAssociatedData(i,r),n=this.mapDataForTransformation(s,a);return this.mergeEnrichedData(e,n)}async fetchAssociatedData(e,t){const r={};return await Promise.all(Object.entries(t).map((async([t,a])=>{const i=e[t];if(!Array.isArray(i)||0===i.length)throw new s(t);try{const e=await a(i.join(","));r[t]=Array.isArray(e)?e:[e]}catch(e){throw new Error(`Failed to fetch associated data for field: ${t}`,e)}}))),r}mapDataForTransformation(e,t){return t.map((({field:t,field_name:r,removeField:a})=>({field:t,data:e[t],field_name:r,removeField:a??!0})))}async mergeEnrichedData(e,t){const r=t.reduce(((e,{field:t,data:r,field_name:a})=>(e[a]=new Map(r.map((e=>[e[t],e]))),e)),{});return e.map((e=>{const a={...e};return t.forEach((({field:t,field_name:i,removeField:s})=>{const n=r[i],o=e[t],c=n?.get(o)||{[t]:o,name:`unknown-id-${o}`};a[i]=c,s&&delete a[t]})),a}))}constructRelativePath({resource:e,type:t,page:r,limit:a,version:i,filters:s,sort:n,pagination:o}){let c=`api/${i}/${t}`;const l=this.constructFilters(s),d=this.constructSort(n);return c+=`?pagination=${o}&page=${r}&limit=${a}`,l.length>0&&(c+=`&filters=[${l.join(",")}]`),d.length>0&&(c+=`&sort=[${d.join(",")}]`),this.logger.debug(`Constructed relative URL: ${c}`),c}constructFilters(e){return e.map((e=>`{"field":"${e.field}","operator":"${e.operator}","value":"${e.value}"}`))}constructSort(e){return e.map((e=>`{"field":"${e.field}","direction":"${e.direction}"}`))}fetchResources(e,t){return this.httpServiceClient.getResource(e,"get",t)}getFieldValue(e,t,r,a){return e.find((e=>e[t]===r))||a}};exports.ResourceFetchService=n,exports.ResourceFetchService=n=e=t.__decorate([(0,r.Injectable)(),t.__metadata("design:paramtypes",[a.DataTransformerService,i.HttpServiceClient])],n);
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.UtilsService=void 0;const e=require("tslib"),t=e.__importStar(require("url")),r=e.__importStar(require("samlify")),s=require("uuid");exports.UtilsService=class{buildDynamicQuery(e,t,r,s,i="*"){let n="",o="";const a=[],l=[],u=[],c=e.filters,d=e.sort,f=new Set;if(t&&Object.keys(t).forEach((e=>{const r=t[e],s=r.alias();f.has(s)||(f.add(s),l.push(r.joinTable(s))),u.push(...r.selectFields(s))})),c&&c.length>0){n=`WHERE ${c.map(((e,r)=>{const s=e.field.toLowerCase();let i="ptbl";if(t&&t[s]){const e=t[s];i=e.alias(),f.has(i)||(f.add(i),l.push(e.joinTable(i))),u.push(...e.selectFields(i))}const n=e.operator.toUpperCase();if("IN"===n){const t=e.value.split(",").map((e=>`'${e.trim()}'`));return`${i}.${e.field} IN (${t.join(", ")})`}if("LIKE"===n){const t=e.value.split(",").map((e=>`'%${e.trim()}%'`));return`UPPER(${i}.${e.field}) LIKE UPPER(${t.join(", ")})`}return a.push(e.value),`${i}.${e.field} ${e.operator} '${e.value}'`})).join(" AND ")}`}d&&d.length>0&&(o="ORDER BY ",o+=d.map((e=>{const r=e.field.toLowerCase();let s="ptbl";if(t&&t[r]){s=t[r].alias()}return`${s}.${e.field} ${e.direction}`})).join(", "));const p=u.length>0?`, ${u.join(", ")}`:[],{selectQuery:S,countQuery:m}=this.queryStatements(r,p,s,l,n,o,i);return{selectQuery:S,countQuery:m}}queryStatements(e,t,r,s,i,n,o="*"){return{selectQuery:`SELECT ${e.join(", ")} ${t} ${r} ${s.join(" ")} ${i} ${n}`,countQuery:`SELECT count(${o}) ${r} ${s.join(" ")} ${i}`}}mergeFilters(e,t,r){return e.filter((e=>![...t,...r].some((t=>e.field===t.field)))).concat(t,r)}addFiltersToPaginationQuery(e,t,r=(e,t)=>e.field===t.field&&e.operator===t.operator&&e.value===t.value){e.filters||(e.filters=[]),t.forEach((t=>{const s=e.filters?.some((e=>r(e,t)));s||e.filters?.push(t)}))}base64Encode(e){return Buffer.from(e).toString("base64")}base64Decode(e,t=!1){const r=Buffer.from(e,"base64");return t?r:r.toString("ascii")}createSsoTemplateCallback(e,t,i,n){return o=>{const a=(0,s.v4)(),l=new Date,u=new Date(l.getTime());u.setMinutes(u.getMinutes()+5);const c=t.entityMeta.getEntityID(),d=e.entitySetting,f={ID:a,AssertionID:d.generateID?d.generateID():(0,s.v4)(),Destination:t.entityMeta.getAssertionConsumerService(i),Audience:c,SubjectRecipient:c,NameIDFormat:"urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",NameID:n.Email,Issuer:e.entityMeta.getEntityID(),IssueInstant:l.toISOString(),ConditionsNotBefore:l.toISOString(),ConditionsNotOnOrAfter:u.toISOString(),SubjectConfirmationDataNotOnOrAfter:u.toISOString(),AssertionConsumerServiceURL:t.entityMeta.getAssertionConsumerService(i),EntityID:c,InResponseTo:"_4606cc1f427fa981e6ffd653ee8d6972fc5ce398c4",StatusCode:"urn:oasis:names:tc:SAML:2.0:status:Success",attrUserEmail:n.Email,attrUserIdUser:n.idUser,attrUserAccessToken:n.AccessToken,attrUserRefreshToken:n.RefreshToken,attrUserIdToken:n.idToken,attrUserAccessTokenExpiresAt:n.AccessTokenExpiresAt};return{id:a,context:r.SamlLib.replaceTagsByValue(o,f)}}}parseRedirectUrlContextCallBack(e){const r=t.parse(e,!0),{SAMLResponse:s,Signature:i,SigAlg:n}=r.query;delete r.query.Signature;return{query:{SAMLResponse:s,Signature:i,SigAlg:n},octetString:Object.keys(r.query).map((e=>`${e}=${encodeURIComponent(r.query[e])}`)).join("&")}}generateFieldConfigs(e,t,r,s){const i={};return t.forEach((t=>{i[t]={alias:()=>r,joinTable:t=>`JOIN ${e} ${t} ON ${t}.${s} = ptbl.${s}`,selectFields:e=>[`${e}.${t}`]}})),i}};
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ValidatorService=void 0;const e=require("tslib"),r=require("@nestjs/common"),i=require("class-validator"),t=e.__importStar(require("lodash"));let s=class{isImage(e){return t.includes(["image/jpeg","image/png"],e)}isEmail(e){return(0,i.isEmail)(e)}isNumber(e){return/^\d+$/.test(e)}};exports.ValidatorService=s,exports.ValidatorService=s=e.__decorate([(0,r.Injectable)()],s);
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.Argon2Service=void 0;const r=require("tslib"),e=require("@nestjs/common"),t=r.__importStar(require("argon2"));let a=class{constructor(){}async hashPassword(r){try{return await t.hash(r,{type:t.argon2id,hashLength:32,timeCost:3,memoryCost:65536,parallelism:1})}catch(r){throw new Error(`Password hashing failed: ${r instanceof Error?r.message:String(r)}`)}}async verifyPassword(r,e){try{return await t.verify(e,r)}catch(r){throw new Error(`Password verification failed: ${r.message}`)}}};exports.Argon2Service=a,exports.Argon2Service=a=r.__decorate([(0,e.Injectable)(),r.__metadata("design:paramtypes",[])],a);
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.DataTransformerService=void 0;const e=require("tslib"),r=require("worker_threads"),n=require("@nestjs/common");let a=class{async processData(e,r){const n=1e3,a=Math.ceil(e.length/n),t=[],o=[];for(let t=0;t<a;t++){const a=e.slice(t*n,(t+1)*n);o.push(this.processChunkWithWorker(a,r))}return(await Promise.all(o)).forEach((e=>t.push(...e))),t}async processChunkWithWorker(e,n){return new Promise(((a,t)=>{const o=new r.Worker("\n const { parentPort, workerData } = require('worker_threads');\n const { chunk, fieldsToInclude } = workerData;\n\n function transformProcessData(data, fieldsToInclude) {\n return fieldsToInclude.reduce((acc, field) => {\n if (field in data) {\n acc[field] = data[field];\n }\n return acc;\n }, {});\n }\n\n function transformData(chunk, fieldsToInclude) {\n return chunk.map((data) => transformProcessData(data, fieldsToInclude));\n }\n\n const transformedData = transformData(chunk, fieldsToInclude);\n parentPort.postMessage(transformedData);\n\n ",{eval:!0,workerData:{chunk:e,fieldsToInclude:n}});o.on("message",a),o.on("error",t)}))}};exports.DataTransformerService=a,exports.DataTransformerService=a=e.__decorate([(0,n.Injectable)()],a);
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.EntityActionService=void 0;const e=require("tslib"),r=require("@nestjs/common"),t=e.__importDefault(require("p-limit")),i=require("./logger.service"),s=require("./prisma.service");let n=class{constructor(e,r){this.prismaService=e,this.loggerService=r,this.batchSize=parseInt(process.env.BATCH_SIZE??"100",10),this.concurrencyLimit=parseInt(process.env.CONCURRENCY_LIMIT??"3",10)}async handleEntityActions(e,r,i,s){const n=this.capitalize(e),c=(0,t.default)(this.concurrencyLimit);try{const t=[];for(let e=0;e<r.length;e+=this.batchSize){const o=r.slice(e,e+this.batchSize);t.push(c((async()=>{this.loggerService.info(`Processing batch ${e/this.batchSize+1} for ${n}`);return await Promise.all(o.map((async(r,t)=>{const c=e+t;try{r[i.id]=i.value,"edit"===r.action&&(r.id=r[i.id_table_primary_key]);return{success:!0,id_return:(await this.executeQuery(r.action,n,"delete"===r.action?r[i.id_table_primary_key]:r,s[0][r.action])).id_return,data:r,index:c}}catch(e){return this.loggerService.error(`Error in batch operation for ${n}`,{error:e instanceof Error?e:new Error(String(e))}),{success:!1,error:e instanceof Error?e.message:String(e),data:r,index:c,retunrn_entity_name:i.id_return||"unknown_return_entity"}}})))})))}const o=(await Promise.all(t)).flat(),a=o.filter((e=>e.success)),u=o.filter((e=>!e.success));return{entity:e,message:`${n} operations completed.`,success:0===u.length,totalProcessed:r.length,totalFailed:u.length,totalSucceeded:a.length,failedOperations:u,succeededOperations:a}}catch(r){return this.loggerService.error(`Error during ${n} operations`,{error:r instanceof Error?r:new Error(String(r))}),{entity:e,message:"An unexpected error occurred during the operations.",success:!1}}}async processEntities(e){const r=e.filter((e=>!e.success)).reduce(((e,r)=>{const t=r.failedOperations.map((e=>({[e.retunrn_entity_name]:e.id_return,message:e.error,index:e.index})));return e.push({field:r.entity,errors:t}),e}),[]);return r.length>0?{success:!1,errorsByEntity:r}:{success:!0}}async executeQuery(e,r,t,i){try{const e=await this.prismaService.executeRawQuery(i,t);return{success:!0,id_return:e?.id??e?.[0].id??null}}catch(t){throw this.loggerService.error(`Error in ${e} operation for ${r}`,{error:t instanceof Error?t:new Error(String(t))}),new Error(`Error executing ${e} operation: ${r}`)}}capitalize(e){return e.charAt(0).toUpperCase()+e.slice(1)}};exports.EntityActionService=n,exports.EntityActionService=n=e.__decorate([(0,r.Injectable)(),e.__metadata("design:paramtypes",[s.PrismaService,i.LoggerService])],n);
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.HttpServiceClient=void 0;const e=require("tslib"),r=require("@nestjs/common"),t=require("@nestjs/config"),s=e.__importDefault(require("axios")),i=e.__importDefault(require("axios-retry")),o=e.__importDefault(require("opossum")),c=require("prom-client"),a=require("./logger.service");let n=class{constructor(e,r){this.configService=e,this.loggerService=r,this.configureMetrics(),this.configureAxiosRetry(),this.configureCircuitBreaker()}configureMetrics(){this.requestCounter=new c.Counter({name:"service_client_requests_total",help:"Total number of requests made by the service client",labelNames:["service","method","status"]}),this.responseTimeHistogram=new c.Histogram({name:"service_client_response_time_seconds",help:"Response times of service client requests",labelNames:["service","method","status"],buckets:[.1,.5,1,2,5,10]})}configureAxiosRetry(){(0,i.default)(s.default,{retries:this.configService.getOrThrow("httpmicroservice.axios_retry_count"),retryDelay:e=>1e3*Math.pow(2,e),retryCondition:e=>i.default.isNetworkError(e)||!!e.response&&e.response.status>=500,onRetry:(e,r,t)=>{this.loggerService.warn(`Retry attempt #${e} for request to ${t.url}`,{sourceClass:this.constructor.name})}})}configureCircuitBreaker(){this.circuitBreaker=new o.default(this.callService.bind(this),{timeout:this.configService.getOrThrow("httpmicroservice.circuit_breaker_timeout"),errorThresholdPercentage:this.configService.getOrThrow("httpmicroservice.circuit_breaker_error_threshold"),resetTimeout:this.configService.getOrThrow("httpmicroservice.circuit_breaker_reset_timeout")}),this.circuitBreaker.fallback((e=>{this.loggerService.warn("Circuit breaker open. Fallback activated.",{sourceClass:this.constructor.name});const t=e instanceof r.HttpException?e.getResponse():e.message;throw new r.ServiceUnavailableException({message:t,error:e.message})}))}async callService(e,r,t,i){const o={method:r,url:`${e}/${t}`,timeout:this.configService.getOrThrow("httpmicroservice.request_timeout")};"get"===r?o.params=i:o.data=i,this.requestCounter?.labels(e,r,"pending").inc();const c=Date.now();try{const i=await(0,s.default)(o),a=Date.now()-c;return this.responseTimeHistogram?.labels(e,r,"success").observe(a/1e3),this.requestCounter?.labels(e,r,"success").inc(),this.loggerService.info(`Successfully retrieved data from ${t} at ${e} in ${a}ms.`,{sourceClass:this.constructor.name}),i.data}catch(t){const s=Date.now()-c;throw this.responseTimeHistogram?.labels(e,r,"failure").observe(s/1e3),this.loggerService.error(`Error calling service at ${e}: ${t.message}`,{sourceClass:this.constructor.name}),this.handleServiceError(t)}}handleServiceError(e){if(e.response){const{status:t,data:s}=e.response;return new r.HttpException(s||"Service Error",t)}return e.request?new r.HttpException("Network Error",r.HttpStatus.SERVICE_UNAVAILABLE):new r.HttpException("Unexpected Error",r.HttpStatus.INTERNAL_SERVER_ERROR)}async getResource(e,t,s,i){const o=this.getServiceBaseURL(e);try{return await(this.circuitBreaker?.fire(o,t,s,i))}catch(t){const i=t;throw this.loggerService.error(`Error occurred while calling ${e} service at ${o}/${s}: ${i.message||i}`,{sourceClass:this.constructor.name}),new r.HttpException(`Service call to ${e} failed: ${i.message||"Service temporarily unavailable"}`,r.HttpStatus.SERVICE_UNAVAILABLE)}}getServiceBaseURL(e){const r=`httpmicroservice.${e}_microservice_url`,t=this.configService.getOrThrow(r);if(!t)throw new Error(`Service URL not found for service: ${e}. Please check your configuration.`);return t}async getMultipleResources(e,r,t,s){const i=e.map((e=>this.getResource(e,r,t,s)));return await Promise.all(i)}async getMultipleResourcesInBatch(e,t,s,i){let o=[];for(let c=0;c<e.length;c+=5){const a=e.slice(c,c+5);try{const e=a.map((e=>this.getResource(e,t,s,i))),r=await Promise.all(e);o=[...o,...r]}catch(e){throw this.loggerService.error("Error fetching data for batch",{sourceClass:this.constructor.name,error:e instanceof Error?e:new Error(String(e))}),new r.HttpException("Batch request failed",r.HttpStatus.INTERNAL_SERVER_ERROR)}}return o}};exports.HttpServiceClient=n,exports.HttpServiceClient=n=e.__decorate([(0,r.Injectable)(),e.__metadata("design:paramtypes",[t.ConfigService,a.LoggerService])],n);
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.InitKafkaConsumer=async function(o){const t=o.get(r.ConfigService);console.log(t.getOrThrow("kafka",{infer:!0}));const n=t.getOrThrow("kafka.consumerEnable",{infer:!0}),s=t.getOrThrow("kafka.brokers",{infer:!0}),i=t.getOrThrow("kafka.consumerClientId",{infer:!0}),a=t.getOrThrow("kafka.consumer.groupId",{infer:!0}),c=t.getOrThrow("kafka.autoCommit",{infer:!0}),f=t.getOrThrow("kafka.consumer",{infer:!0});try{n&&o.connectMicroservice({transport:e.Transport.KAFKA,options:{client:{clientId:i,brokers:s},consumer:{...f,groupId:a},run:{autoCommit:c}}})}catch(r){console.error("Failed to start Kafka microservice:",r),process.exit(1)}await o.startAllMicroservices()};const r=require("@nestjs/config"),e=require("@nestjs/microservices");
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.LoggerService=exports.LogLevel=void 0;const e=require("tslib"),r=require("@nestjs/common"),o=require("@infineit/winston-logger/logger/domain/logger");var g;!function(e){e.Emergency="emergency",e.Fatal="fatal",e.Error="error",e.Warn="warn",e.Info="info",e.Debug="debug"}(g||(exports.LogLevel=g={}));let t=class{constructor(e){this.logger=e}log(e,r,o,g){this.logger.log(e,r,o,g)}debug(e,r,o){this.logger.debug(e,r,o)}info(e,r,o){this.logger.info(e,r,o)}warn(e,r,o){this.logger.warn(e,r,o)}error(e,r,o){this.logger.error(e,r,o)}fatal(e,r,o){this.logger.fatal(e,r,o)}emergency(e,r,o){this.logger.emergency(e,r,o)}};exports.LoggerService=t,exports.LoggerService=t=e.__decorate([(0,r.Injectable)(),e.__param(0,(0,r.Inject)(o.LoggerKey)),e.__metadata("design:paramtypes",[Object])],t);
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.MergeService=void 0;const e=require("tslib"),t=require("@nestjs/common");let r=class{async mergeEntities(e,t,r,n={}){const o={};for(const[e,n]of Object.entries(t)){const t=r[e]?.foreignKey;t&&(o[e]=new Map(n.map((e=>[String(e[t]),e]))))}const s=[];for(const i of e){let e={...i};for(const[s,c]of Object.entries(r)){const{foreignKey:r,nestedRelationships:f,filters:a}=c,l=String(i[r]);let y=o[s]?.get(l);if(a){Object.keys(a).every((e=>{const t=a[e];return Array.isArray(t)?t.includes(y?.[e]):"function"==typeof t?t(y?.[e]):y?.[e]===t}))||(y=void 0)}if(y&&(n.flatten?e={...e,...y}:e[s]={...y},f))for(const[r,o]of Object.entries(f))try{const i=String(y[o.foreignKey]),c=new Map(t[r].map((e=>[e.id_timezone,e]))).get(i);if(o.filters){if(!Object.keys(o.filters).every((e=>{const t=o.filters?.[e]??void 0,r=c?.[e];return Array.isArray(t)?t.includes(r):"function"==typeof t?t(r):r===t})))continue}c&&(n.flatten?e={...e,...c}:e[s][r]=c)}catch(e){}}s.push(e)}return s}};exports.MergeService=r,exports.MergeService=r=e.__decorate([(0,t.Injectable)()],r);
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.MessageFormatterService=void 0;const e=require("tslib"),t=require("@nestjs/common");let r=class{static capitalizeFirstLetter(e){return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}static toLowerCase(e){return e.toLowerCase()}static formatMessage(e,t){return e.replace(/{{module_label}}/gi,t)}static toSingularOrPlural(e,t){return 1===t?e:`${e}s`}static prepareMessage(e,t,r=!1){const s=r?this.capitalizeFirstLetter(t):this.toLowerCase(t);return this.formatMessage(e,s)}};exports.MessageFormatterService=r,exports.MessageFormatterService=r=e.__decorate([(0,t.Injectable)()],r);
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.PaginationService=void 0;const e=require("tslib"),t=require("@nestjs/common"),a=require("@infineit-nestjs/utils/dto"),i=require("./prisma.service");let n=class{constructor(e){this.prisma=e}async paginate(e,t,i){const{page:n=1,limit:r=10,pagination:s}=i,o=`${e} LIMIT ${r} OFFSET ${(n-1)*r}`,c="all"===s||"paginate"===s,[p,l]=await Promise.all([this.prisma.$queryRawUnsafe(o),c?this.prisma.$queryRawUnsafe(t):[{count:0}]]);return{data:p,meta:c?new a.PaginationMetaDto({paginationQueryDto:i,totalItems:Number(l[0].count)}):void 0,has_next_page:"all"===s||"infinity"===s?p.length===r:void 0}}};exports.PaginationService=n,exports.PaginationService=n=e.__decorate([(0,t.Injectable)(),e.__metadata("design:paramtypes",[i.PrismaService])],n);
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.PrismaService=void 0;const e=require("tslib"),t=require("@nestjs/common"),r=require("@nestjs/config"),s=require("@prisma/client"),a=e.__importStar(require("lodash"));let n=class extends s.PrismaClient{constructor(e){super({datasources:{db:{url:e.get("database.url",{infer:!0})}}}),this.configService=e}async onModuleInit(){await this.$connect()}async onModuleDestroy(){await this.$disconnect()}async executeRawQuery(e,...t){try{let r=[],s=[];Array.isArray(t[t.length-1])&&(r=t.pop()),s=t;const{queryObj:a,sql:n,queryParams:i}=this.getQueryDetails(e,...s),c=r.length>0?this.sanitizeData(i,r):i,o=await this.$queryRawUnsafe(n,...c);let u;return u="SELECT_ONE"===a.type||"INSERT"===a.type?o.length>0?o[0]:null:o,u}catch(e){throw e}}getQueryDetails(e,...t){const r=e(),s=r.syntax(...t),a=r.params(...t);return{queryObj:r,sql:s,queryParams:a}}sanitizeData(e,t){if("object"==typeof e&&null!==e&&!(e instanceof Array)){const r={...e};for(const[e,s]of Object.entries(r))t.includes(e)&&"string"==typeof s&&(r[e]=s.replace(/'/g,"''"));return r}return e}async executeRawQueryOld(e=null,t=null,r=[]){const s=Object.assign({},t);if("object"==typeof t&&t instanceof Object&&!(t instanceof Array))for(const[e,t]of Object.entries(s)){if(r.includes(e)){const r=t;s[e]=r.replace(/'/g,"''")}}let n;n=t?e.syntax("object"==typeof t&&t instanceof Object&&!(t instanceof Array)?s:t):e.syntax();const i=await this.$queryRawUnsafe(n);let c;return c="SELECT_ONE"==e.type||"INSERT"==e.type?a.isEmpty(i)?null:i[0]:i,c}async executeTransaction(e){return this.$transaction(e)}async isHealthy(){try{return await(this.$queryRaw`SELECT 1`),{prisma:{status:"up"}}}catch(e){return{prisma:{status:"down",error:e instanceof Error?e.message:"Unknown error"}}}}};exports.PrismaService=n,exports.PrismaService=n=e.__decorate([(0,t.Injectable)(),e.__metadata("design:paramtypes",[r.ConfigService])],n);
@@ -1 +0,0 @@
1
- var e;Object.defineProperty(exports,"__esModule",{value:!0}),exports.ResourceFetchService=exports.MissingDataError=void 0;const t=require("tslib"),r=require("@nestjs/common"),a=require("./data.transformer.service"),i=require("./http.client.service");class s extends Error{constructor(e){super(`No distinct values found for the requested field: ${e}`),this.field=e,this.name="MissingDataError",this.field=e}formatFieldName(){const e=this.field.startsWith("id_")?this.field.slice(3):this.field;return e.charAt(0).toUpperCase()+e.slice(1)}}exports.MissingDataError=s;let n=e=class{constructor(t,a){this.dataTransformerService=t,this.httpServiceClient=a,this.logger=new r.Logger(e.name)}async fetchResourcesDynamic(e){const t=e.map((e=>{const{resource:t,type:r,page:a=1,limit:i=10,version:s="v1",filters:n=[],sort:o=[],pagination:c="all"}=e,l=this.constructRelativePath({resource:t,type:r,page:a,limit:i,version:s,filters:n,sort:o,pagination:c});return this.fetchResources(t,l).then((e=>({[r]:e}))).catch((e=>{throw this.logger.error(`Error fetching resource ${r}: ${e.message}`),e}))}));return(await Promise.all(t)).reduce(((e,t)=>Object.assign(e,t)),{})}async transformMultipleDataSets(e){const t=e.map((({name:e,data:t,fields:r})=>t?this.dataTransformerService.processData(t,r).then((t=>({[e]:t}))):Promise.resolve({[e]:{error:`${e} data is undefined`}})));return(await Promise.all(t)).reduce(((e,t)=>Object.assign(e,t)),{})}async getUniqueFieldValues(e,t){return t.reduce(((t,r)=>(t[r]=[...new Set(e.map((e=>e[r])))],t)),{})}async mergeData(e,t){return e.map((e=>t.reduce(((t,{field:r,data:a,field_name:i,removeField:s})=>{const n=this.getFieldValue(a,r,e[r],{[r]:e[r],name:`Default ${r.charAt(0).toUpperCase()+r.slice(1)}`});return t[i]=n,s&&delete t[r],t}),{...e})))}async generateQueryFunctions(e,t){return e.reduce(((e,{field:r,query:a})=>(e[r]=async e=>{const r=await t(a,e);return Array.isArray(r)?r:[r]},e)),{})}async applyDataTransformations(e,t,r,a){const i=await this.getUniqueFieldValues(e,t),s=await this.fetchAssociatedData(i,r),n=this.mapDataForTransformation(s,a);return this.mergeEnrichedData(e,n)}async fetchAssociatedData(e,t){const r={};return await Promise.all(Object.entries(t).map((async([t,a])=>{const i=e[t];if(!Array.isArray(i)||0===i.length)throw new s(t);try{const e=await a(i.join(","));r[t]=Array.isArray(e)?e:[e]}catch(e){throw new Error(`Failed to fetch associated data for field: ${t}`,e)}}))),r}mapDataForTransformation(e,t){return t.map((({field:t,field_name:r,removeField:a})=>({field:t,data:e[t],field_name:r,removeField:a??!0})))}async mergeEnrichedData(e,t){const r=t.reduce(((e,{field:t,data:r,field_name:a})=>(e[a]=new Map(r.map((e=>[e[t],e]))),e)),{});return e.map((e=>{const a={...e};return t.forEach((({field:t,field_name:i,removeField:s})=>{const n=r[i],o=e[t],c=n?.get(o)||{[t]:o,name:`unknown-id-${o}`};a[i]=c,s&&delete a[t]})),a}))}constructRelativePath({resource:e,type:t,page:r,limit:a,version:i,filters:s,sort:n,pagination:o}){let c=`api/${i}/${t}`;const l=this.constructFilters(s),d=this.constructSort(n);return c+=`?pagination=${o}&page=${r}&limit=${a}`,l.length>0&&(c+=`&filters=[${l.join(",")}]`),d.length>0&&(c+=`&sort=[${d.join(",")}]`),this.logger.debug(`Constructed relative URL: ${c}`),c}constructFilters(e){return e.map((e=>`{"field":"${e.field}","operator":"${e.operator}","value":"${e.value}"}`))}constructSort(e){return e.map((e=>`{"field":"${e.field}","direction":"${e.direction}"}`))}fetchResources(e,t){return this.httpServiceClient.getResource(e,"get",t)}getFieldValue(e,t,r,a){return e.find((e=>e[t]===r))||a}};exports.ResourceFetchService=n,exports.ResourceFetchService=n=e=t.__decorate([(0,r.Injectable)(),t.__metadata("design:paramtypes",[a.DataTransformerService,i.HttpServiceClient])],n);
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.UtilsService=void 0;const e=require("tslib"),t=e.__importStar(require("url")),r=e.__importStar(require("samlify")),s=require("uuid");exports.UtilsService=class{buildDynamicQuery(e,t,r,s,i="*"){let n="",o="";const a=[],l=[],u=[],c=e.filters,d=e.sort,f=new Set;if(t&&Object.keys(t).forEach((e=>{const r=t[e],s=r.alias();f.has(s)||(f.add(s),l.push(r.joinTable(s))),u.push(...r.selectFields(s))})),c&&c.length>0){n=`WHERE ${c.map(((e,r)=>{const s=e.field.toLowerCase();let i="ptbl";if(t&&t[s]){const e=t[s];i=e.alias(),f.has(i)||(f.add(i),l.push(e.joinTable(i))),u.push(...e.selectFields(i))}const n=e.operator.toUpperCase();if("IN"===n){const t=e.value.split(",").map((e=>`'${e.trim()}'`));return`${i}.${e.field} IN (${t.join(", ")})`}if("LIKE"===n){const t=e.value.split(",").map((e=>`'%${e.trim()}%'`));return`UPPER(${i}.${e.field}) LIKE UPPER(${t.join(", ")})`}return a.push(e.value),`${i}.${e.field} ${e.operator} '${e.value}'`})).join(" AND ")}`}d&&d.length>0&&(o="ORDER BY ",o+=d.map((e=>{const r=e.field.toLowerCase();let s="ptbl";if(t&&t[r]){s=t[r].alias()}return`${s}.${e.field} ${e.direction}`})).join(", "));const p=u.length>0?`, ${u.join(", ")}`:[],{selectQuery:S,countQuery:m}=this.queryStatements(r,p,s,l,n,o,i);return{selectQuery:S,countQuery:m}}queryStatements(e,t,r,s,i,n,o="*"){return{selectQuery:`SELECT ${e.join(", ")} ${t} ${r} ${s.join(" ")} ${i} ${n}`,countQuery:`SELECT count(${o}) ${r} ${s.join(" ")} ${i}`}}mergeFilters(e,t,r){return e.filter((e=>![...t,...r].some((t=>e.field===t.field)))).concat(t,r)}addFiltersToPaginationQuery(e,t,r=(e,t)=>e.field===t.field&&e.operator===t.operator&&e.value===t.value){e.filters||(e.filters=[]),t.forEach((t=>{const s=e.filters?.some((e=>r(e,t)));s||e.filters?.push(t)}))}base64Encode(e){return Buffer.from(e).toString("base64")}base64Decode(e,t=!1){const r=Buffer.from(e,"base64");return t?r:r.toString("ascii")}createSsoTemplateCallback(e,t,i,n){return o=>{const a=(0,s.v4)(),l=new Date,u=new Date(l.getTime());u.setMinutes(u.getMinutes()+5);const c=t.entityMeta.getEntityID(),d=e.entitySetting,f={ID:a,AssertionID:d.generateID?d.generateID():(0,s.v4)(),Destination:t.entityMeta.getAssertionConsumerService(i),Audience:c,SubjectRecipient:c,NameIDFormat:"urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",NameID:n.Email,Issuer:e.entityMeta.getEntityID(),IssueInstant:l.toISOString(),ConditionsNotBefore:l.toISOString(),ConditionsNotOnOrAfter:u.toISOString(),SubjectConfirmationDataNotOnOrAfter:u.toISOString(),AssertionConsumerServiceURL:t.entityMeta.getAssertionConsumerService(i),EntityID:c,InResponseTo:"_4606cc1f427fa981e6ffd653ee8d6972fc5ce398c4",StatusCode:"urn:oasis:names:tc:SAML:2.0:status:Success",attrUserEmail:n.Email,attrUserIdUser:n.idUser,attrUserAccessToken:n.AccessToken,attrUserRefreshToken:n.RefreshToken,attrUserIdToken:n.idToken,attrUserAccessTokenExpiresAt:n.AccessTokenExpiresAt};return{id:a,context:r.SamlLib.replaceTagsByValue(o,f)}}}parseRedirectUrlContextCallBack(e){const r=t.parse(e,!0),{SAMLResponse:s,Signature:i,SigAlg:n}=r.query;delete r.query.Signature;return{query:{SAMLResponse:s,Signature:i,SigAlg:n},octetString:Object.keys(r.query).map((e=>`${e}=${encodeURIComponent(r.query[e])}`)).join("&")}}generateFieldConfigs(e,t,r,s){const i={};return t.forEach((t=>{i[t]={alias:()=>r,joinTable:t=>`JOIN ${e} ${t} ON ${t}.${s} = ptbl.${s}`,selectFields:e=>[`${e}.${t}`]}})),i}};
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,"__esModule",{value:!0}),exports.ValidatorService=void 0;const e=require("tslib"),r=require("@nestjs/common"),i=require("class-validator"),t=e.__importStar(require("lodash"));let a=class{isImage(e){return t.includes(["image/jpeg","image/png"],e)}isEmail(e){return(0,i.isEmail)(e)}isNumber(e){return/^\d+$/.test(e)}};exports.ValidatorService=a,exports.ValidatorService=a=e.__decorate([(0,r.Injectable)()],a);