@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,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Repositories
|
|
4
|
+
description: Repositories
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Repositories...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Repositories
|
|
13
|
+
|
|
14
|
+
Repositories are classes or components that encapsulate the logic required to access data sources. They centralize common data access functionality, providing better
|
|
15
|
+
maintainability and decoupling the infrastructure or technology used to access databases from the domain model layer. If you use an Object-Document Mapper (ODM) like
|
|
16
|
+
Mongoose, the code required to query or manipulate the documents is simplified. This lets you focus on the data persistence logic rather than on data access plumbing.
|
|
17
|
+
|
|
18
|
+
For every document in our app, we'll have a respective repository against that document. Document shouldn't be fetched directly without `Repository` doing
|
|
19
|
+
this will be considered `Anti Pattren` and should be avoided. All use cases related to how the app will `fetch` `manipulate` and `process`a document
|
|
20
|
+
should reside inside the `Repository` of that respective document.
|
|
21
|
+
|
|
22
|
+
All basic database operations which we normally need to perform on a `Document` like the basic CRUD operations are already defined inside the `BaseRepository` class.
|
|
23
|
+
So you need to re-write the basic stuff and focus more on advance stuff. Each repository should extend the `BaseRepository` so it can
|
|
24
|
+
benefit from all these pre cooked methods.
|
|
25
|
+
|
|
26
|
+
The methods provided by `BaseRepositiry` are following
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
export interface IBaseRepository<T, D = Document<T>> {
|
|
30
|
+
// Returns the total document count which fullfils the provided condition
|
|
31
|
+
count(conditions?: FilterQuery<D>): Promise<number>;
|
|
32
|
+
|
|
33
|
+
// Returns the list of documents which fullfils the provided condition (if any)
|
|
34
|
+
// Provides out of box paginaytion using `limit` and `skip` params
|
|
35
|
+
// sort attribute can be used to get sorted results
|
|
36
|
+
// selected fields takes a comma serperated strinh of fields name to be returned.
|
|
37
|
+
getAll(options: GetAllArgs<D>): Promise<T[]>;
|
|
38
|
+
|
|
39
|
+
// Returns single document
|
|
40
|
+
get(conditions?: FilterQuery<D>, selectedFields?: string): Promise<T>;
|
|
41
|
+
|
|
42
|
+
// Creates new document
|
|
43
|
+
create<I>(data: I): Promise<T>;
|
|
44
|
+
|
|
45
|
+
// Create/Update (If already exists) new document
|
|
46
|
+
upsert<I>(conditions: FilterQuery<D>, update: I, options: any): Promise<T>;
|
|
47
|
+
|
|
48
|
+
// Update existing document
|
|
49
|
+
update<I>(criteria: FilterQuery<D>, update: UpdateQuery<D>, options?: any): Promise<T>;
|
|
50
|
+
|
|
51
|
+
// Update all docuemnts which matches the provdied conditions
|
|
52
|
+
bulkUpdate<I>(criteria: FilterQuery<D>, update: UpdateQuery<D>, options?: any): Promise<T[]>;
|
|
53
|
+
|
|
54
|
+
delete(criteria: FilterQuery<D>): Promise<boolean>;
|
|
55
|
+
|
|
56
|
+
// Bulk Create provided documents
|
|
57
|
+
bulkCreate<I>(data: I[]): Promise<T[]>;
|
|
58
|
+
|
|
59
|
+
// Delete all documets which matches the criteria
|
|
60
|
+
bulkDelete(criteria: FilterQuery<D>): Promise<number>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export enum ISortEnum {
|
|
64
|
+
Asc = 'ASC',
|
|
65
|
+
Desc = 'DESC',
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type ISort = {
|
|
69
|
+
key: Scalars['String'];
|
|
70
|
+
value: ISortEnum;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export interface GetAllArgs<T> {
|
|
74
|
+
criteria?: FilterQuery<T>;
|
|
75
|
+
sort?: ISort;
|
|
76
|
+
skip?: number;
|
|
77
|
+
limit?: number;
|
|
78
|
+
selectedFields?: string;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Example
|
|
83
|
+
|
|
84
|
+
If you have a document named `User` you should define both `Repository` class and interface against it like the following
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
export type IUserRepository = IBaseRepository<IUser>;
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import { BaseRepository, IMongoOptions } from '@common-stack/store-mongo';
|
|
92
|
+
import { inject, injectable, optional } from 'inversify';
|
|
93
|
+
import { Connection } from 'mongoose';
|
|
94
|
+
import { logger as Logger } from '@cdm-logger/server/lib/logger';
|
|
95
|
+
import { UserModelFunc } from '../models';
|
|
96
|
+
|
|
97
|
+
@injectable()
|
|
98
|
+
export class UserRepository extends BaseRepository<IUser> implements IUserRepository {
|
|
99
|
+
constructor(
|
|
100
|
+
@inject('MongoDBConnection')
|
|
101
|
+
db: Connection,
|
|
102
|
+
@inject('Logger')
|
|
103
|
+
logger: typeof Logger,
|
|
104
|
+
@inject('IMongoOptions')
|
|
105
|
+
@optional()
|
|
106
|
+
options?: IMongoOptions,
|
|
107
|
+
) {
|
|
108
|
+
super(UserModelFunc, db, logger, options);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
After creating the `Repository` class, the next step is to register it with the [Dependency Injection](dependency-injection) so It can be injected easily everywhere in the app.
|
|
114
|
+
After creating repository, the next step is to add [Service](services)
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Resolvers
|
|
4
|
+
description: Resolvers
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Resolvers...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Resolvers
|
|
13
|
+
|
|
14
|
+
GraphQL Server needs to know how to populate data for every field in your schema so that it can respond to requests for
|
|
15
|
+
that data.
|
|
16
|
+
To accomplish this, it uses resolvers.
|
|
17
|
+
|
|
18
|
+
_A resolver is a function that's responsible for populating the data for a single field in your schema_. It can populate
|
|
19
|
+
that data
|
|
20
|
+
in any way you define, such as by fetching data from a back-end database or a third-party API. A resolver is the key
|
|
21
|
+
architectural component that connects GraphQL fields, graph edges, queries, mutations, and subscriptions to their
|
|
22
|
+
respective data sources and micro-services. Read more about
|
|
23
|
+
resolvers [here](https://www.apollographql.com/docs/apollo-server/data/resolvers/)
|
|
24
|
+
|
|
25
|
+
> If you don't define a resolver for a particular field, Apollo Server automatically defines
|
|
26
|
+
> a [default resolver](https://www.apollographql.com/docs/apollo-server/data/resolvers/#default-resolvers) for it.
|
|
27
|
+
|
|
28
|
+
We use `Schema First` approach which requires us to define GraphQL schema before we write any code for it. So in order to
|
|
29
|
+
create new GraphQL types, query or mutation, you need to add them to Schema. Create your schema file under `graphql/schema/<file-name.gql`
|
|
30
|
+
|
|
31
|
+
```graphql
|
|
32
|
+
|
|
33
|
+
type User{}
|
|
34
|
+
type Users{
|
|
35
|
+
totalCount: Int!,
|
|
36
|
+
data: [User!]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
input CreateInput{}
|
|
40
|
+
input UpdateUserInput{}
|
|
41
|
+
|
|
42
|
+
extend type Query{
|
|
43
|
+
# ... existing queries
|
|
44
|
+
user(id:ID!): UserModel!
|
|
45
|
+
users(id:ID!): UserPageModel!
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
extend type Mutation{
|
|
49
|
+
createUser(user:CreateUserInput!): UserModel!
|
|
50
|
+
updateUser(id:ID!, user: UpdateUserInput!): UserModel!
|
|
51
|
+
deleteUser(id:ID!): Boolean!
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Everytime you make change to GraphQL schema, we need to re generate typescript definitions using the following command
|
|
56
|
+
|
|
57
|
+
```shell
|
|
58
|
+
npm run generateGraphql
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Next, let's add resolver implementation, by convention the all resolver definitions resides under `graphql/resolvers`.
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
// graphql/resovlers/user-resolver.ts
|
|
65
|
+
|
|
66
|
+
export const userResolver = (): IResolvers<IContext> => ({
|
|
67
|
+
User: {
|
|
68
|
+
// # Nested resolvers for relations
|
|
69
|
+
async posts(user, _, args, { postService }) {
|
|
70
|
+
const { data, totalCount } = await userService.getAllWithCount({
|
|
71
|
+
...args,
|
|
72
|
+
criteria: {
|
|
73
|
+
...args.criteria,
|
|
74
|
+
user: user.id,
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
totalCount,
|
|
79
|
+
data,
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
Query: {
|
|
84
|
+
async users(_, args, { userService }) {
|
|
85
|
+
const { data, totalCount } = await userService.getAllWithCount(args);
|
|
86
|
+
return {
|
|
87
|
+
totalCount,
|
|
88
|
+
data,
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
user(_, { id }, { userService }) {
|
|
92
|
+
return userService.get(id);
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
Mutation: {
|
|
96
|
+
createUser(_, { user }, { userService }) {
|
|
97
|
+
return userService.create(user);
|
|
98
|
+
},
|
|
99
|
+
updateUser(_, { id, user }, { userService }) {
|
|
100
|
+
return userService.update(id, user, false);
|
|
101
|
+
},
|
|
102
|
+
deleteUser(_, { id }, { userService }) {
|
|
103
|
+
return userService.delete(id);
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
<blockquote>
|
|
110
|
+
Note:
|
|
111
|
+
In order to use any service in the resolver first, you need to register your service in
|
|
112
|
+
the [GraphQL context](https://the-guild.dev/graphql/modules/docs/essentials/context).
|
|
113
|
+
Add it under `createServiceFunc` of [Feature](feature.md) API. If it does not already exist create one.
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
const createServiceFunc = (container: interfaces.Container): IService => ({
|
|
117
|
+
userService: container.get<IUserService>(TYPES.UserService),
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
export default new Feature({
|
|
121
|
+
// rest of the configutations
|
|
122
|
+
createServiceFunc,
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
</blockquote>
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Rules
|
|
4
|
+
description: Rules
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Rules...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Rules
|
|
13
|
+
|
|
14
|
+
Rules represents what GraphQL operations can be performed by the requested user. Rules are generated by two simple steps, defining resource access and
|
|
15
|
+
then mapping those resource access to respective GraphQL operations.
|
|
16
|
+
|
|
17
|
+
- Control who can access what, we are using users's permission together with the [CASL](https://casl.js.org/v6/en) to define their abilities to manage specific resource
|
|
18
|
+
- Whether Graphql request can be performed or not [GraphQL Shield](https://the-guild.dev/graphql/shield)
|
|
19
|
+
|
|
20
|
+
## Access Control
|
|
21
|
+
|
|
22
|
+
We use User's [Permissions](permissions.md) to evaluate what he/she can or can't access. By convention we have 4 types
|
|
23
|
+
of permissions
|
|
24
|
+
|
|
25
|
+
- Mange (Can perform complete CRUD)
|
|
26
|
+
- View
|
|
27
|
+
- Edit
|
|
28
|
+
- Delete
|
|
29
|
+
|
|
30
|
+
So we need to map each of them with the cas ability, how its done is using a simple function which takes permission
|
|
31
|
+
as `param` and define
|
|
32
|
+
abilities for the users using its permissions.
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
import { AbilityBuilder, Ability } from '@casl/ability';
|
|
36
|
+
import { IModule, IPermissionType, IPermissionTypes, IPreDefinePermissions } from '@adminide-stack/core';
|
|
37
|
+
import { get } from 'lodash';
|
|
38
|
+
|
|
39
|
+
export function defineAbilityFor(permissions: Record<string, any>) {
|
|
40
|
+
const { can, build } = new AbilityBuilder(Ability);
|
|
41
|
+
|
|
42
|
+
/***
|
|
43
|
+
* IPreDefinePermissions = {
|
|
44
|
+
* manageResource: 'module.resource.manage'
|
|
45
|
+
* viewResource: 'module.resource.view',
|
|
46
|
+
* editResource: 'module.resource.edit',
|
|
47
|
+
* deleteResource: 'module.resource.delete'
|
|
48
|
+
* }
|
|
49
|
+
*/
|
|
50
|
+
const canManageResource = get(permissions, IPreDefinePermissions.manageResource) === IPermissionType.Allow;
|
|
51
|
+
const canViewResource = get(permissions, IPreDefinePermissions.viewResource) === IPermissionType.Allow;
|
|
52
|
+
const canEditResource = get(permissions, IPreDefinePermissions.editResource) === IPermissionType.Allow;
|
|
53
|
+
const canDeleteResource = get(permissions, IPreDefinePermissions.deleteResource) === IPermissionType.Allow;
|
|
54
|
+
|
|
55
|
+
if (canManageResource) {
|
|
56
|
+
can(IPermissionTypes.manage, IModule.Resource);
|
|
57
|
+
can(IPermissionTypes.view, IModule.Resource);
|
|
58
|
+
can(IPermissionTypes.delete, IModule.Resource);
|
|
59
|
+
can(IPermissionTypes.edit, IModule.Resource);
|
|
60
|
+
}
|
|
61
|
+
if (canViewResource) {
|
|
62
|
+
can(IPermissionTypes.view, IModule.Resource);
|
|
63
|
+
}
|
|
64
|
+
if (canEditResource) {
|
|
65
|
+
can(IPermissionTypes.edit, IModule.Resource);
|
|
66
|
+
}
|
|
67
|
+
if (canDeleteResource) {
|
|
68
|
+
can(IPermissionTypes.delete, IModule.Resource);
|
|
69
|
+
}
|
|
70
|
+
return build();
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## GraphQL Shield
|
|
75
|
+
|
|
76
|
+
Once we have abilities in place next step is to use them with the Graphql operations, this is
|
|
77
|
+
where [GraphQL Shield](https://the-guild.dev/graphql/shield) comes in.
|
|
78
|
+
It lets you defined one to one mapping with the GraphQL operations you have, a simple resolver function which will then
|
|
79
|
+
determine whether this operation can be
|
|
80
|
+
performed or not
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { rule } from 'graphql-shield';
|
|
84
|
+
import { getPermissionsFromContext } from '@adminide-stack/platform-server';
|
|
85
|
+
// This if the function we've just defined above
|
|
86
|
+
import { defineAbilityFor } from '../ability';
|
|
87
|
+
|
|
88
|
+
const options = { cache: 'contextual' };
|
|
89
|
+
const rules = {
|
|
90
|
+
Query: {
|
|
91
|
+
getResource: rule(options)(async (parent, args, ctx) => {
|
|
92
|
+
const permissions = await getPermissionsFromContext(ctx);
|
|
93
|
+
return defineAbilityFor(permissions).can(IPermissionTypes.view, IModule.Resource);
|
|
94
|
+
}),
|
|
95
|
+
getResources: rule(options)(async (parent, args, ctx) => {
|
|
96
|
+
const permissions = await getPermissionsFromContext(ctx);
|
|
97
|
+
return defineAbilityFor(permissions).can(IPermissionTypes.view, IModule.Resource);
|
|
98
|
+
}),
|
|
99
|
+
},
|
|
100
|
+
Mutation: {
|
|
101
|
+
createResource: rule(options)(async (parent, args, ctx) => {
|
|
102
|
+
const permissions = await getPermissionsFromContext(ctx);
|
|
103
|
+
return defineAbilityFor(permissions).can(IPermissionTypes.create, IModule.Resource);
|
|
104
|
+
}),
|
|
105
|
+
updateResource: rule(options)(async (parent, args, ctx) => {
|
|
106
|
+
const permissions = await getPermissionsFromContext(ctx);
|
|
107
|
+
return defineAbilityFor(permissions).can(IPermissionTypes.edit, IModule.Resource);
|
|
108
|
+
}),
|
|
109
|
+
delete: rule(options)(async (parent, args, ctx) => {
|
|
110
|
+
const permissions = await getPermissionsFromContext(ctx);
|
|
111
|
+
return defineAbilityFor(permissions).can(IPermissionTypes.delete, IModule.Resource);
|
|
112
|
+
}),
|
|
113
|
+
},
|
|
114
|
+
Resource: {
|
|
115
|
+
nestedResource: rule(options)(async (parent, args, ctx) => {
|
|
116
|
+
const permissions = await getPermissionsFromContext(ctx);
|
|
117
|
+
return defineAbilityFor(permissions).can(IPermissionTypes.view, IModule.NestedResource);
|
|
118
|
+
}),
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Once we have the rules object in place, the last step is to export it and pass it on to the `Feature API`
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
import { rules } from './rules';
|
|
127
|
+
|
|
128
|
+
export default new Feature({
|
|
129
|
+
// rest of the config
|
|
130
|
+
rules,
|
|
131
|
+
});
|
|
132
|
+
```
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
meta:
|
|
3
|
+
title: Service
|
|
4
|
+
description: Service
|
|
5
|
+
date: '2023-06-02T00:00:00'
|
|
6
|
+
updated: '2024-06-02T00:00:00'
|
|
7
|
+
excerpt: Service...
|
|
8
|
+
headers:
|
|
9
|
+
Cache-Control: no-cache
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Service
|
|
13
|
+
|
|
14
|
+
Services are top level business logic tier encapsulating business logic. A services performs business related
|
|
15
|
+
operations on one or multiple models. It can involve fetching data from different sources, validating and transforming
|
|
16
|
+
that and in the end
|
|
17
|
+
either storing or returning the result. Services should be `database` agnostic and should not care about which database
|
|
18
|
+
or data sources are being used.
|
|
19
|
+
|
|
20
|
+
To understand the concept of `Services` we'll take a common example of `AutheticationService` containing all the basic
|
|
21
|
+
method of an authentication workflow. The methods in the class reflects business operations. `AutheticationService`
|
|
22
|
+
consumes`IOAuth0Client` and `IEmailClient` to perform 0Auth and `Email` related operations thus staying completely
|
|
23
|
+
agnostic of
|
|
24
|
+
which
|
|
25
|
+
`0Auth` and `Email` provider is being used underneath.
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
class AuthenticationService {
|
|
29
|
+
constructor(
|
|
30
|
+
private readonly auth0Client: IOAuth0Client,
|
|
31
|
+
private readonly emailClient: IEmailClient,
|
|
32
|
+
) {}
|
|
33
|
+
|
|
34
|
+
signIn() {}
|
|
35
|
+
|
|
36
|
+
signUp() {}
|
|
37
|
+
|
|
38
|
+
forgotPassoword() {}
|
|
39
|
+
|
|
40
|
+
verifyEmail() {}
|
|
41
|
+
|
|
42
|
+
generateToken() {}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
In our application, in most scenarios, services needs to fetch and store data models from and into databases. Because
|
|
47
|
+
these operations are so repetitive and needed
|
|
48
|
+
almost everywhere we have a `BaseService` class which basically takes care of all database related logic, so you can
|
|
49
|
+
focus more on what you want to do with the data rather than on how to
|
|
50
|
+
fetch/store that data. The `BaseService` consists on the following methods
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
export interface IBaseService<T, C = Omit<T, 'id'>, U = C> {
|
|
54
|
+
count(conditions?: FilterQuery<Document<T>>): Promise<number>;
|
|
55
|
+
|
|
56
|
+
get(id: string): Promise<T>;
|
|
57
|
+
|
|
58
|
+
get(conditions?: string | FilterQuery<Document<T>>): Promise<T>;
|
|
59
|
+
|
|
60
|
+
getAll(options?: GetAllArgs<Document<T>>): Promise<T[]>;
|
|
61
|
+
|
|
62
|
+
getByIds(ids: string[]): Promise<T[]>;
|
|
63
|
+
|
|
64
|
+
create(data: C): Promise<T>;
|
|
65
|
+
|
|
66
|
+
insert(
|
|
67
|
+
data: (C | U) & {
|
|
68
|
+
id?: string;
|
|
69
|
+
},
|
|
70
|
+
overwrite?: boolean,
|
|
71
|
+
): Promise<T>;
|
|
72
|
+
|
|
73
|
+
bulkCreate(data: C[]): Promise<T[]>;
|
|
74
|
+
|
|
75
|
+
update(id: string, data: U, overwrite?: boolean): Promise<T>;
|
|
76
|
+
|
|
77
|
+
delete(id: string): Promise<boolean>;
|
|
78
|
+
|
|
79
|
+
delete(conditions: string | FilterQuery<Document<T>>): Promise<boolean>;
|
|
80
|
+
|
|
81
|
+
getAllWithCount(options: GetAllArgs<Document<T>>): Promise<{
|
|
82
|
+
data: T[];
|
|
83
|
+
totalCount: number;
|
|
84
|
+
}>;
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Any services wishes to use these methods just need to extend the `BaseService`
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
export class UserService extends BaseService<IUserService> implements IUserService {
|
|
92
|
+
constructor(
|
|
93
|
+
@inject(TYPES.UserRepository)
|
|
94
|
+
repository: IUserRepository,
|
|
95
|
+
) {
|
|
96
|
+
super(repository);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
In the end, you need to register your service with the Dependency Injection, read more about
|
|
102
|
+
that [here](dependency-injection)
|