@cdmbase/wiki-browser 12.0.18-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/lib/components/Logo.d.ts +4 -0
- package/lib/components/Logo.d.ts.map +1 -0
- package/lib/components/Logo.js +16 -0
- package/lib/components/Logo.js.map +1 -0
- package/lib/components/help/SidebarSearch.d.ts +8 -0
- package/lib/components/help/SidebarSearch.d.ts.map +1 -0
- package/lib/components/help/SidebarSearch.js +111 -0
- package/lib/components/help/SidebarSearch.js.map +1 -0
- package/lib/components/help/index.d.ts +2 -0
- package/lib/components/help/index.d.ts.map +1 -0
- package/lib/components/landing/FeatureCard.d.ts +13 -0
- package/lib/components/landing/FeatureCard.d.ts.map +1 -0
- package/lib/components/landing/FeatureCard.js +85 -0
- package/lib/components/landing/FeatureCard.js.map +1 -0
- package/lib/components/landing/QuickLinkCard.d.ts +8 -0
- package/lib/components/landing/QuickLinkCard.d.ts.map +1 -0
- package/lib/components/landing/QuickLinkCard.js +26 -0
- package/lib/components/landing/QuickLinkCard.js.map +1 -0
- package/lib/components/landing/SearchInput.d.ts +10 -0
- package/lib/components/landing/SearchInput.d.ts.map +1 -0
- package/lib/components/landing/SearchInput.js +223 -0
- package/lib/components/landing/SearchInput.js.map +1 -0
- package/lib/components/landing/index.d.ts +4 -0
- package/lib/components/landing/index.d.ts.map +1 -0
- package/lib/components/welcome.d.ts +3 -0
- package/lib/components/welcome.d.ts.map +1 -0
- package/lib/compute.d.ts +4 -0
- package/lib/compute.d.ts.map +1 -0
- package/lib/compute.js +96 -0
- package/lib/compute.js.map +1 -0
- package/lib/config/env-config.d.ts +4 -0
- package/lib/config/env-config.d.ts.map +1 -0
- package/lib/config/env-config.js +7 -0
- package/lib/config/env-config.js.map +1 -0
- package/lib/docs.config.d.ts +48 -0
- package/lib/docs.config.d.ts.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/loaders/search.d.ts +1 -0
- package/lib/loaders/search.d.ts.map +1 -0
- package/lib/module.d.ts +4 -0
- package/lib/module.d.ts.map +1 -0
- package/lib/module.js +11 -0
- package/lib/module.js.map +1 -0
- package/lib/pages/ArticlePage/ArticlePage.d.ts +4 -0
- package/lib/pages/ArticlePage/ArticlePage.d.ts.map +1 -0
- package/lib/pages/ArticlePage/ArticlePage.js +222 -0
- package/lib/pages/ArticlePage/ArticlePage.js.map +1 -0
- package/lib/pages/ArticlePage/index.d.ts +3 -0
- package/lib/pages/ArticlePage/index.d.ts.map +1 -0
- package/lib/pages/ArticlePage/index.js +3 -0
- package/lib/pages/ArticlePage/index.js.map +1 -0
- package/lib/pages/CategoryCollection/CategoryCollection.d.ts +4 -0
- package/lib/pages/CategoryCollection/CategoryCollection.d.ts.map +1 -0
- package/lib/pages/CategoryCollection/CategoryCollection.js +103 -0
- package/lib/pages/CategoryCollection/CategoryCollection.js.map +1 -0
- package/lib/pages/CategoryCollection/index.d.ts +3 -0
- package/lib/pages/CategoryCollection/index.d.ts.map +1 -0
- package/lib/pages/CategoryCollection/index.js +3 -0
- package/lib/pages/CategoryCollection/index.js.map +1 -0
- package/lib/pages/Help/HelpIndex.d.ts +4 -0
- package/lib/pages/Help/HelpIndex.d.ts.map +1 -0
- package/lib/pages/Help/HelpIndex.js +44 -0
- package/lib/pages/Help/HelpIndex.js.map +1 -0
- package/lib/pages/Help/index.d.ts +4 -0
- package/lib/pages/Help/index.d.ts.map +1 -0
- package/lib/pages/Help/index.js +226 -0
- package/lib/pages/Help/index.js.map +1 -0
- package/lib/pages/Landing/index.d.ts +3 -0
- package/lib/pages/Landing/index.d.ts.map +1 -0
- package/lib/pages/Landing/index.js +281 -0
- package/lib/pages/Landing/index.js.map +1 -0
- package/lib/routes.json +2533 -0
- package/lib/seo.d.ts +22 -0
- package/lib/seo.d.ts.map +1 -0
- package/lib/slot-fill/FooterFill.d.ts +3 -0
- package/lib/slot-fill/FooterFill.d.ts.map +1 -0
- package/lib/slot-fill/FooterFill.js +18 -0
- package/lib/slot-fill/FooterFill.js.map +1 -0
- package/lib/slot-fill/LogoFill.d.ts +5 -0
- package/lib/slot-fill/LogoFill.d.ts.map +1 -0
- package/lib/slot-fill/LogoFill.js +74 -0
- package/lib/slot-fill/LogoFill.js.map +1 -0
- package/lib/slot-fill/consts.d.ts +5 -0
- package/lib/slot-fill/consts.d.ts.map +1 -0
- package/lib/slot-fill/consts.js +1 -0
- package/lib/slot-fill/consts.js.map +1 -0
- package/lib/slot-fill/index.d.ts +4 -0
- package/lib/slot-fill/index.d.ts.map +1 -0
- package/lib/templates/assets/images/add-link-frontend.png +0 -0
- package/lib/templates/assets/images/add-package-backend.png +0 -0
- package/lib/templates/assets/images/add-to-backend-module.png +0 -0
- package/lib/templates/assets/images/add-upload-client-frontend.png +0 -0
- package/lib/templates/assets/images/additional-parameters.png +0 -0
- package/lib/templates/assets/images/aeh-implementation.png +0 -0
- package/lib/templates/assets/images/aeh-usage.png +0 -0
- package/lib/templates/assets/images/apollo-client/recommendation_cache_mgmt.png +0 -0
- package/lib/templates/assets/images/app-deploy-new-version/jenkins1.PNG +0 -0
- package/lib/templates/assets/images/app-deploy-new-version/jenkins2.PNG +0 -0
- package/lib/templates/assets/images/auth-wrapper-code.png +0 -0
- package/lib/templates/assets/images/cdebase.png +0 -0
- package/lib/templates/assets/images/cdm-locales-directory.png +0 -0
- package/lib/templates/assets/images/client-settings.png +0 -0
- package/lib/templates/assets/images/codegen_file_update.png +0 -0
- package/lib/templates/assets/images/configuration.png +0 -0
- package/lib/templates/assets/images/copy-plugin.png +0 -0
- package/lib/templates/assets/images/docusaurus.png +0 -0
- package/lib/templates/assets/images/error-link.png +0 -0
- package/lib/templates/assets/images/error-sample.png +0 -0
- package/lib/templates/assets/images/extension copy.png +0 -0
- package/lib/templates/assets/images/extension.png +0 -0
- package/lib/templates/assets/images/graphql/graphql-folder-backend.png +0 -0
- package/lib/templates/assets/images/graphql/graphql-folder-with-gql.png +0 -0
- package/lib/templates/assets/images/i18n-config.png +0 -0
- package/lib/templates/assets/images/image.png +0 -0
- package/lib/templates/assets/images/logo.svg +10 -0
- package/lib/templates/assets/images/logo1.svg +1 -0
- package/lib/templates/assets/images/modify-upload-false-server.png +0 -0
- package/lib/templates/assets/images/navigation-auth-enabled.png +0 -0
- package/lib/templates/assets/images/org-dashboard-navigation.png +0 -0
- package/lib/templates/assets/images/org-navigation.png +0 -0
- package/lib/templates/assets/images/preferences_graphql_type.png +0 -0
- package/lib/templates/assets/images/provider.png +0 -0
- package/lib/templates/assets/images/route-config.png +0 -0
- package/lib/templates/assets/images/service-accounts.png +0 -0
- package/lib/templates/assets/images/source-code/source-code-environments.png +0 -0
- package/lib/templates/assets/images/source-code/source-code-organization.png +0 -0
- package/lib/templates/assets/images/spin-clone-develop-deployment/jenkins-changes.png +0 -0
- package/lib/templates/assets/images/spin-clone-develop-deployment/lerna-changes.png +0 -0
- package/lib/templates/assets/images/spin-clone-develop-deployment/root-package-json-changes.png +0 -0
- package/lib/templates/assets/images/spin-clone-develop-deployment/values-dev-changes.png +0 -0
- package/lib/templates/assets/images/sso-mappers.png +0 -0
- package/lib/templates/assets/images/sso-picture-mapper.png +0 -0
- package/lib/templates/assets/images/sso-settings.png +0 -0
- package/lib/templates/assets/images/timesheet_apollo_cache.png +0 -0
- package/lib/templates/assets/images/timesheet_query.png +0 -0
- package/lib/templates/assets/images/tutorial/docsVersionDropdown.png +0 -0
- package/lib/templates/assets/images/tutorial/localeDropdown.png +0 -0
- package/lib/templates/assets/images/unauthenticated.png +0 -0
- package/lib/templates/assets/images/undraw_docusaurus_mountain.svg +170 -0
- package/lib/templates/assets/images/undraw_docusaurus_react.svg +169 -0
- package/lib/templates/assets/images/undraw_docusaurus_tree.svg +1 -0
- package/lib/templates/assets/images/vite-plugin-config.png +0 -0
- package/lib/templates/content/docs/Generators/Project/generate-fullproject.md +12 -0
- package/lib/templates/content/docs/LLM/Logger.llm.md +194 -0
- package/lib/templates/content/docs/LLM/backend-proxies-services-llm.md +2687 -0
- package/lib/templates/content/docs/LLM/backend-service-llm.md +3384 -0
- package/lib/templates/content/docs/LLM/db_migration_llm.md +954 -0
- package/lib/templates/content/docs/LLM/frontend/REMIX-15.3-upgrade-llm.md +1245 -0
- package/lib/templates/content/docs/LLM/inngest/INNGEST_FUNCTION_DEVELOPMENT_GUIDE_LLM.md +1241 -0
- package/lib/templates/content/docs/LLM/inngest/INNGEST_NAMESPACE_LLM.md +384 -0
- package/lib/templates/content/docs/LLM/llm_workflow_namespace.md +384 -0
- package/lib/templates/content/docs/LLM/organization-components-form-llm.md +1395 -0
- package/lib/templates/content/docs/LLM/page-component-llm.md +173 -0
- package/lib/templates/content/docs/LLM/preferences-settings-llm.md +2781 -0
- package/lib/templates/content/docs/LLM/tailwind-css-llm.md +502 -0
- package/lib/templates/content/docs/UI/SchemaBasedUI.md +334 -0
- package/lib/templates/content/docs/UI/SlotFillComponent.md +334 -0
- package/lib/templates/content/docs/adminide-modules/account/auth0-login.md +31 -0
- package/lib/templates/content/docs/adminide-modules/account/index.md +14 -0
- package/lib/templates/content/docs/adminide-modules/account/keycloak-remix-setup.md +86 -0
- package/lib/templates/content/docs/adminide-modules/account/remix-auth-setup.md +79 -0
- package/lib/templates/content/docs/adminide-modules/account/various-auth-qatest.md +157 -0
- package/lib/templates/content/docs/adminide-modules/api-builders/graphql.md +906 -0
- package/lib/templates/content/docs/adminide-modules/billing/payments/index.md +14 -0
- package/lib/templates/content/docs/adminide-modules/billing/payments/stripe/index.md +14 -0
- package/lib/templates/content/docs/adminide-modules/billing/payments/stripe/settingup-stripe-locally.md +25 -0
- package/lib/templates/content/docs/adminide-modules/billing/tier-config.md +293 -0
- package/lib/templates/content/docs/adminide-modules/connectors/Connector.md +207 -0
- package/lib/templates/content/docs/adminide-modules/file-upload/index.md +16 -0
- package/lib/templates/content/docs/adminide-modules/file-upload/setup.md +435 -0
- package/lib/templates/content/docs/adminide-modules/file-upload/upload-file-using-signed-url.md +161 -0
- package/lib/templates/content/docs/adminide-modules/preferences/AddAdditionalPermissions.md +151 -0
- package/lib/templates/content/docs/adminide-modules/preferences/Configuration.md +241 -0
- package/lib/templates/content/docs/adminide-modules/preferences/Policy-Configuration.md +61 -0
- package/lib/templates/content/docs/adminide-modules/preferences/UI-components/ResourceSettingsLoader.md +319 -0
- package/lib/templates/content/docs/adminide-modules/preferences/contribute_scope_target.md +280 -0
- package/lib/templates/content/docs/adminide-modules/preferences/generate-urii.md +94 -0
- package/lib/templates/content/docs/adminide-modules/preferences/index.md +28 -0
- package/lib/templates/content/docs/adminide-modules/preferences/machine-configuration.md +157 -0
- package/lib/templates/content/docs/adminide-modules/preferences/pageSettings/generateCdecodeUri.md +1289 -0
- package/lib/templates/content/docs/adminide-modules/preferences/pageSettings/migratingFromUseSettings.md +215 -0
- package/lib/templates/content/docs/adminide-modules/preferences/permissions/Roles-Permissions.md +72 -0
- package/lib/templates/content/docs/adminide-modules/preferences/permissions/settingUserPermissions.md +139 -0
- package/lib/templates/content/docs/adminide-modules/preferences/preference-dependency.md +138 -0
- package/lib/templates/content/docs/adminide-modules/preferences/route-based-configuration.md +41 -0
- package/lib/templates/content/docs/adminide-modules/preferences/schema-configuration.md +71 -0
- package/lib/templates/content/docs/adminide-modules/preferences/supported.md +24 -0
- package/lib/templates/content/docs/adminide-modules/preferences/useSettingsLoader.md +248 -0
- package/lib/templates/content/docs/adminide-modules/project-tools/auth-providers.md +1317 -0
- package/lib/templates/content/docs/adminide-modules/project-tools/keycloak-guide.md +543 -0
- package/lib/templates/content/docs/adminide-modules/project-tools/tenant-management/tenant-based-authentication.md +846 -0
- package/lib/templates/content/docs/adminide-modules/project-tools/tenant-management/tenant-management.md +708 -0
- package/lib/templates/content/docs/adminide-modules/project-tools/tenant-management/tenants.md +1117 -0
- package/lib/templates/content/docs/chrome-extension/index.md +14 -0
- package/lib/templates/content/docs/chrome-extension/setup.md +30 -0
- package/lib/templates/content/docs/contributing/adding-package.md +23 -0
- package/lib/templates/content/docs/contributing/adding_new_modules.md +99 -0
- package/lib/templates/content/docs/contributing/architecture-updates.md +19 -0
- package/lib/templates/content/docs/contributing/avoid-using-promises-ui.md +116 -0
- package/lib/templates/content/docs/contributing/coding-guidelines.md +111 -0
- package/lib/templates/content/docs/contributing/do-and-dont.md +42 -0
- package/lib/templates/content/docs/contributing/faq.md +22 -0
- package/lib/templates/content/docs/contributing/folder-setup/browser.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/config.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/containers-server.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/core.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/graphql.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/index.md +30 -0
- package/lib/templates/content/docs/contributing/folder-setup/module.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/server.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/services.md +12 -0
- package/lib/templates/content/docs/contributing/folder-setup/store.md +12 -0
- package/lib/templates/content/docs/contributing/frontend-coding.md +30 -0
- package/lib/templates/content/docs/contributing/git-subtree-sharing.md +73 -0
- package/lib/templates/content/docs/contributing/graphql-subscriptions.md +69 -0
- package/lib/templates/content/docs/contributing/how-to-contribute.md +30 -0
- package/lib/templates/content/docs/contributing/how_to_check_pure_esm.md +29 -0
- package/lib/templates/content/docs/contributing/index.md +60 -0
- package/lib/templates/content/docs/contributing/installation-issues.md +23 -0
- package/lib/templates/content/docs/contributing/keyboard-shortcut.md +131 -0
- package/lib/templates/content/docs/contributing/language/locale-support.md +12 -0
- package/lib/templates/content/docs/contributing/lerna-build-tools.md +516 -0
- package/lib/templates/content/docs/contributing/lerna-yarn-workspaces.md +95 -0
- package/lib/templates/content/docs/contributing/lint-and-formatter.md +20 -0
- package/lib/templates/content/docs/contributing/mobile-setup.md +16 -0
- package/lib/templates/content/docs/contributing/project-setup.md +233 -0
- package/lib/templates/content/docs/contributing/react/index.md +14 -0
- package/lib/templates/content/docs/contributing/react/lazy-component.md +70 -0
- package/lib/templates/content/docs/contributing/run-various-options.md +124 -0
- package/lib/templates/content/docs/contributing/schema-first-graphql-types.md +37 -0
- package/lib/templates/content/docs/contributing/source-code-organization.md +57 -0
- package/lib/templates/content/docs/contributing/staging-docker.md +88 -0
- package/lib/templates/content/docs/contributing/third-party/apollo-client-v3-tutorials.md +28 -0
- package/lib/templates/content/docs/contributing/third-party/index.md +18 -0
- package/lib/templates/content/docs/contributing/typescript-contribution.md +16 -0
- package/lib/templates/content/docs/devops/app-deploy-new-version.md +30 -0
- package/lib/templates/content/docs/devops/index.md +14 -0
- package/lib/templates/content/docs/devops/mobile-jenkins-build.md +40 -0
- package/lib/templates/content/docs/devops/versioning-the-project.md +128 -0
- package/lib/templates/content/docs/error-handler/application-error-handler.md +40 -0
- package/lib/templates/content/docs/error-handler/error-handling.md +26 -0
- package/lib/templates/content/docs/error-handler/index.md +16 -0
- package/lib/templates/content/docs/error-handler/logging-errors.md +14 -0
- package/lib/templates/content/docs/feature-api/copy-operation.md +427 -0
- package/lib/templates/content/docs/feature-api/feature-browser/assets.md +46 -0
- package/lib/templates/content/docs/feature-api/feature-browser/auth-permissions.md +12 -0
- package/lib/templates/content/docs/feature-api/feature-browser/feature.md +131 -0
- package/lib/templates/content/docs/feature-api/feature-browser/index.md +22 -0
- package/lib/templates/content/docs/feature-api/feature-browser/routes-menu.md +110 -0
- package/lib/templates/content/docs/feature-api/feature-browser/routing-convention.md +124 -0
- package/lib/templates/content/docs/feature-api/feature-browser/routing.md +338 -0
- package/lib/templates/content/docs/feature-api/feature-mobile/auth-permissions.md +20 -0
- package/lib/templates/content/docs/feature-api/feature-mobile/feature.md +130 -0
- package/lib/templates/content/docs/feature-api/feature-mobile/index.md +18 -0
- package/lib/templates/content/docs/feature-api/feature-mobile/navigation.md +187 -0
- package/lib/templates/content/docs/feature-api/feature-server/Scheduling.md +44 -0
- package/lib/templates/content/docs/feature-api/feature-server/dataloader.md +320 -0
- package/lib/templates/content/docs/feature-api/feature-server/dependency-injection.md +81 -0
- package/lib/templates/content/docs/feature-api/feature-server/feature.md +65 -0
- package/lib/templates/content/docs/feature-api/feature-server/generic-dataloader.md +135 -0
- package/lib/templates/content/docs/feature-api/feature-server/index.md +40 -0
- package/lib/templates/content/docs/feature-api/feature-server/migration.md +127 -0
- package/lib/templates/content/docs/feature-api/feature-server/mongo-model.md +72 -0
- package/lib/templates/content/docs/feature-api/feature-server/permissions.md +12 -0
- package/lib/templates/content/docs/feature-api/feature-server/policies.md +57 -0
- package/lib/templates/content/docs/feature-api/feature-server/preferences.md +57 -0
- package/lib/templates/content/docs/feature-api/feature-server/repositories.md +114 -0
- package/lib/templates/content/docs/feature-api/feature-server/resolvers.md +126 -0
- package/lib/templates/content/docs/feature-api/feature-server/rules.md +132 -0
- package/lib/templates/content/docs/feature-api/feature-server/schema.md +12 -0
- package/lib/templates/content/docs/feature-api/feature-server/services.md +102 -0
- package/lib/templates/content/docs/feature-api/feature-server/setup-resource-crud.md +359 -0
- package/lib/templates/content/docs/feature-api/index.md +18 -0
- package/lib/templates/content/docs/graphql/apolloClient-mutation.md +94 -0
- package/lib/templates/content/docs/graphql/index.md +14 -0
- package/lib/templates/content/docs/graphql/scalars.md +15 -0
- package/lib/templates/content/docs/help/index.md +14 -0
- package/lib/templates/content/docs/help/intro.md +16 -0
- package/lib/templates/content/docs/intl/ant-design-menu-translation.md +74 -0
- package/lib/templates/content/docs/intl/intl-namespace.md +129 -0
- package/lib/templates/content/docs/intl/vite-plugin-intl.md +87 -0
- package/lib/templates/content/docs/intl/webpack-plugin-intl.md +12 -0
- package/lib/templates/content/docs/intro.md +18 -0
- package/lib/templates/content/docs/knowledge/basic-fullstack.md +238 -0
- package/lib/templates/content/docs/mailing/index.md +14 -0
- package/lib/templates/content/docs/mailing/mailing-template.md +148 -0
- package/lib/templates/content/docs/mobile/App-navigation-generator.md +410 -0
- package/lib/templates/content/docs/mobile/MobileTestCases.md +264 -0
- package/lib/templates/content/docs/mobile/eas-profile-build.md +107 -0
- package/lib/templates/content/docs/mobile/expo-push-notification-setup.md +216 -0
- package/lib/templates/content/docs/mobile/index.md +14 -0
- package/lib/templates/content/docs/mobile/routes.md +83 -0
- package/lib/templates/content/docs/organization/adding-account-context.md +116 -0
- package/lib/templates/content/docs/organization/adding-org-mobile-navigation.md +22 -0
- package/lib/templates/content/docs/organization/adding-org-web-navigation.md +12 -0
- package/lib/templates/content/docs/organization/index.md +20 -0
- package/lib/templates/content/docs/organization/initialization.md +20 -0
- package/lib/templates/content/docs/organization/organization-resource-vs-resource.md +112 -0
- package/lib/templates/content/docs/remix/configuration/component-structure-best-practices.md +152 -0
- package/lib/templates/content/docs/remix/configuration/configurations.md +218 -0
- package/lib/templates/content/docs/remix/configuration/css-import-and-stylesheets.md +142 -0
- package/lib/templates/content/docs/remix/configuration/dont-subcomponent-network.md +166 -0
- package/lib/templates/content/docs/remix/configuration/generated-data-loaders.md +122 -0
- package/lib/templates/content/docs/remix/configuration/generated-resource-loaders.md +257 -0
- package/lib/templates/content/docs/remix/configuration/query-params-generator.md +216 -0
- package/lib/templates/content/docs/remix/configuration/routes-extra-icons.md +103 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-advanced.md +86 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-auth.md +113 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-best-practices.md +55 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-fields.md +79 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-graphql.md +79 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-index.md +112 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-loaders.md +165 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-middleware.md +196 -0
- package/lib/templates/content/docs/remix/configuration/routes-json-overview.md +53 -0
- package/lib/templates/content/docs/remix/data-loaders.md +43 -0
- package/lib/templates/content/docs/remix/devtools/remix-devtools.md +58 -0
- package/lib/templates/content/docs/remix/examples/changes-using-servercode.md +79 -0
- package/lib/templates/content/docs/remix/extra-icons.md +62 -0
- package/lib/templates/content/docs/remix/extra-links.md +65 -0
- package/lib/templates/content/docs/remix/generated-data-loaders.md +114 -0
- package/lib/templates/content/docs/remix/queryParamsGenerator.md +89 -0
- package/lib/templates/content/docs/remix/resources.md +16 -0
- package/lib/templates/content/docs/remix/styles.md +132 -0
- package/lib/templates/content/docs/remix/wiki.md +12 -0
- package/lib/templates/content/docs/security/auth-wrapper/auth-wrapper.md +24 -0
- package/lib/templates/content/docs/security/index.md +18 -0
- package/lib/templates/content/docs/security/secure-button-mobilenative.md +88 -0
- package/lib/templates/content/docs/security/secure-button-web.md +89 -0
- package/lib/templates/content/docs/server-side/account-customization.md +82 -0
- package/lib/templates/content/docs/server-side/apollo/caching.md +164 -0
- package/lib/templates/content/docs/server-side/backend-architecture/FINAL-DECISION.md +209 -0
- package/lib/templates/content/docs/server-side/backend-architecture/TRUE-FINAL-ARCHITECTURE.md +603 -0
- package/lib/templates/content/docs/server-side/backend-architecture/index1.md +0 -0
- package/lib/templates/content/docs/server-side/backend-coding.md +839 -0
- package/lib/templates/content/docs/server-side/e2b/manageing-template.md +197 -0
- package/lib/templates/content/docs/server-side/index.md +14 -0
- package/lib/templates/content/docs/server-side/inngest-functions-module.md +309 -0
- package/lib/templates/content/docs/server-side/listen-stripe-events.md +43 -0
- package/lib/templates/content/docs/server-side/slug-service.md +323 -0
- package/lib/templates/content/docs/tests/index.md +18 -0
- package/lib/templates/content/docs/tests/jest-test-debug-vscode.md +40 -0
- package/lib/templates/content/docs/tests/known-errors.md +116 -0
- package/lib/templates/content/docs/tests/service-test-template.md +118 -0
- package/lib/templates/content/docs/tests/test-setup.md +93 -0
- package/lib/templates/content/docs/xstate.md +23 -0
- package/lib/types.d.ts +37 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/utils/docsNavigation.d.ts +9 -0
- package/lib/utils/docsNavigation.d.ts.map +1 -0
- package/lib/utils/docsNavigation.js +37 -0
- package/lib/utils/docsNavigation.js.map +1 -0
- package/lib/utils/helpCenterUtils.d.ts +26 -0
- package/lib/utils/helpCenterUtils.d.ts.map +1 -0
- package/lib/utils/index.d.ts +3 -0
- package/lib/utils/index.d.ts.map +1 -0
- package/lib/utils/index.js +3 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/markdownLoader.d.ts +36 -0
- package/lib/utils/markdownLoader.d.ts.map +1 -0
- package/lib/utils/markdownLoader.js +2242 -0
- package/lib/utils/markdownLoader.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
# Tenant Management System - Complete Setup & Usage Guide
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
1. [Overview](#overview)
|
|
6
|
+
2. [Prerequisites](#prerequisites)
|
|
7
|
+
3. [Creating a Tenant](#creating-a-tenant)
|
|
8
|
+
4. [Understanding API Keys (Client Configurations)](#understanding-api-keys-client-configurations)
|
|
9
|
+
5. [Authentication & Usage](#authentication--usage)
|
|
10
|
+
6. [Managing Tenants](#managing-tenants)
|
|
11
|
+
7. [API Integration Examples](#api-integration-examples)
|
|
12
|
+
8. [Troubleshooting](#troubleshooting)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
|
|
18
|
+
The Tenant Management System provides **multi-tenancy support** for your application, allowing you to:
|
|
19
|
+
|
|
20
|
+
- Isolate resources per tenant
|
|
21
|
+
- Authenticate API requests using tenant-specific credentials
|
|
22
|
+
- Manage multiple API keys per tenant
|
|
23
|
+
- Track tenant status and configurations
|
|
24
|
+
- Associate tenants with organizations and projects
|
|
25
|
+
|
|
26
|
+
### Key Concepts
|
|
27
|
+
|
|
28
|
+
- **Tenant**: An isolated instance representing a client/customer in your system
|
|
29
|
+
- **Client Configurations (API Keys)**: Keycloak-based authentication credentials for accessing tenant resources
|
|
30
|
+
- **Project/Vault**: A logical grouping that tenants belong to (for resource management)
|
|
31
|
+
- **Environment Tag**: Deployment environment (development, staging, production)
|
|
32
|
+
- **Organization**: The owning organization of the tenant
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Prerequisites
|
|
37
|
+
|
|
38
|
+
Before creating a tenant, ensure you have the following set up:
|
|
39
|
+
|
|
40
|
+
### 1. **Organization**
|
|
41
|
+
|
|
42
|
+
Your tenant must belong to an organization.
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// Organizations are managed separately in the system
|
|
46
|
+
// Ensure you have an organization ID or slug available
|
|
47
|
+
const organizationSlug = 'my-company';
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 2. **Project (Vault)**
|
|
51
|
+
|
|
52
|
+
Projects provide logical grouping and resource isolation.
|
|
53
|
+
|
|
54
|
+
**Creating a Project:**
|
|
55
|
+
|
|
56
|
+
- Navigate to **Project Management** in your dashboard
|
|
57
|
+
- Click **"Create Project"**
|
|
58
|
+
- Provide:
|
|
59
|
+
- Project Name (e.g., "Production Services")
|
|
60
|
+
- Description
|
|
61
|
+
- Associated Organization
|
|
62
|
+
|
|
63
|
+
**Note:** The `vault` field in tenant creation maps to `project`. This is used for:
|
|
64
|
+
|
|
65
|
+
- Resource scoping
|
|
66
|
+
- Access control
|
|
67
|
+
- Billing/usage tracking
|
|
68
|
+
|
|
69
|
+
### 3. **Environment Tag**
|
|
70
|
+
|
|
71
|
+
Environment tags categorize deployments.
|
|
72
|
+
|
|
73
|
+
**Available Environments:**
|
|
74
|
+
|
|
75
|
+
- `development` - For dev/test environments
|
|
76
|
+
- `staging` - Pre-production testing
|
|
77
|
+
- `production` - Live production environment
|
|
78
|
+
|
|
79
|
+
**Creating Environment Tags:**
|
|
80
|
+
|
|
81
|
+
```graphql
|
|
82
|
+
# Environment tags are typically created during system setup
|
|
83
|
+
# Contact your system administrator if tags are missing
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 4. **Keycloak Configuration**
|
|
87
|
+
|
|
88
|
+
Ensure your Keycloak instance is configured:
|
|
89
|
+
|
|
90
|
+
- Keycloak server URL: `KEYCLOAK_SERVER_DOMAIN`
|
|
91
|
+
- Realm name: `KEYCLOAK_REALM`
|
|
92
|
+
- Admin credentials configured
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Creating a Tenant
|
|
97
|
+
|
|
98
|
+
### Via UI (Recommended)
|
|
99
|
+
|
|
100
|
+
1. **Navigate to Tenant Management**
|
|
101
|
+
- Go to `/{organizationSlug}/tenants`
|
|
102
|
+
- Click **"Create Tenant"** button
|
|
103
|
+
|
|
104
|
+
2. **Fill in Tenant Details**
|
|
105
|
+
|
|
106
|
+
| Field | Required | Description |
|
|
107
|
+
| ----------- | ----------- | ---------------------------------------------- |
|
|
108
|
+
| Name | ✅ Yes | Tenant display name (e.g., "Acme Corp API") |
|
|
109
|
+
| Description | ✅ Yes | Purpose or details about the tenant |
|
|
110
|
+
| Environment | ✅ Yes | Select development/staging/production |
|
|
111
|
+
| Project | ⚠️ Optional | Associate with a project for resource tracking |
|
|
112
|
+
| Auth Type | ✅ Yes | Authentication method (default: ClientSecret) |
|
|
113
|
+
|
|
114
|
+
3. **Add API Keys (Client Configurations)**
|
|
115
|
+
|
|
116
|
+
**⚠️ Important:** You must add at least one API key during creation.
|
|
117
|
+
|
|
118
|
+
Click **"Add Secret Key"** and provide:
|
|
119
|
+
- **Name**: Unique identifier (e.g., "PRODUCTION_API_KEY", "MOBILE_APP_KEY")
|
|
120
|
+
- **Description**: Optional note about key usage
|
|
121
|
+
|
|
122
|
+
You can add multiple keys for different applications/services.
|
|
123
|
+
|
|
124
|
+
4. **Submit**
|
|
125
|
+
- Click **"Create Tenant"**
|
|
126
|
+
- Status will initially be **"PENDING"**
|
|
127
|
+
- Keycloak clients are created asynchronously via Inngest workflow
|
|
128
|
+
- Status changes to **"ACTIVE"** once complete
|
|
129
|
+
|
|
130
|
+
### Via GraphQL API
|
|
131
|
+
|
|
132
|
+
```graphql
|
|
133
|
+
mutation CreateTenant($input: TenantInput!) {
|
|
134
|
+
createTenant(input: $input) {
|
|
135
|
+
tenant {
|
|
136
|
+
id
|
|
137
|
+
tenantId
|
|
138
|
+
name
|
|
139
|
+
status
|
|
140
|
+
clientConfigurations {
|
|
141
|
+
id
|
|
142
|
+
name
|
|
143
|
+
clientId
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
jobId
|
|
147
|
+
message
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Variables:**
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"input": {
|
|
157
|
+
"name": "Acme Corp Production",
|
|
158
|
+
"description": "Production API tenant for Acme Corp",
|
|
159
|
+
"organization": "my-company",
|
|
160
|
+
"vault": "64f3a1b2c9d8e7f6a5b4c3d2",
|
|
161
|
+
"environmentTag": "64a2b3c4d5e6f7g8h9i0j1k2",
|
|
162
|
+
"authType": "ClientSecret",
|
|
163
|
+
"clientConfigurations": [
|
|
164
|
+
{
|
|
165
|
+
"name": "WEB_APP_KEY",
|
|
166
|
+
"description": "API key for web application"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"name": "MOBILE_APP_KEY",
|
|
170
|
+
"description": "API key for mobile apps"
|
|
171
|
+
}
|
|
172
|
+
]
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### What Happens During Creation?
|
|
178
|
+
|
|
179
|
+
1. **Tenant Record Created**
|
|
180
|
+
- Stored in MongoDB with status `PENDING`
|
|
181
|
+
- Generates unique `tenantId` (UUID)
|
|
182
|
+
- Creates `appName` (slug version of name)
|
|
183
|
+
- Generates `connectionId` for internal tracking
|
|
184
|
+
|
|
185
|
+
2. **Keycloak Client Creation (Async)**
|
|
186
|
+
- Inngest workflow triggered: `TENANT_MGMT_CREATE_CLIENT_EVENT`
|
|
187
|
+
- For each `clientConfiguration`:
|
|
188
|
+
- Creates Keycloak confidential client
|
|
189
|
+
- Generates client credentials
|
|
190
|
+
- Stores `clientId` in tenant record
|
|
191
|
+
|
|
192
|
+
3. **Status Update**
|
|
193
|
+
- Changes to `ACTIVE` on success
|
|
194
|
+
- Changes to `ERROR` if creation fails (can be retried)
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Understanding API Keys (Client Configurations)
|
|
199
|
+
|
|
200
|
+
### What are Client Configurations?
|
|
201
|
+
|
|
202
|
+
Client Configurations are **Keycloak-based API keys** that authenticate requests to your tenant.
|
|
203
|
+
|
|
204
|
+
### Key Components
|
|
205
|
+
|
|
206
|
+
Each API key consists of:
|
|
207
|
+
|
|
208
|
+
| Component | Description | Example |
|
|
209
|
+
| ----------------- | -------------------------- | ------------------------------ |
|
|
210
|
+
| **Name** | Human-readable identifier | `PRODUCTION_API_KEY` |
|
|
211
|
+
| **Client ID** | Keycloak client identifier | `64f3a1b2-c9d8-e7f6-a5b4-c3d2` |
|
|
212
|
+
| **Client Secret** | Authentication password | `dGVzdHNlY3JldGZvcmF1dGg=` |
|
|
213
|
+
| **Created At** | Timestamp | `2025-11-11T08:00:00Z` |
|
|
214
|
+
|
|
215
|
+
### Secret Generation
|
|
216
|
+
|
|
217
|
+
Secrets are **deterministically generated** using:
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
generateSecretFromName(keyName, tenantId);
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Formula:
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
secret = SHA256(keyName + tenantId + SALT)
|
|
227
|
+
.toBase64()
|
|
228
|
+
.removeNonAlphanumeric()
|
|
229
|
+
.substring(0, 32)
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
This ensures:
|
|
233
|
+
|
|
234
|
+
- ✅ Reproducible (can be regenerated)
|
|
235
|
+
- ✅ Unique per tenant
|
|
236
|
+
- ✅ Keycloak-compatible (32 chars, alphanumeric)
|
|
237
|
+
|
|
238
|
+
### Viewing API Keys
|
|
239
|
+
|
|
240
|
+
**In UI:**
|
|
241
|
+
|
|
242
|
+
1. Go to Tenant Management
|
|
243
|
+
2. Click **"Actions" → "View Details"** on a tenant
|
|
244
|
+
3. Scroll to **"Secret API Keys"** section
|
|
245
|
+
4. Click **"Reveal"** to view the full secret
|
|
246
|
+
5. Click **"Copy"** to copy to clipboard
|
|
247
|
+
|
|
248
|
+
**Via GraphQL:**
|
|
249
|
+
|
|
250
|
+
```graphql
|
|
251
|
+
mutation RevealSecretKey($tenantId: ID!, $keyId: ID!) {
|
|
252
|
+
revealSecretKey(tenantId: $tenantId, keyId: $keyId)
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
**Response:**
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
"base64EncodedClientId:Secret"
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Managing API Keys
|
|
263
|
+
|
|
264
|
+
**Add New Key** (During Update):
|
|
265
|
+
|
|
266
|
+
```graphql
|
|
267
|
+
mutation UpdateTenant($id: ID!, $input: TenantUpdateInput!) {
|
|
268
|
+
updateTenant(id: $id, input: $input) {
|
|
269
|
+
id
|
|
270
|
+
clientConfigurations {
|
|
271
|
+
id
|
|
272
|
+
name
|
|
273
|
+
clientId
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**Revoke Key:**
|
|
280
|
+
|
|
281
|
+
```graphql
|
|
282
|
+
mutation RevokeSecretKey($tenantId: ID!, $keyId: ID!) {
|
|
283
|
+
revokeSecretKey(tenantId: $tenantId, keyId: $keyId)
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## Authentication & Usage
|
|
290
|
+
|
|
291
|
+
### How Tenant Authentication Works
|
|
292
|
+
|
|
293
|
+
The system uses **header-based authentication** validated against Keycloak.
|
|
294
|
+
|
|
295
|
+
#### Authentication Flow
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
┌─────────────┐
|
|
299
|
+
│ Client │
|
|
300
|
+
│ Application │
|
|
301
|
+
└──────┬──────┘
|
|
302
|
+
│ 1. Make API Request
|
|
303
|
+
│ Headers:
|
|
304
|
+
│ - x-tenant-id: {tenantId}
|
|
305
|
+
│ - x-tenant-key: {base64(clientId:secret)}
|
|
306
|
+
│
|
|
307
|
+
▼
|
|
308
|
+
┌──────────────────────────────────────┐
|
|
309
|
+
│ Middleware: cached-tenant-info │
|
|
310
|
+
│ │
|
|
311
|
+
│ 2. Extract Headers │
|
|
312
|
+
│ 3. Lookup Tenant in MongoDB │
|
|
313
|
+
│ 4. Validate with Keycloak │
|
|
314
|
+
│ - Verify clientId exists │
|
|
315
|
+
│ - Check credentials valid │
|
|
316
|
+
└──────┬───────────────────────────────┘
|
|
317
|
+
│
|
|
318
|
+
▼
|
|
319
|
+
┌─────────────────┐
|
|
320
|
+
│ Request Valid │◄─── Success (200)
|
|
321
|
+
│ Set req.tenant │
|
|
322
|
+
└─────────────────┘
|
|
323
|
+
|
|
324
|
+
│
|
|
325
|
+
▼
|
|
326
|
+
┌─────────────────┐
|
|
327
|
+
│ Unauthorized │◄─── Failure (401)
|
|
328
|
+
│ Error Response │
|
|
329
|
+
└─────────────────┘
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Implementation (Middleware)
|
|
333
|
+
|
|
334
|
+
Located in: `cached-tenant-info.middleware.ts`
|
|
335
|
+
|
|
336
|
+
**Key Functions:**
|
|
337
|
+
|
|
338
|
+
1. **Header Extraction**
|
|
339
|
+
|
|
340
|
+
```typescript
|
|
341
|
+
const tenantId = req.headers['x-tenant-id'];
|
|
342
|
+
const tenantKey = req.headers['x-tenant-key'];
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
2. **Tenant Lookup**
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
const tenantData = await TenantModel.findById(tenantId);
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
3. **Keycloak Validation**
|
|
352
|
+
|
|
353
|
+
```typescript
|
|
354
|
+
// Decode: clientId:secret
|
|
355
|
+
const [clientId, clientSecret] = Buffer.from(tenantKey, 'base64').toString('utf-8').split(':');
|
|
356
|
+
|
|
357
|
+
// Verify against Keycloak
|
|
358
|
+
const isValid = await keycloakAdminService.verifyClientCredentials(clientId, clientSecret);
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
4. **Authorization**
|
|
362
|
+
|
|
363
|
+
```typescript
|
|
364
|
+
if (isValid) {
|
|
365
|
+
req.tenant = tenantData; // Attach tenant to request
|
|
366
|
+
next();
|
|
367
|
+
} else {
|
|
368
|
+
res.status(401).json({ error: 'Invalid tenant credentials' });
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
## API Integration Examples
|
|
375
|
+
|
|
376
|
+
### Node.js / JavaScript
|
|
377
|
+
|
|
378
|
+
```javascript
|
|
379
|
+
const axios = require('axios');
|
|
380
|
+
|
|
381
|
+
// Your tenant credentials
|
|
382
|
+
const TENANT_ID = '64f3a1b2c9d8e7f6a5b4c3d2';
|
|
383
|
+
const CLIENT_ID = 'your-keycloak-client-id';
|
|
384
|
+
const CLIENT_SECRET = 'your-client-secret';
|
|
385
|
+
|
|
386
|
+
// Encode credentials
|
|
387
|
+
const tenantKey = Buffer.from(`${CLIENT_ID}:${CLIENT_SECRET}`).toString('base64');
|
|
388
|
+
|
|
389
|
+
// Make authenticated request
|
|
390
|
+
axios
|
|
391
|
+
.post(
|
|
392
|
+
'https://api.yourapp.com/graphql',
|
|
393
|
+
{
|
|
394
|
+
query: `
|
|
395
|
+
query GetData {
|
|
396
|
+
myData {
|
|
397
|
+
id
|
|
398
|
+
name
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
`,
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
headers: {
|
|
405
|
+
'x-tenant-id': TENANT_ID,
|
|
406
|
+
'x-tenant-key': tenantKey,
|
|
407
|
+
'Content-Type': 'application/json',
|
|
408
|
+
},
|
|
409
|
+
},
|
|
410
|
+
)
|
|
411
|
+
.then((response) => console.log(response.data))
|
|
412
|
+
.catch((error) => console.error(error));
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### cURL
|
|
416
|
+
|
|
417
|
+
```bash
|
|
418
|
+
# Your credentials
|
|
419
|
+
TENANT_ID="64f3a1b2c9d8e7f6a5b4c3d2"
|
|
420
|
+
CLIENT_ID="your-keycloak-client-id"
|
|
421
|
+
CLIENT_SECRET="your-client-secret"
|
|
422
|
+
|
|
423
|
+
# Encode credentials
|
|
424
|
+
TENANT_KEY=$(echo -n "${CLIENT_ID}:${CLIENT_SECRET}" | base64)
|
|
425
|
+
|
|
426
|
+
# Make request
|
|
427
|
+
curl -X POST https://api.yourapp.com/graphql \
|
|
428
|
+
-H "x-tenant-id: ${TENANT_ID}" \
|
|
429
|
+
-H "x-tenant-key: ${TENANT_KEY}" \
|
|
430
|
+
-H "Content-Type: application/json" \
|
|
431
|
+
-d '{
|
|
432
|
+
"query": "query GetData { myData { id name } }"
|
|
433
|
+
}'
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## Managing Tenants
|
|
439
|
+
|
|
440
|
+
### Viewing Tenants
|
|
441
|
+
|
|
442
|
+
**UI:**
|
|
443
|
+
|
|
444
|
+
- Navigate to `/{organizationSlug}/tenants`
|
|
445
|
+
- View list of all tenants with:
|
|
446
|
+
- Name, Description
|
|
447
|
+
- Environment
|
|
448
|
+
- Status (Pending, Active, Error)
|
|
449
|
+
- Created date
|
|
450
|
+
|
|
451
|
+
**GraphQL:**
|
|
452
|
+
|
|
453
|
+
```graphql
|
|
454
|
+
query GetTenants($orgName: String!) {
|
|
455
|
+
tenants(orgName: $orgName) {
|
|
456
|
+
id
|
|
457
|
+
tenantId
|
|
458
|
+
name
|
|
459
|
+
description
|
|
460
|
+
status
|
|
461
|
+
environmentTag {
|
|
462
|
+
name
|
|
463
|
+
}
|
|
464
|
+
clientConfigurations {
|
|
465
|
+
id
|
|
466
|
+
name
|
|
467
|
+
createdAt
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Updating Tenants
|
|
474
|
+
|
|
475
|
+
**UI:**
|
|
476
|
+
|
|
477
|
+
1. Click **"Actions" → "Edit"** on a tenant
|
|
478
|
+
2. Modify:
|
|
479
|
+
- Name
|
|
480
|
+
- Description
|
|
481
|
+
- Environment Tag
|
|
482
|
+
- Project
|
|
483
|
+
3. **Add new API keys** if needed
|
|
484
|
+
4. Click **"Update Tenant"**
|
|
485
|
+
|
|
486
|
+
**GraphQL:**
|
|
487
|
+
|
|
488
|
+
```graphql
|
|
489
|
+
mutation UpdateTenant($id: ID!, $input: TenantUpdateInput!) {
|
|
490
|
+
updateTenant(id: $id, input: $input) {
|
|
491
|
+
id
|
|
492
|
+
name
|
|
493
|
+
description
|
|
494
|
+
clientConfigurations {
|
|
495
|
+
id
|
|
496
|
+
name
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
**Variables:**
|
|
503
|
+
|
|
504
|
+
```json
|
|
505
|
+
{
|
|
506
|
+
"id": "6911f062534d4b0db1e1ced2",
|
|
507
|
+
"input": {
|
|
508
|
+
"name": "Updated Tenant Name",
|
|
509
|
+
"description": "New description",
|
|
510
|
+
"clientConfigurations": [
|
|
511
|
+
{
|
|
512
|
+
"name": "NEW_API_KEY",
|
|
513
|
+
"description": "Additional key for new service"
|
|
514
|
+
}
|
|
515
|
+
]
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
**⚠️ Note:** Existing API keys are preserved. New keys are appended.
|
|
521
|
+
|
|
522
|
+
### Deleting Tenants
|
|
523
|
+
|
|
524
|
+
**UI:**
|
|
525
|
+
|
|
526
|
+
- Click **"Actions" → "Delete"** on a tenant
|
|
527
|
+
- Confirm deletion
|
|
528
|
+
- This will:
|
|
529
|
+
- Delete tenant record
|
|
530
|
+
- Trigger Keycloak client cleanup (async)
|
|
531
|
+
|
|
532
|
+
**GraphQL:**
|
|
533
|
+
|
|
534
|
+
```graphql
|
|
535
|
+
mutation DeleteTenant($id: ID!) {
|
|
536
|
+
deleteTenant(id: $id)
|
|
537
|
+
}
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
### Retry Failed Creation
|
|
541
|
+
|
|
542
|
+
If tenant creation fails (status: `ERROR`):
|
|
543
|
+
|
|
544
|
+
**UI:**
|
|
545
|
+
|
|
546
|
+
- Click **"Actions" → "Retry Creation"**
|
|
547
|
+
|
|
548
|
+
**GraphQL:**
|
|
549
|
+
|
|
550
|
+
```graphql
|
|
551
|
+
mutation RetryTenantCreation($tenantId: ID!) {
|
|
552
|
+
retryTenantCreation(tenantId: $tenantId)
|
|
553
|
+
}
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
---
|
|
557
|
+
|
|
558
|
+
## Troubleshooting
|
|
559
|
+
|
|
560
|
+
### Common Issues
|
|
561
|
+
|
|
562
|
+
#### 1. **"Tenant with ID not found"**
|
|
563
|
+
|
|
564
|
+
**Cause:** Passing MongoDB `_id` instead of `tenantId`
|
|
565
|
+
|
|
566
|
+
**Solution:** Always use the `tenantId` field (UUID format):
|
|
567
|
+
|
|
568
|
+
```typescript
|
|
569
|
+
// ✅ Correct
|
|
570
|
+
const id = tenant.tenantId; // "6911f062-534d-4b0d-b1e1-ced2..."
|
|
571
|
+
|
|
572
|
+
// ❌ Wrong
|
|
573
|
+
const id = tenant.id; // MongoDB ObjectId
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
#### 2. **"Invalid tenant credentials" (401)**
|
|
577
|
+
|
|
578
|
+
**Causes:**
|
|
579
|
+
|
|
580
|
+
- Incorrect `x-tenant-key` encoding
|
|
581
|
+
- Using MongoDB ID instead of `tenantId`
|
|
582
|
+
- Client doesn't exist in Keycloak
|
|
583
|
+
- Client secret is wrong
|
|
584
|
+
|
|
585
|
+
**Debug Steps:**
|
|
586
|
+
|
|
587
|
+
```javascript
|
|
588
|
+
// 1. Check encoding
|
|
589
|
+
const decoded = Buffer.from(tenantKey, 'base64').toString();
|
|
590
|
+
console.log('Decoded:', decoded); // Should be "clientId:secret"
|
|
591
|
+
|
|
592
|
+
// 2. Verify clientId exists
|
|
593
|
+
// Check in Keycloak admin console or reveal key in UI
|
|
594
|
+
|
|
595
|
+
// 3. Test credentials
|
|
596
|
+
// Use "Reveal" in UI to get correct credentials
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
#### 3. **Tenant Status Stuck on "PENDING"**
|
|
600
|
+
|
|
601
|
+
**Causes:**
|
|
602
|
+
|
|
603
|
+
- Inngest workflow not running
|
|
604
|
+
- Keycloak connection failed
|
|
605
|
+
- Network issues
|
|
606
|
+
|
|
607
|
+
**Resolution:**
|
|
608
|
+
|
|
609
|
+
1. Check Inngest dashboard for failed jobs
|
|
610
|
+
2. Verify Keycloak is accessible
|
|
611
|
+
3. Check server logs for errors
|
|
612
|
+
4. Use **"Retry Creation"** if needed
|
|
613
|
+
|
|
614
|
+
#### 4. **"At least one secret API key is required"**
|
|
615
|
+
|
|
616
|
+
**Cause:** Trying to create tenant without API keys
|
|
617
|
+
|
|
618
|
+
**Solution:** Add at least one client configuration:
|
|
619
|
+
|
|
620
|
+
```json
|
|
621
|
+
{
|
|
622
|
+
"clientConfigurations": [
|
|
623
|
+
{
|
|
624
|
+
"name": "DEFAULT_KEY",
|
|
625
|
+
"description": "Primary API key"
|
|
626
|
+
}
|
|
627
|
+
]
|
|
628
|
+
}
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
#### 5. **Environment Tag Not Found**
|
|
632
|
+
|
|
633
|
+
**Cause:** Invalid or missing environment tag ID
|
|
634
|
+
|
|
635
|
+
**Solution:**
|
|
636
|
+
|
|
637
|
+
1. Fetch available tags:
|
|
638
|
+
|
|
639
|
+
```graphql
|
|
640
|
+
query GetEnvironmentTags($projectId: ID!) {
|
|
641
|
+
getEnvironmentTags(projectId: $projectId) {
|
|
642
|
+
id
|
|
643
|
+
name
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
2. Use a valid tag ID in tenant creation
|
|
649
|
+
|
|
650
|
+
---
|
|
651
|
+
|
|
652
|
+
## Best Practices
|
|
653
|
+
|
|
654
|
+
### Security
|
|
655
|
+
|
|
656
|
+
1. **Never expose client secrets in frontend code**
|
|
657
|
+
- Store in backend environment variables
|
|
658
|
+
- Use server-to-server communication
|
|
659
|
+
|
|
660
|
+
2. **Rotate API keys regularly**
|
|
661
|
+
- Add new key
|
|
662
|
+
- Update services to use new key
|
|
663
|
+
- Revoke old key
|
|
664
|
+
|
|
665
|
+
3. **Use separate keys per service**
|
|
666
|
+
- Easier to track usage
|
|
667
|
+
- Limit blast radius if compromised
|
|
668
|
+
|
|
669
|
+
### Organization
|
|
670
|
+
|
|
671
|
+
1. **Use descriptive names**
|
|
672
|
+
|
|
673
|
+
```
|
|
674
|
+
✅ "PRODUCTION_WEB_APP"
|
|
675
|
+
✅ "STAGING_MOBILE_IOS"
|
|
676
|
+
❌ "key1"
|
|
677
|
+
❌ "test"
|
|
678
|
+
```
|
|
679
|
+
|
|
680
|
+
2. **Match environment to usage**
|
|
681
|
+
- Don't use production tenants in development
|
|
682
|
+
- Create separate tenants per environment
|
|
683
|
+
|
|
684
|
+
3. **Associate with projects**
|
|
685
|
+
- Helps with resource tracking
|
|
686
|
+
- Enables better access control
|
|
687
|
+
|
|
688
|
+
---
|
|
689
|
+
|
|
690
|
+
## Additional Resources
|
|
691
|
+
|
|
692
|
+
- **GraphQL API Documentation**: `/graphql` (GraphiQL interface)
|
|
693
|
+
- **Keycloak Admin Console**: Check configured clients
|
|
694
|
+
- **Inngest Dashboard**: Monitor tenant creation jobs
|
|
695
|
+
- **Server Logs**: Check for detailed error messages
|
|
696
|
+
|
|
697
|
+
---
|
|
698
|
+
|
|
699
|
+
## Support
|
|
700
|
+
|
|
701
|
+
For issues or questions:
|
|
702
|
+
|
|
703
|
+
1. Check this documentation
|
|
704
|
+
2. Review server logs
|
|
705
|
+
3. Contact your system administrator
|
|
706
|
+
4. Check Keycloak and Inngest status
|
|
707
|
+
|
|
708
|
+
---
|