From 29dba9d6720c986b8b6df23e6b8dbbcc2340f400 Mon Sep 17 00:00:00 2001 From: Shubham P Date: Tue, 23 Jul 2024 16:59:36 +0530 Subject: [PATCH] feat(tenant-management): decouple the event processing using a connector and an orchestrator service (#33) ## Description This PR adds an overridable event connector to avoid coupling with AWS CodeBuild and make the provisioning and other actions event driven. This also adds an orchestrator service intended to help consumers deploy a supporting serverless application as a common target for the control plane events. The invocation flow in the orchestrator service is the following: ![image](https://github.com/user-attachments/assets/d8ea5e4e-421a-4bf5-82f9-b5feb1907a2b) GH-17 Fixes #17 ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - [x] Testing in the sandbox application ## Checklist: - [x] Performed a self-review of my own code - [x] npm test passes on your machine - [x] New tests added or existing tests modified to cover all changes - [x] Code conforms with the style guide - [x] API Documentation in code was updated - [ ] Any dependent changes have been merged and published in downstream modules --- .cz-config.js | 59 +- package-lock.json | 1548 ++++------------- services/orchestrator-service/.env.defaults | 2 + services/orchestrator-service/.env.example | 2 + services/orchestrator-service/.eslintignore | 9 + services/orchestrator-service/.eslintrc.js | 12 + services/orchestrator-service/.gitignore | 64 + services/orchestrator-service/.mocharc.json | 5 + services/orchestrator-service/.nycrc | 5 + services/orchestrator-service/.prettierignore | 3 + services/orchestrator-service/.prettierrc | 7 + services/orchestrator-service/.yo-rc.json | 6 + services/orchestrator-service/CHANGELOG.md | 1 + services/orchestrator-service/DEVELOPING.md | 36 + services/orchestrator-service/README.md | 607 +++++++ .../docs/example-architecture.png | Bin 0 -> 139898 bytes .../invocation-flow-between-artifacts.png | Bin 0 -> 176829 bytes services/orchestrator-service/package.json | 82 + .../orchestrator-service/public/index.html | 103 ++ .../src/__tests__/README.md | 1 + .../acceptance/event-controller.acceptance.ts | 109 ++ .../src/__tests__/unit/component.unit.ts | 115 ++ .../unit/orchestrator-service.unit.ts | 87 + .../orchestrator-service/src/component.ts | 99 ++ .../src/controllers/README.md | 9 + .../src/controllers/event.controller.ts | 47 + .../src/controllers/home-page.controller.ts | 31 + .../src/controllers/index.ts | 3 + .../src/controllers/ping.controller.ts | 22 + services/orchestrator-service/src/index.ts | 2 + .../orchestrator-service/src/openapi.json | 84 + .../src/services/builder.service.ts | 14 + .../src/services/index.ts | 8 + .../src/services/orchestrator.service.ts | 43 + .../tenant-deprovisioning-handler.service.ts | 23 + ...nt-provisioning-failure-handler.service.ts | 23 + .../tenant-provisioning-handler.service.ts | 23 + ...nt-provisioning-success-handler.service.ts | 23 + .../src/services/tier-details.service.ts | 27 + .../src/services/types.ts | 56 + services/orchestrator-service/tsconfig.json | 9 + services/tenant-management-service/README.md | 24 +- .../tenant-management-service/package.json | 1 - .../tenant.controller.acceptance.ts | 60 +- .../src/__tests__/acceptance/test-helper.ts | 18 +- .../src/__tests__/fixtures/index.ts | 1 - .../fixtures/mock-codebuild-client.ts | 10 - .../unit/codebuild-client.provider.unit.ts | 11 - .../src/component.ts | 23 +- .../src/controllers/tenant.controller.ts | 10 +- .../tenant-management-service/src/keys.ts | 9 +- .../services/aws/codebuild-client.provider.ts | 10 - .../src/services/aws/codebuild.service.ts | 56 - .../src/services/aws/index.ts | 3 - .../src/services/aws/keys.ts | 5 - .../event-connector/event.connector.ts | 11 + .../src/services/event-connector/index.ts | 2 + .../src/services/event-connector/types.ts | 5 + .../src/services/index.ts | 2 +- .../src/services/provisioning.service.ts | 101 +- .../src/types/i-event-connector.interface.ts | 3 + 61 files changed, 2270 insertions(+), 1504 deletions(-) create mode 100644 services/orchestrator-service/.env.defaults create mode 100644 services/orchestrator-service/.env.example create mode 100644 services/orchestrator-service/.eslintignore create mode 100644 services/orchestrator-service/.eslintrc.js create mode 100644 services/orchestrator-service/.gitignore create mode 100644 services/orchestrator-service/.mocharc.json create mode 100644 services/orchestrator-service/.nycrc create mode 100644 services/orchestrator-service/.prettierignore create mode 100644 services/orchestrator-service/.prettierrc create mode 100644 services/orchestrator-service/.yo-rc.json create mode 100644 services/orchestrator-service/CHANGELOG.md create mode 100644 services/orchestrator-service/DEVELOPING.md create mode 100644 services/orchestrator-service/README.md create mode 100644 services/orchestrator-service/docs/example-architecture.png create mode 100644 services/orchestrator-service/docs/invocation-flow-between-artifacts.png create mode 100644 services/orchestrator-service/package.json create mode 100644 services/orchestrator-service/public/index.html create mode 100644 services/orchestrator-service/src/__tests__/README.md create mode 100644 services/orchestrator-service/src/__tests__/acceptance/event-controller.acceptance.ts create mode 100644 services/orchestrator-service/src/__tests__/unit/component.unit.ts create mode 100644 services/orchestrator-service/src/__tests__/unit/orchestrator-service.unit.ts create mode 100644 services/orchestrator-service/src/component.ts create mode 100644 services/orchestrator-service/src/controllers/README.md create mode 100644 services/orchestrator-service/src/controllers/event.controller.ts create mode 100644 services/orchestrator-service/src/controllers/home-page.controller.ts create mode 100644 services/orchestrator-service/src/controllers/index.ts create mode 100644 services/orchestrator-service/src/controllers/ping.controller.ts create mode 100644 services/orchestrator-service/src/index.ts create mode 100644 services/orchestrator-service/src/openapi.json create mode 100644 services/orchestrator-service/src/services/builder.service.ts create mode 100644 services/orchestrator-service/src/services/index.ts create mode 100644 services/orchestrator-service/src/services/orchestrator.service.ts create mode 100644 services/orchestrator-service/src/services/tenant-deprovisioning-handler.service.ts create mode 100644 services/orchestrator-service/src/services/tenant-provisioning-failure-handler.service.ts create mode 100644 services/orchestrator-service/src/services/tenant-provisioning-handler.service.ts create mode 100644 services/orchestrator-service/src/services/tenant-provisioning-success-handler.service.ts create mode 100644 services/orchestrator-service/src/services/tier-details.service.ts create mode 100644 services/orchestrator-service/src/services/types.ts create mode 100644 services/orchestrator-service/tsconfig.json delete mode 100644 services/tenant-management-service/src/__tests__/fixtures/mock-codebuild-client.ts delete mode 100644 services/tenant-management-service/src/__tests__/unit/codebuild-client.provider.unit.ts delete mode 100644 services/tenant-management-service/src/services/aws/codebuild-client.provider.ts delete mode 100644 services/tenant-management-service/src/services/aws/codebuild.service.ts delete mode 100644 services/tenant-management-service/src/services/aws/index.ts delete mode 100644 services/tenant-management-service/src/services/aws/keys.ts create mode 100644 services/tenant-management-service/src/services/event-connector/event.connector.ts create mode 100644 services/tenant-management-service/src/services/event-connector/index.ts create mode 100644 services/tenant-management-service/src/services/event-connector/types.ts create mode 100644 services/tenant-management-service/src/types/i-event-connector.interface.ts diff --git a/.cz-config.js b/.cz-config.js index 9cc7d27..9d2269f 100644 --- a/.cz-config.js +++ b/.cz-config.js @@ -1,62 +1,63 @@ module.exports = { types: [ - { value: "feat", name: "feat: A new feature" }, - { value: "fix", name: "fix: A bug fix" }, - { value: "docs", name: "docs: Documentation only changes" }, + {value: 'feat', name: 'feat: A new feature'}, + {value: 'fix', name: 'fix: A bug fix'}, + {value: 'docs', name: 'docs: Documentation only changes'}, { - value: "style", - name: "style: Changes that do not affect the meaning of the code\n (white-space, formatting, missing semi-colons, etc)", + value: 'style', + name: 'style: Changes that do not affect the meaning of the code\n (white-space, formatting, missing semi-colons, etc)', }, { - value: "refactor", - name: "refactor: A code change that neither fixes a bug nor adds a feature", + value: 'refactor', + name: 'refactor: A code change that neither fixes a bug nor adds a feature', }, { - value: "perf", - name: "perf: A code change that improves performance", + value: 'perf', + name: 'perf: A code change that improves performance', }, - { value: "test", name: "test: Adding missing tests" }, + {value: 'test', name: 'test: Adding missing tests'}, { - value: "chore", - name: "chore: Changes to the build process or auxiliary tools\n and libraries such as documentation generation", + value: 'chore', + name: 'chore: Changes to the build process or auxiliary tools\n and libraries such as documentation generation', }, - { value: "revert", name: "revert: Revert to a commit" }, - { value: "WIP", name: "WIP: Work in progress" }, + {value: 'revert', name: 'revert: Revert to a commit'}, + {value: 'WIP', name: 'WIP: Work in progress'}, ], scopes: [ - { name: "ci-cd" }, - { name: "deps" }, - { name: "migrations" }, - { name: "tenant-management" }, - { name: "subscription-service" }, + {name: 'ci-cd'}, + {name: 'deps'}, + {name: 'migrations'}, + {name: 'tenant-management'}, + {name: 'subscription-service'}, + {name: 'orchestrator-service'}, ], appendBranchNameToCommitMessage: false, allowTicketNumber: false, isTicketNumberRequired: false, - ticketNumberPrefix: "Fixes - ", + ticketNumberPrefix: 'Fixes - ', // override the messages, defaults are as follows messages: { type: "Select the type of change that you're committing:", - scope: "Denote the SCOPE of this change:", + scope: 'Denote the SCOPE of this change:', // used if allowCustomScopes is true - customScope: "Denote the SCOPE of this change:", - subject: "Write a SHORT, IMPERATIVE tense description of the change:\n", + customScope: 'Denote the SCOPE of this change:', + subject: 'Write a SHORT, IMPERATIVE tense description of the change:\n', body: 'Provide a LONGER description of the change (optional). Use "|" to break new line:\n', - breaking: "List any BREAKING CHANGES (optional):\n", + breaking: 'List any BREAKING CHANGES (optional):\n', footer: - "List any ISSUES CLOSED by this change (optional). E.g.: GH-31, GH-34:\n", - confirmCommit: "Are you sure you want to proceed with the commit above?", + 'List any ISSUES CLOSED by this change (optional). E.g.: GH-31, GH-34:\n', + confirmCommit: 'Are you sure you want to proceed with the commit above?', }, allowCustomScopes: false, - allowBreakingChanges: ["feat", "fix"], + allowBreakingChanges: ['feat', 'fix'], // limit subject length subjectLimit: 100, - breaklineChar: "|", // It is supported for fields body and footer. - footerPrefix: "", + breaklineChar: '|', // It is supported for fields body and footer. + footerPrefix: '', askForBreakingChangeFirst: true, // default is false }; diff --git a/package-lock.json b/package-lock.json index 9bf2146..4c2097c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,624 +45,9 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-codebuild": { - "version": "3.600.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-codebuild/-/client-codebuild-3.600.0.tgz", - "integrity": "sha512-zLRqIJvbm/autDc+YuS0a18aaxWAdLedejDi0ZSPKjndBE45YgFVNTaP0WEsvJTVjySnZ8dtqrkicLJpd1iR9w==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.600.0", - "@aws-sdk/client-sts": "3.600.0", - "@aws-sdk/core": "3.598.0", - "@aws-sdk/credential-provider-node": "3.600.0", - "@aws-sdk/middleware-host-header": "3.598.0", - "@aws-sdk/middleware-logger": "3.598.0", - "@aws-sdk/middleware-recursion-detection": "3.598.0", - "@aws-sdk/middleware-user-agent": "3.598.0", - "@aws-sdk/region-config-resolver": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@aws-sdk/util-endpoints": "3.598.0", - "@aws-sdk/util-user-agent-browser": "3.598.0", - "@aws-sdk/util-user-agent-node": "3.598.0", - "@smithy/config-resolver": "^3.0.2", - "@smithy/core": "^2.2.1", - "@smithy/fetch-http-handler": "^3.0.2", - "@smithy/hash-node": "^3.0.1", - "@smithy/invalid-dependency": "^3.0.1", - "@smithy/middleware-content-length": "^3.0.1", - "@smithy/middleware-endpoint": "^3.0.2", - "@smithy/middleware-retry": "^3.0.4", - "@smithy/middleware-serde": "^3.0.1", - "@smithy/middleware-stack": "^3.0.1", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/node-http-handler": "^3.0.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "@smithy/url-parser": "^3.0.1", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.4", - "@smithy/util-defaults-mode-node": "^3.0.4", - "@smithy/util-endpoints": "^2.0.2", - "@smithy/util-middleware": "^3.0.1", - "@smithy/util-retry": "^3.0.1", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.598.0.tgz", - "integrity": "sha512-nOI5lqPYa+YZlrrzwAJywJSw3MKVjvu6Ge2fCqQUNYMfxFB0NAaDFnl0EPjXi+sEbtCuz/uWE77poHbqiZ+7Iw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.598.0", - "@aws-sdk/middleware-host-header": "3.598.0", - "@aws-sdk/middleware-logger": "3.598.0", - "@aws-sdk/middleware-recursion-detection": "3.598.0", - "@aws-sdk/middleware-user-agent": "3.598.0", - "@aws-sdk/region-config-resolver": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@aws-sdk/util-endpoints": "3.598.0", - "@aws-sdk/util-user-agent-browser": "3.598.0", - "@aws-sdk/util-user-agent-node": "3.598.0", - "@smithy/config-resolver": "^3.0.2", - "@smithy/core": "^2.2.1", - "@smithy/fetch-http-handler": "^3.0.2", - "@smithy/hash-node": "^3.0.1", - "@smithy/invalid-dependency": "^3.0.1", - "@smithy/middleware-content-length": "^3.0.1", - "@smithy/middleware-endpoint": "^3.0.2", - "@smithy/middleware-retry": "^3.0.4", - "@smithy/middleware-serde": "^3.0.1", - "@smithy/middleware-stack": "^3.0.1", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/node-http-handler": "^3.0.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "@smithy/url-parser": "^3.0.1", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.4", - "@smithy/util-defaults-mode-node": "^3.0.4", - "@smithy/util-endpoints": "^2.0.2", - "@smithy/util-middleware": "^3.0.1", - "@smithy/util-retry": "^3.0.1", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.600.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.600.0.tgz", - "integrity": "sha512-7+I8RWURGfzvChyNQSyj5/tKrqRbzRl7H+BnTOf/4Vsw1nFOi5ROhlhD4X/Y0QCTacxnaoNcIrqnY7uGGvVRzw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sts": "3.600.0", - "@aws-sdk/core": "3.598.0", - "@aws-sdk/credential-provider-node": "3.600.0", - "@aws-sdk/middleware-host-header": "3.598.0", - "@aws-sdk/middleware-logger": "3.598.0", - "@aws-sdk/middleware-recursion-detection": "3.598.0", - "@aws-sdk/middleware-user-agent": "3.598.0", - "@aws-sdk/region-config-resolver": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@aws-sdk/util-endpoints": "3.598.0", - "@aws-sdk/util-user-agent-browser": "3.598.0", - "@aws-sdk/util-user-agent-node": "3.598.0", - "@smithy/config-resolver": "^3.0.2", - "@smithy/core": "^2.2.1", - "@smithy/fetch-http-handler": "^3.0.2", - "@smithy/hash-node": "^3.0.1", - "@smithy/invalid-dependency": "^3.0.1", - "@smithy/middleware-content-length": "^3.0.1", - "@smithy/middleware-endpoint": "^3.0.2", - "@smithy/middleware-retry": "^3.0.4", - "@smithy/middleware-serde": "^3.0.1", - "@smithy/middleware-stack": "^3.0.1", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/node-http-handler": "^3.0.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "@smithy/url-parser": "^3.0.1", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.4", - "@smithy/util-defaults-mode-node": "^3.0.4", - "@smithy/util-endpoints": "^2.0.2", - "@smithy/util-middleware": "^3.0.1", - "@smithy/util-retry": "^3.0.1", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.600.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.600.0.tgz", - "integrity": "sha512-KQG97B7LvTtTiGmjlrG1LRAY8wUvCQzrmZVV5bjrJ/1oXAU7DITYwVbSJeX9NWg6hDuSk0VE3MFwIXS2SvfLIA==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.600.0", - "@aws-sdk/core": "3.598.0", - "@aws-sdk/credential-provider-node": "3.600.0", - "@aws-sdk/middleware-host-header": "3.598.0", - "@aws-sdk/middleware-logger": "3.598.0", - "@aws-sdk/middleware-recursion-detection": "3.598.0", - "@aws-sdk/middleware-user-agent": "3.598.0", - "@aws-sdk/region-config-resolver": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@aws-sdk/util-endpoints": "3.598.0", - "@aws-sdk/util-user-agent-browser": "3.598.0", - "@aws-sdk/util-user-agent-node": "3.598.0", - "@smithy/config-resolver": "^3.0.2", - "@smithy/core": "^2.2.1", - "@smithy/fetch-http-handler": "^3.0.2", - "@smithy/hash-node": "^3.0.1", - "@smithy/invalid-dependency": "^3.0.1", - "@smithy/middleware-content-length": "^3.0.1", - "@smithy/middleware-endpoint": "^3.0.2", - "@smithy/middleware-retry": "^3.0.4", - "@smithy/middleware-serde": "^3.0.1", - "@smithy/middleware-stack": "^3.0.1", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/node-http-handler": "^3.0.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "@smithy/url-parser": "^3.0.1", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.4", - "@smithy/util-defaults-mode-node": "^3.0.4", - "@smithy/util-endpoints": "^2.0.2", - "@smithy/util-middleware": "^3.0.1", - "@smithy/util-retry": "^3.0.1", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.598.0.tgz", - "integrity": "sha512-HaSjt7puO5Cc7cOlrXFCW0rtA0BM9lvzjl56x0A20Pt+0wxXGeTOZZOkXQIepbrFkV2e/HYukuT9e99vXDm59g==", - "dependencies": { - "@smithy/core": "^2.2.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/signature-v4": "^3.1.0", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "fast-xml-parser": "4.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.598.0.tgz", - "integrity": "sha512-vi1khgn7yXzLCcgSIzQrrtd2ilUM0dWodxj3PQ6BLfP0O+q1imO3hG1nq7DVyJtq7rFHs6+9N8G4mYvTkxby2w==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/property-provider": "^3.1.1", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.598.0.tgz", - "integrity": "sha512-N7cIafi4HVlQvEgvZSo1G4T9qb/JMLGMdBsDCT5XkeJrF0aptQWzTFH0jIdZcLrMYvzPcuEyO3yCBe6cy/ba0g==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/fetch-http-handler": "^3.0.2", - "@smithy/node-http-handler": "^3.0.1", - "@smithy/property-provider": "^3.1.1", - "@smithy/protocol-http": "^4.0.1", - "@smithy/smithy-client": "^3.1.2", - "@smithy/types": "^3.1.0", - "@smithy/util-stream": "^3.0.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.598.0.tgz", - "integrity": "sha512-/ppcIVUbRwDIwJDoYfp90X3+AuJo2mvE52Y1t2VSrvUovYn6N4v95/vXj6LS8CNDhz2jvEJYmu+0cTMHdhI6eA==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.598.0", - "@aws-sdk/credential-provider-http": "3.598.0", - "@aws-sdk/credential-provider-process": "3.598.0", - "@aws-sdk/credential-provider-sso": "3.598.0", - "@aws-sdk/credential-provider-web-identity": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@smithy/credential-provider-imds": "^3.1.1", - "@smithy/property-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.598.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.600.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.600.0.tgz", - "integrity": "sha512-1pC7MPMYD45J7yFjA90SxpR0yaSvy+yZiq23aXhAPZLYgJBAxHLu0s0mDCk/piWGPh8+UGur5K0bVdx4B1D5hw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.598.0", - "@aws-sdk/credential-provider-http": "3.598.0", - "@aws-sdk/credential-provider-ini": "3.598.0", - "@aws-sdk/credential-provider-process": "3.598.0", - "@aws-sdk/credential-provider-sso": "3.598.0", - "@aws-sdk/credential-provider-web-identity": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@smithy/credential-provider-imds": "^3.1.1", - "@smithy/property-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.598.0.tgz", - "integrity": "sha512-rM707XbLW8huMk722AgjVyxu2tMZee++fNA8TJVNgs1Ma02Wx6bBrfIvlyK0rCcIRb0WdQYP6fe3Xhiu4e8IBA==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/property-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.598.0.tgz", - "integrity": "sha512-5InwUmrAuqQdOOgxTccRayMMkSmekdLk6s+az9tmikq0QFAHUCtofI+/fllMXSR9iL6JbGYi1940+EUmS4pHJA==", - "dependencies": { - "@aws-sdk/client-sso": "3.598.0", - "@aws-sdk/token-providers": "3.598.0", - "@aws-sdk/types": "3.598.0", - "@smithy/property-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.598.0.tgz", - "integrity": "sha512-GV5GdiMbz5Tz9JO4NJtRoFXjW0GPEujA0j+5J/B723rTN+REHthJu48HdBKouHGhdzkDWkkh1bu52V02Wprw8w==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/property-provider": "^3.1.1", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.598.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.598.0.tgz", - "integrity": "sha512-WiaG059YBQwQraNejLIi0gMNkX7dfPZ8hDIhvMr5aVPRbaHH8AYF3iNSsXYCHvA2Cfa1O9haYXsuMF9flXnCmA==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/protocol-http": "^4.0.1", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.598.0.tgz", - "integrity": "sha512-bxBjf/VYiu3zfu8SYM2S9dQQc3tz5uBAOcPz/Bt8DyyK3GgOpjhschH/2XuUErsoUO1gDJqZSdGOmuHGZQn00Q==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.598.0.tgz", - "integrity": "sha512-vjT9BeFY9FeN0f8hm2l6F53tI0N5bUq6RcDkQXKNabXBnQxKptJRad6oP2X5y3FoVfBLOuDkQgiC2940GIPxtQ==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/protocol-http": "^4.0.1", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.598.0.tgz", - "integrity": "sha512-4tjESlHG5B5MdjUaLK7tQs/miUtHbb6deauQx8ryqSBYOhfHVgb1ZnzvQR0bTrhpqUg0WlybSkDaZAICf9xctg==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@aws-sdk/util-endpoints": "3.598.0", - "@smithy/protocol-http": "^4.0.1", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.598.0.tgz", - "integrity": "sha512-oYXhmTokSav4ytmWleCr3rs/1nyvZW/S0tdi6X7u+dLNL5Jee+uMxWGzgOrWK6wrQOzucLVjS4E/wA11Kv2GTw==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/types": "^3.1.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.598.0.tgz", - "integrity": "sha512-TKY1EVdHVBnZqpyxyTHdpZpa1tUpb6nxVeRNn1zWG8QB5MvH4ALLd/jR+gtmWDNQbIG4cVuBOZFVL8hIYicKTA==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/property-provider": "^3.1.1", - "@smithy/shared-ini-file-loader": "^3.1.1", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.598.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.598.0.tgz", - "integrity": "sha512-742uRl6z7u0LFmZwDrFP6r1wlZcgVPw+/TilluDJmCAR8BgRw3IR+743kUXKBGd8QZDRW2n6v/PYsi/AWCDDMQ==", - "dependencies": { - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.598.0.tgz", - "integrity": "sha512-Qo9UoiVVZxcOEdiOMZg3xb1mzkTxrhd4qSlg5QQrfWPJVx/QOg+Iy0NtGxPtHtVZNHZxohYwDwV/tfsnDSE2gQ==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/types": "^3.1.0", - "@smithy/util-endpoints": "^2.0.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", - "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.598.0.tgz", - "integrity": "sha512-36Sxo6F+ykElaL1mWzWjlg+1epMpSe8obwhCN1yGE7Js9ywy5U6k6l+A3q3YM9YRbm740sNxncbwLklMvuhTKw==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/types": "^3.1.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.598.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.598.0.tgz", - "integrity": "sha512-oyWGcOlfTdzkC6SVplyr0AGh54IMrDxbhg5RxJ5P+V4BKfcDoDcZV9xenUk9NsOi9MuUjxMumb9UJGkDhM1m0A==", - "dependencies": { - "@aws-sdk/types": "3.598.0", - "@smithy/node-config-provider": "^3.1.1", - "@smithy/types": "^3.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } + "node_modules/@arc-saas/orchestrator-service": { + "resolved": "services/orchestrator-service", + "link": true }, "node_modules/@babel/code-frame": { "version": "7.24.7", @@ -1089,6 +474,14 @@ "node": ">=6.9.0" } }, + "node_modules/@codegenie/serverless-express": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@codegenie/serverless-express/-/serverless-express-4.14.1.tgz", + "integrity": "sha512-B90/1OmA9mf9bEJnplLj7FGf+N2v2ikB68c/9W9uXmCa4ep/V00ymCiivwGLyeuzQRW33tcj4+KxZ2utfmu39Q==", + "engines": { + "node": ">=12" + } + }, "node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", @@ -2357,6 +1750,25 @@ "node": "18 || 20 || 22" } }, + "node_modules/@loopback/logging": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@loopback/logging/-/logging-0.12.4.tgz", + "integrity": "sha512-+30PxdR2F8V9mrUxTD7eHjhV46LgAyVbZfv4+C9Sjrpa81+e2V/uXBai8o6Ir1pJsQo6fm97EohLttYV3LrNUA==", + "dependencies": { + "fluent-logger": "^3.4.1", + "morgan": "^1.10.0", + "tslib": "^2.6.3", + "winston": "^3.13.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": "18 || 20 || 22" + }, + "peerDependencies": { + "@loopback/core": "^6.0.0", + "@loopback/rest": "^14.0.0" + } + }, "node_modules/@loopback/metadata": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@loopback/metadata/-/metadata-7.0.3.tgz", @@ -3950,598 +3362,87 @@ "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/sign/node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.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/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", - "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@smithy/abort-controller": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.0.tgz", - "integrity": "sha512-XOm4LkuC0PsK1sf2bBJLIlskn5ghmVxiEBVlo/jg0R8hxASBKYYgOoJEhKWgOr4vWGkN+5rC+oyBAqHYtxjnwQ==", - "dependencies": { - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.3.tgz", - "integrity": "sha512-4wHqCMkdfVDP4qmr4fVPYOFOH+vKhOv3X4e6KEU9wIC8xXUQ24tnF4CW+sddGDX1zU86GGyQ7A+rg2xmUD6jpQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.2", - "@smithy/types": "^3.2.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.2.3.tgz", - "integrity": "sha512-SpyLOL2vgE6sUYM6nQfu82OirCPkCDKctyG3aMgjMlDPTJpUlmlNH0ttu9ZWwzEjrzzr8uABmPjJTRI7gk1HFQ==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.0.3", - "@smithy/middleware-retry": "^3.0.6", - "@smithy/middleware-serde": "^3.0.2", - "@smithy/protocol-http": "^4.0.2", - "@smithy/smithy-client": "^3.1.4", - "@smithy/types": "^3.2.0", - "@smithy/util-middleware": "^3.0.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.1.2.tgz", - "integrity": "sha512-gqVmUaNoeqyrOAjgZg+rTmFLsphh/vS59LCMdFfVpthVS0jbfBzvBmEPktBd+y9ME4DYMGHFAMSYJDK8q0noOQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.2", - "@smithy/property-provider": "^3.1.2", - "@smithy/types": "^3.2.0", - "@smithy/url-parser": "^3.0.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.1.0.tgz", - "integrity": "sha512-s7oQjEOUH9TYjctpITtWF4qxOdg7pBrP9eigEQ8SBsxF3dRFV0S28pGMllC83DUr7ECmErhO/BUwnULfoNhKgQ==", - "dependencies": { - "@smithy/protocol-http": "^4.0.2", - "@smithy/querystring-builder": "^3.0.2", - "@smithy/types": "^3.2.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.2.tgz", - "integrity": "sha512-43uGA6o6QJQdXwAogybdTDHDd3SCdKyoiHIHb8PpdE2rKmVicjG9b1UgVwdgO8QPytmVqHFaUw27M3LZKwu8Yg==", - "dependencies": { - "@smithy/types": "^3.2.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.2.tgz", - "integrity": "sha512-+BAY3fMhomtq470tswXyrdVBSUhiLuhBVT+rOmpbz5e04YX+s1dX4NxTLzZGwBjCpeWZNtTxP8zbIvvFk81gUg==", - "dependencies": { - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.2.tgz", - "integrity": "sha512-/Havz3PkYIEmwpqkyRTR21yJsWnFbD1ec4H1pUL+TkDnE7RCQkAVUQepLL/UeCaZeCBXvfdoKbOjSbV01xIinQ==", - "dependencies": { - "@smithy/protocol-http": "^4.0.2", - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.0.3.tgz", - "integrity": "sha512-ARAXHodhj4tttKa9y75zvENdSoHq6VGsSi7XS3+yLutrnxttJs6N10UMInCC1yi3/bopT8xug3iOP/y9R6sKJQ==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.2", - "@smithy/node-config-provider": "^3.1.2", - "@smithy/shared-ini-file-loader": "^3.1.2", - "@smithy/types": "^3.2.0", - "@smithy/url-parser": "^3.0.2", - "@smithy/util-middleware": "^3.0.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.6.tgz", - "integrity": "sha512-ICsFKp8eAyIMmxN5UT3IU37S6886L879TKtgxPsn/VD/laYNwqTLmJaCAn5//+2fRIrV0dnHp6LFlMwdXlWoUQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.2", - "@smithy/protocol-http": "^4.0.2", - "@smithy/service-error-classification": "^3.0.2", - "@smithy/smithy-client": "^3.1.4", - "@smithy/types": "^3.2.0", - "@smithy/util-middleware": "^3.0.2", - "@smithy/util-retry": "^3.0.2", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.2.tgz", - "integrity": "sha512-oT2abV5zLhBucJe1LIIFEcRgIBDbZpziuMPswTMbBQNcaEUycLFvX63zsFmqfwG+/ZQKsNx+BSE8W51CMuK7Yw==", - "dependencies": { - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.2.tgz", - "integrity": "sha512-6fRcxomlNKBPIy/YjcnC7YHpMAjRvGUYlYVJAfELqZjkW0vQegNcImjY7T1HgYA6u3pAcCxKVBLYnkTw8z/l0A==", - "dependencies": { - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.2.tgz", - "integrity": "sha512-388fEAa7+6ORj/BDC70peg3fyFBTTXJyXfXJ0Bwd6FYsRltePr2oGzIcm5AuC1WUSLtZ/dF+hYOnfTMs04rLvA==", - "dependencies": { - "@smithy/property-provider": "^3.1.2", - "@smithy/shared-ini-file-loader": "^3.1.2", - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.0.tgz", - "integrity": "sha512-pOpgB6B+VLXLwAyyvRz+ZAVXABlbAsJ2xvn3WZvrppAPImxwQOPFbeSUzWYMhpC8Tr7yQ3R8fG990QDhskkf1Q==", - "dependencies": { - "@smithy/abort-controller": "^3.1.0", - "@smithy/protocol-http": "^4.0.2", - "@smithy/querystring-builder": "^3.0.2", - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.2.tgz", - "integrity": "sha512-Hzp32BpeFFexBpO1z+ts8okbq/VLzJBadxanJAo/Wf2CmvXMBp6Q/TLWr7Js6IbMEcr0pDZ02V3u1XZkuQUJaA==", - "dependencies": { - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.0.2.tgz", - "integrity": "sha512-X/90xNWIOqSR2tLUyWxVIBdatpm35DrL44rI/xoeBWUuanE0iyCXJpTcnqlOpnEzgcu0xCKE06+g70TTu2j7RQ==", - "dependencies": { - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.2.tgz", - "integrity": "sha512-xhv1+HacDYsOLdNt7zW+8Fe779KYAzmWvzs9bC5NlKM8QGYCwwuFwDBynhlU4D5twgi2pZ14Lm4h6RiAazCtmA==", - "dependencies": { - "@smithy/types": "^3.2.0", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.2.tgz", - "integrity": "sha512-C5hyRKgrZGPNh5QqIWzXnW+LXVrPmVQO0iJKjHeb5v3C61ZkP9QhrKmbfchcTyg/VnaE0tMNf/nmLpQlWuiqpg==", - "dependencies": { - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.2.tgz", - "integrity": "sha512-cu0WV2XRttItsuXlcM0kq5MKdphbMMmSd2CXF122dJ75NrFE0o7rruXFGfxAp3BKzgF/DMxX+PllIA/cj4FHMw==", - "dependencies": { - "@smithy/types": "^3.2.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.2.tgz", - "integrity": "sha512-tgnXrXbLMO8vo6VeuqabMw/eTzQHlLmZx0TC0TjtjJghnD0Xl4pEnJtBjTJr6XF5fHMNrt5BcczDXHJT9yNQnA==", - "dependencies": { - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-3.1.1.tgz", - "integrity": "sha512-2/vlG86Sr489XX8TA/F+VDA+P04ESef04pSz0wRtlQBExcSPjqO08rvrkcas2zLnJ51i+7ukOURCkgqixBYjSQ==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/types": "^3.2.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.2", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.4.tgz", - "integrity": "sha512-y6xJROGrIoitjpwXLY7P9luDHvuT9jWpAluliuSFdBymFxcl6iyQjo9U/JhYfRHFNTruqsvKOrOESVuPGEcRmQ==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.0.3", - "@smithy/middleware-stack": "^3.0.2", - "@smithy/protocol-http": "^4.0.2", - "@smithy/types": "^3.2.0", - "@smithy/util-stream": "^3.0.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.2.0.tgz", - "integrity": "sha512-cKyeKAPazZRVqm7QPvcPD2jEIt2wqDPAL1KJKb0f/5I7uhollvsWZuZKLclmyP6a+Jwmr3OV3t+X0pZUUHS9BA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.2.tgz", - "integrity": "sha512-pRiPHrgibeAr4avtXDoBHmTLtthwA4l8jKYRfZjNgp+bBPyxDMPRg2TMJaYxqbKemvrOkHu9MIBTv2RkdNfD6w==", - "dependencies": { - "@smithy/querystring-parser": "^3.0.2", - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.6.tgz", - "integrity": "sha512-tAgoc++Eq+KL7g55+k108pn7nAob3GLWNEMbXhZIQyBcBNaE/o3+r4AEbae0A8bWvLRvArVsjeiuhMykGa04/A==", - "dependencies": { - "@smithy/property-provider": "^3.1.2", - "@smithy/smithy-client": "^3.1.4", - "@smithy/types": "^3.2.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.6.tgz", - "integrity": "sha512-UNerul6/E8aiCyFTBHk+RSIZCo7m96d/N5K3FeO/wFeZP6oy5HAicLzxqa85Wjv7MkXSxSySX29L/LwTV/QMag==", - "dependencies": { - "@smithy/config-resolver": "^3.0.3", - "@smithy/credential-provider-imds": "^3.1.2", - "@smithy/node-config-provider": "^3.1.2", - "@smithy/property-provider": "^3.1.2", - "@smithy/smithy-client": "^3.1.4", - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.3.tgz", - "integrity": "sha512-Dyi+pfLglDHSGsKSYunuUUSFM5V0tz7UDgv1Ex97yg+Xkn0Eb0rH0rcvl1n0MaJ11fac3HKDOH0DkALyQYCQag==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.2", - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" + "unique-slug": "^4.0.0" }, "engines": { - "node": ">=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "node_modules/@sigstore/sign/node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, "dependencies": { - "tslib": "^2.6.2" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@smithy/util-middleware": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.2.tgz", - "integrity": "sha512-7WW5SD0XVrpfqljBYzS5rLR+EiDzl7wCVJZ9Lo6ChNFV4VYDk37Z1QI5w/LnYtU/QKnSawYoHRd7VjSyC8QRQQ==", + "node_modules/@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, "dependencies": { - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" }, "engines": { - "node": ">=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@smithy/util-retry": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.2.tgz", - "integrity": "sha512-HUVOb1k8p/IH6WFUjsLa+L9H1Zi/FAAB2CDOpWuffI1b2Txi6sknau8kNfC46Xrt39P1j2KDzCE1UlLa2eW5+A==", + "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.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, "dependencies": { - "@smithy/service-error-classification": "^3.0.2", - "@smithy/types": "^3.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" + "type-detect": "4.0.8" } }, - "node_modules/@smithy/util-stream": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.0.4.tgz", - "integrity": "sha512-CcMioiaOOsEVdb09pS7ux1ij7QcQ2jE/cE1+iin1DXMeRgAEQN/47m7Xztu7KFQuQsj0A5YwB2UN45q97CqKCg==", - "dependencies": { - "@smithy/fetch-http-handler": "^3.1.0", - "@smithy/node-http-handler": "^3.1.0", - "@smithy/types": "^3.2.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" + "node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "dev": true, "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, - "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" + "type-detect": "4.0.8" } }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, "node_modules/@sourceloop/core": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/@sourceloop/core/-/core-13.1.0.tgz", @@ -4685,6 +3586,11 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@types/aws-lambda": { + "version": "8.10.141", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.141.tgz", + "integrity": "sha512-SMWlRBukG9KV8ZNjwemp2AzDibp/czIAeKKTw09nCPbWxVskIxactCJCGOp4y6I1hCMY7T7UGfySvBLXNeUbEw==" + }, "node_modules/@types/body-parser": { "version": "1.19.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -4775,6 +3681,12 @@ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" }, + "node_modules/@types/i18n": { + "version": "0.13.12", + "resolved": "https://registry.npmjs.org/@types/i18n/-/i18n-0.13.12.tgz", + "integrity": "sha512-iAd2QjKh+0ToBXocmCS3m38GskiaGzmSV1MTQz2GaOraqSqBiLf46J7u3EGINl+st+Uk4lO3OL7QyIjTJlrWIg==", + "dev": true + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -5206,6 +4118,17 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@vendia/serverless-express": { + "version": "4.12.6", + "resolved": "https://registry.npmjs.org/@vendia/serverless-express/-/serverless-express-4.12.6.tgz", + "integrity": "sha512-ePsIPk3VQwgm5nh/JGBtTKQs5ZOF7REjHxC+PKk/CHvhlKQkJuUU365uPOlxuLJhC+BAefDznDRReWxpnKjmYg==", + "dependencies": { + "@codegenie/serverless-express": "^4.12.5" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -5862,11 +4785,6 @@ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" }, - "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/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8584,6 +7502,11 @@ "node": ">= 0.6" } }, + "node_modules/event-lite": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/event-lite/-/event-lite-0.1.3.tgz", + "integrity": "sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==" + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", @@ -8801,27 +7724,6 @@ "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.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -9077,6 +7979,17 @@ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/fluent-logger": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/fluent-logger/-/fluent-logger-3.4.1.tgz", + "integrity": "sha512-lERIhXAvhtCYeQq8K7sBDg/HY9GkiVRq5xY3oN+hcSINVKwqwBzG6LQOJK73EnV50qO59U7XEmRnn2hBzLWaHw==", + "dependencies": { + "msgpack-lite": "*" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -10463,6 +9376,11 @@ "node": ">=12.0.0" } }, + "node_modules/int64-buffer": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-0.1.10.tgz", + "integrity": "sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA==" + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -13439,11 +12357,64 @@ "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/msgpack-lite": { + "version": "0.1.26", + "resolved": "https://registry.npmjs.org/msgpack-lite/-/msgpack-lite-0.1.26.tgz", + "integrity": "sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw==", + "dependencies": { + "event-lite": "^0.1.1", + "ieee754": "^1.1.8", + "int64-buffer": "^0.1.9", + "isarray": "^1.0.0" + }, + "bin": { + "msgpack": "bin/msgpack" + } + }, "node_modules/msgpack5": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/msgpack5/-/msgpack5-4.5.1.tgz", @@ -14906,6 +13877,14 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -18481,11 +17460,6 @@ "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/strong-error-handler": { "version": "5.0.10", "resolved": "https://registry.npmjs.org/strong-error-handler/-/strong-error-handler-5.0.10.tgz", @@ -20236,6 +19210,147 @@ "node": "18 || 20" } }, + "services/orchestrator-service": { + "name": "@arc-saas/orchestrator-service", + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "@loopback/boot": "^7.0.3", + "@loopback/context": "^7.0.3", + "@loopback/core": "^6.1.0", + "@loopback/logging": "^0.12.4", + "@loopback/openapi-v3": "^10.0.3", + "@loopback/repository": "^7.0.3", + "@loopback/rest": "^14.0.3", + "@loopback/rest-explorer": "^7.0.3", + "@loopback/service-proxy": "^7.0.3", + "@types/aws-lambda": "^8.10.140", + "@vendia/serverless-express": "^4.12.6", + "dotenv": "^16.4.5", + "dotenv-extended": "^2.9.0", + "swagger-stats": "^0.99.7", + "symlink-resolver": "0.2.1", + "tslib": "^2.0.0" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.2", + "@loopback/build": "^11.0.3", + "@loopback/eslint-config": "^15.0.3", + "@loopback/testlab": "^7.0.3", + "@types/i18n": "^0.13.12", + "@types/node": "^16.18.98", + "nodemon": "^3.1.4", + "nyc": "^15.1.0", + "source-map-support": "^0.5.21", + "typescript": "~5.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "services/orchestrator-service/node_modules/@types/node": { + "version": "16.18.102", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.102.tgz", + "integrity": "sha512-eSe2YwGCcRjqPidxfm20IAq02krERWcIIJW4FNPkU0zQLbc4L9pvhsmB0p6UJecjEf0j/E2ERHsKq7madvthKw==", + "dev": true + }, + "services/orchestrator-service/node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "services/orchestrator-service/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "services/orchestrator-service/node_modules/nodemon": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "services/orchestrator-service/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "services/orchestrator-service/node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "services/orchestrator-service/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "services/orchestrator-service/node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "services/subscription-service": { "name": "@sourceloop/ctrl-plane-subscription-service", "version": "0.1.0", @@ -20298,7 +19413,6 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@aws-sdk/client-codebuild": "^3.504.0", "@loopback/boot": "^7.0.0", "@loopback/context": "^7.0.0", "@loopback/core": "^6.0.0", diff --git a/services/orchestrator-service/.env.defaults b/services/orchestrator-service/.env.defaults new file mode 100644 index 0000000..3abc47e --- /dev/null +++ b/services/orchestrator-service/.env.defaults @@ -0,0 +1,2 @@ +NODE_ENV=production +LOG_LEVEL=info diff --git a/services/orchestrator-service/.env.example b/services/orchestrator-service/.env.example new file mode 100644 index 0000000..4963e75 --- /dev/null +++ b/services/orchestrator-service/.env.example @@ -0,0 +1,2 @@ +NODE_ENV= +LOG_LEVEL= diff --git a/services/orchestrator-service/.eslintignore b/services/orchestrator-service/.eslintignore new file mode 100644 index 0000000..5d4193a --- /dev/null +++ b/services/orchestrator-service/.eslintignore @@ -0,0 +1,9 @@ +node_modules/ +dist/ +coverage/ +migrations/ + +.eslintrc.js +migration.js + +mochawesome-report/ \ No newline at end of file diff --git a/services/orchestrator-service/.eslintrc.js b/services/orchestrator-service/.eslintrc.js new file mode 100644 index 0000000..4e5330c --- /dev/null +++ b/services/orchestrator-service/.eslintrc.js @@ -0,0 +1,12 @@ +module.exports = { + extends: '@loopback/eslint-config', + rules: { + 'no-extra-boolean-cast': 'off', + '@typescript-eslint/interface-name-prefix': 'off', + 'no-prototype-builtins': 'off', + }, + parserOptions: { + project: './tsconfig.json', + tsconfigRootDir: __dirname, + }, +}; diff --git a/services/orchestrator-service/.gitignore b/services/orchestrator-service/.gitignore new file mode 100644 index 0000000..d85d9e6 --- /dev/null +++ b/services/orchestrator-service/.gitignore @@ -0,0 +1,64 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' + + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# Transpiled JavaScript files from Typescript +/dist + +# Cache used by TypeScript's incremental build +*.tsbuildinfo diff --git a/services/orchestrator-service/.mocharc.json b/services/orchestrator-service/.mocharc.json new file mode 100644 index 0000000..7b523c3 --- /dev/null +++ b/services/orchestrator-service/.mocharc.json @@ -0,0 +1,5 @@ +{ + "exit": true, + "recursive": true, + "require": "source-map-support/register" +} diff --git a/services/orchestrator-service/.nycrc b/services/orchestrator-service/.nycrc new file mode 100644 index 0000000..115a4e3 --- /dev/null +++ b/services/orchestrator-service/.nycrc @@ -0,0 +1,5 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "all": true, + "reporter": ["html", "text-summary"] +} \ No newline at end of file diff --git a/services/orchestrator-service/.prettierignore b/services/orchestrator-service/.prettierignore new file mode 100644 index 0000000..bfc57b8 --- /dev/null +++ b/services/orchestrator-service/.prettierignore @@ -0,0 +1,3 @@ +dist +*.json +coverage \ No newline at end of file diff --git a/services/orchestrator-service/.prettierrc b/services/orchestrator-service/.prettierrc new file mode 100644 index 0000000..2e48c76 --- /dev/null +++ b/services/orchestrator-service/.prettierrc @@ -0,0 +1,7 @@ +{ + "bracketSpacing": false, + "singleQuote": true, + "printWidth": 80, + "trailingComma": "all", + "arrowParens": "avoid" +} diff --git a/services/orchestrator-service/.yo-rc.json b/services/orchestrator-service/.yo-rc.json new file mode 100644 index 0000000..de09a1d --- /dev/null +++ b/services/orchestrator-service/.yo-rc.json @@ -0,0 +1,6 @@ +{ + "@sourceloop/cli": { + "packageManager": "npm", + "version": "4.2.1" + } +} diff --git a/services/orchestrator-service/CHANGELOG.md b/services/orchestrator-service/CHANGELOG.md new file mode 100644 index 0000000..420e6f2 --- /dev/null +++ b/services/orchestrator-service/CHANGELOG.md @@ -0,0 +1 @@ +# Change Log diff --git a/services/orchestrator-service/DEVELOPING.md b/services/orchestrator-service/DEVELOPING.md new file mode 100644 index 0000000..d5cdbb3 --- /dev/null +++ b/services/orchestrator-service/DEVELOPING.md @@ -0,0 +1,36 @@ +# Developer's Guide + +We use Visual Studio Code for developing LoopBack and recommend the same to our +users. + +## VSCode setup + +Install the following extensions: + + - [eslint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) + - [prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) + +## Development workflow + +### Visual Studio Code + +1. Start the build task (Cmd+Shift+B) to run TypeScript compiler in the + background, watching and recompiling files as you change them. Compilation + errors will be shown in the VSCode's "PROBLEMS" window. + +2. Execute "Run Rest Task" from the Command Palette (Cmd+Shift+P) to re-run the + test suite and lint the code for both programming and style errors. Linting + errors will be shown in VSCode's "PROBLEMS" window. Failed tests are printed + to terminal output only. + +### Other editors/IDEs + +1. Open a new terminal window/tab and start the continuous build process via + `npm run build:watch`. It will run TypeScript compiler in watch mode, + recompiling files as you change them. Any compilation errors will be printed + to the terminal. + +2. In your main terminal window/tab, run `npm run test:dev` to re-run the test + suite and lint the code for both programming and style errors. You should run + this command manually whenever you have new changes to test. Test failures + and linter errors will be printed to the terminal. diff --git a/services/orchestrator-service/README.md b/services/orchestrator-service/README.md new file mode 100644 index 0000000..57ead03 --- /dev/null +++ b/services/orchestrator-service/README.md @@ -0,0 +1,607 @@ +ARC By SourceFuse logo + +# [@arc-saas/orchestrator-service](https://github.com/sourcefuse/arc-saas/tree/master/services/audit-service) + +

+ +npm version + + +GitHub contributors + + +sourceloop orchestrator-service downloads + + +License + + +Pb Loopback + +

+ +## Overview + +The `@arc-saas/orchestrator-service` is designed to provide the standard interfaces and endpoint to handle the events sent from / to a SaaS Control Plane. This acts as a orchestrator for the event targets/processors. + +Consider the following example architecture that uses Amazon EventBridge at the center to pass on the events, and this Orchestrator service is used as its initial target, so that the events can then be sent to the expected candidates to process the event. + +![Example Architecture with Orchestrator Service in Use](./docs/example-architecture.png) + +Above example is of a tenant provisioning event flow, as shown it originates from a control plane service called tenant management service and then when it's received to the Amazon EventBridge, it passes it to the orchestrator service which can run any bussiness logic before it's sent for processing (the example illustrates starting the codebuild or jenkins job conditionally based on the event). Further code examples in this README will take this same reference. + +## Installation + +```bash +npm i @arc-saas/orchestrator-service +``` + +## Getting Started + +You can start using `@arc-saas/orchestrator-service` in just 4 steps: + +1. [Bind Component](#bind-component) +2. [Configure the Providers and Services](#configure-the-providers-and-services) + +### Bind Component + +Bind the `OrchestratorServiceComponent` to your application constructor as shown below, this will load the built-in artifacts provided by the service in your application to use. + +Mainly the `EventController` that provides the endpoint to receive the events. + +```ts +import {OrchestratorServiceComponent} from '@arc-saas/orchestrator-service'; +// ... +export class MyApplication extends BootMixin( + ServiceMixin(RepositoryMixin(RestApplication)), +) { + constructor(options: ApplicationConfig = {}) { + // ... + this.component(OrchestratorServiceComponent); + } +} +``` + +### Configure the Providers and Services + +This microservice provides following loopback services and providers which can be configured based on your specific needs: + +1. [Orchestrator Service](#1-orchestrator-service) +2. [Builder Service](#2-builder-service) +3. [Tier Details Provider](#3-tier-details-provider) +4. [Tenant Provisioning Provider](#4-tenant-provisioning-provider) +5. [Tenant Deprovisioning Provider](#5-tenant-deprovisioning-provider) +6. [Tenant Provisioning Success Handler](#6-tenant-provisioning-success-provider) +7. [Tenant Provisioning Failure Handler](#7-tenant-provisioning-failure-provider) + +Here's the invocation flow for quick understanding on how and when above artifacts are called, more details are provided in their own sections: + +![Invocation flow between artifacts](./docs/invocation-flow-between-artifacts.png) + +#### 1. Orchestrator Service + +This LB4 service is used by the event controller which invokes the `handleEvent` method and passes the type of the event along with the request body containing the event detail as the function arguments. + +Following is the interface you'll need to implement in your class that is to be bound to the key `OrchestratorServiceBindings.ORCHESTRATOR_SERVICE`. + +```ts +interface OrchestratorServiceInterface< + EventType extends string = DefaultEventTypes, + BodyType extends AnyObject = AnyObject, +> { + handleEvent(eventType: EventType, eventBody: BodyType): Promise; +} + +// PS: It is available to be imported from this package. +``` + +Here's how you can bind your custom orchestrator service: + +```ts +import { + OrchestratorServiceComponent, + OrchestratorServiceBindings, +} from '@arc-saas/orchestrator-service'; + +import {YourOrchestratorService} from './services'; + +export class OrchestratorApplication extends BootMixin( + ServiceMixin(RestApplication), +) { + constructor(options: ApplicationConfig = {}) { + super(options); + // ... + + this.bind(OrchestratorServiceBindings.ORCHESTRATOR_SERVICE).toClass( + YourOrchestratorService, + ); + + this.component(OrchestratorServiceComponent); + // ... + } +} +``` + +
View example implementation of the service class: + +```ts +import {injectable, BindingScope, inject} from '@loopback/core'; +import {AnyObject} from '@loopback/repository'; +import { + EventTypes, + OrchestratorServiceBindings, + OrchestratorServiceInterface, + TenantDeprovisioningHandler, + TenantProvisioningFailureHandler, + TenantProvisioningHandler, + TenantProvisioningSuccessHandler, +} from '@arc-saas/orchestrator-service'; + +export interface AWSEventBridgeInterface { + version: string; + id: string; + 'detail-type': EventTypes; + source: string; + account: string; + time: string; + region: string; + resources: never[]; + detail: Record; +} + +@injectable({scope: BindingScope.TRANSIENT}) +export class OrchestratorService implements OrchestratorServiceInterface { + constructor( + @inject(OrchestratorServiceBindings.TENANT_PROVISIONING_HANDLER) + private handleTenantProvisioning: TenantProvisioningHandler, + @inject(OrchestratorServiceBindings.TENANT_DEPROVISIONING_HANDLER) + private handleTenantDeprovisioning: TenantDeprovisioningHandler, + @inject(OrchestratorServiceBindings.TENANT_PROVISIONING_SUCCESS_HANDLER) + private handleTenantProvisioningSuccess: TenantProvisioningSuccessHandler, + @inject(OrchestratorServiceBindings.TENANT_PROVISIONING_FAILURE_HANDLER) + private handleTenantProvisioningFailure: TenantProvisioningFailureHandler, + ) {} + + handleEvent( + eventType: EventTypes, + eventBody: AWSEventBridgeInterface, + ): Promise { + switch (eventType) { + case EventTypes.TENANT_PROVISIONING: + return this.handleTenantProvisioning(eventBody.detail); + case EventTypes.TENANT_DEPROVISIONING: + return this.handleTenantDeprovisioning(eventBody.detail); + case EventTypes.TENANT_PROVISIONING_SUCCESS: + return this.handleTenantProvisioningSuccess(eventBody.detail); + case EventTypes.TENANT_PROVISIONING_FAILED: + return this.handleTenantProvisioningFailure(eventBody.detail); + default: + throw new Error(`Unsupported event type: ${eventType}`); + } + } +} +``` + +
+ +#### 2. Builder Service + +This LB4 service is intended to be used by any logic that requires triggering a build job. This common interface has a method called `startJob` which can take the job identifier and the params object as its arguments. + +For example you can implement a triggering codebuild in this service whenever a specific event is received. + +Following is the interface you'll need to implement in your class that is to be bound to the key `OrchestratorServiceBindings.BUILDER_SERVICE`. + +```ts +interface BuilderServiceInterface { + startJob(jobIdentifier: string, params: AnyObject): Promise; +} + +// PS: It is available to be imported from this package. +``` + +Here's how you can bind your builder service implementation: + +```ts +import { + OrchestratorServiceComponent, + OrchestratorServiceBindings, +} from '@arc-saas/orchestrator-service'; + +import {AwsCodeBuildService} from './services'; + +export class OrchestratorApplication extends BootMixin( + ServiceMixin(RestApplication), +) { + constructor(options: ApplicationConfig = {}) { + super(options); + // ... + + this.bind(OrchestratorServiceBindings.BUILDER_SERVICE).toClass( + AwsCodeBuildService, + ); + + this.component(OrchestratorServiceComponent); + // ... + } +} +``` + +
View example implementation of the service class: + +```ts +import {injectable, BindingScope} from '@loopback/core'; +import {AnyObject} from '@loopback/repository'; +import {BuilderServiceInterface} from '@arc-saas/orchestrator-service'; +import { + CodeBuildClient, + StartBuildCommand, + StartBuildCommandInput, +} from '@aws-sdk/client-codebuild'; + +@injectable({scope: BindingScope.TRANSIENT}) +export class AwsCodeBuildService implements BuilderServiceInterface { + constructor() {} + + async startJob(jobName: string, params: AnyObject): Promise { + const codeBuildClient = new CodeBuildClient({region: 'us-east-1'}); + + const buildParams: StartBuildCommandInput = { + projectName: jobName, + environmentVariablesOverride: Object.keys(params).map(key => { + return { + name: key, + value: String(params[key]), + type: 'PLAINTEXT', + }; + }), + }; + + try { + const command = new StartBuildCommand(buildParams); + await codeBuildClient.send(command); + console.log('CodeBuild triggered successfully.'); + return; + } catch (error) { + console.error('Error triggering CodeBuild:', error); + throw error; + } + } +} +``` + +
+ +#### 3. Tier Details Provider + +This provider is intended to be used as the handler to get the tier details. Which can be used while provisioning the tenant or anywhere when we need to retrieve the tier details. + +For example you can implement a data pulling logic from Amazon DynamoDB that contains the tier details (the example implementation is given below). + +Here's how you can bind your tier details provider: + +```ts +import { + OrchestratorServiceComponent, + OrchestratorServiceBindings, +} from '@arc-saas/orchestrator-service'; + +import {TierDetailsProvider} from './providers'; + +export class OrchestratorApplication extends BootMixin( + ServiceMixin(RestApplication), +) { + constructor(options: ApplicationConfig = {}) { + super(options); + // ... + + this.bind(OrchestratorServiceBindings.TIER_DETAILS_PROVIDER).toProvider( + TierDetailsProvider, + ); + + this.component(OrchestratorServiceComponent); + // ... + } +} +``` + +
View example implementation of this provider: + +```ts +import {injectable, BindingScope, Provider} from '@loopback/core'; +import {TierDetailsFn} from '@arc-saas/orchestrator-service'; +import {marshall, unmarshall} from '@aws-sdk/util-dynamodb'; + +import {DynamoDBClient, QueryCommand} from '@aws-sdk/client-dynamodb'; + +@injectable({scope: BindingScope.TRANSIENT}) +export class TierDetailsProvider implements Provider { + value() { + return async (tier: string) => { + return this.fetchTierDetails(tier); + }; + } + private async fetchTierDetails(tier: string) { + const client = new DynamoDBClient({region: 'us-east-1'}); + const params = { + TableName: process.env.TIER_DETAILS_TABLE, + KeyConditionExpression: 'tier = :tier', + ExpressionAttributeValues: marshall({ + ':tier': tier, + }), + }; + + try { + const command = new QueryCommand(params); + const response = await client.send(command); + if (!response.Items) { + throw Error('Items not found.'); + } + const items = response.Items.map(item => unmarshall(item)); + console.log('Query results:', items); + + if (items.length === 0) { + throw new Error( + `Provided tier details not found in table: "${process.env.TIER_DETAILS_TABLE}".`, + ); + } + + const tierDetails = items[0]; + return {...tierDetails}; + } catch (error) { + console.error('Error fetching data:', error); + throw error; + } + } +} +``` + +
+ +#### 4. Tenant Provisioning Provider + +This provider is intended to be used as the handler to be invoked when the tenant provisioning event is received. + +For example, In this provider you can implement the logic of invoking the [tier details provider](#3-tier-details-provider) and then triggering the provisioning job using the [builder service](#2-builder-service). + +
Check how to bind your custom implementation. + +```ts +import { + OrchestratorServiceComponent, + OrchestratorServiceBindings, +} from '@arc-saas/orchestrator-service'; + +import {TenantProvisioningHandlerProvider} from './providers'; + +export class OrchestratorApplication extends BootMixin( + ServiceMixin(RestApplication), +) { + constructor(options: ApplicationConfig = {}) { + super(options); + // ... + + this.bind>( + OrchestratorServiceBindings.TENANT_PROVISIONING_HANDLER, + ).toProvider(TenantProvisioningHandlerProvider); + + this.component(OrchestratorServiceComponent); + // ... + } +} +``` + +
+ +
View example implementation of this provider: + +```ts +import {injectable, BindingScope, Provider, inject} from '@loopback/core'; +import {AnyObject} from '@loopback/repository'; +import { + BuilderService, + TenantProvisioningHandler, + TierDetailsFn, + OrchestratorServiceBindings, +} from '@arc-saas/orchestrator-service'; + +export type ProvisioningInputs = { + planConfig: AnyObject; + builderConfig: AnyObject; +}; + +@injectable({scope: BindingScope.TRANSIENT}) +export class TenantProvisioningHandlerProvider + implements Provider> +{ + constructor( + @inject(OrchestratorServiceBindings.TIER_DETAILS_PROVIDER) + private tierDetails: TierDetailsFn, + @inject(OrchestratorServiceBindings.BUILDER_SERVICE) + private builderService: BuilderService, + ) {} + + value() { + return async (body: ProvisioningInputs) => { + // Extract plan and builder information from the body + const planConfig = body.planConfig; + const builder = body.builderConfig; + const tier = planConfig.tier; + + try { + // Fetch tier details based on the provided tier + const {jobIdentifier, ...otherTierDetails} = + await this.tierDetails(tier); + const jobName = jobIdentifier; + + // Ensure Job name is present in the tier details + if (!jobName) { + throw new Error('Builder Job name not found in plan details'); + } + + // Check if the builder type is CODE_BUILD + if (builder?.type === 'CODE_BUILD') { + // Trigger CodeBuild with the necessary environments + const codeBuildResponse = await this.builderService.startJob( + jobName, + { + ...otherTierDetails, + ...(builder?.config?.environmentOverride ?? {}), + }, + ); + + console.log(codeBuildResponse); + + return; + } else { + // Throw an error if the builder config is invalid + throw Error('Invalid builder config provided.'); + } + } catch (error) { + console.error('Error in tenant provisioning:', error); + return; + } + }; + } +} +``` + +
+ +#### 5. Tenant Deprovisioning Provider + +This provider is intended to be used as the handler to be invoked when the tenant deprovisioning event is received. + +For example, In this provider you can implement any business logic you want to execute before triggering the deprovisioning job using the [builder service](#2-builder-service). + +
Check how to bind your custom implementation. + +```ts +import { + OrchestratorServiceComponent, + OrchestratorServiceBindings, +} from '@arc-saas/orchestrator-service'; + +import {TenantDeprovisioningHandlerProvider} from './providers'; + +export class OrchestratorApplication extends BootMixin( + ServiceMixin(RestApplication), +) { + constructor(options: ApplicationConfig = {}) { + super(options); + // ... + + this.bind( + OrchestratorServiceBindings.TENANT_DEPROVISIONING_HANDLER, + ).toProvider(TenantDeprovisioningHandlerProvider); + + this.component(OrchestratorServiceComponent); + // ... + } +} +``` + +
+ +#### 6. Tenant Provisioning Success Provider + +This provider is intended to be used as the handler to be invoked when the tenant provisioning success event is received i.e. when the provisioning job is completed. + +For example, In this provider you can implement further steps needed to onboard the tenant. + +The way of binding this provider is similar to others, just the binding key is `OrchestratorServiceBindings.TENANT_PROVISIONING_SUCCESS_HANDLER`. + +#### 7. Tenant Provisioning Failure Provider + +This provider is intended to be used as the handler to be invoked when the tenant provisioning failed event is received i.e. when the provisioning job is failed for some reason. + +For example, In this provider you can implement any cleanup or notification needed to handle the failure. + +The way of binding this provider is similar to other provider, just the binding key is `OrchestratorServiceBindings.TENANT_PROVISIONING_FAILURE_HANDLER`. + +## Deployment + +The @arc-saas/orchestrator-service can be deployed in various ways, including as a serverless application. Here's how you can set it up for serverless deployment, specifically for AWS Lambda. + +### Serverless Deployment + +To deploy this service as a serverless application on AWS Lambda, follow these steps: + +1. Add a `lambda.ts` file in your `src` directory. This file will serve as the Lambda entry point: + +```typescript +import {APIGatewayEvent, APIGatewayProxyEvent, Context} from 'aws-lambda'; +const serverlessExpress = require('@vendia/serverless-express'); + +export * from './application'; +let serverlessApp: (arg0: APIGatewayProxyEvent, arg1: Context) => any; + +export async function setup(event: APIGatewayEvent, context: Context) { + const {OrchestratorService} = require('./application'); + const config = { + rest: { + openApiSpec: { + setServersFromRequest: true, + }, + }, + }; + const app = new OrchestratorService(config); + await app.boot(); + const requestHandler = app.restServer.requestHandler; + serverlessApp = serverlessExpress({app: requestHandler}); + return serverlessApp(event, context); +} + +export const handler = async (event: APIGatewayEvent, context: Context) => { + if (serverlessApp) { + return serverlessApp(event, context); + } + + return setup(event, context); +}; +``` + +2. Create a Dockerfile in your project root: + +```dockerfile +FROM public.ecr.aws/lambda/nodejs:20-x86_64 AS BUILD_IMAGE + +RUN mkdir -p ${LAMBDA_TASK_ROOT} + +WORKDIR ${LAMBDA_TASK_ROOT} + +COPY package*.json ./ + +RUN npm install + +COPY . . + +RUN npm run build + +CMD [ "./dist/lambda.handler" ] +``` + +3. Build your Docker image: + +```bash +docker build -t orchestrator-service . +``` + +4. Push the Docker image to your container registry (e.g., Amazon ECR). + +5. Create a Lambda function using the pushed container image. + +6. Configure an API Gateway to trigger your Lambda function. + +This setup allows you to run your Orchestrator Service as a serverless application, leveraging AWS Lambda's scalability and cost-efficiency. +Remember to adjust your Lambda function's configuration (memory, timeout, etc.) based on your specific needs. + +### API Documentation + +#### API Details + +Visit the [OpenAPI spec docs](./openapi.md) for more details on the APIs provided in this service. + +## License + +ARC SaaS is [MIT licensed](./LICENSE). diff --git a/services/orchestrator-service/docs/example-architecture.png b/services/orchestrator-service/docs/example-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..1338b1f10cb7869a1306e10509bdd9f101ee022d GIT binary patch literal 139898 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 literal 0 HcmV?d00001 diff --git a/services/orchestrator-service/docs/invocation-flow-between-artifacts.png b/services/orchestrator-service/docs/invocation-flow-between-artifacts.png new file mode 100644 index 0000000000000000000000000000000000000000..5b20fba4d23b5a0819699eee551e2cf06b6efb37 GIT binary patch literal 176829 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 literal 0 HcmV?d00001 diff --git a/services/orchestrator-service/package.json b/services/orchestrator-service/package.json new file mode 100644 index 0000000..f001ab6 --- /dev/null +++ b/services/orchestrator-service/package.json @@ -0,0 +1,82 @@ +{ + "name": "@arc-saas/orchestrator-service", + "private": "true", + "version": "0.0.1", + "description": "ARC SaaS Orchestrator service", + "keywords": [ + "loopback-microservice", + "loopback" + ], + "main": "dist/index.js", + "types": "dist/index.d.ts", + "engines": { + "node": ">=18" + }, + "scripts": { + "build": "lb-tsc", + "build:watch": "lb-tsc --watch", + "lint": "npm run eslint && npm run prettier:check", + "lint:fix": "npm run eslint:fix && npm run prettier:fix", + "prettier:cli": "lb-prettier \"**/*.ts\" \"**/*.js\"", + "prettier:check": "npm run prettier:cli -- -l", + "prettier:fix": "npm run prettier:cli -- --write", + "eslint": "eslint --report-unused-disable-directives .", + "eslint:fix": "npm run eslint -- --fix", + "pretest": "npm run rebuild", + "test": "lb-mocha --allow-console-logs \"dist/__tests__\"", + "test:dev": "lb-mocha --allow-console-logs dist/__tests__/**/*.js", + "symlink-resolver": "symlink-resolver", + "resolve-links": "npm run symlink-resolver build ./node_modules/@local", + "premigrate": "npm run build", + "migrate": "node ./dist/migrate", + "preopenapi-spec": "npm run build", + "openapi-spec": "node ./dist/openapi-spec", + "prestart": "npm run clean && npm run openapi-spec", + "start": "node -r source-map-support/register .", + "dev": "nodemon --watch src -e ts --exec \"npm run start\"", + "clean": "lb-clean dist *.tsbuildinfo .eslintcache", + "rebuild": "npm run clean && npm run build" + }, + "repository": { + "type": "git", + "url": "" + }, + "author": "SourceFuse", + "license": "MIT", + "files": [ + "README.md", + "dist", + "src", + "!*/__tests__" + ], + "dependencies": { + "@loopback/boot": "^7.0.3", + "@loopback/context": "^7.0.3", + "@loopback/core": "^6.1.0", + "@loopback/logging": "^0.12.4", + "@loopback/openapi-v3": "^10.0.3", + "@loopback/repository": "^7.0.3", + "@loopback/rest": "^14.0.3", + "@loopback/rest-explorer": "^7.0.3", + "@loopback/service-proxy": "^7.0.3", + "@types/aws-lambda": "^8.10.140", + "@vendia/serverless-express": "^4.12.6", + "dotenv": "^16.4.5", + "dotenv-extended": "^2.9.0", + "swagger-stats": "^0.99.7", + "symlink-resolver": "0.2.1", + "tslib": "^2.0.0" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.2", + "@loopback/build": "^11.0.3", + "@loopback/eslint-config": "^15.0.3", + "@loopback/testlab": "^7.0.3", + "@types/i18n": "^0.13.12", + "@types/node": "^16.18.98", + "nodemon": "^3.1.4", + "nyc": "^15.1.0", + "source-map-support": "^0.5.21", + "typescript": "~5.2.2" + } +} diff --git a/services/orchestrator-service/public/index.html b/services/orchestrator-service/public/index.html new file mode 100644 index 0000000..f5f93bd --- /dev/null +++ b/services/orchestrator-service/public/index.html @@ -0,0 +1,103 @@ + + + + Orchestrator Service + + + + + + + + + + + + + + + diff --git a/services/orchestrator-service/src/__tests__/README.md b/services/orchestrator-service/src/__tests__/README.md new file mode 100644 index 0000000..007eb95 --- /dev/null +++ b/services/orchestrator-service/src/__tests__/README.md @@ -0,0 +1 @@ +# Tests diff --git a/services/orchestrator-service/src/__tests__/acceptance/event-controller.acceptance.ts b/services/orchestrator-service/src/__tests__/acceptance/event-controller.acceptance.ts new file mode 100644 index 0000000..5572be2 --- /dev/null +++ b/services/orchestrator-service/src/__tests__/acceptance/event-controller.acceptance.ts @@ -0,0 +1,109 @@ +import {expect, givenHttpServerConfig} from '@loopback/testlab'; +import { + OrchestratorServiceBindings, + OrchestratorServiceInterface, + DefaultEventTypes, +} from './../../services/types'; +import {createRestAppClient, Client} from '@loopback/testlab'; +import {RestApplication} from '@loopback/rest'; +import {OrchestratorServiceComponent} from '../../component'; + +describe('EventController (acceptance)', () => { + let app: RestApplication; + let client: Client; + let orchestratorServiceStub: OrchestratorServiceInterface; + + before(givenRunningApplication); + after(() => app.stop()); + + before(givenOrchestratorServiceStub); + before(() => { + app + .bind(OrchestratorServiceBindings.ORCHESTRATOR_SERVICE) + .to(orchestratorServiceStub); + }); + + before(givenClient); + + it('should successfully handle a valid event', async () => { + const eventType: DefaultEventTypes = DefaultEventTypes.TENANT_PROVISIONING; + const eventBody = {tenantId: '123', name: 'John Doe'}; + + let calledEventType: DefaultEventTypes | undefined; + let calledEventBody: unknown; + + orchestratorServiceStub.handleEvent = async (type, body) => { + calledEventType = type; + calledEventBody = body; + }; + + const response = await client + .post(`/events/${eventType}`) + .send(eventBody) + .expect(200); + + expect(response.body).to.deepEqual({success: true}); + expect(calledEventType).to.equal(eventType); + expect(calledEventBody).to.deepEqual(eventBody); + }); + + it('should return 400 for an invalid event', async () => { + const eventType = 'INVALID_EVENT'; + const eventBody = {someData: 'test'}; + + orchestratorServiceStub.handleEvent = async () => { + throw new Error('Invalid event'); + }; + + await client.post(`/events/${eventType}`).send(eventBody).expect(400); + }); + + it('should accept any JSON object as the event body', async () => { + const eventType: DefaultEventTypes = DefaultEventTypes.TENANT_PROVISIONING; + const eventBody = { + field1: 'value1', + field2: 123, + nested: { + subfield: true, + }, + }; + + let calledEventType: DefaultEventTypes | undefined; + let calledEventBody: unknown; + + orchestratorServiceStub.handleEvent = async (type, body) => { + calledEventType = type; + calledEventBody = body; + }; + + const response = await client + .post(`/events/${eventType}`) + .send(eventBody) + .expect(200); + + expect(response.body).to.deepEqual({success: true}); + expect(calledEventType).to.equal(eventType); + expect(calledEventBody).to.deepEqual(eventBody); + }); + + // Helper functions + + async function givenRunningApplication() { + const restConfig = givenHttpServerConfig({}); + app = new RestApplication({ + rest: restConfig, + }); + app.component(OrchestratorServiceComponent); + await app.start(); + } + + async function givenOrchestratorServiceStub() { + orchestratorServiceStub = { + handleEvent: async () => {}, + }; + } + + async function givenClient() { + client = createRestAppClient(app); + } +}); diff --git a/services/orchestrator-service/src/__tests__/unit/component.unit.ts b/services/orchestrator-service/src/__tests__/unit/component.unit.ts new file mode 100644 index 0000000..16a8886 --- /dev/null +++ b/services/orchestrator-service/src/__tests__/unit/component.unit.ts @@ -0,0 +1,115 @@ +import {expect} from '@loopback/testlab'; +import {EventController} from './../../controllers'; +import {RestApplication} from '@loopback/rest'; +import { + OrchestratorServiceBindings, + TierDetailsProvider, + TenantProvisioningHandlerProvider, + TenantDeprovisioningHandlerProvider, + TenantProvisioningSuccessHandlerProvider, + TenantProvisioningFailureHandlerProvider, + OrchestratorService, + BuilderService, + TierDetailsFn, +} from './../../'; +import {OrchestratorServiceComponent} from '../../component'; +import {Provider} from '@loopback/context'; + +describe('OrchestratorServiceComponent', () => { + let app: RestApplication; + let component: OrchestratorServiceComponent; + + beforeEach(givenApplication); + + it('binds all providers when not already bound', () => { + const expectedProviders = [ + OrchestratorServiceBindings.TIER_DETAILS_PROVIDER, + OrchestratorServiceBindings.TENANT_PROVISIONING_HANDLER, + OrchestratorServiceBindings.TENANT_DEPROVISIONING_HANDLER, + OrchestratorServiceBindings.TENANT_PROVISIONING_SUCCESS_HANDLER, + OrchestratorServiceBindings.TENANT_PROVISIONING_FAILURE_HANDLER, + ]; + + expectedProviders.forEach(binding => { + expect(app.isBound(binding.key)).to.be.true(); + }); + }); + + it('binds all services when not already bound', () => { + const expectedServices = [ + OrchestratorServiceBindings.ORCHESTRATOR_SERVICE, + OrchestratorServiceBindings.BUILDER_SERVICE, + ]; + + expectedServices.forEach(binding => { + expect(app.isBound(binding.key)).to.be.true(); + }); + }); + + it('registers EventController', () => { + expect(component.controllers).to.containEql(EventController); + }); + + it('respects existing bindings', async () => { + class MockTierDetailsProvider implements Provider { + constructor() {} + value() { + return (tier: string) => { + return {foo: `bar`}; + }; + } + } + + app + .bind(OrchestratorServiceBindings.TIER_DETAILS_PROVIDER) + .toProvider(MockTierDetailsProvider); + + // Re-initialize the component + component = new OrchestratorServiceComponent(app); + + const boundProvider = await app.get( + OrchestratorServiceBindings.TIER_DETAILS_PROVIDER.key, + ); + expect(boundProvider('sample-tier')).to.have.property('foo'); + }); + + it('binds providers to the correct classes', async () => { + const providerMap = { + [OrchestratorServiceBindings.TIER_DETAILS_PROVIDER.key]: + TierDetailsProvider, + [OrchestratorServiceBindings.TENANT_PROVISIONING_HANDLER.key]: + TenantProvisioningHandlerProvider, + [OrchestratorServiceBindings.TENANT_DEPROVISIONING_HANDLER.key]: + TenantDeprovisioningHandlerProvider, + [OrchestratorServiceBindings.TENANT_PROVISIONING_SUCCESS_HANDLER.key]: + TenantProvisioningSuccessHandlerProvider, + [OrchestratorServiceBindings.TENANT_PROVISIONING_FAILURE_HANDLER.key]: + TenantProvisioningFailureHandlerProvider, + }; + + for (const [key] of Object.entries(providerMap)) { + expect(app.isBound(key)).to.be.true(); + const boundValue = app.getBinding(key); + expect(boundValue.tagMap.type).to.be.eql('provider'); + } + }); + + it('binds services to the correct classes', async () => { + const serviceMap = { + [OrchestratorServiceBindings.ORCHESTRATOR_SERVICE.key]: + OrchestratorService, + [OrchestratorServiceBindings.BUILDER_SERVICE.key]: BuilderService, + }; + + for (const [key, expectedClass] of Object.entries(serviceMap)) { + const boundService = await app.getSync(key); + expect(boundService).to.be.instanceOf(expectedClass); + } + }); + + function givenApplication() { + app = new RestApplication(); + component = new OrchestratorServiceComponent(app); + app.component(OrchestratorServiceComponent); + } +}); diff --git a/services/orchestrator-service/src/__tests__/unit/orchestrator-service.unit.ts b/services/orchestrator-service/src/__tests__/unit/orchestrator-service.unit.ts new file mode 100644 index 0000000..fcd6bab --- /dev/null +++ b/services/orchestrator-service/src/__tests__/unit/orchestrator-service.unit.ts @@ -0,0 +1,87 @@ +import {expect, sinon} from '@loopback/testlab'; +import { + OrchestratorService, + DefaultEventTypes, + TenantProvisioningHandler, + TenantDeprovisioningHandler, + TenantProvisioningSuccessHandler, + TenantProvisioningFailureHandler, +} from '../..'; + +describe('OrchestratorService', () => { + let orchestratorService: OrchestratorService; + let tenantProvisioningHandlerStub: sinon.SinonStub; + let tenantDeprovisioningHandlerStub: sinon.SinonStub; + let tenantProvisioningSuccessHandlerStub: sinon.SinonStub; + let tenantProvisioningFailureHandlerStub: sinon.SinonStub; + + beforeEach(givenOrchestratorService); + + it('handles TENANT_PROVISIONING event', async () => { + const eventBody = {tenantId: '123'}; + await orchestratorService.handleEvent( + DefaultEventTypes.TENANT_PROVISIONING, + eventBody, + ); + expect( + tenantProvisioningHandlerStub.calledOnceWith(eventBody), + ).to.be.true(); + }); + + it('handles TENANT_DEPROVISIONING event', async () => { + const eventBody = {tenantId: '123'}; + await orchestratorService.handleEvent( + DefaultEventTypes.TENANT_DEPROVISIONING, + eventBody, + ); + expect( + tenantDeprovisioningHandlerStub.calledOnceWith(eventBody), + ).to.be.true(); + }); + + it('handles TENANT_PROVISIONING_SUCCESS event', async () => { + const eventBody = {tenantId: '123'}; + await orchestratorService.handleEvent( + DefaultEventTypes.TENANT_PROVISIONING_SUCCESS, + eventBody, + ); + expect( + tenantProvisioningSuccessHandlerStub.calledOnceWith(eventBody), + ).to.be.true(); + }); + + it('handles TENANT_PROVISIONING_FAILED event', async () => { + const eventBody = {tenantId: '123', error: 'Some error'}; + await orchestratorService.handleEvent( + DefaultEventTypes.TENANT_PROVISIONING_FAILED, + eventBody, + ); + expect( + tenantProvisioningFailureHandlerStub.calledOnceWith(eventBody), + ).to.be.true(); + }); + + it('throws error for unsupported event type', async () => { + const eventBody = {}; + await expect( + orchestratorService.handleEvent( + 'UNSUPPORTED_EVENT' as DefaultEventTypes, + eventBody, + ), + ).to.be.rejectedWith('Unsupported event type: UNSUPPORTED_EVENT'); + }); + + function givenOrchestratorService() { + tenantProvisioningHandlerStub = sinon.stub(); + tenantDeprovisioningHandlerStub = sinon.stub(); + tenantProvisioningSuccessHandlerStub = sinon.stub(); + tenantProvisioningFailureHandlerStub = sinon.stub(); + + orchestratorService = new OrchestratorService( + tenantProvisioningHandlerStub as unknown as TenantProvisioningHandler, + tenantDeprovisioningHandlerStub as unknown as TenantDeprovisioningHandler, + tenantProvisioningSuccessHandlerStub as unknown as TenantProvisioningSuccessHandler, + tenantProvisioningFailureHandlerStub as unknown as TenantProvisioningFailureHandler, + ); + } +}); diff --git a/services/orchestrator-service/src/component.ts b/services/orchestrator-service/src/component.ts new file mode 100644 index 0000000..84b670f --- /dev/null +++ b/services/orchestrator-service/src/component.ts @@ -0,0 +1,99 @@ +import { + Binding, + Component, + Constructor, + ControllerClass, + CoreBindings, + createBindingFromClass, + inject, + Provider, + ProviderMap, + ServiceOrProviderClass, +} from '@loopback/core'; +import {OrchestratorServiceBindings} from './services/types'; +import { + BuilderService, + OrchestratorService, + TenantProvisioningFailureHandlerProvider, + TenantProvisioningHandlerProvider, + TierDetailsProvider, + TenantProvisioningSuccessHandlerProvider, + TenantDeprovisioningHandlerProvider, +} from './services'; +import {EventController} from './controllers'; +import {RestApplication} from '@loopback/rest'; +import {LoggingBindings, LoggingComponent} from '@loopback/logging'; + +export class OrchestratorServiceComponent implements Component { + providers: ProviderMap = {}; + controllers: ControllerClass[] = []; + bindings: Binding[] = []; + services?: ServiceOrProviderClass[]; + + constructor( + @inject(CoreBindings.APPLICATION_INSTANCE) + private application: RestApplication, + ) { + application.configure(LoggingBindings.COMPONENT).to({ + enableFluent: false, + enableHttpAccessLog: true, + }); + application.component(LoggingComponent); + + // Bind Providers if not provided by consumer of the component + this.bindProviders({ + [OrchestratorServiceBindings.TIER_DETAILS_PROVIDER.key]: + TierDetailsProvider, + [OrchestratorServiceBindings.TENANT_PROVISIONING_HANDLER.key]: + TenantProvisioningHandlerProvider, + [OrchestratorServiceBindings.TENANT_DEPROVISIONING_HANDLER.key]: + TenantDeprovisioningHandlerProvider, + [OrchestratorServiceBindings.TENANT_PROVISIONING_SUCCESS_HANDLER.key]: + TenantProvisioningSuccessHandlerProvider, + [OrchestratorServiceBindings.TENANT_PROVISIONING_FAILURE_HANDLER.key]: + TenantProvisioningFailureHandlerProvider, + }); + + // Bind Service Classes if not provided by consumer of the component + this.bindServiceClasses({ + [OrchestratorServiceBindings.ORCHESTRATOR_SERVICE.key]: + OrchestratorService, + [OrchestratorServiceBindings.BUILDER_SERVICE.key]: BuilderService, + }); + + this.controllers = [EventController]; + } + + private bindProviders(providersObject: ProviderMap) { + for (const key in providersObject) { + this.addProviderIfNotPresent(key, providersObject[key]); + } + } + + private bindServiceClasses(serviceObject: { + [key: string]: Constructor; + }) { + for (const key in serviceObject) { + this.addClassBindingIfNotPresent(key, serviceObject[key]); + } + } + + private addClassBindingIfNotPresent(key: string, cls: Constructor) { + if (!this.application.isBound(key)) { + this.bindings.push( + createBindingFromClass(cls, { + key: key, + }), + ); + } + } + + private addProviderIfNotPresent( + key: string, + provider: Constructor>, + ) { + if (!this.application.isBound(key)) { + this.providers[key] = provider; + } + } +} diff --git a/services/orchestrator-service/src/controllers/README.md b/services/orchestrator-service/src/controllers/README.md new file mode 100644 index 0000000..ad4c4cc --- /dev/null +++ b/services/orchestrator-service/src/controllers/README.md @@ -0,0 +1,9 @@ +# Controllers + +This directory contains source files for the controllers exported by this app. + +To add a new empty controller, type in `lb4 controller []` from the +command-line of your application's root directory. + +For more information, please visit +[Controller generator](http://loopback.io/doc/en/lb4/Controller-generator.html). diff --git a/services/orchestrator-service/src/controllers/event.controller.ts b/services/orchestrator-service/src/controllers/event.controller.ts new file mode 100644 index 0000000..baf6c2c --- /dev/null +++ b/services/orchestrator-service/src/controllers/event.controller.ts @@ -0,0 +1,47 @@ +import {post, param, requestBody, HttpErrors} from '@loopback/rest'; +import {inject} from '@loopback/core'; +import { + DefaultEventTypes, + OrchestratorServiceBindings, + OrchestratorServiceInterface, +} from '../services/types'; +import {AnyObject} from '@loopback/repository'; +import {LoggingBindings, WinstonLogger} from '@loopback/logging'; + +export class EventController { + @inject(LoggingBindings.WINSTON_LOGGER) + private logger: WinstonLogger; + + constructor( + @inject(OrchestratorServiceBindings.ORCHESTRATOR_SERVICE) + protected orchestratorService: OrchestratorServiceInterface, + ) {} + + @post('/events/{eventType}') + async handleEvent( + @param.path.string('eventType') eventType: DefaultEventTypes, + @requestBody({ + content: { + 'application/json': { + schema: { + type: 'object', + additionalProperties: true, + }, + }, + }, + }) + body: AnyObject, + ): Promise { + try { + await this.orchestratorService.handleEvent(eventType, body); + return {success: true}; + } catch (err) { + if (err instanceof Error) { + throw HttpErrors.BadRequest(err.message); + } + // Log unexpected errors + this.logger.error(err); + throw new HttpErrors.InternalServerError('An unexpected error occurred.'); + } + } +} diff --git a/services/orchestrator-service/src/controllers/home-page.controller.ts b/services/orchestrator-service/src/controllers/home-page.controller.ts new file mode 100644 index 0000000..46b6802 --- /dev/null +++ b/services/orchestrator-service/src/controllers/home-page.controller.ts @@ -0,0 +1,31 @@ +import {get} from '@loopback/openapi-v3'; +import * as fs from 'fs'; +import * as path from 'path'; +import {inject} from '@loopback/context'; +import {RestBindings, Response} from '@loopback/rest'; + +const OK = 200; + +export class HomePageController { + private readonly html: string; + constructor( + @inject(RestBindings.Http.RESPONSE) + private readonly response: Response, + ) { + this.html = fs.readFileSync( + path.join(__dirname, '../../public/index.html'), + 'utf-8', + ); + // Replace base path placeholder from env + this.html = this.html.replace( + /\$\{basePath\}/g, + process.env.BASE_PATH ?? '', + ); + } + + @get('/') + homePage() { + this.response.status(OK).contentType('html').send(this.html); + return this.response; + } +} diff --git a/services/orchestrator-service/src/controllers/index.ts b/services/orchestrator-service/src/controllers/index.ts new file mode 100644 index 0000000..646b83f --- /dev/null +++ b/services/orchestrator-service/src/controllers/index.ts @@ -0,0 +1,3 @@ +export * from './ping.controller'; +export * from './event.controller'; +export * from './home-page.controller'; diff --git a/services/orchestrator-service/src/controllers/ping.controller.ts b/services/orchestrator-service/src/controllers/ping.controller.ts new file mode 100644 index 0000000..9121b5e --- /dev/null +++ b/services/orchestrator-service/src/controllers/ping.controller.ts @@ -0,0 +1,22 @@ +import {inject} from '@loopback/core'; +import {Request, RestBindings, get} from '@loopback/rest'; + +/** + * A simple controller to bounce back http requests + */ +export class PingController { + constructor( + @inject(RestBindings.Http.REQUEST) private readonly req: Request, + ) {} + + @get('/ping') + ping(): object { + // Reply with a greeting, the current time, the url, and request headers + return { + greeting: 'Hello from Orchestrator Service.', + date: new Date(), + url: this.req.url, + headers: {...this.req.headers}, + }; + } +} diff --git a/services/orchestrator-service/src/index.ts b/services/orchestrator-service/src/index.ts new file mode 100644 index 0000000..f4f17fc --- /dev/null +++ b/services/orchestrator-service/src/index.ts @@ -0,0 +1,2 @@ +export * from './component'; +export * from './services'; diff --git a/services/orchestrator-service/src/openapi.json b/services/orchestrator-service/src/openapi.json new file mode 100644 index 0000000..4c8a7ba --- /dev/null +++ b/services/orchestrator-service/src/openapi.json @@ -0,0 +1,84 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "orchestrator-service", + "version": "1.0.0", + "description": "ARC SaaS Orchestrator service", + "contact": { + "name": "SourceFuse" + } + }, + "paths": { + "/events/{eventType}": { + "post": { + "x-controller-name": "EventController", + "x-operation-name": "handleEvent", + "tags": [ + "EventController" + ], + "responses": { + "200": { + "description": "Return value of EventController.handleEvent" + } + }, + "parameters": [ + { + "name": "eventType", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": true + } + } + }, + "x-parameter-index": 1 + }, + "operationId": "EventController.handleEvent" + } + }, + "/ping": { + "get": { + "x-controller-name": "PingController", + "x-operation-name": "ping", + "tags": [ + "PingController" + ], + "responses": { + "200": { + "description": "Return value of PingController.ping" + } + }, + "operationId": "PingController.ping" + } + }, + "/": { + "get": { + "x-controller-name": "HomePageController", + "x-operation-name": "homePage", + "tags": [ + "HomePageController" + ], + "responses": { + "200": { + "description": "Return value of HomePageController.homePage" + } + }, + "operationId": "HomePageController.homePage" + } + } + }, + "servers": [ + { + "url": "/" + } + ] +} \ No newline at end of file diff --git a/services/orchestrator-service/src/services/builder.service.ts b/services/orchestrator-service/src/services/builder.service.ts new file mode 100644 index 0000000..ff90c4e --- /dev/null +++ b/services/orchestrator-service/src/services/builder.service.ts @@ -0,0 +1,14 @@ +import {injectable} from '@loopback/core'; +import {BuilderServiceInterface} from './types'; +import {AnyObject} from '@loopback/repository'; + +@injectable() +export class BuilderService implements BuilderServiceInterface { + constructor() {} + + async startJob(jobName: string, params: AnyObject): Promise { + throw Error( + `${BuilderService.name} is not implemented. Follow the README for more details.`, + ); + } +} diff --git a/services/orchestrator-service/src/services/index.ts b/services/orchestrator-service/src/services/index.ts new file mode 100644 index 0000000..d5790ba --- /dev/null +++ b/services/orchestrator-service/src/services/index.ts @@ -0,0 +1,8 @@ +export * from './builder.service'; +export * from './tenant-provisioning-handler.service'; +export * from './tenant-provisioning-success-handler.service'; +export * from './tenant-provisioning-failure-handler.service'; +export * from './tenant-deprovisioning-handler.service'; +export * from './tier-details.service'; +export * from './orchestrator.service'; +export * from './types'; diff --git a/services/orchestrator-service/src/services/orchestrator.service.ts b/services/orchestrator-service/src/services/orchestrator.service.ts new file mode 100644 index 0000000..435d120 --- /dev/null +++ b/services/orchestrator-service/src/services/orchestrator.service.ts @@ -0,0 +1,43 @@ +import {injectable, BindingScope, inject} from '@loopback/core'; +import { + DefaultEventTypes, + OrchestratorServiceBindings, + OrchestratorServiceInterface, +} from './types'; +import {TenantProvisioningHandler} from './tenant-provisioning-handler.service'; +import {AnyObject} from '@loopback/repository'; +import {TenantDeprovisioningHandler} from './tenant-deprovisioning-handler.service'; +import {TenantProvisioningSuccessHandler} from './tenant-provisioning-success-handler.service'; +import {TenantProvisioningFailureHandler} from './tenant-provisioning-failure-handler.service'; + +@injectable({scope: BindingScope.TRANSIENT}) +export class OrchestratorService implements OrchestratorServiceInterface { + constructor( + @inject(OrchestratorServiceBindings.TENANT_PROVISIONING_HANDLER) + private handleTenantProvisioning: TenantProvisioningHandler, + @inject(OrchestratorServiceBindings.TENANT_DEPROVISIONING_HANDLER) + private handleTenantDeprovisioning: TenantDeprovisioningHandler, + @inject(OrchestratorServiceBindings.TENANT_PROVISIONING_SUCCESS_HANDLER) + private handleTenantProvisioningSuccess: TenantProvisioningSuccessHandler, + @inject(OrchestratorServiceBindings.TENANT_PROVISIONING_FAILURE_HANDLER) + private handleTenantProvisioningFailure: TenantProvisioningFailureHandler, + ) {} + + async handleEvent( + eventType: DefaultEventTypes, + eventBody: AnyObject, + ): Promise { + switch (eventType) { + case DefaultEventTypes.TENANT_PROVISIONING: + return this.handleTenantProvisioning(eventBody); + case DefaultEventTypes.TENANT_DEPROVISIONING: + return this.handleTenantDeprovisioning(eventBody); + case DefaultEventTypes.TENANT_PROVISIONING_SUCCESS: + return this.handleTenantProvisioningSuccess(eventBody); + case DefaultEventTypes.TENANT_PROVISIONING_FAILED: + return this.handleTenantProvisioningFailure(eventBody); + default: + throw new Error(`Unsupported event type: ${eventType}`); + } + } +} diff --git a/services/orchestrator-service/src/services/tenant-deprovisioning-handler.service.ts b/services/orchestrator-service/src/services/tenant-deprovisioning-handler.service.ts new file mode 100644 index 0000000..64482d2 --- /dev/null +++ b/services/orchestrator-service/src/services/tenant-deprovisioning-handler.service.ts @@ -0,0 +1,23 @@ +import {injectable, BindingScope, Provider} from '@loopback/core'; +import {AnyObject} from '@loopback/repository'; + +export type TenantDeprovisioningHandler = ( + body: T, +) => Promise; + +@injectable({scope: BindingScope.TRANSIENT}) +export class TenantDeprovisioningHandlerProvider + implements Provider +{ + constructor() {} + + value() { + return async (body: AnyObject) => this.handler(body); + } + + private async handler(body: AnyObject): Promise { + throw Error( + `${TenantDeprovisioningHandlerProvider.name} is not implemented. Follow the README for more details.`, + ); + } +} diff --git a/services/orchestrator-service/src/services/tenant-provisioning-failure-handler.service.ts b/services/orchestrator-service/src/services/tenant-provisioning-failure-handler.service.ts new file mode 100644 index 0000000..d69eaca --- /dev/null +++ b/services/orchestrator-service/src/services/tenant-provisioning-failure-handler.service.ts @@ -0,0 +1,23 @@ +import {injectable, BindingScope, Provider} from '@loopback/core'; +import {AnyObject} from '@loopback/repository'; + +export type TenantProvisioningFailureHandler = ( + body: T, +) => Promise; + +@injectable({scope: BindingScope.TRANSIENT}) +export class TenantProvisioningFailureHandlerProvider + implements Provider +{ + constructor() {} + + value() { + return async (body: AnyObject) => this.handler(body); + } + + private async handler(body: AnyObject): Promise { + throw Error( + `${TenantProvisioningFailureHandlerProvider.name} is not implemented. Follow the README for more details.`, + ); + } +} diff --git a/services/orchestrator-service/src/services/tenant-provisioning-handler.service.ts b/services/orchestrator-service/src/services/tenant-provisioning-handler.service.ts new file mode 100644 index 0000000..3602c74 --- /dev/null +++ b/services/orchestrator-service/src/services/tenant-provisioning-handler.service.ts @@ -0,0 +1,23 @@ +import {injectable, BindingScope, Provider} from '@loopback/core'; +import {AnyObject} from '@loopback/repository'; + +export type TenantProvisioningHandler = ( + body: T, +) => Promise; + +@injectable({scope: BindingScope.TRANSIENT}) +export class TenantProvisioningHandlerProvider + implements Provider +{ + constructor() {} + + value() { + return async (body: AnyObject) => this.handler(body); + } + + private async handler(body: AnyObject): Promise { + throw Error( + `${TenantProvisioningHandlerProvider.name} is not implemented. Follow the README for more details.`, + ); + } +} diff --git a/services/orchestrator-service/src/services/tenant-provisioning-success-handler.service.ts b/services/orchestrator-service/src/services/tenant-provisioning-success-handler.service.ts new file mode 100644 index 0000000..1a0cf8b --- /dev/null +++ b/services/orchestrator-service/src/services/tenant-provisioning-success-handler.service.ts @@ -0,0 +1,23 @@ +import {injectable, BindingScope, Provider} from '@loopback/core'; +import {AnyObject} from '@loopback/repository'; + +export type TenantProvisioningSuccessHandler = ( + body: T, +) => Promise; + +@injectable({scope: BindingScope.TRANSIENT}) +export class TenantProvisioningSuccessHandlerProvider + implements Provider +{ + constructor() {} + + value() { + return async (body: AnyObject) => this.handler(body); + } + + private async handler(body: AnyObject): Promise { + throw Error( + `${TenantProvisioningSuccessHandlerProvider.name} is not implemented. Follow the README for more details.`, + ); + } +} diff --git a/services/orchestrator-service/src/services/tier-details.service.ts b/services/orchestrator-service/src/services/tier-details.service.ts new file mode 100644 index 0000000..8758974 --- /dev/null +++ b/services/orchestrator-service/src/services/tier-details.service.ts @@ -0,0 +1,27 @@ +import { + injectable, + BindingScope, + Provider, + ValueOrPromise, +} from '@loopback/core'; +import {AnyObject} from '@loopback/repository'; + +export type TierDetailsFn = (tier: string) => ValueOrPromise; + +@injectable({scope: BindingScope.TRANSIENT}) +export class TierDetailsProvider implements Provider { + constructor() {} + + value() { + return async (tier: string) => this.fetchTierDetails(tier); + } + + private fetchTierDetails(tier: string) { + // Example implementation + // To write your own logic, bind your custom provider of fetchign tier details. + // Follow readme for more details. + return Promise.resolve({ + jobIdentifier: `${tier}-job`, + }); + } +} diff --git a/services/orchestrator-service/src/services/types.ts b/services/orchestrator-service/src/services/types.ts new file mode 100644 index 0000000..6fc3b41 --- /dev/null +++ b/services/orchestrator-service/src/services/types.ts @@ -0,0 +1,56 @@ +import {BindingKey} from '@loopback/context'; +import {TierDetailsFn} from './tier-details.service'; +import {TenantProvisioningHandler} from './tenant-provisioning-handler.service'; +import {TenantDeprovisioningHandler} from './tenant-deprovisioning-handler.service'; +import {AnyObject} from '@loopback/repository'; +import {TenantProvisioningSuccessHandler} from './tenant-provisioning-success-handler.service'; +import {TenantProvisioningFailureHandler} from './tenant-provisioning-failure-handler.service'; + +const BINDING_PREFIX = `arc-saas`; + +export namespace OrchestratorServiceBindings { + export const TIER_DETAILS_PROVIDER = BindingKey.create( + `${BINDING_PREFIX}.providers.tier-details`, + ); + export const TENANT_PROVISIONING_HANDLER = + BindingKey.create( + `${BINDING_PREFIX}.providers.tenant-provisioning-handler`, + ); + export const TENANT_DEPROVISIONING_HANDLER = + BindingKey.create( + `${BINDING_PREFIX}.providers.tenant-deprovisioning-handler`, + ); + export const TENANT_PROVISIONING_SUCCESS_HANDLER = + BindingKey.create( + `${BINDING_PREFIX}.providers.tenant-provisioning-success-handler`, + ); + export const TENANT_PROVISIONING_FAILURE_HANDLER = + BindingKey.create( + `${BINDING_PREFIX}.providers.tenant-provisioning-success-handler`, + ); + export const BUILDER_SERVICE = BindingKey.create( + `${BINDING_PREFIX}.services.builder-service`, + ); + export const ORCHESTRATOR_SERVICE = + BindingKey.create( + `${BINDING_PREFIX}.services.orchestrator-service`, + ); +} + +export interface OrchestratorServiceInterface< + EventType extends string = DefaultEventTypes, + BodyType extends AnyObject = AnyObject, +> { + handleEvent(eventType: EventType, eventBody: BodyType): Promise; +} + +export interface BuilderServiceInterface { + startJob(jobIdentifier: string, params: AnyObject): Promise; +} + +export enum DefaultEventTypes { + TENANT_PROVISIONING = 'TENANT_PROVISIONING', + TENANT_DEPROVISIONING = 'TENANT_DEPROVISIONING', + TENANT_PROVISIONING_SUCCESS = 'TENANT_PROVISIONING_SUCCESS', + TENANT_PROVISIONING_FAILED = 'TENANT_PROVISIONING_FAILED', +} diff --git a/services/orchestrator-service/tsconfig.json b/services/orchestrator-service/tsconfig.json new file mode 100644 index 0000000..c7b8e49 --- /dev/null +++ b/services/orchestrator-service/tsconfig.json @@ -0,0 +1,9 @@ +{ + "$schema": "http://json.schemastore.org/tsconfig", + "extends": "@loopback/build/config/tsconfig.common.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src"] +} diff --git a/services/tenant-management-service/README.md b/services/tenant-management-service/README.md index 9c71fc9..2c87e36 100644 --- a/services/tenant-management-service/README.md +++ b/services/tenant-management-service/README.md @@ -1,21 +1,21 @@ # tenant-management-service + [![LoopBack]()](http://loopback.io/) This is the primary service of the control plane responsible for onboarding a tenant and triggering it's provisioning. - ## Overview A Microservice for handling tenant management operations. It provides - + - lead creation and verification - Tenant Onboarding of both pooled and silo tenants - Billing and Invoicing - Provisioning of resources for silo and pooled tenants ### work flow -![image](https://github.com/sourcefuse/arc-saas/assets/107617248/25cb5c15-30d6-4e3a-8a43-05cca121eeaf) - +![image](https://github.com/sourcefuse/arc-saas/assets/107617248/25cb5c15-30d6-4e3a-8a43-05cca121eeaf) ## Installation @@ -53,7 +53,8 @@ $ [npm install | yarn add] @sourceloop/tenant-management-service - The mail has a link which should direct to a front end application, which in turn would call the upcoming api's using a temporary authorization code included in the mail. - The front end application first calls the `/leads/{id}/verify` which updates the validated status of the lead in the DB and returns a new JWT Token that can be used for subsequent calls - If the token is validated in the previous step, the UI should call the `/leads/{id}/tenants` endpoint with the necessary payload(as per swagger documentation). -- This endpoint would onboard the tenant in the DB, and the facade is then supposed to trigger the relevant pipeline using the `/tenants/{id}/provision` endpoint +- This endpoint would onboard the tenant in the DB, and the facade is then supposed to trigger the relevant events using the `/tenants/{id}/provision` endpoint. +- The provisioning endpoint will invoke the publish method on the `EventConnector`. This connector's purpose is to provide a place for consumer to write the event publishing logic. And your custom service can be bound to the key `EventConnectorBinding` exported by the service. Refer the example with Amazon EventBridge implementation in the [sandbox](./sandbox). ## Webhook Integration @@ -80,8 +81,6 @@ const signature = crypto .digest('hex'); ``` - - ### Environment Variables @@ -272,12 +271,12 @@ const signature = crypto ### Setting up a `DataSource` -Here is a sample Implementation `DataSource` implementation using environment variables and PostgreSQL as the data source. +Here is a sample Implementation `DataSource` implementation using environment variables and PostgreSQL as the data source. ```typescript import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core'; import {juggler} from '@loopback/repository'; -import {TenantManagementDbSourceName} from "@sourceloop/tenant-management-service"; +import {TenantManagementDbSourceName} from '@sourceloop/tenant-management-service'; const config = { name: TenantManagementDbSourceName, @@ -301,7 +300,9 @@ export class AuthenticationDbDataSource constructor( // You need to set datasource configuration name as 'datasources.config.Authentication' otherwise you might get Errors - @inject(`datasources.config.${TenantManagementDbSourceName}`, {optional: true}) + @inject(`datasources.config.${TenantManagementDbSourceName}`, { + optional: true, + }) dsConfig: object = config, ) { super(dsConfig); @@ -314,7 +315,7 @@ create one more datasource with redis as connector and db name 'TenantManagement ```typescript import {inject, lifeCycleObserver, LifeCycleObserver} from '@loopback/core'; import {AnyObject, juggler} from '@loopback/repository'; -import { readFileSync } from 'fs'; +import {readFileSync} from 'fs'; const config = { name: 'TenantManagementCacheDB', @@ -376,8 +377,8 @@ export class RedisDataSource super(dsConfig); } } - ``` + ### Migrations The migrations required for this service can be copied from the service. You can customize or cherry-pick the migrations in the copied files according to your specific requirements and then apply them to the DB. @@ -386,7 +387,6 @@ The migrations required for this service can be copied from the service. You can ![alt text](./docs/tenants.png) - The major tables in the schema are briefly described below - **Address** - this model represents the address of a company or lead diff --git a/services/tenant-management-service/package.json b/services/tenant-management-service/package.json index 38a61d5..34e6830 100644 --- a/services/tenant-management-service/package.json +++ b/services/tenant-management-service/package.json @@ -64,7 +64,6 @@ "!*/__tests__" ], "dependencies": { - "@aws-sdk/client-codebuild": "^3.504.0", "@loopback/boot": "^7.0.0", "@loopback/context": "^7.0.0", "@loopback/core": "^6.0.0", diff --git a/services/tenant-management-service/src/__tests__/acceptance/tenant.controller.acceptance.ts b/services/tenant-management-service/src/__tests__/acceptance/tenant.controller.acceptance.ts index 93227b7..8d5bb14 100644 --- a/services/tenant-management-service/src/__tests__/acceptance/tenant.controller.acceptance.ts +++ b/services/tenant-management-service/src/__tests__/acceptance/tenant.controller.acceptance.ts @@ -19,10 +19,6 @@ import { import {getRepo, getToken, setupApplication} from './test-helper'; import {ILogger, LOGGER, STATUS_CODE} from '@sourceloop/core'; import {BindingScope} from '@loopback/context'; -import {AWS_CODEBUILD_CLIENT} from '../../services'; -import {CodeBuildClient, StartBuildCommand} from '@aws-sdk/client-codebuild'; -import {PlanTier} from '../../enums'; -import {PIPELINES} from '../../keys'; describe('TenantController', () => { let app: TenantMgmtServiceApplication; @@ -46,10 +42,6 @@ describe('TenantController', () => { const logger = app.getSync(LOGGER.LOGGER_INJECT); app.bind(LOGGER.LOGGER_INJECT).to(logger).inScope(BindingScope.SINGLETON); - app.bind(PIPELINES).to({ - [PlanTier.POOLED]: 'free-pipeline', - [PlanTier.SILO]: '', - }); secretRepo = await getRepo(app, 'repositories.WebhookSecretRepository'); }); @@ -106,7 +98,7 @@ describe('TenantController', () => { const webhookSecret = await secretRepo.get(tenant.id); expect(webhookSecret).to.not.be.null(); - expect(webhookSecret.context).to.eql('test-id'); + expect(webhookSecret.context).to.not.undefined(); expect(webhookSecret.secret).to.be.String(); }); @@ -173,61 +165,13 @@ describe('TenantController', () => { .expect(STATUS_CODE.INTERNAL_SERVER_ERROR); }); - it('invokes POST /tenants/{id}/provision but throws 500 for missing plan pipeline in a subscription', async () => { - const invalidSubscription = { - id: mockSubscriptionId, - plan: { - tier: PlanTier.SILO, - }, - }; - const token = getToken([ - PermissionKey.CreateTenant, - PermissionKey.ProvisionTenant, - ]); - const {body: tenant} = await client - .post('/tenants') - .set('Authorization', token) - .send(mockTenantOnboardDTO) - .expect(STATUS_CODE.OK); - - await client - .post(`/tenants/${tenant.id}/provision`) - .set('Authorization', token) - .send(invalidSubscription) - .expect(STATUS_CODE.INTERNAL_SERVER_ERROR); - }); - - it('invokes POST /tenants/{id}/provision but throws 500 for missing build id', async () => { - app.bind(AWS_CODEBUILD_CLIENT).to({ - send: (cmd: StartBuildCommand) => { - return { - build: {}, - }; - }, - } as unknown as CodeBuildClient); - const token = getToken([ - PermissionKey.CreateTenant, - PermissionKey.ProvisionTenant, - ]); - const {body: tenant} = await client - .post('/tenants') - .set('Authorization', token) - .send({...mockTenantOnboardDTO, name: 'test2'}) - .expect(STATUS_CODE.OK); - - await client - .post(`/tenants/${tenant.id}/provision`) - .set('Authorization', token) - .send(mockSusbcription) - .expect(STATUS_CODE.INTERNAL_SERVER_ERROR); - }); - it('invokes GET /tenants with valid token', async () => { const token = getToken([PermissionKey.ViewTenant]); const {body} = await client .get('/tenants') .set('Authorization', token) .expect(STATUS_CODE.OK); + console.log(body); expect(body.length).to.eql(1); expect(body[0].name).to.eql(mockTenant.name); }); diff --git a/services/tenant-management-service/src/__tests__/acceptance/test-helper.ts b/services/tenant-management-service/src/__tests__/acceptance/test-helper.ts index 55d35bb..36a4bdd 100644 --- a/services/tenant-management-service/src/__tests__/acceptance/test-helper.ts +++ b/services/tenant-management-service/src/__tests__/acceptance/test-helper.ts @@ -10,16 +10,16 @@ import {MemoryStore} from 'express-rate-limit'; import {sign} from 'jsonwebtoken'; import {AuthenticationBindings} from 'loopback4-authentication'; import {RateLimitSecurityBindings} from 'loopback4-ratelimiter'; -import {TenantMgmtServiceApplication} from '../..'; +import {EventConnectorBinding, TenantMgmtServiceApplication} from '../..'; import { ContactRepository, ResourceRepository, TenantRepository, } from '../../repositories'; -import {AWS_CODEBUILD_CLIENT, NotificationService} from '../../services'; +import {NotificationService} from '../../services'; import {Transaction} from '../fixtures'; -import {MOCK_CODEBUILD_CLIENT} from '../fixtures/mock-codebuild-client'; import {DbDataSource, RedisDataSource} from '../helper/datasources'; +import {IEventConnector} from '../../types/i-event-connector.interface'; export async function setupApplication( notifStub?: sinon.SinonStub, @@ -45,7 +45,7 @@ export async function setupApplication( ResourceRepository.prototype.beginTransaction = async () => new Transaction(); setUpRateLimitMemory(app); - app.bind(AWS_CODEBUILD_CLIENT).to(MOCK_CODEBUILD_CLIENT); + setupEventConnector(app); await app.boot(); @@ -86,6 +86,16 @@ function setUpRateLimitMemory(app: RestApplication) { app.bind(RateLimitSecurityBindings.DATASOURCEPROVIDER).to(store); } +function setupEventConnector(app: RestApplication) { + class EventConnector implements IEventConnector { + publish(event: unknown): Promise { + return Promise.resolve(); + } + } + + app.bind(EventConnectorBinding).toClass(EventConnector); +} + export interface AppWithClient { app: TenantMgmtServiceApplication; client: Client; diff --git a/services/tenant-management-service/src/__tests__/fixtures/index.ts b/services/tenant-management-service/src/__tests__/fixtures/index.ts index 54b0924..eb56405 100644 --- a/services/tenant-management-service/src/__tests__/fixtures/index.ts +++ b/services/tenant-management-service/src/__tests__/fixtures/index.ts @@ -1,2 +1 @@ -export * from './mock-codebuild-client'; export * from './mock-transaction'; diff --git a/services/tenant-management-service/src/__tests__/fixtures/mock-codebuild-client.ts b/services/tenant-management-service/src/__tests__/fixtures/mock-codebuild-client.ts deleted file mode 100644 index 0619f3b..0000000 --- a/services/tenant-management-service/src/__tests__/fixtures/mock-codebuild-client.ts +++ /dev/null @@ -1,10 +0,0 @@ -import {StartBuildCommand, CodeBuildClient} from '@aws-sdk/client-codebuild'; -export const MOCK_CODEBUILD_CLIENT = { - send: (cmd: StartBuildCommand) => { - return { - build: { - id: 'test-id', - }, - }; - }, -} as unknown as CodeBuildClient; diff --git a/services/tenant-management-service/src/__tests__/unit/codebuild-client.provider.unit.ts b/services/tenant-management-service/src/__tests__/unit/codebuild-client.provider.unit.ts deleted file mode 100644 index 04a222c..0000000 --- a/services/tenant-management-service/src/__tests__/unit/codebuild-client.provider.unit.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {expect} from '@loopback/testlab'; -import {CodebuildClientProvider} from '../../services'; -import {CodeBuildClient} from '@aws-sdk/client-codebuild'; - -describe(`CodeBuildClientProvider`, () => { - it('should return a CodeBuild client', async () => { - const provider = new CodebuildClientProvider(); - const value = provider.value(); - expect(value).to.be.instanceOf(CodeBuildClient); - }); -}); diff --git a/services/tenant-management-service/src/component.ts b/services/tenant-management-service/src/component.ts index 150c134..580efe7 100644 --- a/services/tenant-management-service/src/component.ts +++ b/services/tenant-management-service/src/component.ts @@ -5,8 +5,10 @@ import { Binding, Component, + Constructor, ControllerClass, CoreBindings, + createBindingFromClass, createServiceBinding, inject, ProviderMap, @@ -29,6 +31,7 @@ import { AuthorizationComponent, } from 'loopback4-authorization'; import { + EventConnectorBinding, LEAD_TOKEN_VERIFIER, SYSTEM_USER, TenantManagementServiceBindings, @@ -70,10 +73,8 @@ import { } from './repositories'; import {LeadTokenVerifierProvider, SystemUserProvider} from './providers'; import { - AWS_CODEBUILD_CLIENT, - CodebuildClientProvider, - CodeBuildService, CryptoHelperService, + EventConnector, InvoicePDFGenerator, LeadAuthenticator, NotificationService, @@ -150,20 +151,20 @@ export class TenantManagementServiceComponent implements Component { this.bindings = [ Binding.bind(LEAD_TOKEN_VERIFIER).toProvider(LeadTokenVerifierProvider), Binding.bind(SYSTEM_USER).toProvider(SystemUserProvider), - Binding.bind(AWS_CODEBUILD_CLIENT).toProvider(CodebuildClientProvider), createServiceBinding(ProvisioningService), createServiceBinding(OnboardingService), createServiceBinding(LeadAuthenticator), createServiceBinding(CryptoHelperService), Binding.bind('services.NotificationService').toClass(NotificationService), - createServiceBinding(CodeBuildService), createServiceBinding(InvoicePDFGenerator), ]; + + this.addClassBindingIfNotPresent(EventConnectorBinding.key, EventConnector); } providers?: ProviderMap = {}; - bindings?: Binding[] = []; + bindings: Binding[] = []; services?: ServiceOrProviderClass[]; @@ -206,4 +207,14 @@ export class TenantManagementServiceComponent implements Component { }); this.application.component(AuthorizationComponent); } + + private addClassBindingIfNotPresent(key: string, cls: Constructor) { + if (!this.application.isBound(key)) { + this.bindings.push( + createBindingFromClass(cls, { + key: key, + }), + ); + } + } } diff --git a/services/tenant-management-service/src/controllers/tenant.controller.ts b/services/tenant-management-service/src/controllers/tenant.controller.ts index cdd2f6d..cdf1b9f 100644 --- a/services/tenant-management-service/src/controllers/tenant.controller.ts +++ b/services/tenant-management-service/src/controllers/tenant.controller.ts @@ -98,13 +98,17 @@ export class TenantController { }, }, }) - dto: SubscriptionDTO, + subscription: SubscriptionDTO, @param.path.string('id') id: string, ): Promise { - const existing = await this.tenantRepository.findById(id, { + const tenantDetails = await this.tenantRepository.findById(id, { include: ['contacts', 'address'], }); - return this.provisioningService.provisionTenant(existing, dto); + + return this.provisioningService.provisionTenant( + tenantDetails, + subscription, + ); } @authorize({ diff --git a/services/tenant-management-service/src/keys.ts b/services/tenant-management-service/src/keys.ts index 26213a6..d9edad1 100644 --- a/services/tenant-management-service/src/keys.ts +++ b/services/tenant-management-service/src/keys.ts @@ -15,6 +15,7 @@ import { extensionFor, } from '@loopback/core'; import {BINDING_PREFIX} from '@sourceloop/core'; +import {IEventConnector} from './types/i-event-connector.interface'; export namespace TenantManagementServiceBindings { export const Config = @@ -30,10 +31,6 @@ export const LEAD_TOKEN_VERIFIER = BindingKey.create< VerifyFunction.BearerFn >('sf.user.lead.verifier'); -export const PIPELINES = BindingKey.create>( - 'sf.tenant.pipelines', -); - /** * Binding key for the system user. */ @@ -73,3 +70,7 @@ export const WebhookNotificationService = BindingKey.create( 'sf.webhook.handler.notification.service', ); + +export const EventConnectorBinding = BindingKey.create< + IEventConnector +>('arc-saas.services.tenant-management.event-connector'); diff --git a/services/tenant-management-service/src/services/aws/codebuild-client.provider.ts b/services/tenant-management-service/src/services/aws/codebuild-client.provider.ts deleted file mode 100644 index 4944216..0000000 --- a/services/tenant-management-service/src/services/aws/codebuild-client.provider.ts +++ /dev/null @@ -1,10 +0,0 @@ -import {Provider} from '@loopback/core'; -import {CodeBuildClient} from '@aws-sdk/client-codebuild'; -/* The CodebuildClientProvider class is a provider for creating instances of the CodeBuildClient class. */ -export class CodebuildClientProvider implements Provider { - value() { - return new CodeBuildClient({ - region: process.env.AWS_REGION, - }); - } -} diff --git a/services/tenant-management-service/src/services/aws/codebuild.service.ts b/services/tenant-management-service/src/services/aws/codebuild.service.ts deleted file mode 100644 index 71f8b7d..0000000 --- a/services/tenant-management-service/src/services/aws/codebuild.service.ts +++ /dev/null @@ -1,56 +0,0 @@ -import {inject, injectable, BindingScope} from '@loopback/core'; -import {AWS_CODEBUILD_CLIENT} from './keys'; -import { - CodeBuildClient, - EnvironmentVariable, - StartBuildCommand, - StartBuildCommandInput, -} from '@aws-sdk/client-codebuild'; -import {AnyObject} from '@loopback/repository'; - -/** - * Service for handling AWS CodeBuild operations. - * This service is responsible for starting build processes using the AWS CodeBuild client. - */ -@injectable({scope: BindingScope.TRANSIENT}) -export class CodeBuildService { - /** - * Constructs a new instance of the CodeBuildService. - * @param {CodeBuildClient} codeBuildClient - The AWS CodeBuild client to use. - */ - constructor( - @inject(AWS_CODEBUILD_CLIENT) - private readonly codeBuildClient: CodeBuildClient, - ) {} - - /** - * The `startBuild` function starts a build process with the specified project name and environment - * variables. - * @param {string} type - The `type` parameter is a string that represents the project name for the - * build. - * @param {T} data - The `data` parameter is of type `T`, which extends `AnyObject`. It represents the - * data that will be used to override the environment variables for the build. - * @returns The `startBuild` function is returning a promise that resolves to the result of sending a - * `StartBuildCommand` using the `codeBuildClient`. - */ - async startBuild(type: string, data: T) { - const params: StartBuildCommandInput = { - projectName: type, - environmentVariablesOverride: this._buildEnvironment(data), - }; - const command = new StartBuildCommand(params); - return this.codeBuildClient.send(command); - } - - private _buildEnvironment( - data: T, - ): EnvironmentVariable[] { - return Object.keys(data).map(key => { - return { - name: key, - value: String(data[key]), - type: 'PLAINTEXT', - }; - }); - } -} diff --git a/services/tenant-management-service/src/services/aws/index.ts b/services/tenant-management-service/src/services/aws/index.ts deleted file mode 100644 index f1c9b30..0000000 --- a/services/tenant-management-service/src/services/aws/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './codebuild-client.provider'; -export * from './codebuild.service'; -export * from './keys'; diff --git a/services/tenant-management-service/src/services/aws/keys.ts b/services/tenant-management-service/src/services/aws/keys.ts deleted file mode 100644 index e2ddb55..0000000 --- a/services/tenant-management-service/src/services/aws/keys.ts +++ /dev/null @@ -1,5 +0,0 @@ -import {BindingKey} from '@loopback/core'; -import {CodeBuildClient} from '@aws-sdk/client-codebuild'; -export const AWS_CODEBUILD_CLIENT = BindingKey.create( - 'aws.codebuild.client', -); diff --git a/services/tenant-management-service/src/services/event-connector/event.connector.ts b/services/tenant-management-service/src/services/event-connector/event.connector.ts new file mode 100644 index 0000000..cde8552 --- /dev/null +++ b/services/tenant-management-service/src/services/event-connector/event.connector.ts @@ -0,0 +1,11 @@ +import {injectable, BindingScope} from '@loopback/core'; +import {IEventConnector} from '../../types/i-event-connector.interface'; + +@injectable({scope: BindingScope.TRANSIENT}) +export class EventConnector implements IEventConnector { + constructor() {} + + publish(event: unknown): Promise { + throw Error(`${EventConnector.name} not implemented.`); + } +} diff --git a/services/tenant-management-service/src/services/event-connector/index.ts b/services/tenant-management-service/src/services/event-connector/index.ts new file mode 100644 index 0000000..fe7b89b --- /dev/null +++ b/services/tenant-management-service/src/services/event-connector/index.ts @@ -0,0 +1,2 @@ +export * from './event.connector'; +export * from './types'; diff --git a/services/tenant-management-service/src/services/event-connector/types.ts b/services/tenant-management-service/src/services/event-connector/types.ts new file mode 100644 index 0000000..c4ab14c --- /dev/null +++ b/services/tenant-management-service/src/services/event-connector/types.ts @@ -0,0 +1,5 @@ +export enum EventTypes { + TENANT_PROVISIONING = 'TENANT_PROVISIONING', + TENANT_DEPROVISIONING = 'TENANT_DEPROVISIONING', + TENANT_PROVISIONING_SUCCESS = 'TENANT_PROVISIONING_SUCCESS', +} diff --git a/services/tenant-management-service/src/services/index.ts b/services/tenant-management-service/src/services/index.ts index 587861a..3c1dc5e 100644 --- a/services/tenant-management-service/src/services/index.ts +++ b/services/tenant-management-service/src/services/index.ts @@ -1,7 +1,7 @@ export * from './lead-authenticator.service'; export * from './onboarding.service'; export * from './crypto-helper.service'; -export * from './aws'; export * from './provisioning.service'; export * from './notifications'; export * from './invoice-pdf-generator.service'; +export * from './event-connector'; diff --git a/services/tenant-management-service/src/services/provisioning.service.ts b/services/tenant-management-service/src/services/provisioning.service.ts index d840926..cb1f2e2 100644 --- a/services/tenant-management-service/src/services/provisioning.service.ts +++ b/services/tenant-management-service/src/services/provisioning.service.ts @@ -1,14 +1,15 @@ import {repository} from '@loopback/repository'; import {SubscriptionDTO, TenantWithRelations} from '../models'; -import {CodeBuildService} from './aws'; import {CryptoHelperService} from './crypto-helper.service'; import {service, inject} from '@loopback/core'; import {TenantRepository, WebhookSecretRepository} from '../repositories'; import {HttpErrors} from '@loopback/rest'; -import {IPlanItem, IProvisioningService} from '../types'; +import {IProvisioningService} from '../types'; import {ILogger, LOGGER} from '@sourceloop/core'; -import {PlanTier, TenantStatus} from '../enums'; -import {PIPELINES} from '../keys'; +import {TenantStatus} from '../enums'; +import {EventConnectorBinding} from '../keys'; +import {EventConnector, EventTypes} from './event-connector'; +import {randomUUID} from 'crypto'; /** * Service for provisioning tenants. */ @@ -18,23 +19,21 @@ export class ProvisioningService /** * Constructs a new instance of the ProvisioningService. * @param cryptoHelperService - Service for cryptographic operations. - * @param codeBuildService - Service for AWS CodeBuild related operations. + * @param eventConnector - Event Connector provided by consumer to invoke publish on. * @param webhookSecretRepo - Repository for webhook secrets. * @param logger - Logger service for logging messages. */ constructor( @service(CryptoHelperService) private cryptoHelperService: CryptoHelperService, - @service(CodeBuildService) - private codeBuildService: CodeBuildService, + @inject(EventConnectorBinding) + private eventConnector: EventConnector, @repository(WebhookSecretRepository) private webhookSecretRepo: WebhookSecretRepository, @repository(TenantRepository) private tenantRepository: TenantRepository, @inject(LOGGER.LOGGER_INJECT) private logger: ILogger, - @inject(PIPELINES) - private pipelines: Record, ) {} /** * The `provisionTenant` function provisions a new tenant by generating a temporary token, retrieving @@ -42,88 +41,44 @@ export class ProvisioningService * webhook secret and build context to later verify the webhook callback. * @param {Tenant} tenant - The `tenant` parameter is an object that represents a tenant. It likely * contains information such as the tenant's ID, name, and other relevant details. - * @param {string} initiatorId - The `initiatorId` parameter is a string that represents the ID - * of the entity confirming the initiation of provisioning. + * @param {string} subscription - The `subscription` parameter is an object that contains + * the details of the subscription opted by the tenant. */ - async provisionTenant(tenant: TenantWithRelations, dto: T): Promise { + async provisionTenant( + tenant: TenantWithRelations, + subscription: T, + ): Promise { await this.tenantRepository.updateById(tenant.id, { status: TenantStatus.PROVISIONING, }); - if (!dto.id) { + if (!subscription.id) { throw HttpErrors.BadRequest('Subscription ID is required'); } const hmacSecret = this.cryptoHelperService.generateRandomString(32); - if (dto.plan?.tier === undefined) { - this.logger.error(`Tier not found in plan for subscription: ${dto.id}`); + if (subscription.plan?.tier === undefined) { + this.logger.error( + `Tier not found in plan for subscription: ${subscription.id}`, + ); throw new HttpErrors.InternalServerError(); } - if (!this.pipelines[dto.plan?.tier]) { - this.logger.error(`Pipeline not configured for tier: ${dto.plan?.tier}`); - throw new HttpErrors.InternalServerError(); - } - const firstName = tenant.contacts?.[0]?.firstName; - const lastName = tenant.contacts?.[0]?.lastName; - const startOutput = await this.codeBuildService.startBuild( - this.pipelines[dto.plan?.tier], - { - TENANT_ID: tenant.id, - SECRET: hmacSecret, - TENANT_NAME: this._sanitizeTenantName(tenant.name), - KEY: tenant.key, - TENANT_ADMIN_EMAIL: tenant.contacts?.[0]?.email, - USERNAME: tenant.key, - TENANT_DATA: JSON.stringify({ - name: tenant.name, - key: tenant.key, - address: { - country: tenant.address?.country, - state: tenant.address?.state, - city: tenant.address?.city, - zip: tenant.address?.zip, - address: tenant.address?.address, - }, - contact: { - firstName: firstName, - middleName: undefined, - lastName: lastName, - email: tenant.contacts?.[0]?.email, - // not accepting phone of contact as of now - // phone: tenant.contacts?.[0]?.phone, - }, - }), - ...this._buildEnvVars(dto.plan?.planItems ?? []), - }, - ); - if (!startOutput.build?.id) { - throw new HttpErrors.InternalServerError('Failed to start build'); - } + + await this.eventConnector.publish({ + type: EventTypes.TENANT_PROVISIONING, + tenant: tenant, + subscription: subscription, + }); + await this.webhookSecretRepo.set(tenant.id, { secret: hmacSecret, - context: startOutput.build.id, + context: randomUUID(), }); + await this.webhookSecretRepo.expire( tenant.id, +process.env.WEBHOOK_SECRET_EXPIRY!, ); } - - private _buildEnvVars(planItems: IPlanItem[]) { - const envVars: { - [key: IPlanItem['value']['name']]: IPlanItem['value']['value']; - } = {}; - planItems.forEach(item => { - envVars[item.value.name] = item.value.value; - }); - return envVars; - } - - private _sanitizeTenantName(name: string) { - return name - .trim() - .toLowerCase() - .replace(/[^a-zA-Z0-9 ]/, ''); - } } diff --git a/services/tenant-management-service/src/types/i-event-connector.interface.ts b/services/tenant-management-service/src/types/i-event-connector.interface.ts new file mode 100644 index 0000000..f91c6f3 --- /dev/null +++ b/services/tenant-management-service/src/types/i-event-connector.interface.ts @@ -0,0 +1,3 @@ +export interface IEventConnector { + publish(event: T): Promise; +}