diff --git a/.github/workflows/.deploy.yml b/.github/workflows/.deploy.yml index d924290f..fb3403d9 100644 --- a/.github/workflows/.deploy.yml +++ b/.github/workflows/.deploy.yml @@ -123,6 +123,10 @@ jobs: --set global.autoscaling=${{ inputs.autoscaling }} \ --set-string global.repository=${{ github.repository }} \ --set-string global.tag="${{ env.package_tag }}" \ + --set-string global.secrets.osBucket="${{ secrets.osBucket }}" \ + --set-string global.secrets.osAccessKeyId="${{ secrets.osAccessKeyId }}" \ + --set-string global.secrets.osSecretAccessKeyId="${{ secrets.osSecretAccessKeyId }}" \ + --set-string global.secrets.osEndpoint="${{ secrets.osEndpoint }}" \ ${{ inputs.params }} \ --install --wait --atomic ${{ env.repo_release }} \ --timeout ${{ inputs.timeout-minutes }}m \ diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml index 54aaab5e..5225ec2c 100644 --- a/.github/workflows/merge.yml +++ b/.github/workflows/merge.yml @@ -35,11 +35,14 @@ jobs: uses: ./.github/workflows/.deploy.yml secrets: inherit with: - autoscaling: false environment: test tag: ${{ needs.vars.outputs.pr }} release: test - + params: | + --set backend.deploymentStrategy=RollingUpdate \ + --set frontend.deploymentStrategy=RollingUpdate \ + --set backend.pdb.enabled=true \ + --set frontend.pdb.enabled=true deploy-prod: @@ -51,7 +54,11 @@ jobs: environment: prod tag: ${{ needs.vars.outputs.pr }} release: prod - params: --set backend.deploymentStrategy=RollingUpdate --set frontend.deploymentStrategy=RollingUpdate + params: | + --set backend.deploymentStrategy=RollingUpdate \ + --set frontend.deploymentStrategy=RollingUpdate \ + --set backend.pdb.enabled=true \ + --set frontend.pdb.enabled=true promote: name: Promote Images diff --git a/backend/package-lock.json b/backend/package-lock.json index 6dc6da27..21b5eb5a 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -6,21 +6,25 @@ "": { "license": "Apache-2.0", "dependencies": { + "@aws-sdk/client-s3": "^3.515.0", "@nestjs/cli": "^10.1.16", "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.0.0", "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", + "@nestjs/schedule": "^4.0.1", "@nestjs/schematics": "^10.0.0", "@nestjs/swagger": "^7.0.3", "@nestjs/terminus": "^10.2.1", "@nestjs/testing": "^10.0.0", + "@nestjs/throttler": "^5.1.2", "@prisma/client": "^5.7.0", "dotenv": "^16.0.1", "express-prom-bundle": "^7.0.0", "helmet": "^7.0.0", "nest-winston": "^1.9.4", "nestjs-prisma": "^0.23.0", + "papaparse": "^5.4.1", "pg": "^8.11.3", "prom-client": "^15.1.0", "reflect-metadata": "^0.2.0", @@ -33,6 +37,7 @@ "@types/express": "^4.17.15", "@types/jest": "^29.0.0", "@types/node": "^20.0.0", + "@types/papaparse": "^5.3.14", "@types/supertest": "^6.0.0", "@typescript-eslint/eslint-plugin": "^6.5.0", "@typescript-eslint/parser": "^6.5.0", @@ -243,6 +248,806 @@ "node": ">=0.12.0" } }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/crc32c": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", + "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", + "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.515.0.tgz", + "integrity": "sha512-K527n83hrMUdosxOYTzL63wtlJtmN5SUJZnGY1sUR6UyOrnOr9lS6t3AB6BgHqLFRFZJqSqmhflv2cOD7P1UPg==", + "dependencies": { + "@aws-crypto/sha1-browser": "3.0.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.515.0", + "@aws-sdk/core": "3.513.0", + "@aws-sdk/credential-provider-node": "3.515.0", + "@aws-sdk/middleware-bucket-endpoint": "3.515.0", + "@aws-sdk/middleware-expect-continue": "3.515.0", + "@aws-sdk/middleware-flexible-checksums": "3.515.0", + "@aws-sdk/middleware-host-header": "3.515.0", + "@aws-sdk/middleware-location-constraint": "3.515.0", + "@aws-sdk/middleware-logger": "3.515.0", + "@aws-sdk/middleware-recursion-detection": "3.515.0", + "@aws-sdk/middleware-sdk-s3": "3.515.0", + "@aws-sdk/middleware-signing": "3.515.0", + "@aws-sdk/middleware-ssec": "3.515.0", + "@aws-sdk/middleware-user-agent": "3.515.0", + "@aws-sdk/region-config-resolver": "3.515.0", + "@aws-sdk/signature-v4-multi-region": "3.515.0", + "@aws-sdk/types": "3.515.0", + "@aws-sdk/util-endpoints": "3.515.0", + "@aws-sdk/util-user-agent-browser": "3.515.0", + "@aws-sdk/util-user-agent-node": "3.515.0", + "@aws-sdk/xml-builder": "3.496.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.2", + "@smithy/eventstream-serde-browser": "^2.1.1", + "@smithy/eventstream-serde-config-resolver": "^2.1.1", + "@smithy/eventstream-serde-node": "^2.1.1", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-blob-browser": "^2.1.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/hash-stream-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/md5-js": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.2.0", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-stream": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "@smithy/util-waiter": "^2.1.1", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.515.0.tgz", + "integrity": "sha512-4oGBLW476zmkdN98lAns3bObRNO+DLOfg4MDUSR6l6GYBV/zGAtoy2O/FhwYKgA2L5h2ZtElGopLlk/1Q0ePLw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.513.0", + "@aws-sdk/middleware-host-header": "3.515.0", + "@aws-sdk/middleware-logger": "3.515.0", + "@aws-sdk/middleware-recursion-detection": "3.515.0", + "@aws-sdk/middleware-user-agent": "3.515.0", + "@aws-sdk/region-config-resolver": "3.515.0", + "@aws-sdk/types": "3.515.0", + "@aws-sdk/util-endpoints": "3.515.0", + "@aws-sdk/util-user-agent-browser": "3.515.0", + "@aws-sdk/util-user-agent-node": "3.515.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.2", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.2.0", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-middleware": "^2.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.515.0.tgz", + "integrity": "sha512-zACa8LNlPUdlNUBqQRf5a3MfouLNtcBfm84v2c8M976DwJrMGONPe1QjyLLsD38uESQiXiVQRruj/b000iMXNw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.515.0", + "@aws-sdk/core": "3.513.0", + "@aws-sdk/middleware-host-header": "3.515.0", + "@aws-sdk/middleware-logger": "3.515.0", + "@aws-sdk/middleware-recursion-detection": "3.515.0", + "@aws-sdk/middleware-user-agent": "3.515.0", + "@aws-sdk/region-config-resolver": "3.515.0", + "@aws-sdk/types": "3.515.0", + "@aws-sdk/util-endpoints": "3.515.0", + "@aws-sdk/util-user-agent-browser": "3.515.0", + "@aws-sdk/util-user-agent-node": "3.515.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.2", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.2.0", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-middleware": "^2.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/credential-provider-node": "^3.515.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.515.0.tgz", + "integrity": "sha512-ScYuvaIDgip3atOJIA1FU2n0gJkEdveu1KrrCPathoUCV5zpK8qQmO/n+Fj/7hKFxeKdFbB+4W4CsJWYH94nlg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/core": "3.513.0", + "@aws-sdk/middleware-host-header": "3.515.0", + "@aws-sdk/middleware-logger": "3.515.0", + "@aws-sdk/middleware-recursion-detection": "3.515.0", + "@aws-sdk/middleware-user-agent": "3.515.0", + "@aws-sdk/region-config-resolver": "3.515.0", + "@aws-sdk/types": "3.515.0", + "@aws-sdk/util-endpoints": "3.515.0", + "@aws-sdk/util-user-agent-browser": "3.515.0", + "@aws-sdk/util-user-agent-node": "3.515.0", + "@smithy/config-resolver": "^2.1.1", + "@smithy/core": "^1.3.2", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/hash-node": "^2.1.1", + "@smithy/invalid-dependency": "^2.1.1", + "@smithy/middleware-content-length": "^2.1.1", + "@smithy/middleware-endpoint": "^2.4.1", + "@smithy/middleware-retry": "^2.1.1", + "@smithy/middleware-serde": "^2.1.1", + "@smithy/middleware-stack": "^2.1.1", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/url-parser": "^2.1.1", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-body-length-browser": "^2.1.1", + "@smithy/util-body-length-node": "^2.2.1", + "@smithy/util-defaults-mode-browser": "^2.1.1", + "@smithy/util-defaults-mode-node": "^2.2.0", + "@smithy/util-endpoints": "^1.1.1", + "@smithy/util-middleware": "^2.1.1", + "@smithy/util-retry": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@aws-sdk/credential-provider-node": "^3.515.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.513.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.513.0.tgz", + "integrity": "sha512-L+9DL4apWuqNKVOMJ8siAuWoRM9rZf9w1iPv8S2o83WO2jVK7E/m+rNW1dFo9HsA5V1ccDl2H2qLXx24HiHmOw==", + "dependencies": { + "@smithy/core": "^1.3.2", + "@smithy/protocol-http": "^3.1.1", + "@smithy/signature-v4": "^2.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.515.0.tgz", + "integrity": "sha512-45vxdyqhTAaUMERYVWOziG3K8L2TV9G4ryQS/KZ84o7NAybE9GMdoZRVmGHAO7mJJ1wQiYCM/E+i5b3NW9JfNA==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.515.0.tgz", + "integrity": "sha512-Ba6FXK77vU4WyheiamNjEuTFmir0eAXuJGPO27lBaA8g+V/seXGHScsbOG14aQGDOr2P02OPwKGZrWWA7BFpfQ==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/fetch-http-handler": "^2.4.1", + "@smithy/node-http-handler": "^2.3.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/util-stream": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.515.0.tgz", + "integrity": "sha512-ouDlNZdv2TKeVEA/YZk2+XklTXyAAGdbWnl4IgN9ItaodWI+lZjdIoNC8BAooVH+atIV/cZgoGTGQL7j2TxJ9A==", + "dependencies": { + "@aws-sdk/client-sts": "3.515.0", + "@aws-sdk/credential-provider-env": "3.515.0", + "@aws-sdk/credential-provider-process": "3.515.0", + "@aws-sdk/credential-provider-sso": "3.515.0", + "@aws-sdk/credential-provider-web-identity": "3.515.0", + "@aws-sdk/types": "3.515.0", + "@smithy/credential-provider-imds": "^2.2.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.515.0.tgz", + "integrity": "sha512-Y4kHSpbxksiCZZNcvsiKUd8Fb2XlyUuONEwqWFNL82ZH6TCCjBGS31wJQCSxBHqYcOL3tiORUEJkoO7uS30uQA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.515.0", + "@aws-sdk/credential-provider-http": "3.515.0", + "@aws-sdk/credential-provider-ini": "3.515.0", + "@aws-sdk/credential-provider-process": "3.515.0", + "@aws-sdk/credential-provider-sso": "3.515.0", + "@aws-sdk/credential-provider-web-identity": "3.515.0", + "@aws-sdk/types": "3.515.0", + "@smithy/credential-provider-imds": "^2.2.1", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.515.0.tgz", + "integrity": "sha512-pSjiOA2FM63LHRKNDvEpBRp80FVGT0Mw/gzgbqFXP+sewk0WVonYbEcMDTJptH3VsLPGzqH/DQ1YL/aEIBuXFQ==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.515.0.tgz", + "integrity": "sha512-j7vUkiSmuhpBvZYoPTRTI4ePnQbiZMFl6TNhg9b9DprC1zHkucsZnhRhqjOVlrw/H6J4jmcPGcHHTZ5WQNI5xQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.515.0", + "@aws-sdk/token-providers": "3.515.0", + "@aws-sdk/types": "3.515.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.515.0.tgz", + "integrity": "sha512-66+2g4z3fWwdoGReY8aUHvm6JrKZMTRxjuizljVmMyOBttKPeBYXvUTop/g3ZGUx1f8j+C5qsGK52viYBvtjuQ==", + "dependencies": { + "@aws-sdk/client-sts": "3.515.0", + "@aws-sdk/types": "3.515.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.515.0.tgz", + "integrity": "sha512-Vm423j3udFrhKPaKiXtie+6aF05efjX8lhAu5VOruIvbam7olvdWNdkH7sGWlz1ko3CVa7PwOYjGHiOOhxpEOA==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@aws-sdk/util-arn-parser": "3.495.0", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-config-provider": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.515.0.tgz", + "integrity": "sha512-TWCXulivab4reOMx/vxa/IwnPX78fLwI9NUoAxjsqB6W9qjmSnPD43BSVeGvbbl/YNmgk7XfMbZb6IgxW7RyzA==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.515.0.tgz", + "integrity": "sha512-ydGjnqNeYlJaAkmQeQnS4pZRAAvzefdm8c234Qh0Fg55xRwHTNLp7uYsdfkTjrdAlj6YIO3Zr6vK6VJ6MGCwug==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", + "@aws-sdk/types": "3.515.0", + "@smithy/is-array-buffer": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.515.0.tgz", + "integrity": "sha512-I1MwWPzdRKM1luvdDdjdGsDjNVPhj9zaIytEchjTY40NcKOg+p2evLD2y69ozzg8pyXK63r8DdvDGOo9QPuh0A==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.515.0.tgz", + "integrity": "sha512-ORFC5oijjTJsHhUXy9o52/vl5Irf6e83bE/8tBp+sVVx81+E8zTTWZbysoa41c0B5Ycd0H3wCWutvjdXT16ydQ==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.515.0.tgz", + "integrity": "sha512-qXomJzg2m/5seQOxHi/yOXOKfSjwrrJSmEmfwJKJyQgdMbBcjz3Cz0H/1LyC6c5hHm6a/SZgSTzDAbAoUmyL+Q==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.515.0.tgz", + "integrity": "sha512-dokHLbTV3IHRIBrw9mGoxcNTnQsjlm7TpkJhPdGT9T4Mq399EyQo51u6IsVMm07RXLl2Zw7u+u9p+qWBFzmFRA==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.515.0.tgz", + "integrity": "sha512-vB8JwiTEAqm1UT9xfugnCgl0H0dtBLUQQK99JwQEWjHPZmQ3HQuVkykmJRY3X0hzKMEgqXodz0hZOvf3Hq1mvQ==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@aws-sdk/util-arn-parser": "3.495.0", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/signature-v4": "^2.1.1", + "@smithy/smithy-client": "^2.3.1", + "@smithy/types": "^2.9.1", + "@smithy/util-config-provider": "^2.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.515.0.tgz", + "integrity": "sha512-SdjCyQCL702I07KhCiBFcoh6+NYtnruHJQIzWwMpBteuYHnCHW1k9uZ6pqacsS+Y6qpAKfTVNpQx2zP2s6QoHA==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/protocol-http": "^3.1.1", + "@smithy/signature-v4": "^2.1.1", + "@smithy/types": "^2.9.1", + "@smithy/util-middleware": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.515.0.tgz", + "integrity": "sha512-0qLjKiorosVBzzaV/o7MEyS9xqLLu02qGbP564Z/FZY74JUQEpBNedgveMUbb6lqr85RnOuwZ0GZ0cBRfH2brQ==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.515.0.tgz", + "integrity": "sha512-nOqZjGA/GkjuJ5fUshec9Fv6HFd7ovOTxMJbw3MfAhqXuVZ6dKF41lpVJ4imNsgyFt3shUg9WDY8zGFjlYMB3g==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@aws-sdk/util-endpoints": "3.515.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.515.0.tgz", + "integrity": "sha512-RIRx9loxMgEAc/r1wPfnfShOuzn4RBi8pPPv6/jhhITEeMnJe6enAh2k5y9DdiVDDgCWZgVFSv0YkAIfzAFsnQ==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/types": "^2.9.1", + "@smithy/util-config-provider": "^2.2.1", + "@smithy/util-middleware": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.515.0.tgz", + "integrity": "sha512-5lrCn4DSE0zL41k0L6moqcdExZhWdAnV0/oMEagrISzQYoia+aNTEeyVD3xqJhRbEW4gCj3Uoyis6c8muf7b9g==", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.515.0", + "@aws-sdk/types": "3.515.0", + "@smithy/protocol-http": "^3.1.1", + "@smithy/signature-v4": "^2.1.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.515.0.tgz", + "integrity": "sha512-MQuf04rIcTXqwDzmyHSpFPF1fKEzRl64oXtCRUF3ddxTdK6wxXkePfK6wNCuL+GEbEcJAoCtIGIRpzGPJvQjHA==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.515.0", + "@aws-sdk/types": "3.515.0", + "@smithy/property-provider": "^2.1.1", + "@smithy/shared-ini-file-loader": "^2.3.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.515.0.tgz", + "integrity": "sha512-B3gUpiMlpT6ERaLvZZ61D0RyrQPsFYDkCncLPVkZOKkCOoFU46zi1o6T5JcYiz8vkx1q9RGloQ5exh79s5pU/w==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.495.0.tgz", + "integrity": "sha512-hwdA3XAippSEUxs7jpznwD63YYFR+LtQvlEcebPTgWR9oQgG9TfS+39PUfbnEeje1ICuOrN3lrFqFbmP9uzbMg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.515.0.tgz", + "integrity": "sha512-UJi+jdwcGFV/F7d3+e2aQn5yZOVpDiAgfgNhPnEtgV0WozJ5/ZUeZBgWvSc/K415N4A4D/9cbBc7+I+35qzcDQ==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/types": "^2.9.1", + "@smithy/util-endpoints": "^1.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.495.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.495.0.tgz", + "integrity": "sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.515.0.tgz", + "integrity": "sha512-pTWQb0JCafTmLHLDv3Qqs/nAAJghcPdGQIBpsCStb0YEzg3At/dOi2AIQ683yYnXmeOxLXJDzmlsovfVObJScw==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/types": "^2.9.1", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.515.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.515.0.tgz", + "integrity": "sha512-A/KJ+/HTohHyVXLH+t/bO0Z2mPrQgELbQO8tX+B2nElo8uklj70r5cT7F8ETsI9oOy+HDVpiL5/v45ZgpUOiPg==", + "dependencies": { + "@aws-sdk/types": "3.515.0", + "@smithy/node-config-provider": "^2.2.1", + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.496.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.496.0.tgz", + "integrity": "sha512-GvEjh537IIeOw1ZkZuB37sV12u+ipS5Z1dwjEC/HAvhl5ac23ULtTr1/n+U1gLNN+BAKSWjKiQ2ksj8DiUzeyw==", + "dependencies": { + "@smithy/types": "^2.9.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", @@ -1881,6 +2686,31 @@ "@nestjs/core": "^10.0.0" } }, + "node_modules/@nestjs/schedule": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-4.0.1.tgz", + "integrity": "sha512-cz2FNjsuoma+aGsG0cMmG6Dqg/BezbBWet1UTHtAuu6d2mXNTVcmoEQM2DIVG5Lfwb2hfSE2yZt8Moww+7y+mA==", + "dependencies": { + "cron": "3.1.6", + "uuid": "9.0.1" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/@nestjs/schedule/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@nestjs/schematics": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/@nestjs/schematics/-/schematics-10.1.0.tgz", @@ -2022,6 +2852,16 @@ } } }, + "node_modules/@nestjs/throttler": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@nestjs/throttler/-/throttler-5.1.2.tgz", + "integrity": "sha512-60MqhSLYUqWOgc38P6C6f76JIpf6mVjly7gpuPBCKtVd0p5e8Fq855j7bJuO4/v25vgaOo1OdVs0U1qtgYioGw==", + "peerDependencies": { + "@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/core": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2054,244 +2894,889 @@ "fastq": "^1.6.0" }, "engines": { - "node": ">= 8" + "node": ">= 8" + } + }, + "node_modules/@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", + "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@prisma/client": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.8.1.tgz", + "integrity": "sha512-xQtMPfbIwLlbm0VVIVQY2yqQVOxPwRQhvIp7Z3m2900g1bu/zRHKhYZJQWELqmjl6d8YwBy0K2NvMqh47v1ubw==", + "hasInstallScript": true, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.8.1.tgz", + "integrity": "sha512-tjuw7eA0Us3T42jx9AmAgL58rzwzpFGYc3R7Y4Ip75EBYrKMBA1YihuWMcBC92ILmjlQ/u3p8VxcIE0hr+fZfg==" + }, + "node_modules/@prisma/engines": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.8.1.tgz", + "integrity": "sha512-TJgYLRrZr56uhqcXO4GmP5be+zjCIHtLDK20Cnfg+o9d905hsN065QOL+3Z0zQAy6YD31Ol4u2kzSfRmbJv/uA==", + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "5.8.1", + "@prisma/engines-version": "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2", + "@prisma/fetch-engine": "5.8.1", + "@prisma/get-platform": "5.8.1" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2.tgz", + "integrity": "sha512-f5C3JM3l9yhGr3cr4FMqWloFaSCpNpMi58Om22rjD2DOz3owci2mFdFXMgnAGazFPKrCbbEhcxdsRfspEYRoFQ==" + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.8.1.tgz", + "integrity": "sha512-+bgjjoSFa6uYEbAPlklfoVSStOEfcpheOjoBoNsNNSQdSzcwE2nM4Q0prun0+P8/0sCHo18JZ9xqa8gObvgOUw==", + "dependencies": { + "@prisma/debug": "5.8.1", + "@prisma/engines-version": "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2", + "@prisma/get-platform": "5.8.1" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.8.1.tgz", + "integrity": "sha512-wnA+6HTFcY+tkykMokix9GiAkaauPC5W/gg0O5JB0J8tCTNWrqpnQ7AsaGRfkYUbeOIioh6woDjQrGTTRf1Zag==", + "dependencies": { + "@prisma/debug": "5.8.1" + } + }, + "node_modules/@schematics/angular": { + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.11.tgz", + "integrity": "sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A==", + "dependencies": { + "@angular-devkit/core": "13.3.11", + "@angular-devkit/schematics": "13.3.11", + "jsonc-parser": "3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.11.tgz", + "integrity": "sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w==", + "dependencies": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": { + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.11.tgz", + "integrity": "sha512-ben+EGXpCrClnIVAAnEQmhQdKmnnqFhMp5BqMxgOslSYBAmCutLA6rBu5vsc8kZcGian1wt+lueF7G1Uk5cGBg==", + "dependencies": { + "@angular-devkit/core": "13.3.11", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@schematics/angular/node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" + }, + "node_modules/@schematics/angular/node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/@schematics/angular/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@schematics/angular/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@schematics/angular/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.2.tgz", + "integrity": "sha512-iwUxrFm/ZFCXhzhtZ6JnoJzAsqUrVfBAZUTQj8ypXGtIjwXZpKqmgYiuqrDERiydDI5gesqvsC4Rqe57GGhbVg==", + "dependencies": { + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.1.1.tgz", + "integrity": "sha512-NjNFCKxC4jVvn+lUr3Yo4/PmUJj3tbyqH6GNHueyTGS5Q27vlEJ1MkNhUDV8QGxJI7Bodnc2pD18lU2zRfhHlQ==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.1.1.tgz", + "integrity": "sha512-zNW+43dltfNMUrBEYLMWgI8lQr0uhtTcUyxkgC9EP4j17WREzgSFMPUFVrVV6Rc2+QtWERYjb4tzZnQGa7R9fQ==", + "dependencies": { + "@smithy/util-base64": "^2.1.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.1.2.tgz", + "integrity": "sha512-ZDMY63xJVsJl7ei/yIMv9nx8OiEOulwNnQOUDGpIvzoBrcbvYwiMjIMe5mP5J4fUmttKkpiTKwta/7IUriAn9w==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.2", + "@smithy/types": "^2.10.0", + "@smithy/util-config-provider": "^2.2.1", + "@smithy/util-middleware": "^2.1.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.3.tgz", + "integrity": "sha512-8cT/swERvU1EUMuJF914+psSeVy4+NcNhbRe1WEKN1yIMPE5+Tq5EaPq1HWjKCodcdBIyU9ViTjd62XnebXMHA==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.4.2", + "@smithy/middleware-retry": "^2.1.2", + "@smithy/middleware-serde": "^2.1.2", + "@smithy/protocol-http": "^3.2.0", + "@smithy/smithy-client": "^2.4.0", + "@smithy/types": "^2.10.0", + "@smithy/util-middleware": "^2.1.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.2.tgz", + "integrity": "sha512-a2xpqWzhzcYwImGbFox5qJLf6i5HKdVeOVj7d6kVFElmbS2QW2T4HmefRc5z1huVArk9bh5Rk1NiFp9YBCXU3g==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.2", + "@smithy/property-provider": "^2.1.2", + "@smithy/types": "^2.10.0", + "@smithy/url-parser": "^2.1.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.1.2.tgz", + "integrity": "sha512-2PHrVRixITHSOj3bxfZmY93apGf8/DFiyhRh9W0ukfi07cvlhlRonZ0fjgcqryJjUZ5vYHqqmfIE/Qe1HM9mlw==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.10.0", + "@smithy/util-hex-encoding": "^2.1.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.1.2.tgz", + "integrity": "sha512-2N11IFHvOmKuwK6hLVkqM8ge8oiQsFkflr4h07LToxo3rX+njkx/5eRn6RVcyNmpbdbxYYt0s0Pf8u+yhHmOKg==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.1.2", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.1.2.tgz", + "integrity": "sha512-nD/+k3mK+lMMwf2AItl7uWma+edHLqiE6LyIYXYnIBlCJcIQnA/vTHjHFoSJFCfG30sBJnU/7u4X5j/mbs9uKg==", + "dependencies": { + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.1.2.tgz", + "integrity": "sha512-zNE6DhbwDEWTKl4mELkrdgXBGC7UsFg1LDkTwizSOFB/gd7G7la083wb0JgU+xPt+TYKK0AuUlOM0rUZSJzqeA==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.1.2", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.1.2.tgz", + "integrity": "sha512-Upd/zy+dNvvIDPU1HGhW9ivNjvJQ0W4UkkQOzr5Mo0hz2lqnZAyOuit4TK2JAEg/oo+V1gUY4XywDc7zNbCF0g==", + "dependencies": { + "@smithy/eventstream-codec": "^2.1.2", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.4.2.tgz", + "integrity": "sha512-sIGMVwa/8h6eqNjarI3F07gvML3mMXcqBe+BINNLuKsVKXMNBN6wRzeZbbx7lfiJDEHAP28qRns8flHEoBB7zw==", + "dependencies": { + "@smithy/protocol-http": "^3.2.0", + "@smithy/querystring-builder": "^2.1.2", + "@smithy/types": "^2.10.0", + "@smithy/util-base64": "^2.1.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.1.2.tgz", + "integrity": "sha512-f8QHgOVSXeYsc4BLKWdfXRowKa2g9byAkAX5c7Ku89bi9uBquWLEVmKlYXFBlkX562Fkmp2YSeciv+zZuOrIOQ==", + "dependencies": { + "@smithy/chunked-blob-reader": "^2.1.1", + "@smithy/chunked-blob-reader-native": "^2.1.1", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.1.2.tgz", + "integrity": "sha512-3Sgn4s0g4xud1M/j6hQwYCkz04lVJ24wvCAx4xI26frr3Ao6v0o2VZkBpUySTeQbMUBp2DhuzJ0fV1zybzkckw==", + "dependencies": { + "@smithy/types": "^2.10.0", + "@smithy/util-buffer-from": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.1.2.tgz", + "integrity": "sha512-UB6xo+KN3axrLO+MfnWb8mtdeep4vjGUcjYCVFdk9h+OqUb7JYWZZLRcupRPZx28cNBCBEUtc9wVZDI71JDdQA==", + "dependencies": { + "@smithy/types": "^2.10.0", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.1.2.tgz", + "integrity": "sha512-qdgKhkFYxDJnKecx2ANwz3JRkXjm0qDgEnAs5BIfb2z/XqA2l7s9BTH7GTC/RR4E8h6EDCeb5rM2rnARxviqIg==", + "dependencies": { + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.1.1.tgz", + "integrity": "sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.1.2.tgz", + "integrity": "sha512-C/FWR5ooyDNDfc1Opx3n0QFO5p4G0gldIbk2VU9mPGnZVTjzXcWM5jUQp33My5UK305tKYpG5/kZdQSNVh+tLw==", + "dependencies": { + "@smithy/types": "^2.10.0", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.1.2.tgz", + "integrity": "sha512-XEWtul1tHP31EtUIobEyN499paUIbnCTRtjY+ciDCEXW81lZmpjrDG3aL0FxJDPnvatVQuMV1V5eg6MCqTFaLQ==", + "dependencies": { + "@smithy/protocol-http": "^3.2.0", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.2.tgz", + "integrity": "sha512-72qbmVwaWcLOd/OT52fszrrlXywPwciwpsRiIk/dIvpcwkpGE9qrYZ2bt/SYcA/ma8Rz9Ni2AbBuSXLDYISS+A==", + "dependencies": { + "@smithy/middleware-serde": "^2.1.2", + "@smithy/node-config-provider": "^2.2.2", + "@smithy/shared-ini-file-loader": "^2.3.2", + "@smithy/types": "^2.10.0", + "@smithy/url-parser": "^2.1.2", + "@smithy/util-middleware": "^2.1.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.1.2.tgz", + "integrity": "sha512-tlvSK+v9bPHHb0dLWvEaFW2Iz0IeA57ISvSaso36I33u8F8wYqo5FCvenH7TgMVBx57jyJBXOmYCZa9n5gdJIg==", + "dependencies": { + "@smithy/node-config-provider": "^2.2.2", + "@smithy/protocol-http": "^3.2.0", + "@smithy/service-error-classification": "^2.1.2", + "@smithy/smithy-client": "^2.4.0", + "@smithy/types": "^2.10.0", + "@smithy/util-middleware": "^2.1.2", + "@smithy/util-retry": "^2.1.2", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.1.2.tgz", + "integrity": "sha512-XNU6aVIhlSbjuo2XsfZ7rd4HhjTXDlNWxAmhlBfViTW1TNK02CeWdeEntp5XtQKYD//pyTIbYi35EQvIidAkOw==", + "dependencies": { + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.1.2.tgz", + "integrity": "sha512-EPGaHGd4XmZcaRYjbhyqiqN/Q/ESxXu5e5TK24CTZUe99y8/XCxmiX8VLMM4H0DI7K3yfElR0wPAAvceoSkTgw==", + "dependencies": { + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.2.2.tgz", + "integrity": "sha512-QXvpqHSijAm13ZsVkUo92b085UzDvYP1LblWTb3uWi9WilhDvYnVyPLXaryLhOWZ2YvdhK2170T3ZBqtg+quIQ==", + "dependencies": { + "@smithy/property-provider": "^2.1.2", + "@smithy/shared-ini-file-loader": "^2.3.2", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.4.0.tgz", + "integrity": "sha512-Mf2f7MMy31W8LisJ9O+7J5cKiNwBwBBLU6biQ7/sFSFdhuOxPN7hOPoZ8vlaFjvrpfOUJw9YOpjGyNTKuvomOQ==", + "dependencies": { + "@smithy/abort-controller": "^2.1.2", + "@smithy/protocol-http": "^3.2.0", + "@smithy/querystring-builder": "^2.1.2", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.1.2.tgz", + "integrity": "sha512-yaXCVFKzxbSXqOoyA7AdAgXhwdjiLeui7n2P6XLjBCz/GZFdLUJgSY6KL1PevaxT4REMwUSs/bSHAe/0jdzEHw==", + "dependencies": { + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.2.0.tgz", + "integrity": "sha512-VRp0YITYIQum+rX4zeZ3cW1wl9r90IQzQN+VLS1NxdSMt6NLsJiJqR9czTxlaeWNrLHsFAETmjmdrS48Ug1liA==", + "dependencies": { + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.1.2.tgz", + "integrity": "sha512-wk6QpuvBBLJF5w8aADsZOtxaHY9cF5MZe1Ry3hSqqBxARdUrMoXi/jukUz5W0ftXGlbA398IN8dIIUj3WXqJXg==", + "dependencies": { + "@smithy/types": "^2.10.0", + "@smithy/util-uri-escape": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.1.2.tgz", + "integrity": "sha512-z1yL5Iiagm/UxVy1tcuTFZdfOBK/QtYeK6wfClAJ7cOY7kIaYR6jn1cVXXJmhAQSh1b2ljP4xiZN4Ybj7Tbs5w==", + "dependencies": { + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.2.tgz", + "integrity": "sha512-R+gL1pAPuWkH6unFridk57wDH5PFY2IlVg2NUjSAjoaIaU+sxqKf/7AOWIcx9Bdn+xY0/4IRQ69urlC+F3I9gg==", + "dependencies": { + "@smithy/types": "^2.10.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.2.tgz", + "integrity": "sha512-idHGDJB+gBh+aaIjmWj6agmtNWftoyAenErky74hAtKyUaCvfocSBgEJ2pQ6o68svBluvGIj4NGFgJu0198mow==", + "dependencies": { + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "node_modules/@smithy/signature-v4": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.1.2.tgz", + "integrity": "sha512-DdPWaNGIbxzyocR3ncH8xlxQgsqteRADEdCPoivgBzwv17UzKy2obtdi2vwNc5lAJ955bGEkkWef9O7kc1Eocg==", "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" - }, - "bin": { - "opencollective": "bin/opencollective.js" + "@smithy/eventstream-codec": "^2.1.2", + "@smithy/is-array-buffer": "^2.1.1", + "@smithy/types": "^2.10.0", + "@smithy/util-hex-encoding": "^2.1.1", + "@smithy/util-middleware": "^2.1.2", + "@smithy/util-uri-escape": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" }, "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "node": ">=14.0.0" } }, - "node_modules/@opentelemetry/api": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz", - "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==", + "node_modules/@smithy/smithy-client": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.4.0.tgz", + "integrity": "sha512-6/jxk0om9l2s9BcgHtrBn+Hd3xcFGDzxfEJ2FvGpZxIz0S7bgvZg1gyR66O1xf1w9WZBH+W7JClhfSn2gETINw==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.4.2", + "@smithy/middleware-stack": "^2.1.2", + "@smithy/protocol-http": "^3.2.0", + "@smithy/types": "^2.10.0", + "@smithy/util-stream": "^2.1.2", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=8.0.0" + "node": ">=14.0.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, + "node_modules/@smithy/types": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.10.0.tgz", + "integrity": "sha512-QYXQmpIebS8/jYXgyJjCanKZbI4Rr8tBVGBAIdDhA35f025TVjJNW69FJ0TGiDqt+lIGo037YIswq2t2Y1AYZQ==", + "dependencies": { + "tslib": "^2.5.0" + }, "engines": { - "node": ">=14" + "node": ">=14.0.0" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" + "node_modules/@smithy/url-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.1.2.tgz", + "integrity": "sha512-KBPi740ciTujUaY+RfQuPABD0QFmgSBN5qNVDCGTryfsbG4jkwC0YnElSzi72m24HegMyxzZDLG4Oh4/97mw2g==", + "dependencies": { + "@smithy/querystring-parser": "^2.1.2", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" } }, - "node_modules/@prisma/client": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.8.1.tgz", - "integrity": "sha512-xQtMPfbIwLlbm0VVIVQY2yqQVOxPwRQhvIp7Z3m2900g1bu/zRHKhYZJQWELqmjl6d8YwBy0K2NvMqh47v1ubw==", - "hasInstallScript": true, - "engines": { - "node": ">=16.13" - }, - "peerDependencies": { - "prisma": "*" + "node_modules/@smithy/util-base64": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.1.1.tgz", + "integrity": "sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==", + "dependencies": { + "@smithy/util-buffer-from": "^2.1.1", + "tslib": "^2.5.0" }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@prisma/debug": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.8.1.tgz", - "integrity": "sha512-tjuw7eA0Us3T42jx9AmAgL58rzwzpFGYc3R7Y4Ip75EBYrKMBA1YihuWMcBC92ILmjlQ/u3p8VxcIE0hr+fZfg==" - }, - "node_modules/@prisma/engines": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.8.1.tgz", - "integrity": "sha512-TJgYLRrZr56uhqcXO4GmP5be+zjCIHtLDK20Cnfg+o9d905hsN065QOL+3Z0zQAy6YD31Ol4u2kzSfRmbJv/uA==", - "hasInstallScript": true, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.1.1.tgz", + "integrity": "sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==", "dependencies": { - "@prisma/debug": "5.8.1", - "@prisma/engines-version": "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2", - "@prisma/fetch-engine": "5.8.1", - "@prisma/get-platform": "5.8.1" + "tslib": "^2.5.0" } }, - "node_modules/@prisma/engines-version": { - "version": "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2.tgz", - "integrity": "sha512-f5C3JM3l9yhGr3cr4FMqWloFaSCpNpMi58Om22rjD2DOz3owci2mFdFXMgnAGazFPKrCbbEhcxdsRfspEYRoFQ==" - }, - "node_modules/@prisma/fetch-engine": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.8.1.tgz", - "integrity": "sha512-+bgjjoSFa6uYEbAPlklfoVSStOEfcpheOjoBoNsNNSQdSzcwE2nM4Q0prun0+P8/0sCHo18JZ9xqa8gObvgOUw==", + "node_modules/@smithy/util-body-length-node": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.2.1.tgz", + "integrity": "sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==", "dependencies": { - "@prisma/debug": "5.8.1", - "@prisma/engines-version": "5.8.1-1.78caf6feeaed953168c64e15a249c3e9a033ebe2", - "@prisma/get-platform": "5.8.1" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@prisma/get-platform": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.8.1.tgz", - "integrity": "sha512-wnA+6HTFcY+tkykMokix9GiAkaauPC5W/gg0O5JB0J8tCTNWrqpnQ7AsaGRfkYUbeOIioh6woDjQrGTTRf1Zag==", + "node_modules/@smithy/util-buffer-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.1.1.tgz", + "integrity": "sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==", "dependencies": { - "@prisma/debug": "5.8.1" + "@smithy/is-array-buffer": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@schematics/angular": { - "version": "13.3.11", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.11.tgz", - "integrity": "sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A==", + "node_modules/@smithy/util-config-provider": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.2.1.tgz", + "integrity": "sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==", "dependencies": { - "@angular-devkit/core": "13.3.11", - "@angular-devkit/schematics": "13.3.11", - "jsonc-parser": "3.0.0" + "tslib": "^2.5.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=14.0.0" } }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { - "version": "13.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.11.tgz", - "integrity": "sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w==", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.2.tgz", + "integrity": "sha512-YmojdmsE7VbvFGJ/8btn/5etLm1HOQkgVX6nMWlB0yBL/Vb//s3aTebUJ66zj2+LNrBS3B9S+18+LQU72Yj0AQ==", "dependencies": { - "ajv": "8.9.0", - "ajv-formats": "2.1.1", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.7", - "source-map": "0.7.3" + "@smithy/property-provider": "^2.1.2", + "@smithy/smithy-client": "^2.4.0", + "@smithy/types": "^2.10.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - }, - "peerDependencies": { - "chokidar": "^3.5.2" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } + "node": ">= 10.0.0" } }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": { - "version": "13.3.11", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.11.tgz", - "integrity": "sha512-ben+EGXpCrClnIVAAnEQmhQdKmnnqFhMp5BqMxgOslSYBAmCutLA6rBu5vsc8kZcGian1wt+lueF7G1Uk5cGBg==", + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.2.1.tgz", + "integrity": "sha512-kof7M9Q2qP5yaQn8hHJL3KwozyvIfLe+ys7feifSul6gBAAeoraibo/MWqotb/I0fVLMlCMDwn7WXFsGUwnsew==", "dependencies": { - "@angular-devkit/core": "13.3.11", - "jsonc-parser": "3.0.0", - "magic-string": "0.25.7", - "ora": "5.4.1", - "rxjs": "6.6.7" + "@smithy/config-resolver": "^2.1.2", + "@smithy/credential-provider-imds": "^2.2.2", + "@smithy/node-config-provider": "^2.2.2", + "@smithy/property-provider": "^2.1.2", + "@smithy/smithy-client": "^2.4.0", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" }, "engines": { - "node": "^12.20.0 || ^14.15.0 || >=16.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">= 10.0.0" } }, - "node_modules/@schematics/angular/node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "node_modules/@smithy/util-endpoints": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.1.2.tgz", + "integrity": "sha512-2/REfdcJ20y9iF+9kSBRBsaoGzjT5dZ3E6/TA45GHJuJAb/vZTj76VLTcrl2iN3fWXiDK1B8RxchaLGbr7RxxA==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@smithy/node-config-provider": "^2.2.2", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 14.0.0" } }, - "node_modules/@schematics/angular/node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" - }, - "node_modules/@schematics/angular/node_modules/magic-string": { - "version": "0.25.7", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", - "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "node_modules/@smithy/util-hex-encoding": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.1.1.tgz", + "integrity": "sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==", "dependencies": { - "sourcemap-codec": "^1.4.4" + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@schematics/angular/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/@smithy/util-middleware": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.1.2.tgz", + "integrity": "sha512-lvSOnwQ7iAajtWb1nAyy0CkOIn8d+jGykQOtt2NXDsPzOTfejZM/Uph+O/TmVgWoXdcGuw5peUMG2f5xEIl6UQ==", "dependencies": { - "tslib": "^1.9.0" + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" }, "engines": { - "npm": ">=2.0.0" + "node": ">=14.0.0" } }, - "node_modules/@schematics/angular/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "node_modules/@smithy/util-retry": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.1.2.tgz", + "integrity": "sha512-pqifOgRqwLfRu+ks3awEKKqPeYxrHLwo4Yu2EarGzeoarTd1LVEyyf5qLE6M7IiCsxnXRhn9FoWIdZOC+oC/VQ==", + "dependencies": { + "@smithy/service-error-classification": "^2.1.2", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, "engines": { - "node": ">= 8" + "node": ">= 14.0.0" } }, - "node_modules/@schematics/angular/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/@smithy/util-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.1.2.tgz", + "integrity": "sha512-AbGjvoSok7YeUKv9WRVRSChQfsufLR54YCAabTbaABRdIucywRQs29em0uAP6r4RLj+4aFZStWGYpFgT0P8UlQ==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.4.2", + "@smithy/node-http-handler": "^2.4.0", + "@smithy/types": "^2.10.0", + "@smithy/util-base64": "^2.1.1", + "@smithy/util-buffer-from": "^2.1.1", + "@smithy/util-hex-encoding": "^2.1.1", + "@smithy/util-utf8": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "node_modules/@smithy/util-uri-escape": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.1.1.tgz", + "integrity": "sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, + "node_modules/@smithy/util-utf8": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.1.1.tgz", + "integrity": "sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==", "dependencies": { - "type-detect": "4.0.8" + "@smithy/util-buffer-from": "^2.1.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, + "node_modules/@smithy/util-waiter": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.1.2.tgz", + "integrity": "sha512-yxLC57GBDmbDmrnH+vJxsrbV4/aYUucBONkSRLZyJIVFAl/QJH+O/h+phITHDaxVZCYZAcudYJw4ERE32BJM7g==", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@smithy/abort-controller": "^2.1.2", + "@smithy/types": "^2.10.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/@tsconfig/node10": { @@ -2486,6 +3971,11 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/luxon": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.8.tgz", + "integrity": "sha512-jYvz8UMLDgy3a5SkGJne8H7VA7zPV2Lwohjx0V8V31+SqAjNmurWMkk9cQhfvlcnXWudBpK9xPM1n4rljOcHYQ==" + }, "node_modules/@types/methods": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", @@ -2505,6 +3995,15 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/papaparse": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/@types/papaparse/-/papaparse-5.3.14.tgz", + "integrity": "sha512-LxJ4iEFcpqc6METwp9f6BV6VVc43m6MfH0VqFosHvrUgfXiFe6ww7R3itkOQ+TCK6Y+Iv/+RnnvtRZnkc5Kc9g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/qs": { "version": "6.9.11", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", @@ -3474,6 +4973,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, "node_modules/boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", @@ -4237,6 +5741,15 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cron": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/cron/-/cron-3.1.6.tgz", + "integrity": "sha512-cvFiQCeVzsA+QPM6fhjBtlKGij7tLLISnTSvFxVdnFGLdz+ZdXN37kNe0i2gefmdD17XuZA6n2uPVwzl4FxW/w==", + "dependencies": { + "@types/luxon": "~3.3.0", + "luxon": "~3.4.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -5543,6 +7056,27 @@ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", @@ -8215,6 +9749,14 @@ "yallist": "^3.0.2" } }, + "node_modules/luxon": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.4.tgz", + "integrity": "sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==", + "engines": { + "node": ">=12" + } + }, "node_modules/magic-string": { "version": "0.30.5", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", @@ -8872,6 +10414,11 @@ "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" }, + "node_modules/papaparse": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", + "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10343,6 +11890,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, "node_modules/superagent": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", diff --git a/backend/package.json b/backend/package.json index 4a50ef4b..1fc28009 100644 --- a/backend/package.json +++ b/backend/package.json @@ -22,21 +22,25 @@ "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { + "@aws-sdk/client-s3": "^3.515.0", "@nestjs/cli": "^10.1.16", "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.0.0", "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", + "@nestjs/schedule": "^4.0.1", "@nestjs/schematics": "^10.0.0", "@nestjs/swagger": "^7.0.3", "@nestjs/terminus": "^10.2.1", "@nestjs/testing": "^10.0.0", + "@nestjs/throttler": "^5.1.2", "@prisma/client": "^5.7.0", "dotenv": "^16.0.1", "express-prom-bundle": "^7.0.0", "helmet": "^7.0.0", "nest-winston": "^1.9.4", "nestjs-prisma": "^0.23.0", + "papaparse": "^5.4.1", "pg": "^8.11.3", "prom-client": "^15.1.0", "reflect-metadata": "^0.2.0", @@ -49,6 +53,7 @@ "@types/express": "^4.17.15", "@types/jest": "^29.0.0", "@types/node": "^20.0.0", + "@types/papaparse": "^5.3.14", "@types/supertest": "^6.0.0", "@typescript-eslint/eslint-plugin": "^6.5.0", "@typescript-eslint/parser": "^6.5.0", diff --git a/backend/src/app.controller.spec.ts b/backend/src/app.controller.spec.ts index 722af674..0412bd0f 100644 --- a/backend/src/app.controller.spec.ts +++ b/backend/src/app.controller.spec.ts @@ -1,22 +1,23 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; +import { Test, TestingModule } from "@nestjs/testing"; +import { AppController } from "./app.controller"; +import { AppService } from "./app.service"; +import { ObjectStoreService } from "./v1/object-store/object.store.service"; -describe('AppController', () => { +describe("AppController", () => { let appController: AppController; beforeEach(async () => { const app: TestingModule = await Test.createTestingModule({ controllers: [AppController], - providers: [AppService], + providers: [AppService, ObjectStoreService], }).compile(); appController = app.get(AppController); }); - describe('root', () => { + describe("root", () => { it('should return "Hello Backend!"', () => { - expect(appController.getHello()).toBe('Hello Backend!'); + expect(appController.getHello()).toBe("Hello Backend!"); }); }); }); diff --git a/backend/src/app.controller.ts b/backend/src/app.controller.ts index cce879ee..6cc94d03 100644 --- a/backend/src/app.controller.ts +++ b/backend/src/app.controller.ts @@ -1,12 +1,19 @@ import { Controller, Get } from '@nestjs/common'; import { AppService } from './app.service'; +import { ObjectStoreService } from './v1/object-store/object.store.service' +import { OmrrData } from './v1/types/omrr-data' @Controller() export class AppController { - constructor(private readonly appService: AppService) {} + constructor(private readonly appService: AppService, + private readonly objectStoreService: ObjectStoreService) {} @Get() getHello(): string { return this.appService.getHello(); } + @Get('/omrr') + async getAllOmrrRecords(): Promise { + return this.objectStoreService.getLatestOMRRFileContents(); + } } diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index 869c614f..703f795e 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -1,32 +1,37 @@ -import "dotenv/config"; -import { Logger, MiddlewareConsumer, Module, RequestMethod } from "@nestjs/common"; -import { HTTPLoggerMiddleware } from "./middleware/req.res.logger"; -import { loggingMiddleware, PrismaModule } from "nestjs-prisma"; -import { ConfigModule } from "@nestjs/config"; -import { AppService } from "./app.service"; -import { AppController } from "./app.controller"; -import { MetricsController } from "./metrics.controller"; -import { TerminusModule } from '@nestjs/terminus'; -import { HealthController } from "./health.controller"; +import 'dotenv/config' +import { Logger, MiddlewareConsumer, Module, RequestMethod } from '@nestjs/common' +import { HTTPLoggerMiddleware } from './middleware/req.res.logger' +import { loggingMiddleware, PrismaModule } from 'nestjs-prisma' +import { ConfigModule } from '@nestjs/config' +import { AppService } from './app.service' +import { AppController } from './app.controller' +import { MetricsController } from './metrics.controller' +import { TerminusModule } from '@nestjs/terminus' +import { HealthController } from './health.controller' +import { ThrottlerModule } from '@nestjs/throttler' +import { ObjectStoreModule } from './v1/object-store/object.store.module' +import { ObjectStoreService } from './v1/object-store/object.store.service' +import { TasksModule } from './v1/tasks/task.module' +import { ScheduleModule } from '@nestjs/schedule' -const DB_HOST = process.env.POSTGRES_HOST || "localhost"; -const DB_USER = process.env.POSTGRES_USER || "postgres"; -const DB_PWD = encodeURIComponent(process.env.POSTGRES_PASSWORD || "default"); // this needs to be encoded, if the password contains special characters it will break connection string. -const DB_PORT = process.env.POSTGRES_PORT || 5432; -const DB_NAME = process.env.POSTGRES_DATABASE || "postgres"; -const DB_SCHEMA = process.env.DB_SCHEMA || "users"; +const DB_HOST = process.env.POSTGRES_HOST || 'localhost' +const DB_USER = process.env.POSTGRES_USER || 'postgres' +const DB_PWD = encodeURIComponent(process.env.POSTGRES_PASSWORD || 'default') // this needs to be encoded, if the password contains special characters it will break connection string. +const DB_PORT = process.env.POSTGRES_PORT || 5432 +const DB_NAME = process.env.POSTGRES_DATABASE || 'postgres' +const DB_SCHEMA = process.env.DB_SCHEMA || 'users' function getMiddlewares() { if (process.env.PRISMA_LOGGING) { return [ // configure your prisma middleware loggingMiddleware({ - logger: new Logger("PrismaMiddleware"), - logLevel: "debug" - }) - ]; + logger: new Logger('PrismaMiddleware'), + logLevel: 'debug', + }), + ] } - return []; + return [] } @Module({ @@ -35,21 +40,31 @@ function getMiddlewares() { TerminusModule, PrismaModule.forRoot({ isGlobal: true, - prismaServiceOptions:{ - prismaOptions:{ - log: ["error", "warn"], - errorFormat: "pretty", + prismaServiceOptions: { + prismaOptions: { + log: ['error', 'warn'], + errorFormat: 'pretty', datasourceUrl: `postgresql://${DB_USER}:${DB_PWD}@${DB_HOST}:${DB_PORT}/${DB_NAME}?schema=${DB_SCHEMA}&connection_limit=5`, }, middlewares: getMiddlewares(), }, }), + ThrottlerModule.forRoot([{ + ttl: 60000, + limit: 1000, + }]), + ScheduleModule.forRoot(), + TasksModule, + ObjectStoreModule, ], controllers: [AppController, MetricsController, HealthController], - providers: [AppService] + providers: [AppService, ObjectStoreService], }) export class AppModule { // let's add a middleware on all routes configure(consumer: MiddlewareConsumer) { - consumer.apply(HTTPLoggerMiddleware).exclude({ path: 'metrics', method: RequestMethod.ALL }, { path: 'health', method: RequestMethod.ALL }).forRoutes('*'); + consumer.apply(HTTPLoggerMiddleware).exclude({ path: 'metrics', method: RequestMethod.ALL }, { + path: 'health', + method: RequestMethod.ALL, + }).forRoutes('*') } } diff --git a/backend/src/v1/object-store/object.store.module.ts b/backend/src/v1/object-store/object.store.module.ts new file mode 100644 index 00000000..f9ee586d --- /dev/null +++ b/backend/src/v1/object-store/object.store.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common' +import { ObjectStoreService } from './object.store.service' + +@Module({ + providers: [ObjectStoreService], + exports: [ObjectStoreService], +}) +export class ObjectStoreModule{ + +} diff --git a/backend/src/v1/object-store/object.store.service.ts b/backend/src/v1/object-store/object.store.service.ts new file mode 100644 index 00000000..daeb9b8a --- /dev/null +++ b/backend/src/v1/object-store/object.store.service.ts @@ -0,0 +1,104 @@ +import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common' +import { GetObjectCommand, ListObjectsCommand, S3Client } from '@aws-sdk/client-s3' +import * as process from 'process' +import { logger } from '../../logger' +import { Readable } from 'stream' +import Papa from 'papaparse' +import { OmrrData } from '../types/omrr-data' + +@Injectable() +export class ObjectStoreService implements OnModuleDestroy, OnModuleInit { + private readonly _s3Client: S3Client + private _omrrData: OmrrData[] = [] + + constructor() { + this._s3Client = new S3Client({ + credentials: { + accessKeyId: process.env.OS_ACCESS_KEY_ID, + secretAccessKey: process.env.OS_SECRET_ACCESS_KEY_ID, + }, + endpoint: process.env.OS_ENDPOINT, + forcePathStyle: true, + region: 'ca-central-1', + }) + } + + async onModuleInit() { + try { + logger.info('Initializing ObjectStoreService'); + await this.getLatestOmrrDataFromObjectStore() + } catch (e) { + logger.error(e) + process.exit(1) + } + } + + onModuleDestroy() { + this._s3Client.destroy() + } + + async parseCSVToObject(csv: string): Promise { + return new Promise((resolve, reject) => { + Papa.parse(csv, { + header: true, + complete: (results: any) => { + resolve(results.data) + }, + error: (error: any) => { + reject(error) + }, + }) + }) + } + + async convertCSVToJson(stream: Readable): Promise { + return new Promise((resolve, reject) => { + let csvData = '' + stream.on('data', (chunk) => { + csvData += chunk + }) + stream.on('end', async () => { + try { + const jsonData = await this.parseCSVToObject(csvData) + resolve(jsonData) + } catch (error) { + reject(error) + } + }) + stream.on('error', (error) => { + reject(error) + }) + }) + } + + async getLatestOMRRFileContents(): Promise { + return this._omrrData + } + + async getLatestOmrrDataFromObjectStore(): Promise { + try { + const response = await this._s3Client.send( + new ListObjectsCommand({ Bucket: process.env.OS_BUCKET }), + ) + let sortedData: any = response.Contents.sort((a: any, b: any) => { + const modifiedDateA: any = new Date(a.LastModified) + const modifiedDateB: any = new Date(b.LastModified) + return modifiedDateB - modifiedDateA + }) + const fileName = sortedData[0]?.Key + logger.info(`fileName is ${fileName}`) + + const result = await this._s3Client.send( + new GetObjectCommand({ Bucket: process.env.OS_BUCKET, Key: fileName }), + ) + const fileStream: any = result?.Body + if (fileStream) { + this._omrrData = await this.convertCSVToJson(fileStream) + return this._omrrData + } + } catch (e) { + } + + throw new Error('No file found') + } +} diff --git a/backend/src/v1/tasks/task.module.ts b/backend/src/v1/tasks/task.module.ts new file mode 100644 index 00000000..a6404643 --- /dev/null +++ b/backend/src/v1/tasks/task.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { TasksService } from './task.service'; +import { ObjectStoreModule } from '../object-store/object.store.module' + +@Module({ + imports: [ObjectStoreModule], + providers: [TasksService], +}) +export class TasksModule {} diff --git a/backend/src/v1/tasks/task.service.ts b/backend/src/v1/tasks/task.service.ts new file mode 100644 index 00000000..4d94bccd --- /dev/null +++ b/backend/src/v1/tasks/task.service.ts @@ -0,0 +1,20 @@ +import { Injectable, Logger } from '@nestjs/common' +import { Cron } from '@nestjs/schedule' +import { ObjectStoreService } from '../object-store/object.store.service' +import { logger } from '../../logger' + +@Injectable() +export class TasksService { + + constructor(private readonly objectStoreService: ObjectStoreService) { + + } + + @Cron('0 0 0/4 * * *') + async refreshCache() { + logger.info('refresh cache every 4 hours') + await this.objectStoreService.getLatestOmrrDataFromObjectStore() + + } + +} diff --git a/backend/src/v1/types/omrr-data.ts b/backend/src/v1/types/omrr-data.ts new file mode 100644 index 00000000..fcfa7eb6 --- /dev/null +++ b/backend/src/v1/types/omrr-data.ts @@ -0,0 +1,32 @@ +export interface OmrrData { + "id": number; + "Authorization Number": number, + "Authorization Type": string, + "Regulated Party": string, + "Authorization Status": string, + "Effective/Issue Date": Date, + "Last Amendment Date": Date, + "Facility Location": string, + "Latitude": number, + "Longitude": number + "WDR Regulation"?: string, + "WDR Schedule One or Two"? : string, + "Operation Type"? : string, + "Material Land Applied"? : string, + "Intended Dates of Land Applica"? : string, + "Facility Design Capacity (t/y)"? : string, + "Type of Compost Produced"? : string, + "Yard Waste"? : boolean, + "Biosolids"? : boolean, + "Whey"? : boolean, + "Untreated and Unprocessed Wood"? : boolean, + "Poultry Carcasses"? : boolean, + "Fish Wastes"? : boolean, + "Food Waste"? : boolean, + "Brewary Waste/Wine Waste"? : boolean, + "Animal Bedding"? : boolean, + "Domestic Septic Tank Sludge"? : boolean, + "Hatchery Waste"? : boolean, + "Manure"? : boolean, + "Milk Processing Waste"? : boolean, +} diff --git a/charts/nr-omrr-transparency/templates/secret.yaml b/charts/nr-omrr-transparency/templates/secret.yaml index 297e7de0..418a6f17 100644 --- a/charts/nr-omrr-transparency/templates/secret.yaml +++ b/charts/nr-omrr-transparency/templates/secret.yaml @@ -33,5 +33,8 @@ data: POSTGRES_USER: {{ $databaseUser | b64enc | quote }} POSTGRES_DATABASE: {{ $databaseName | b64enc | quote }} POSTGRES_HOST: {{ $hostWithoutPort | b64enc | quote }} - + OS_BUCKET: {{ .Values.global.secrets.osBucket | b64enc | quote }} + OS_ACCESS_KEY_ID: {{ .Values.global.secrets.osAccessKeyId | b64enc | quote }} + OS_SECRET_ACCESS_KEY_ID: {{ .Values.global.secrets.osSecretAccessKeyId | b64enc | quote }} + OS_ENDPOINT: {{ .Values.global.secrets.osEndpoint | b64enc | quote }} {{- end }} diff --git a/charts/nr-omrr-transparency/values.yaml b/charts/nr-omrr-transparency/values.yaml index 952dfcbe..da0d0a23 100644 --- a/charts/nr-omrr-transparency/values.yaml +++ b/charts/nr-omrr-transparency/values.yaml @@ -18,6 +18,10 @@ global: databaseName: ~ annotation: helm.sh/policy: "keep" + osBucket: ~ + osAccessKeyId: ~ + osSecretAccessKeyId: ~ + osEndpoint: ~ #-- domain of the application, it is required, apps.silver.devops.gov.bc.ca for silver cluster and apps.devops.gov.bc.ca for gold cluster domain: "apps.silver.devops.gov.bc.ca" # it is apps.gold.devops.gov.bc.ca for gold cluster #-- the database Alias gives a nice way to switch to different databases, crunchy, patroni ... etc. @@ -32,17 +36,17 @@ backend: #-- autoscaling for the component. it is optional and is an object. initContainerResources: limits: - cpu: 150m + cpu: 100m memory: 200Mi requests: - cpu: 50m + cpu: 30m memory: 100Mi containerResources: limits: - cpu: 150m + cpu: 100m memory: 200Mi requests: - cpu: 50m + cpu: 30m memory: 100Mi autoscaling: #-- enable or disable autoscaling. @@ -71,7 +75,7 @@ frontend: imagePullPolicy: Always containerResources: limits: - cpu: 50m + cpu: 60m memory: 100Mi requests: cpu: 20m @@ -90,6 +94,9 @@ frontend: service: type: ClusterIP #-- the route for the component. it is optional and is an object. To make the application accessible from internet, use the route. + pdb: + enabled: false # enable it in PRODUCTION for having pod disruption budget. + minAvailable: 1 # the minimum number of pods that must be available during the disruption budget. crunchy: # enable it for TEST and PROD, for PR based pipelines simply use single postgres enabled: false @@ -224,8 +231,8 @@ bitnami-pg: PGPASSWORD=$POSTGRES_PASSWORD psql -U postgres -d postgres -c "CREATE EXTENSION postgis;" resources: requests: - cpu: 50m - memory: 150Mi + cpu: 30m + memory: 100Mi limits: - cpu: 150m + cpu: 90m memory: 250Mi diff --git a/frontend/src/components/DataTable.tsx b/frontend/src/components/DataTable.tsx index 5b67ecde..49f357a7 100644 --- a/frontend/src/components/DataTable.tsx +++ b/frontend/src/components/DataTable.tsx @@ -20,20 +20,6 @@ const columns: GridColDef[] = [ filterable: true, flex: 1, }, - { - field: 'Status', - headerName: 'Status', - sortable: true, - filterable: true, - flex: 1, - }, - { - field: 'Company', - headerName: 'Company', - sortable: true, - filterable: true, - flex: 1, - }, { field: 'Authorization Type', headerName: 'Authorization Type', @@ -42,134 +28,41 @@ const columns: GridColDef[] = [ flex: 1, }, { - field: 'Discharge Type', - headerName: 'Discharge Type', + field: 'Regulated Party', + headerName: 'Regulated Party', sortable: true, filterable: true, flex: 1, }, { - field: 'BC Industry Code (BCENIC)', - headerName: 'BC Industry Code (BCENIC)', + field: 'Authorization Status', + headerName: 'Authorization Status', sortable: true, filterable: true, flex: 1, }, { - field: 'EMS Site #, Type and Desc.', - headerName: 'EMS Site #, Type and Desc.', + field: 'Effective/Issue Date', + headerName: 'Effective/Issue Date', sortable: true, filterable: true, flex: 1, }, - /* { - field: 'Comparative Priority Index', - headerName: 'Comparative Priority Index', - sortable: true, - filterable: true, - }, - { - field: 'WDR Regulation', - headerName: 'WDR Regulation', - sortable: true, - filterable: true, - }, - { - field: 'WDR Description', - headerName: 'WDR Description', - sortable: true, - filterable: true, - }, { - field: 'Facility Type/Description', - headerName: 'Facility Type/Description', - sortable: true, - filterable: true, - }, - { - field: 'Discharge Point/Source', - headerName: 'Discharge Point/Source', - sortable: true, - filterable: true, - }, */ - { - field: 'Discharge Contaminant', - headerName: 'Discharge Contaminant', + field: 'Last Amendment Date', + headerName: 'Last Amendment Date', sortable: true, filterable: true, flex: 1, }, - /* { - field: 'Discharge Min', - headerName: 'Discharge Min', - sortable: true, - filterable: true, - }, { - field: 'Discharge Avg', - headerName: 'Discharge Avg', - sortable: true, - filterable: true, - }, - { - field: 'Discharge Max', - headerName: 'Discharge Max', - sortable: true, - filterable: true, - }, - { - field: 'Discharge Start Date', - headerName: 'Discharge Start Date', - sortable: true, - filterable: true, - }, - { - field: 'Discharge End Date', - headerName: 'Discharge End Date', - sortable: true, - filterable: true, - }, - { - field: 'Proposed Treatment + Disposal', - headerName: 'Proposed Treatment + Disposal', - sortable: true, - filterable: true, - }, */ - { - field: 'Administrative Area', - headerName: 'Administrative Area', - sortable: true, - filterable: true, - flex: 1, - }, - { - field: 'Program Area', - headerName: 'Program Area', - sortable: true, - filterable: true, - flex: 1, - }, - { - field: 'Regional District', - headerName: 'Regional District', - sortable: true, - filterable: true, - flex: 1, - }, - { - field: 'Nearest Municipality', - headerName: 'Nearest Municipality', - sortable: true, - filterable: true, - flex: 1, - }, - { - field: 'Facility Address', - headerName: 'Facility Address', + field: 'Facility Location', + headerName: 'Facility Location', sortable: true, filterable: true, flex: 1, }, + { field: 'Latitude', headerName: 'Latitude', @@ -177,6 +70,7 @@ const columns: GridColDef[] = [ filterable: true, flex: 1, }, + { field: 'Longitude', headerName: 'Longitude', @@ -184,362 +78,18 @@ const columns: GridColDef[] = [ filterable: true, flex: 1, }, - { - field: 'Issue Date', - headerName: 'Issue Date', - sortable: true, - filterable: true, - flex: 1, - }, - { - field: 'Expiry Date', - headerName: 'Expiry Date', - sortable: true, - filterable: true, - flex: 1, - }, + ] export default function DataTable() { - const [data, setData] = useState([ - { - id: 1, - 'Authorization Number': 1, - Status: 'Active', - Company: 'COMPANY A', - 'Authorization Type': - 'Oil & Gas Waste Regulation (Facility Registration)', - 'Discharge Type': 'Air', - 'BC Industry Code (BCENIC)': - 'Primary: 211100 Oil & Gas - Extraction Secondary: 211110 Oil & Gas - Processing Plants', - 'EMS Site #, Type and Desc.': 'E333591: STACK - Permitted Discharge', - 'Comparative Priority Index': 'Low', - 'WDR Regulation': 'Schedule 1', - 'WDR Description': 'Oil and Natural Gas Industry - Large', - 'Facility Type/Description': 'Waterhub ', - 'Discharge Point/Source': 'One (1) Caterpillar G3512 Generator', - 'Discharge Contaminant': 'Nitrous Oxide', - 'Discharge Min': null, - 'Discharge Avg': ' 4.877 t/y', - 'Discharge Max': null, - 'Discharge Start Date': '2024-02-01', - 'Discharge End Date': '3999-12-31', - 'Proposed Treatment + Disposal': 'Discharge To Air', - 'Administrative Area': 'BC Energy Regulator', - 'Program Area': 'Authorizations', - 'Regional District': 'Peace River ', - 'Nearest Municipality': 'Fort St. John (OGC)', - 'Facility Address': 'facilities 1', - Latitude: 56.30521, - Longitude: 121.978231, - 'Issue Date': '2023-11-08', - 'Expiry Date': '2024-02-06', - }, - { - id: 2, - 'Authorization Number': 2, - Status: 'Active', - Company: 'COMPANY A', - 'Authorization Type': - 'Oil & Gas Waste Regulation (Facility Registration)', - 'Discharge Type': 'Air', - 'BC Industry Code (BCENIC)': - 'Primary: 211100 Oil & Gas - Extraction Secondary: 211110 Oil & Gas - Processing Plants', - 'EMS Site #, Type and Desc.': 'E333591: STACK - Permitted Discharge', - 'Comparative Priority Index': 'Low', - 'WDR Regulation': 'Schedule 1', - 'WDR Description': 'Oil and Natural Gas Industry - Large', - 'Facility Type/Description': 'Waterhub ', - 'Discharge Point/Source': 'One (1) Caterpillar G3512 Generator', - 'Discharge Contaminant': 'Nitrous Oxide', - 'Discharge Min': null, - 'Discharge Avg': ' 4.877 t/y', - 'Discharge Max': null, - 'Discharge Start Date': '2024-02-01', - 'Discharge End Date': '3999-12-31', - 'Proposed Treatment + Disposal': 'Discharge To Air', - 'Administrative Area': 'BC Energy Regulator', - 'Program Area': 'Authorizations', - 'Regional District': 'Peace River ', - 'Nearest Municipality': 'Fort St. John (OGC)', - 'Facility Address': 'facilities 1', - Latitude: 56.30521, - Longitude: 121.978231, - 'Issue Date': '2023-11-08', - 'Expiry Date': '2024-02-06', - }, - { - id: 3, - 'Authorization Number': 3, - Status: 'Active', - Company: 'COMPANY A', - 'Authorization Type': - 'Oil & Gas Waste Regulation (Facility Registration)', - 'Discharge Type': 'Air', - 'BC Industry Code (BCENIC)': - 'Primary: 211100 Oil & Gas - Extraction Secondary: 211110 Oil & Gas - Processing Plants', - 'EMS Site #, Type and Desc.': 'E333591: STACK - Permitted Discharge', - 'Comparative Priority Index': 'Low', - 'WDR Regulation': 'Schedule 1', - 'WDR Description': 'Oil and Natural Gas Industry - Large', - 'Facility Type/Description': 'Waterhub ', - 'Discharge Point/Source': 'One (1) Caterpillar G3512 Generator', - 'Discharge Contaminant': 'Nitrous Oxide', - 'Discharge Min': null, - 'Discharge Avg': ' 4.877 t/y', - 'Discharge Max': null, - 'Discharge Start Date': '2024-02-01', - 'Discharge End Date': '3999-12-31', - 'Proposed Treatment + Disposal': 'Discharge To Air', - 'Administrative Area': 'BC Energy Regulator', - 'Program Area': 'Authorizations', - 'Regional District': 'Peace River ', - 'Nearest Municipality': 'Fort St. John (OGC)', - 'Facility Address': 'facilities 1', - Latitude: 56.30521, - Longitude: 121.978231, - 'Issue Date': '2023-11-08', - 'Expiry Date': '2024-02-06', - }, - { - id: 4, - 'Authorization Number': 4, - Status: 'Active', - Company: 'COMPANY A', - 'Authorization Type': - 'Oil & Gas Waste Regulation (Facility Registration)', - 'Discharge Type': 'Air', - 'BC Industry Code (BCENIC)': - 'Primary: 211100 Oil & Gas - Extraction Secondary: 211110 Oil & Gas - Processing Plants', - 'EMS Site #, Type and Desc.': 'E333591: STACK - Permitted Discharge', - 'Comparative Priority Index': 'Low', - 'WDR Regulation': 'Schedule 1', - 'WDR Description': 'Oil and Natural Gas Industry - Large', - 'Facility Type/Description': 'Waterhub ', - 'Discharge Point/Source': 'One (1) Caterpillar G3512 Generator', - 'Discharge Contaminant': 'Nitrous Oxide', - 'Discharge Min': null, - 'Discharge Avg': ' 4.877 t/y', - 'Discharge Max': null, - 'Discharge Start Date': '2024-02-01', - 'Discharge End Date': '3999-12-31', - 'Proposed Treatment + Disposal': 'Discharge To Air', - 'Administrative Area': 'BC Energy Regulator', - 'Program Area': 'Authorizations', - 'Regional District': 'Peace River ', - 'Nearest Municipality': 'Fort St. John (OGC)', - 'Facility Address': 'facilities 1', - Latitude: 56.30521, - Longitude: 121.978231, - 'Issue Date': '2023-11-08', - 'Expiry Date': '2024-02-06', - }, - { - id: 5, - 'Authorization Number': 5, - Status: 'Active', - Company: 'COMPANY A', - 'Authorization Type': - 'Oil & Gas Waste Regulation (Facility Registration)', - 'Discharge Type': 'Air', - 'BC Industry Code (BCENIC)': - 'Primary: 211100 Oil & Gas - Extraction Secondary: 211110 Oil & Gas - Processing Plants', - 'EMS Site #, Type and Desc.': 'E333591: STACK - Permitted Discharge', - 'Comparative Priority Index': 'Low', - 'WDR Regulation': 'Schedule 1', - 'WDR Description': 'Oil and Natural Gas Industry - Large', - 'Facility Type/Description': 'Waterhub ', - 'Discharge Point/Source': 'One (1) Caterpillar G3512 Generator', - 'Discharge Contaminant': 'Nitrous Oxide', - 'Discharge Min': null, - 'Discharge Avg': ' 4.877 t/y', - 'Discharge Max': null, - 'Discharge Start Date': '2024-02-01', - 'Discharge End Date': '3999-12-31', - 'Proposed Treatment + Disposal': 'Discharge To Air', - 'Administrative Area': 'BC Energy Regulator', - 'Program Area': 'Authorizations', - 'Regional District': 'Peace River ', - 'Nearest Municipality': 'Fort St. John (OGC)', - 'Facility Address': 'facilities 1', - Latitude: 56.30521, - Longitude: 121.978231, - 'Issue Date': '2023-11-08', - 'Expiry Date': '2024-02-06', - }, - { - id: 6, - 'Authorization Number': 6, - Status: 'Active', - Company: 'COMPANY A', - 'Authorization Type': - 'Oil & Gas Waste Regulation (Facility Registration)', - 'Discharge Type': 'Air', - 'BC Industry Code (BCENIC)': - 'Primary: 211100 Oil & Gas - Extraction Secondary: 211110 Oil & Gas - Processing Plants', - 'EMS Site #, Type and Desc.': 'E333591: STACK - Permitted Discharge', - 'Comparative Priority Index': 'Low', - 'WDR Regulation': 'Schedule 1', - 'WDR Description': 'Oil and Natural Gas Industry - Large', - 'Facility Type/Description': 'Waterhub ', - 'Discharge Point/Source': 'One (1) Caterpillar G3512 Generator', - 'Discharge Contaminant': 'Nitrous Oxide', - 'Discharge Min': null, - 'Discharge Avg': ' 4.877 t/y', - 'Discharge Max': null, - 'Discharge Start Date': '2024-02-01', - 'Discharge End Date': '3999-12-31', - 'Proposed Treatment + Disposal': 'Discharge To Air', - 'Administrative Area': 'BC Energy Regulator', - 'Program Area': 'Authorizations', - 'Regional District': 'Peace River ', - 'Nearest Municipality': 'Fort St. John (OGC)', - 'Facility Address': 'facilities 1', - Latitude: 56.30521, - Longitude: 121.978231, - 'Issue Date': '2023-11-08', - 'Expiry Date': '2024-02-06', - }, - { - id: 7, - 'Authorization Number': 7, - Status: 'Active', - Company: 'COMPANY A', - 'Authorization Type': - 'Oil & Gas Waste Regulation (Facility Registration)', - 'Discharge Type': 'Air', - 'BC Industry Code (BCENIC)': - 'Primary: 211100 Oil & Gas - Extraction Secondary: 211110 Oil & Gas - Processing Plants', - 'EMS Site #, Type and Desc.': 'E333591: STACK - Permitted Discharge', - 'Comparative Priority Index': 'Low', - 'WDR Regulation': 'Schedule 1', - 'WDR Description': 'Oil and Natural Gas Industry - Large', - 'Facility Type/Description': 'Waterhub ', - 'Discharge Point/Source': 'One (1) Caterpillar G3512 Generator', - 'Discharge Contaminant': 'Nitrous Oxide', - 'Discharge Min': null, - 'Discharge Avg': ' 4.877 t/y', - 'Discharge Max': null, - 'Discharge Start Date': '2024-02-01', - 'Discharge End Date': '3999-12-31', - 'Proposed Treatment + Disposal': 'Discharge To Air', - 'Administrative Area': 'BC Energy Regulator', - 'Program Area': 'Authorizations', - 'Regional District': 'Peace River ', - 'Nearest Municipality': 'Fort St. John (OGC)', - 'Facility Address': 'facilities 1', - Latitude: 56.30521, - Longitude: 121.978231, - 'Issue Date': '2023-11-08', - 'Expiry Date': '2024-02-06', - }, - { - id: 8, - 'Authorization Number': 8, - Status: 'Active', - Company: 'COMPANY A', - 'Authorization Type': - 'Oil & Gas Waste Regulation (Facility Registration)', - 'Discharge Type': 'Air', - 'BC Industry Code (BCENIC)': - 'Primary: 211100 Oil & Gas - Extraction Secondary: 211110 Oil & Gas - Processing Plants', - 'EMS Site #, Type and Desc.': 'E333591: STACK - Permitted Discharge', - 'Comparative Priority Index': 'Low', - 'WDR Regulation': 'Schedule 1', - 'WDR Description': 'Oil and Natural Gas Industry - Large', - 'Facility Type/Description': 'Waterhub ', - 'Discharge Point/Source': 'One (1) Caterpillar G3512 Generator', - 'Discharge Contaminant': 'Nitrous Oxide', - 'Discharge Min': null, - 'Discharge Avg': ' 4.877 t/y', - 'Discharge Max': null, - 'Discharge Start Date': '2024-02-01', - 'Discharge End Date': '3999-12-31', - 'Proposed Treatment + Disposal': 'Discharge To Air', - 'Administrative Area': 'BC Energy Regulator', - 'Program Area': 'Authorizations', - 'Regional District': 'Peace River ', - 'Nearest Municipality': 'Fort St. John (OGC)', - 'Facility Address': 'facilities 1', - Latitude: 56.30521, - Longitude: 121.978231, - 'Issue Date': '2023-11-08', - 'Expiry Date': '2024-02-06', - }, - { - id: 9, - 'Authorization Number': 9, - Status: 'Active', - Company: 'COMPANY A', - 'Authorization Type': - 'Oil & Gas Waste Regulation (Facility Registration)', - 'Discharge Type': 'Air', - 'BC Industry Code (BCENIC)': - 'Primary: 211100 Oil & Gas - Extraction Secondary: 211110 Oil & Gas - Processing Plants', - 'EMS Site #, Type and Desc.': 'E333591: STACK - Permitted Discharge', - 'Comparative Priority Index': 'Low', - 'WDR Regulation': 'Schedule 1', - 'WDR Description': 'Oil and Natural Gas Industry - Large', - 'Facility Type/Description': 'Waterhub ', - 'Discharge Point/Source': 'One (1) Caterpillar G3512 Generator', - 'Discharge Contaminant': 'Nitrous Oxide', - 'Discharge Min': null, - 'Discharge Avg': ' 4.877 t/y', - 'Discharge Max': null, - 'Discharge Start Date': '2024-02-01', - 'Discharge End Date': '3999-12-31', - 'Proposed Treatment + Disposal': 'Discharge To Air', - 'Administrative Area': 'BC Energy Regulator', - 'Program Area': 'Authorizations', - 'Regional District': 'Peace River ', - 'Nearest Municipality': 'Fort St. John (OGC)', - 'Facility Address': 'facilities 1', - Latitude: 56.30521, - Longitude: 121.978231, - 'Issue Date': '2023-11-08', - 'Expiry Date': '2024-02-06', - }, - { - id: 10, - 'Authorization Number': 10, - Status: 'Active', - Company: 'COMPANY A', - 'Authorization Type': - 'Oil & Gas Waste Regulation (Facility Registration)', - 'Discharge Type': 'Air', - 'BC Industry Code (BCENIC)': - 'Primary: 211100 Oil & Gas - Extraction Secondary: 211110 Oil & Gas - Processing Plants', - 'EMS Site #, Type and Desc.': 'E333591: STACK - Permitted Discharge', - 'Comparative Priority Index': 'Low', - 'WDR Regulation': 'Schedule 1', - 'WDR Description': 'Oil and Natural Gas Industry - Large', - 'Facility Type/Description': 'Waterhub ', - 'Discharge Point/Source': 'One (1) Caterpillar G3512 Generator', - 'Discharge Contaminant': 'Nitrous Oxide', - 'Discharge Min': null, - 'Discharge Avg': ' 4.877 t/y', - 'Discharge Max': null, - 'Discharge Start Date': '2024-02-01', - 'Discharge End Date': '3999-12-31', - 'Proposed Treatment + Disposal': 'Discharge To Air', - 'Administrative Area': 'BC Energy Regulator', - 'Program Area': 'Authorizations', - 'Regional District': 'Peace River ', - 'Nearest Municipality': 'Fort St. John (OGC)', - 'Facility Address': 'facilities 1', - Latitude: 56.30521, - Longitude: 121.978231, - 'Issue Date': '2023-11-08', - 'Expiry Date': '2024-02-06', - }, - ]) + const [data, setData] = useState([]); useEffect(() => { apiService .getAxiosInstance() - .get('/health') + .get('/omrr') .then((response: AxiosResponse) => { - console.log(response?.data) + setData(response?.data) }) .catch((error) => { console.error(error) diff --git a/frontend/src/interfaces/omrr.ts b/frontend/src/interfaces/omrr.ts new file mode 100644 index 00000000..fba24e64 --- /dev/null +++ b/frontend/src/interfaces/omrr.ts @@ -0,0 +1,32 @@ +export default interface OmrrData { + "id": number; + "Authorization Number": number, + "Authorization Type": string, + "Regulated Party": string, + "Authorization Status": string, + "Effective/Issue Date": Date, + "Last Amendment Date": Date, + "Facility Location": string, + "Latitude": number, + "Longitude": number + "WDR Regulation"?: string, + "WDR Schedule One or Two"? : string, + "Operation Type"? : string, + "Material Land Applied"? : string, + "Intended Dates of Land Applica"? : string, + "Facility Design Capacity (t/y)"? : string, + "Type of Compost Produced"? : string, + "Yard Waste"? : boolean, + "Biosolids"? : boolean, + "Whey"? : boolean, + "Untreated and Unprocessed Wood"? : boolean, + "Poultry Carcasses"? : boolean, + "Fish Wastes"? : boolean, + "Food Waste"? : boolean, + "Brewary Waste/Wine Waste"? : boolean, + "Animal Bedding"? : boolean, + "Domestic Septic Tank Sludge"? : boolean, + "Hatchery Waste"? : boolean, + "Manure"? : boolean, + "Milk Processing Waste"? : boolean, +}