diff --git a/docs/custom-code/index.md b/docs/custom-code/index.md
index 6ac6435f..d3a418d8 100644
--- a/docs/custom-code/index.md
+++ b/docs/custom-code/index.md
@@ -4,7 +4,7 @@ title: Customize Your Application
# Customize Your Application
-Amplication enables you to generate code, manage custom files, and seed databases. We'll give you a brief overview what what Amplication can do in this area.
+Amplication enables you to generate code, manage custom files, and seed databases. We'll give you a brief overview of what Amplication can do in this area.
## Custom Code with Amplication
diff --git a/docs/dictionary/en-custom.txt b/docs/dictionary/en-custom.txt
index a3b738e5..fbe39e5e 100644
--- a/docs/dictionary/en-custom.txt
+++ b/docs/dictionary/en-custom.txt
@@ -96,4 +96,14 @@ Zustand
Supertokens
Bitwarden
Jovu
-Jovu's
\ No newline at end of file
+Jovu's
+passwordless
+Appsettings
+appsettings
+Codespaces
+Keycloak
+thirdparty
+emailpassword
+placeholder
+Quickstart
+autoupdating
\ No newline at end of file
diff --git a/docs/faqs/faqs.md b/docs/faqs/faqs.md
index 4c391816..908e7c16 100644
--- a/docs/faqs/faqs.md
+++ b/docs/faqs/faqs.md
@@ -12,7 +12,7 @@ Here are some questions that we are asked about frequently about using Amplicati
### What is Amplication?
-Amplication is an open-source AI-powered code generation platform that helps developers build and manage backend services without spending time on repetitive coding tasks and boilerplate code. Amplication auto-generates a fully functional, production-ready backend based on Node.js and .NET.
+Amplication is an open-source AI-powered code generation platform that helps developers build and manage backend services without spending time on repetitive coding tasks and boilerplate code. Our platform generates fully functional, production-ready backend services that follow modern best practices.
### How does Amplication work?
@@ -57,7 +57,7 @@ Amplication offers a structured way to [add custom code](https://docs.amplicatio
We also provide various [plugins](https://docs.amplication.com/getting-started/plugins/), like Prettier and ESLint, so you can format your code exactly how you need it.
-Furthermore, you can create [private plugins](https://docs.amplication.com/enterprise-private-plugins/) that are accessible only within your organization.
+Furthermore, you can create [private plugins](/private-plugins/) that are accessible only within your organization.
## Version Control and Collaboration
diff --git a/docs/getting-started-v2/example-services.md b/docs/getting-started-v2/example-services.md
new file mode 100644
index 00000000..679fb86b
--- /dev/null
+++ b/docs/getting-started-v2/example-services.md
@@ -0,0 +1,3 @@
+---
+sidebar_label: Example Services
+---
\ No newline at end of file
diff --git a/docs/getting-started-v2/intro-to-amplication.md b/docs/getting-started-v2/intro-to-amplication.md
new file mode 100644
index 00000000..67e3f620
--- /dev/null
+++ b/docs/getting-started-v2/intro-to-amplication.md
@@ -0,0 +1,3 @@
+---
+sidebar_label: Intro to Amplication
+---
\ No newline at end of file
diff --git a/docs/getting-started-v2/quickstart.md b/docs/getting-started-v2/quickstart.md
new file mode 100644
index 00000000..d67c1dcf
--- /dev/null
+++ b/docs/getting-started-v2/quickstart.md
@@ -0,0 +1,3 @@
+---
+sidebar_label: Quickstart
+---
\ No newline at end of file
diff --git a/docs/getting-started/assets/all-plugins-and-categories.png b/docs/getting-started/assets/all-plugins-and-categories.png
new file mode 100644
index 00000000..d3cc9462
Binary files /dev/null and b/docs/getting-started/assets/all-plugins-and-categories.png differ
diff --git a/docs/getting-started/community-plugins.md b/docs/getting-started/community-plugins.md
index ec86c519..888e10b9 100644
--- a/docs/getting-started/community-plugins.md
+++ b/docs/getting-started/community-plugins.md
@@ -1,18 +1,18 @@
---
-title: Community Plugins
-sidebar_label: Plugins List
+title: Node.js Plugins
+sidebar_label: Node.js Plugins
slug: /plugins-list
pagination_next: plugins/overview
pagination_prev: getting-started/plugins
---
-# Amplication Community Plugins
+# Amplication Node.js Plugins
-The following plugins are currently available.
+The following plugins are currently available for Node.js services generated by Amplication.
Additional plugins will be added in future releases of Amplication.
:::note
-For the most updated list of plugins, it's recommended to check the _All Plugins_ page on your Amplication dashboard.
+For the most updated list of Node.js plugins, please check the _Plugins_ tab on your Amplication dashboard.
:::
### Mongo DB
@@ -85,21 +85,15 @@ Integrate Auth0's robust authentication solutions into your service with the [Au
[ESLint](https://github.com/amplication/plugins/tree/master/plugins/linter-eslint) is a library that helps find issues and enforce code style in your JavaScript code.
ESLint has a wide array of rules that can be configured to enforce code quality and consistency.
-### Redis
+### Redis Caching
-[Redis](https://github.com/amplication/plugins/tree/master/plugins/cache-redis) is an open-source, in-memory data store that can be used as a database, cache, streaming engine, and message broker.
-Redis provides high availability via replication and high performance via caching.
-It is commonly used to quickly access frequently used application data.
+Enhance your application's performance with the [Redis Caching](https://github.com/amplication/plugins/tree/master/plugins/cache-redis) plugin. Redis is known for its fast data retrieval capabilities, making it an excellent choice for implementing caching strategies.
### Redis Message Broker
[Redis Message Broker](https://github.com/amplication/plugins/tree/master/plugins/broker-redis) is an extension of the traditional Redis in-memory data store, allowing it to function as a message broker.
Install this plugin to leverage Redis's in-memory capabilities and enables asynchronous message communication between different parts of an application or between different applications.
-### Redis Caching
-
-Enhance your application's performance with the [Redis Caching](https://github.com/amplication/plugins/tree/master/plugins/cache-redis) plugin. Redis is known for its fast data retrieval capabilities, making it an excellent choice for implementing caching strategies.
-
### OpenAI
The [OpenAI](https://github.com/amplication/plugins/tree/master/plugins/integration-openai) plugin allows you to integrate OpenAI's various AI models into your Amplication app.
@@ -195,8 +189,30 @@ Incorporate Hashicorp Vault's powerful secrets management capabilities with the
### JSON Logger
-The JSON Logger Plugin is designed for logging in JSON format. It offers configurable log levels, including 'fatal', 'error', 'warn', 'info', 'debug', 'trace', and 'silent'. Users can also add custom properties to log messages.
+The [JSON Logger Plugin](https://github.com/amplication/plugins/tree/master/plugins/logger-json) is designed for logging in JSON format. It offers configurable log levels, including 'fatal', 'error', 'warn', 'info', 'debug', 'trace', and 'silent'. Users can also add custom properties to log messages.
### MQTT
MQTT (Message Queuing Telemetry Transport) is an ISO standard publish-subscribe-based messaging protocol. It is designed for connections with remote locations where a "small code footprint" is required or the network bandwidth is limited. MQTT is highly scalable and is ideal for IoT devices, mobile applications, and messaging applications that require minimal data packets for communication.
+
+### RabbitMQ Message Broker
+
+Use RabbitMQ as a message broker to facilitate communication between your services.
+
+[RabbitMQ](https://github.com/amplication/plugins/tree/master/plugins/broker-rabbitmq) is a robust, open-source message-queuing software that implements the Advanced Message Queuing Protocol (AMQP). It's known for its reliability, scalability, and support for multiple messaging protocols, making it an excellent choice for building distributed systems and microservices architectures.
+
+### GitHub Codespaces Dev Container
+
+Streamline your development environment setup with the [GitHub Codespaces Dev Container](https://github.com/amplication/plugins/tree/master/plugins/devcontainer-github-codespaces) plugin. This plugin configures a consistent, reproducible development environment using GitHub Codespaces, ensuring that all team members work with the same tools and dependencies.
+
+### Keycloak Authentication Provider
+
+Enhance your service's security with the [Keycloak Authentication Provider](https://github.com/amplication/plugins/tree/master/plugins/auth-keycloak) plugin. Keycloak is an open-source identity and access management solution that provides single sign-on, identity federation, and user management capabilities, allowing you to easily implement robust authentication and authorization in your applications.
+
+### SAML Authentication Provider
+
+Implement SAML (Security Assertion Markup Language) authentication in your service with the [SAML Authentication Provider](https://github.com/amplication/plugins/tree/master/plugins/auth-saml) plugin. SAML is an XML-based open standard for exchanging authentication and authorization data between parties, particularly between an identity provider and a service provider.
+
+### HTTPS Transport
+
+Secure your API communications with the [HTTPS Transport](https://github.com/amplication/plugins/tree/master/plugins/transport-https) plugin. This plugin enables HTTPS (Hypertext Transfer Protocol Secure) for your service, ensuring that all data transmitted between the client and server is encrypted and secure.
diff --git a/docs/getting-started/first-service.md b/docs/getting-started/first-service.md
index 06dcf0b1..804ae76c 100644
--- a/docs/getting-started/first-service.md
+++ b/docs/getting-started/first-service.md
@@ -6,18 +6,16 @@ sidebar_label: Create Your First Service
slug: /first-service
---
-# Create Your First Service With Amplication
+# Create Your First Service
-Amplication accelerates your app development by helping you build production-ready backends in either Node.js or .NET. These automatically-generated backends, known as **services**, utilize modern frameworks such as NestJS and Prisma for Node.js, and ASP.NET Core alongside Entity Framework Core for .NET.
+Amplication accelerates your app development by helping you build production-ready backend services. These automatically-generated backends, known as **services**, provide modern, secure, and scalable foundations for your apps.
-Each service includes both REST and GraphQL APIs and comes with an interactive React Admin UI. These services offer a comprehensive solution that encompasses authentication, authorization, logging, git synchronization, and other critical backend management functionalities.
+Each service includes REST and GraphQL API support and an optional admin interface. Your service comes fully equipped with authentication, authorization, logging, git synchronization, and other critical backend management functionalities.
-This guide will help you create your first service using our streamlined service creation onboarding wizard.
+This guide will help you create your first service using our creation wizard.
-:::tip
-[Amplication's AI](/amplication-ai) can help you build your first service with a single request in a few seconds.
-
-Ask Jovu: `Can you create a new blog service with entities for posts, categories, authors, and comments?`
+:::info Generated Service Example
+Want to see an example of what a generated service looks like? Check out the [Generated Service Sample App](https://github.com/amplication/sample-app) on GitHub.
:::
## Prerequisites
@@ -26,12 +24,32 @@ First, [sign up](https://app.amplication.com/login) for an Amplication account w
![](./assets/first-service/amplication-home-page.png)
-If this is your first time using Amplication, the Service Creation Wizard start automatically will guide you through the process.
+If this is your first time using Amplication, the Service Creation Wizard will automatically guide you through the process.
## Step 1: Name Your Service
When naming your service, consider its primary function. What will it do? What problem is it solving? An appropriately named service will be easier to identify and maintain.
+
+Available Technology Stacks
+
+Amplication supports two technology stacks for your backend services:
+
+**Node.js**
+- NestJS framework
+- Prisma ORM
+- GraphQL and REST APIs
+- React Admin UI
+
+**.NET**
+
+- ASP.NET Core
+- Entity Framework Core
+- REST APIs
+
+Choose the stack that best fits your team's expertise and project requirements during service creation.
+
+
![](./assets/first-service/service-name.png)
## Step 2: Connect Your GitHub Repository
@@ -47,7 +65,7 @@ You can also create a new repository by clicking on the **Create repository** bu
![](./assets/first-service/select-repository.png)
-:::note
+:::note Other Supported Git Providers
In addition to GitHub, Amplication also supports [Bitbucket](/sync-with-bitbucket) and [AWS CodeCommit](/sync-with-aws-codecommit) for Enterprise users.
:::
@@ -87,16 +105,16 @@ Monorepo is recommended if you plan on having multiple services in a single GitH
Amplication supports PostgreSQL, MongoDB, and MySQL out of the box. Choose the one that suits your needs.
:::tip
-You're not locked into your choice - you can always change your database type later in your project's plugin page.
+You're not locked into your choice - you can always [change your database type later](/plugins/guides/database/) in your project's plugin page.
:::
![](./assets/first-service/database.png)
## Step 6: Define Your Data Model
-Define entities and fields for your database. You can manually define your own or use a template provided by Amplication.
+Define entities and fields for your database. You can manually define your own or use a set of pre-defined entities provided by Amplication.
-:::info
+:::info What Are Entities?
Entities are the objects you want to keep track of in your app, like a User or a Product. They become tables in your database. Each row represents an instance of the entity.
A field is a column in that table that represents an attribute of that entity.
@@ -118,12 +136,6 @@ Congratulations! You've successfully set up your first service on Amplication. Y
Clicking on the `View my code` button will take you to the GitHub repository you chose in Step 2. Specifically, you'll see Amplication's first commit to that repository.
-:::note
-If you're curious about what the generated code for a service looks like, we have an example on GitHub for you. Check out the following repository:
-
-[Amplication Generated Service Sample App](https://github.com/amplication/sample-app)
-:::
-
![](./assets/first-service/service-created-successfully.png)
## Next Steps
diff --git a/docs/getting-started/generated-app.md b/docs/getting-started/generated-app.md
index 8dc1f082..f0000883 100644
--- a/docs/getting-started/generated-app.md
+++ b/docs/getting-started/generated-app.md
@@ -11,20 +11,22 @@ When you use Amplication to create your backend service, we automatically genera
Some of the key features of our generated backend services include:
-- **Extensive Functionality**: The generated services provide a wide range of features, including authentication, authorization, data validation, logging, a database, and a REST API. For Node.js services, they also offer GraphQL APIs for efficient data communication and a React-based admin UI.
-- **Clean Architecture**: Both Node.js and .NET services are structured following the clean architecture principles, ensuring that the business logic is decoupled from the infrastructure and UI layers. This makes the code easier to maintain and test.
-- **Ready for Production**: The generated services include Docker configurations, CI/CD pipelines, and are optimized for cloud deployment, making it straightforward to move from development to production.
-- **Customizable and Extendable**: While the service provides a solid foundation, it is fully customizable. Developers can extend the generated code with custom features and integrate additional services as needed.
-
-:::note
-You can see an example of a Node.js service generated with Amplication in this [GitHub repository](https://github.com/amplication/sample-app).
+- **Comprehensive APIs**: Every service includes REST APIs with built-in validation, documentation, and testing capabilities. Optional GraphQL support is available for enhanced data querying.
+- **Authentication & Authorization**: Built-in user management, role-based access control, and security best practices.
+- **Database Integration**: Robust database connectivity with your choice of modern ORMs and data validation.
+- **Developer Experience**: Generated services include logging, testing frameworks, and development tools configured according to industry standards.
+- **Production-ready**: Includes Docker configurations and CI/CD pipelines for straightforward deployment to your preferred platform.
+- **Extensible Architecture**: Clean, modular architecture that separates business logic from infrastructure concerns, making the code easy to maintain and customize.
+
+:::info Generated Service Example
+See an example of a generated service in our [sample application repository](https://github.com/amplication/sample-app).
:::
## Technologies
The generated services utilize a suite of proven, robust technologies tailored for each supported technology.
-Below are the technologies employed for Node.js and .NET, ensuring efficient, reliable, and scalable server-side applications.
+Below are the technologies used for Amplication's supported tech stacks, ensuring efficient, reliable, and scalable server-side apps.
### Server-side
diff --git a/docs/getting-started/plugins.md b/docs/getting-started/plugins.md
index 326a0052..a5831370 100644
--- a/docs/getting-started/plugins.md
+++ b/docs/getting-started/plugins.md
@@ -1,25 +1,20 @@
---
id: plugins
-title: How To Use Plugins
-description: Learn how to use Amplication plugins that extend the functionality of your generated application.
-sidebar_label: How To Use Plugins
+title: Plugins Explained
+description: Learn how to use Amplication plugins to extend the functionality of your generated service.
+sidebar_label: Plugins Explained
slug: /getting-started/plugins
pagination_next: plugins/overview
pagination_prev: getting-started/community-plugins
---
-Amplication uses _Plugins_ to extend the functionality of your generated code.
+Amplication uses _Plugins_ to extend the functionality of your generated service. These software additions allow developers to customize the default behavior of [Amplication's code generation process](/plugins/plugin-architecture/), providing hooks into various stages of service creation.
-Some plugins can be enabled when you first create your service.
-For example, if you choose MySQL as your database, the _MySQL DB_ plugin will be enabled.
-If you choose to turn on authentication for your service, that will enable the _NestJS Auth Module_ plugin.
-
-All community plugins published by Amplication are available on the _All Plugins_ page.
-Your installed plugins are shown on the _Installed Plugins_ page.
-Plugins can be manually enabled or disabled on either of these pages.
-The source code of all community Amplication plugins are [available on GitHub](https://github.com/amplication/plugins).
+Amplication offers a wide range of community-created plugins that are open-source and available on GitHub. You also have the flexibility to develop your own [custom plugins](/plugins/overview/) so you can tailor your generated service to meet your exact requirements.
-Besides the community plugins created by the Amplication team, you can [develop your own custom plugins](/plugins/overview/).
+You can enable certain plugins when you first create your service.
+For example, if you choose MySQL as your database, the _MySQL DB_ plugin will be enabled.
+If you choose to turn on authentication for your service, that will enable Authentication-related plugins.
:::tip
[Amplication's AI](/amplication-ai) can help you find new plugins for your service, and even install them automatically, with a single request.
@@ -27,31 +22,35 @@ Besides the community plugins created by the Amplication team, you can [develop
Ask Jovu: `Which plugins do you recommend for adding caching capabilities to my Amplication service?`
:::
-## Community Plugins List
+## Available Plugins
-You can view all community plugins on the _All Plugins_ page.
-They're also available on the [Community Plugins](/plugins-list) page here on the Amplication documentation.
+Amplication supports both Node.js and .NET for code generation. Plugins are technology-specific.
-## Viewing Open-Source Plugin Code
+Node.js and .NET services will see a different set of available plugins, each optimized for the chosen stack.
-All Amplication plugins are open-source and available on GitHub.
-You can find the plugin source code for each individual plugin in Amplication's [`plugins`](https://github.com/amplication/amplication-plugins) repository.
+Node.js plugins integrate seamlessly with the Node.js ecosystem and popular frameworks like NestJS. .NET plugins are designed to work with .NET Core and leverage the power of the .NET ecosystem.
-## How To Install A Plugin
+## How To Install a Plugin
-To install a plugin:
+To see all community-created plugins, first visit the _Plugins_ tab in your Amplication dashboard.
-1. In the _All Plugins_ page, click **Install** for the required plugin.
+To install an individual plugin:
-![](./assets/all-plugins.png)
+1. On the left sidebar in the Plugins page, you can browse by _Plugin Categories_ categories like Database, Authentication, and more, or click on _All Plugins_ to see the complete list.
+2. Click the **Install** button next to the desired plugin.
+3. The plugin's toggle will switch to its _on_ state, indicating it's now active.
+4. You can view all your installed plugins in the _Installed Plugins_ tab.
+5. To see a plugin's source code on GitHub, select **View on GitHub** next to the installed plugin.
-2. This will turn on the plugin's toggle into its _on_ state.
+Plugins can be manually enabled or disabled from both the _All Plugins_ and _Installed Plugins_ tabs.
-3. Go to the _Installed Plugins_ page. The installed plugins are listed.
+![](./assets/all-plugins-and-categories.png)
-4. To see the plugin's code on GitHub, select **View on GitHub**.
+:::tip
+Explore different plugin categories to discover plugins that can enhance specific parts of your service, such as database management, authentication, or API functionality.
+:::
-## How To Uninstall A Plugin
+## How To Uninstall a Plugin
To uninstall, or deactivate, a plugin, click the toggle switch into its _off_ state.
@@ -76,7 +75,7 @@ By default, the latest version of the plugin will be available in the list of pl
1. To change the installed version of a plugin, in the **All Plugins** page, click the **Settings** icon.
- The plugin’s settings page opens.
+ The plugin's settings page opens.
![](./assets/plugin-versions.png)
@@ -88,6 +87,13 @@ By default, the latest version of the plugin will be available in the list of pl
Each version of the Plugin has its own settings, so when you replace the version you also replace its settings.
:::
+## How To View Open-Source Plugin Code
+
+All Amplication plugins are open-source and available on GitHub.
+You can find the plugin source code for each individual plugin in Amplication's [`plugins`](https://github.com/amplication/amplication-plugins) repository.
+
+Besides the plugins created by the Amplication team and the community, you can [develop your own custom plugins](/plugins/overview/).
+
## How To Develop a Custom Plugin
To add more functionality, you can develop your own plugins, or can use plugins developed by the community, as they become available.
diff --git a/docs/getting-started/service-entities-roles-permissions.md b/docs/getting-started/service-entities-roles-permissions.md
index 73df10f2..97922861 100644
--- a/docs/getting-started/service-entities-roles-permissions.md
+++ b/docs/getting-started/service-entities-roles-permissions.md
@@ -30,9 +30,9 @@ The _Entities_ page opens. Here you see all the entities in your application.
![](./assets/first-app/entities.png)
:::info
-When you initially established your service using the service creation wizard, you had the choice to [incorporate entities into your data model](/first-service/#step-6-define-your-data-model) from an Amplication template, or leave it empty.
+When you initially established your service using the service creation wizard, you had the choice to [incorporate entities into your service](/first-service/#step-6-define-your-data-model) from a set of pre-defined entities, or leave it empty.
-If you opted not to use a template, you'll find your Entities screen with only one entity, **User**. This entity auto-generated when you created the new service.
+If you opted not to use the pre-defined entities, you'll find your Entities screen with only one entity, **User**. This entity auto-generated when you created the new service.
:::
In this example, we'll now add another entity called _Project_.
diff --git a/docs/getting-started/set-up-entities.md b/docs/getting-started/set-up-entities.md
index ce6d9d41..d103b81a 100644
--- a/docs/getting-started/set-up-entities.md
+++ b/docs/getting-started/set-up-entities.md
@@ -34,9 +34,9 @@ The _Entities_ page opens. Here you see all the entities in your application.
![](./assets/first-app/entities.png)
:::info
-When you initially established your service using the service creation wizard, you had the choice to [incorporate entities into your data model](/first-service/#step-6-define-your-data-model) from an Amplication template, or leave it empty.
+When you initially established your service using the service creation wizard, you had the choice to [incorporate entities into your service](/first-service/#step-6-define-your-data-model) from a set of pre-defined entities, or leave it empty.
-If you opted not to use a template, you'll find your Entities screen with only one entity, **User**. This entity auto-generated when you created the new service.
+If you opted not to use the pre-defined entities, you'll find your Entities screen with only one entity, **User**. This entity auto-generated when you created the new service.
:::
In this example, we'll now add another entity called _Project_.
diff --git a/docs/getting-started/smart-git-sync.md b/docs/getting-started/smart-git-sync.md
index 63589f17..80f89570 100644
--- a/docs/getting-started/smart-git-sync.md
+++ b/docs/getting-started/smart-git-sync.md
@@ -44,8 +44,10 @@ For example, let's say you've just added a new _Task_ entity to your project. On
This method ensures that every single change you make in your Amplication project is automatically tracked and committed to the `amplication` branch in your Git repository. You can then easily review and merge these changes through pull requests.
-:::info
-After the Amplication build completes, review the PR, resolve any conflicts, and merge it. **Keep the `amplication` branch and avoid deleting it**.
+:::note
+After the Amplication build completes, review the PR, resolve any conflicts, and merge it.
+
+**Keep the `amplication` branch and avoid deleting it**. In case of conflicts, handle them on the `amplication` branch and perform commits there. Regular development work should not be done on this branch.
:::
## The `amplication` branch
@@ -61,7 +63,9 @@ For example, Amplication will base the `amplication` branch from `main` if your
You can merge Amplication-made changes by merging pull requests created by Amplication from the `amplication` branch to your repository's default branch.
:::note
-Refrain from modifying the `amplication` branch directly. Creating new commits or merging changes from other branches can introduce bugs and inconsistencies. In case of conflict, delete the `amplication` branch and resolve the merge conflict in the next PR.
+**Do not delete the `amplication` branch**.
+
+Do not modify the `amplication` branch, except to resolve conflicts. Handle conflicts directly on the `amplication` branch. Avoid creating new commits or merging changes from other branches to prevent bugs and inconsistencies.
:::
![](./assets/sync-with-git-provider/github-pull-request.png)
diff --git a/docs/getting-started/sync-with-bitbucket.md b/docs/getting-started/sync-with-bitbucket.md
index dd174b48..4286f5b5 100644
--- a/docs/getting-started/sync-with-bitbucket.md
+++ b/docs/getting-started/sync-with-bitbucket.md
@@ -120,4 +120,14 @@ And there you have it – a new pull request ready for review.
![bitbucket-pull-request](./assets/sync-with-git-provider/bitbucket-pull-request.png)
-Amplication creates pull requests from the `amplication` branch into your repository's default base branch. Pro and Enterprise users can [change the base branch for these pull requests](/how-to/change-base-branch-for-pull-requests)
+## Merging Amplication's Pull Request into your branch
+
+Amplication creates pull requests from the `amplication` branch into your repository's default base branch.
+Amplication triggers the creation of a commit on the changed files whenever a new build is performed on a project.
+The changed files are all the files that were added, removed, or changed from the last build.
+
+:::note
+**Do not delete the `amplication` branch**.
+
+Do not modify the `amplication` branch, except to resolve conflicts. Handle conflicts directly on the `amplication` branch. Avoid creating new commits or merging changes from other branches to prevent bugs and inconsistencies.
+:::
diff --git a/docs/getting-started/sync-with-github.md b/docs/getting-started/sync-with-github.md
index f90f31c6..74e5b0db 100644
--- a/docs/getting-started/sync-with-github.md
+++ b/docs/getting-started/sync-with-github.md
@@ -142,6 +142,12 @@ Now let's review what happens from GitHub's side when Amplication generates a ne
Amplication triggers the creation of a commit on the changed files whenever a new build is performed on a project.
The changed files are all the files that were added, removed, or changed from the last build.
+:::note
+**Do not delete the `amplication` branch**.
+
+Do not modify the `amplication` branch, except to resolve conflicts. Handle conflicts directly on the `amplication` branch. Avoid creating new commits or merging changes from other branches to prevent bugs and inconsistencies.
+:::
+
![A pull request generated by Amplication on GitHub](./assets/sync-with-git-provider/github-pull-request-amplication-branch.png)
Amplication reduces the chances of user changes being overridden by interacting with the user’s repository through an `amplication` branch. This branch is created in your selected repository by Amplication's GitHub App.
@@ -172,7 +178,7 @@ It will take you to the specific build log for this commit on Amplication.
## Merging your pull request
-After clicking on `Merge`, you can safely delete this branch. You can then navigate back to your main branch where you will find your Amplication code.
+After clicking on `Merge`, do not delete the `amplication` branch. You can then navigate back to your main branch where you will find your Amplication code.
![](./assets/sync-with-git-provider/4d38da6f-9b1c-4844-91ec-ec9b101c4503.png)
diff --git a/docs/how-to/add-custom-commits.md b/docs/how-to/add-custom-commits.md
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/how-to/assets/amplication-platform-console.png b/docs/how-to/assets/amplication-platform-console.png
new file mode 100644
index 00000000..49acdae4
Binary files /dev/null and b/docs/how-to/assets/amplication-platform-console.png differ
diff --git a/docs/how-to/assets/create-service-from-template.png b/docs/how-to/assets/create-service-from-template.png
new file mode 100644
index 00000000..3e01822d
Binary files /dev/null and b/docs/how-to/assets/create-service-from-template.png differ
diff --git a/docs/how-to/assets/live-service-templates/apis.png b/docs/how-to/assets/live-service-templates/apis.png
new file mode 100644
index 00000000..6352fa4e
Binary files /dev/null and b/docs/how-to/assets/live-service-templates/apis.png differ
diff --git a/docs/how-to/assets/live-service-templates/complete.png b/docs/how-to/assets/live-service-templates/complete.png
new file mode 100644
index 00000000..5de59a7d
Binary files /dev/null and b/docs/how-to/assets/live-service-templates/complete.png differ
diff --git a/docs/how-to/assets/live-service-templates/database.png b/docs/how-to/assets/live-service-templates/database.png
new file mode 100644
index 00000000..b5cc1474
Binary files /dev/null and b/docs/how-to/assets/live-service-templates/database.png differ
diff --git a/docs/how-to/assets/live-service-templates/name-and-stack.png b/docs/how-to/assets/live-service-templates/name-and-stack.png
new file mode 100644
index 00000000..cb01e46a
Binary files /dev/null and b/docs/how-to/assets/live-service-templates/name-and-stack.png differ
diff --git a/docs/how-to/assets/live-service-templates/platform-changes.png b/docs/how-to/assets/live-service-templates/platform-changes.png
new file mode 100644
index 00000000..61331d35
Binary files /dev/null and b/docs/how-to/assets/live-service-templates/platform-changes.png differ
diff --git a/docs/how-to/assets/live-service-templates/publish.png b/docs/how-to/assets/live-service-templates/publish.png
new file mode 100644
index 00000000..776155f2
Binary files /dev/null and b/docs/how-to/assets/live-service-templates/publish.png differ
diff --git a/docs/how-to/assets/live-service-templates/service-template-dashboard.png b/docs/how-to/assets/live-service-templates/service-template-dashboard.png
new file mode 100644
index 00000000..ed0be3fe
Binary files /dev/null and b/docs/how-to/assets/live-service-templates/service-template-dashboard.png differ
diff --git a/docs/how-to/assets/live-service-templates/settings.png b/docs/how-to/assets/live-service-templates/settings.png
new file mode 100644
index 00000000..61b302a2
Binary files /dev/null and b/docs/how-to/assets/live-service-templates/settings.png differ
diff --git a/docs/how-to/assets/platform-changes.png b/docs/how-to/assets/platform-changes.png
new file mode 100644
index 00000000..ee6576ab
Binary files /dev/null and b/docs/how-to/assets/platform-changes.png differ
diff --git a/docs/how-to/assets/service-catalog/above-grid-add-filter.png b/docs/how-to/assets/service-catalog/above-grid-add-filter.png
new file mode 100644
index 00000000..548b5f36
Binary files /dev/null and b/docs/how-to/assets/service-catalog/above-grid-add-filter.png differ
diff --git a/docs/how-to/assets/service-catalog/card-view.png b/docs/how-to/assets/service-catalog/card-view.png
new file mode 100644
index 00000000..713106bf
Binary files /dev/null and b/docs/how-to/assets/service-catalog/card-view.png differ
diff --git a/docs/how-to/assets/service-catalog/code-view.png b/docs/how-to/assets/service-catalog/code-view.png
new file mode 100644
index 00000000..4e6ec150
Binary files /dev/null and b/docs/how-to/assets/service-catalog/code-view.png differ
diff --git a/docs/how-to/assets/service-catalog/commits.png b/docs/how-to/assets/service-catalog/commits.png
new file mode 100644
index 00000000..a7654cac
Binary files /dev/null and b/docs/how-to/assets/service-catalog/commits.png differ
diff --git a/docs/how-to/assets/service-catalog/filter-view.png b/docs/how-to/assets/service-catalog/filter-view.png
new file mode 100644
index 00000000..630b89e3
Binary files /dev/null and b/docs/how-to/assets/service-catalog/filter-view.png differ
diff --git a/docs/how-to/assets/service-catalog/grid-view.png b/docs/how-to/assets/service-catalog/grid-view.png
new file mode 100644
index 00000000..d69ecd0e
Binary files /dev/null and b/docs/how-to/assets/service-catalog/grid-view.png differ
diff --git a/docs/how-to/assets/service-catalog/pending-changes-sidebar.png b/docs/how-to/assets/service-catalog/pending-changes-sidebar.png
new file mode 100644
index 00000000..7b1c0c55
Binary files /dev/null and b/docs/how-to/assets/service-catalog/pending-changes-sidebar.png differ
diff --git a/docs/how-to/assets/service-catalog/pending-changes.png b/docs/how-to/assets/service-catalog/pending-changes.png
new file mode 100644
index 00000000..1e844a3e
Binary files /dev/null and b/docs/how-to/assets/service-catalog/pending-changes.png differ
diff --git a/docs/how-to/assets/service-catalog/service-catalog.png b/docs/how-to/assets/service-catalog/service-catalog.png
new file mode 100644
index 00000000..a360b4f2
Binary files /dev/null and b/docs/how-to/assets/service-catalog/service-catalog.png differ
diff --git a/docs/how-to/assets/template-name-and-stack.png b/docs/how-to/assets/template-name-and-stack.png
new file mode 100644
index 00000000..12ceaac0
Binary files /dev/null and b/docs/how-to/assets/template-name-and-stack.png differ
diff --git a/docs/how-to/authentication-plugin-examples.md b/docs/how-to/authentication-plugin-examples.md
deleted file mode 100644
index 8aa6aa67..00000000
--- a/docs/how-to/authentication-plugin-examples.md
+++ /dev/null
@@ -1,76 +0,0 @@
----
-title: Authentication Plugin Examples
-sidebar_label: Authentication Plugin Examples
-slug: /authentication-plugin-examples
-pagination_next: getting-started/authentication
----
-
-# Authentication Plugin Examples
-
-Amplication provides you with various plugins for [Authentication](/authentication).
-
-This page provides you with in-depth examples on how to use and interact with the available authentication plugins.
-
-## JWT Authentication
-
-When generating an app with JWT authentication, the process includes the following two steps:
-
-1. Send a login request to the server with username and password to get back from the server the JWT token.
-2. Add an authentication header with the JWT token to every consecutive request.
-
-Following are examples of how to log in with REST API and GraphQL API.
-
-### Rest API
-
-```bash title="Rest API Curl Request Example"
-curl -X 'POST' \
- 'https://[server-url]/api/login' \
- -H 'accept: */*' \
- -H 'Content-Type: application/json' \
- -d '{
- "username": "admin",
- "password": "admin"
-}'
-```
-
-![Swagger playground for login endpoint.](./../getting-started/assets/authentication/auth-rest.png)
-
-### GraphQL API
-
-```graphql
-mutation {
- login(credentials: { username: "admin", password: "admin" }) {
- accessToken
- }
-}
-```
-
-### Header with JWT Included (example)
-
-
-
-```text title="JWT Authorization Header Example"
- Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoieW91IGFyZSBzb29vb28gY29vbCB0aGF0IHlvdSBjaGVjayB0aGF0ISIsIm5hbWUiOiJPZmVrIGdhYmF5IDspIiwiaWF0IjoxNTE2MjM5MDIyfQ.vaYJaP9SUlOU0u4NfFCRm5tmBVDKeCwvN6ByCkqJt8U
-```
-
-
-
-## Basic Authentication
-
-When using Basic HTTP authentication, when sending a request to the API you must provide a Basic HTTP authentication header with the format:
-
-Authorization: 'type' 'credentials'
-
-where type is Basic and credentials is the Base64 encoding of a string "username:password".
-
-```text title="Basic Authentication Example"
-Authorization: Basic YWRtaW46YWRtaW4=
-```
-
-By default, your app comes with one user with the username `admin` and password `admin`.
-
-:::tip
-You can use a tool to create the header. There are several generators available, such as [https://www.blitter.se/utils/basic-authentication-header-generator/](https://www.blitter.se/utils/basic-authentication-header-generator/)
-:::
-
-Read here to find out more: [HTTP authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication).
diff --git a/docs/how-to/authentication-plugin-examples.mdx b/docs/how-to/authentication-plugin-examples.mdx
new file mode 100644
index 00000000..79323097
--- /dev/null
+++ b/docs/how-to/authentication-plugin-examples.mdx
@@ -0,0 +1,350 @@
+---
+title: Authentication Plugin Guide
+sidebar_label: Authentication Plugin Guide
+slug: /plugins/guides/authentication
+pagination_next: getting-started/authentication
+---
+
+# Authentication Plugin Guide
+
+Authentication and authorization are crucial components of your Amplication service. This guide will help you implement secure user authentication using Amplication's authentication plugins.
+
+## Enable Authentication
+
+Make sure you have an [Authentication Entity](/user-entity) set up.
+Next, follow these steps to add authentication:
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+
+
+1. Navigate to your service's Plugins page.
+2. Go to the "Authentication" category in the left sidebar.
+3. Ensure you install the "NestJS Auth Module" plugin first.
+4. Choose and add an Auth Provider plugin that suits your needs (e.g., Auth0, Supertokens, etc.).
+
+:::note
+By default, Node.js services are created with a user with the credentials username: `admin` and password: `admin`.
+:::
+
+
+
+
+1. Navigate to your service's Plugins page.
+2. Go to the "Authentication" category in the left sidebar.
+3. Choose and add an Auth Provider plugin that suits your needs (e.g., ASP.NET Core Identity).
+
+:::note
+For .NET services, the default user credentials are username: `test@email.com` and password: `P@ssw0rd!`
+:::
+
+
+
+
+After adding the required Authentication plugins, [configure your authentication settings](#plugin-configuration-settings) in the plugin options page.
+
+## Disable Authentication
+
+If you no longer need authentication on a specific service, you can disable it.
+
+1. Visit your service's Plugins page and toggle the Authentication-related plugins into the off state.
+2. Delete the [Authentication Entity](/user-entity/) from your list of entities.
+3. [Re-build your project](/building-new-versions/) and commit your changes to your preferred git provider.
+
+## Authentication Providers
+
+Amplication supports multiple authentication providers to suit different needs:
+
+1. [JWT Auth Provider](https://jwt.io/)
+2. [Auth0 Auth Provider](https://auth0.com/)
+3. [Supertokens Auth Provider](https://supertokens.com/)
+4. [SAML Auth Provider](https://en.wikipedia.org/wiki/Security_Assertion_Markup_Language)
+5. Basic Auth Provider
+6. [KeyCloak Auth Provider](https://www.keycloak.org/)
+7. [ASP.NET Core Identity](https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-9.0&tabs=visual-studio)
+
+### JWT Auth Provider
+
+- Adds JSON Web Token (JWT) authentication and authorization to your service.
+- Must be installed with the "NestJS Auth Module" plugin.
+- For detailed configuration, visit the [JWT Auth Provider GitHub README](https://github.com/amplication/plugins/tree/master/plugins/auth-jwt).
+
+### Auth0 Auth Provider
+
+- Integrates Auth0 authentication and authorization into your service.
+- Requires an Auth0 account and configuration of an Auth0 application.
+- For setup instructions and configuration options, check the [Auth0 Auth Provider GitHub README](https://github.com/amplication/plugins/tree/master/plugins/auth-auth0).
+
+### Supertokens Auth Provider
+
+- Adds Supertokens authentication to your service.
+- Supports various authentication recipes (e.g., email-password, passwordless, third-party).
+- Requires setup of the Supertokens core service.
+- For detailed configuration and usage, refer to the [Supertokens Auth Provider GitHub README](https://github.com/amplication/plugins/tree/master/plugins/auth-supertokens).
+
+### SAML Auth Provider
+
+- Enables SAML authentication on your service.
+- Uses Passport SAML strategy and generates JWT tokens for authorization.
+- For usage details, check the [SAML Auth Provider GitHub README](https://github.com/amplication/plugins/tree/master/plugins/auth-saml).
+
+### Basic Auth Provider
+
+- Enables a straightforward authentication scheme built into the HTTP protocol.
+- Requires sending user's credentials in the form of a username and password, encoded in base64, included in the Authorization header of the request.
+
+:::note
+If you use the Basic Auth Provider plugin, your service comes with one user with the username `admin` and the password `admin` by default.
+:::
+
+### KeyCloak Auth Provider
+
+- Integrates KeyCloak authentication and authorization into your service.
+- Provides single sign-on (SSO) capabilities and support for various identity protocols.
+- Requires setup of a KeyCloak server and configuration of a KeyCloak realm.
+- For detailed setup instructions and configuration options, refer to the [KeyCloak Auth Provider GitHub README](https://github.com/amplication/plugins/tree/master/plugins/auth-keycloak).
+
+### ASP.NET Core Identity
+
+If you're using a .NET service, refer to the [.NET Auth Core Identity plugin documentation](https://github.com/amplication/plugins/tree/master/plugins/dotnet-auth-core-identity) for setup and usage instructions.
+
+## Plugin Configuration Settings
+
+You can customize your authentication settings, including the default username and password, in the authentication plugin's options page.
+
+Let's look at detailed configuration settings for some of the available authentication plugins:
+
+### ASP.NET Core Identity
+
+This plugin adds authentication and authorization to your .NET services.
+
+#### Configuration
+
+```json
+{
+ "seedUserEmail":"test@email.com",
+ "seedUserPassword":"P@ssw0rd!"
+}
+```
+
+- `seedUserEmail`: The email address for the default seed user created when initializing the service (default: "test@email.com")
+- `seedUserPassword`: The password for the default seed user created when initializing the service (default: "P@ssw0rd!")
+
+### JWT Auth Provider
+
+The JWT Auth Provider adds JSON Web Token (JWT) authentication and authorization to your service.
+
+#### Configuration
+
+```json
+{
+ "settings": {
+ "tokenExpiresIn": 3600,
+ "refreshTokenExpiresIn": 604800,
+ "grantType": "PASSWORD",
+ "jwtSecretKey": "Change_ME!!!"
+ }
+}
+```
+
+- `tokenExpiresIn`: Expiration time of the access token in seconds (default: 3600)
+- `refreshTokenExpiresIn`: Expiration time of the refresh token in seconds (default: 604800)
+- `grantType`: The grant type for token generation (default: "PASSWORD")
+- `jwtSecretKey`: Secret key for JWT signing (default: "Change_ME!!!")
+
+For detailed configuration, visit the [JWT Auth Provider GitHub README](https://github.com/amplication/plugins/tree/master/plugins/auth-jwt).
+
+### Auth0 Auth Provider
+
+The Auth0 Auth Provider integrates Auth0 authentication and authorization into your service.
+
+#### Configuration
+
+```json
+{
+ "settings": {
+ "useManagementApi": true,
+ "managementParams": {
+ "identifier": "https://{TENANT_NAME}.{REGION}.auth0.com/api/v2/",
+ "accessToken": "{ACCESS_TOKEN}",
+ "actionName": "Add user details to access token",
+ "clientName": "Custom SPA",
+ "apiName": "Custom API",
+ "audience": "http://example.com"
+ }
+ }
+}
+```
+
+- `useManagementApi`: Set to `true` to use the Auth0 Management API
+- `managementParams`: Configuration for the Management API
+ - `identifier`: The identifier of the Auth0 Management API
+ - `accessToken`: The access token of the Auth0 Management API
+ - `actionName`: The name of the action to create in Auth0
+ - `clientName`: The name of the client to create in Auth0
+ - `apiName`: The name of the API to create in Auth0
+ - `audience`: The audience/identifier of the API
+
+For setup instructions and configuration options, check the [Auth0 Auth Provider GitHub README](https://github.com/amplication/plugins/tree/master/plugins/auth-auth0).
+
+### Supertokens Auth Provider
+
+The Supertokens Auth Provider adds Supertokens authentication to your service, supporting various authentication recipes.
+
+#### Configuration
+
+```json
+{
+ "settings": {
+ "apiDomain": "http://localhost:3000",
+ "appName": "Amplication App",
+ "websiteDomain": "http://localhost:3001",
+ "websiteBasePath": "/auth",
+ "apiBasePath": "/api/auth",
+ "connectionUri": "https://try.supertokens.com",
+ "apiGatewayPath": "",
+ "apiKey": "",
+ "supertokensIdFieldName": "supertokensId",
+ "recipe": {
+ "name": "email-password"
+ }
+ }
+}
+```
+
+- `apiDomain`: The API domain for Supertokens
+- `appName`: The name of your application
+- `websiteDomain`: The website domain for Supertokens
+- `websiteBasePath`: The base path for authentication on the website
+- `apiBasePath`: The base path for authentication API endpoints
+- `connectionUri`: The URI for connecting to the Supertokens core
+- `supertokensIdFieldName`: The field name to store the Supertokens user ID
+- `recipe`: The authentication recipe to use (e.g., "emailpassword", "passwordless", "thirdparty")
+
+For detailed configuration and usage, refer to the [Supertokens Auth Provider GitHub README](https://github.com/amplication/plugins/tree/master/plugins/auth-supertokens).
+
+### Keycloak Auth Provider
+
+The Keycloak Auth Provider integrates Keycloak authentication and authorization into your service.
+
+#### Configuration
+
+```json
+{
+ "settings": {
+ "port": 8080,
+ "realmID": "amplication-sample-realm",
+ "clientID": "amplication-server",
+ "realmName": "Amplication Sample Realm",
+ "clientName": "Amplication Server",
+ "clientDescription": "Sample client for Amplication Server",
+ "adminUsername": "admin",
+ "adminPassword": "admin",
+ "recipe": {
+ "emailFieldName": "email",
+ "verifyEmail": false,
+ "registrationAllowed": true,
+ "payLoadMapping": {
+ "username": "name",
+ "name": "name"
+ }
+ }
+ }
+}
+```
+
+- `port`: The port on which to run the Keycloak server
+- `realmID`: The ID of the Keycloak realm to use
+- `clientID`: The ID of the Keycloak client to use
+- `realmName`: The name of the Keycloak realm
+- `clientName`: The name of the Keycloak client
+- `adminUsername`: The username for the Keycloak admin user
+- `adminPassword`: The password for the Keycloak admin user
+- `recipe`: Configuration for the authentication recipe
+
+For detailed setup instructions and configuration options, refer to the [Keycloak Auth Provider GitHub README](https://github.com/amplication/plugins/tree/master/plugins/auth-keycloak).
+
+### Basic Auth Provider
+
+```json
+{
+ "username":"admin",
+ "password":"admin"
+}
+```
+
+- `username`: The username for the default seed user created when initializing the service.
+- `seedUserPassword`: The password for the default seed user created when initializing the service.
+
+## Examples
+
+This section provides you with in-depth examples on how to use and interact with some of the available authentication plugins.
+
+### JWT Authentication
+
+When generating an app with JWT authentication, the process includes the following two steps:
+
+1. Send a login request to the server with username and password to get back from the server the JWT token.
+2. Add an authentication header with the JWT token to every consecutive request.
+
+Following are examples of how to log in with REST API and GraphQL API.
+
+#### Rest API
+
+```bash title="Rest API Curl Request Example"
+curl -X 'POST' \
+ 'https://[server-url]/api/login' \
+ -H 'accept: */*' \
+ -H 'Content-Type: application/json' \
+ -d '{
+ "username": "admin",
+ "password": "admin"
+}'
+```
+
+![Swagger playground for login endpoint.](./../getting-started/assets/authentication/auth-rest.png)
+
+#### GraphQL API
+
+```graphql
+mutation {
+ login(credentials: { username: "admin", password: "admin" }) {
+ accessToken
+ }
+}
+```
+
+#### Header with JWT Included
+
+
+
+```text title="JWT Authorization Header Example"
+ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoieW91IGFyZSBzb29vb28gY29vbCB0aGF0IHlvdSBjaGVjayB0aGF0ISIsIm5hbWUiOiJPZmVrIGdhYmF5IDspIiwiaWF0IjoxNTE2MjM5MDIyfQ.vaYJaP9SUlOU0u4NfFCRm5tmBVDKeCwvN6ByCkqJt8U
+```
+
+
+
+### Basic Authentication
+
+When using Basic HTTP authentication and sending a request to the API you must provide a Basic HTTP authentication header with the format:
+
+Authorization: 'type' 'credentials'
+
+where type is Basic and credentials is the Base64 encoding of a string "username:password".
+
+```text title="Basic Authentication Example"
+Authorization: Basic YWRtaW46YWRtaW4=
+```
+
+:::tip
+You can use a tool to create the header. There are several generators available, such as [https://www.blitter.se/utils/basic-authentication-header-generator/](https://www.blitter.se/utils/basic-authentication-header-generator/)
+:::
+
+## Next Steps
+
+After you've successfully added authentication to your service, you can do the following:
+
+1. Add authenticated users to your system.
+2. [Set up roles and permissions](/configure-roles-and-permissions/) for authorization.
diff --git a/docs/how-to/choose-configure-update-database.md b/docs/how-to/choose-configure-update-database.md
new file mode 100644
index 00000000..f9876c69
--- /dev/null
+++ b/docs/how-to/choose-configure-update-database.md
@@ -0,0 +1,67 @@
+---
+id: choose-configure-update-database
+title: How To Choose, Configure, and Update Your Database
+description: Learn how to choose, configure, and update your Amplication database using plugins.
+sidebar_label: Database Plugin Guide
+slug: /plugins/guides/database
+---
+
+# How To Choose, Configure, and Update Your Database
+
+One important part of setting up your Amplication service is choosing and configuring your database. Your database is a _plugin_ in Amplication, so you can operate it like other plugins.
+
+This guide will walk you through the process of selecting, configuring, and updating your database in Amplication.
+
+:::note
+Amplication's [Import Prisma Schema](/how-to/import-prisma-schema/) feature lets you use your existing databases and utilize the data you've already had in your existing app or service.
+:::
+
+## Choosing Your Database
+
+Amplication supports multiple database options. Here are the steps to choose your database:
+
+1. When [creating a new service](/first-service/) using the wizard in Amplication, you'll be required to select a database. If you're using [Jovu](/amplication-ai/) to create your service, you can specify a different database than the default.
+2. Choose from the available options, which may include:
+ - Microsoft SQL Server (default for .NET)
+ - PostgreSQL (default for Node.js)
+ - MongoDB
+ - MySQL
+
+Consider factors such as your team's familiarity with the database, scalability needs, and specific feature requirements when making your choice.
+
+![](./../plugins/assets/guides/choose-your-database.png)
+
+## Configuring Your Database
+
+Once you've chosen your database, you'll need to configure it for your Amplication project.
+
+1. In your Amplication service's dashboard, navigate to the "Plugins" tab and click on "Installed Plugins" in the left sidebar.
+2. You'll see all your installed plugins. Find your database and click on the `Settings` button to get taken to its configuration page. These JSON configuration options can include:
+ - Host
+ - Port
+ - Database name
+ - Username
+ - Password
+
+3. Replace the `host`, `port`, `user`, `dbName`, and `password` values with your specific database credentials. Click the Save button and your credentials will be applied by the plugin.
+4. To apply these changes to your generated code, click on the `Generate the code` button in the right sidebar.
+
+![Amplication Database Settings Configuration Page](./../plugins/assets/guides/db-settings.png)
+
+## Updating Your Database
+
+In Amplication, updating your database is as easy as uninstalling that specific db plugin and installing another.
+
+1. Proceed to the Installed Plugins tab. Uninstall your current database plugin.
+2. Click on the Database plugin category in the left sidebar and install a new database plugin.
+3. When you're ready to apply the changes click on the `Generate the code` button in the right sidebar.
+
+![Amplication Database Update DB](./../plugins/assets/guides/another-database.png)
+
+That's it! The generated code will include all the changes required to use the new database instead of the old one.
+
+## Best Practices
+
+1. **Testing**: Always test database changes in a development or staging environment before applying them to production.
+2. **Backups**: Regularly backup your database, especially before applying significant schema changes.
+3. **Performance**: Monitor your database performance and optimize queries as your application grows.
diff --git a/docs/how-to/create-service.md b/docs/how-to/create-service.md
index 08602141..901939cf 100644
--- a/docs/how-to/create-service.md
+++ b/docs/how-to/create-service.md
@@ -78,7 +78,7 @@ You're not locked into your choice - you can always change your database type la
## Step 6: Define Your Data Model
-Define entities and fields for your database. You can manually define your own or use a template provided by Amplication.
+Define entities and fields for your database. You can manually define your own or use pre-defined entities provided by Amplication at service creation.
:::info
Entities are the objects you want to keep track of in your app, like a User or a Product. They become tables in your database. Each row represents an instance of the entity.
diff --git a/docs/how-to/deploy.md b/docs/how-to/deploy.md
new file mode 100644
index 00000000..80ec1b82
--- /dev/null
+++ b/docs/how-to/deploy.md
@@ -0,0 +1,59 @@
+---
+id: deploy
+title: Amplication Deployment
+sidebar_label: Overview
+slug: /deploy
+---
+
+# Amplication Deployment
+
+Amplication provides flexible and powerful deployment options for services generated using our platform.
+This guide provides an overview of deployment options and links to specific instructions for various deployment targets.
+
+## Understanding Amplication's Deployment Architecture
+
+Every Amplication service consists of core components that work together to deliver your application:
+
+### Core Components
+
+1. **API Server**: Your main application server
+2. **Database**: Persistent data storage
+
+### Optional Components
+
+Depending on your service requirements, you may include:
+
+- Admin Interface (Pre-built administrative dashboard)
+- Message brokers (e.g., Kafka, RabbitMQ)
+- Caching solutions (e.g., Redis)
+- Other plugins
+
+All components are containerized and defined in your generated `docker-compose` file, making deployment consistent across environments.
+
+## Deployment Options
+
+When it comes to deployment, you have several options to choose from, allowing you to select the best approach for your development workflow and production needs.
+
+### Docker
+
+Amplication generates all necessary configuration and scripts for Docker deployment, making it easy to containerize your application.
+
+[Learn more about deploying with Docker](/deploy/docker-desktop)
+
+### Kubernetes
+
+For those looking to leverage the power of Kubernetes orchestration, Amplication provides the necessary plugins for a smooth deployment process.
+
+[Learn more about deploying to Kubernetes](/deploy/kubernetes)
+
+### Amazon Web Services (AWS) ECS
+
+Amplication has plugins that enable deployment to Amazon Web Services using Elastic Container Service (ECS). This option allows you to leverage AWS's managed container orchestration service for deploying, managing, and scaling your containerized applications.
+
+[Learn more about deploying to AWS ECS](/deploy/aws/ecs)
+
+## Request New Deployment Guides
+
+We're always looking to expand our deployment options to meet the needs of our users. Is there a specific deployment target or cloud provider you'd like to see covered in our documentation? We'd love to hear from you!
+
+[Contact us with your deployment guide requests](https://meetings-eu1.hubspot.com/paz-yanover/product-overview-vp-product)
diff --git a/docs/how-to/live-service-templates.md b/docs/how-to/live-service-templates.md
new file mode 100644
index 00000000..5dadbd0f
--- /dev/null
+++ b/docs/how-to/live-service-templates.md
@@ -0,0 +1,128 @@
+---
+title: Live Service Templates
+description: Learn about Amplication's Live Service Templates feature for creating and managing standardized services.
+sidebar_label: Live Service Templates
+slug: /live-service-templates
+---
+
+# Live Service Templates
+
+Live Service Templates provide a centralized way to create, maintain, and enforce standardized backend services through reusable templates that evolve with your organization's best practices.
+
+## Overview
+
+Live Service Templates introduce several key components:
+
+1. **Service Templates**: Pre-configured templates that serve as a foundation for creating and maintaining new services that follow your organization standards and best practices.
+2. **Template-based Services**: New services created from existing templates, inheriting all settings, configurations and plugins.
+3. **Template Management**: Tools for creating, editing, and maintaining service templates, with the ability to propagate template updates automatically to the services as pull requests with the required changes.
+
+## Create a Service Template
+
+Navigate to the [Platform Console](/platform-console) dashboard. Click on "Create Template".
+
+The Service Template Creation Wizard will guide you through the process of setting up your template.
+
+1. **Select Technologies**: Choose the name and back-end framework for your template.
+
+![Live Service Template Name and Stack](./assets/live-service-templates/name-and-stack.png)
+
+2. **Choose APIs**: Select which APIs to include (REST API, GraphQL API, or both). Also, decide whether to generate an Admin UI for your templated service.
+
+:::note
+GraphQL API and Admin UI are currently not available with the .NET generator.
+:::
+
+![Live Service Template Select APIs](./assets/live-service-templates/apis.png)
+
+3. **Database Selection**: Choose the database type for your template (e.g., PostgreSQL, MySQL, MongoDB, MS SQL Server).
+
+![Live Service Template Database Selection](./assets/live-service-templates/database.png)
+
+After completing these steps, your new service template will be created and added to the Platform Console.
+
+![Amplication Create New Template](./assets/live-service-templates/complete.png)
+
+## Manage Service Templates
+
+### Viewing Templates
+
+To view and manage your templates:
+
+1. Go to the Platform Console dashboard.
+2. You'll see a list of all your service templates, including their name, description, code generator type, and more.
+
+![Amplication Platform Console](./assets/amplication-platform-console.png)
+
+### Managing Plugins
+
+To manage plugins for your template:
+
+1. Go to the Plugins section of your service template.
+2. You can view all available plugins, installed plugins, or private plugins.
+3. To install a new plugin, select it from the available options and click "Install".
+
+:::note
+To learn more about Plugin Management and Private Plugins, visit the [Plugins page](/getting-started/plugins/) and [Private Plugins page](/private-plugins/).
+:::
+
+### Template Settings
+
+The Settings tab for service templates provides various configuration options:
+
+1. **General**: Update the template name and description.
+2. **APIs and Admin**: Toggle different API types (REST, GraphQL) and Admin UI.
+3. **Base Directories**: Set the root directory for code placement when using the sync with Git feature. You can use `{{SERVICE_NAME}}` as a placeholder for the service name which will be generated from the template.
+4. **Code Generator Version**: Select a specific version or use the latest.
+
+:::note
+While you can customize the Base Directories, we recommend keeping the `{{SERVICE_NAME}}` placeholder for better organization and consistency.
+:::
+
+![Service Template Dashboard](./assets/live-service-templates/settings.png)
+
+## Creating Services from Templates
+
+To create a new service based on a template:
+
+1. Go to the Service Catalog of your project.
+2. Click "Add Resource".
+3. Select "Service from Template".
+4. Choose the desired template from the dropdown menu.
+5. Provide a name for your new service.
+6. Click "Create" to generate the new service based on the selected template.
+
+![Amplication Create Services From Template](./assets/create-service-from-template.png)
+
+The new service will inherit all settings and plugins from the template. You can view these inherited configurations in the Pending Changes tab.
+
+## Update Service Templates
+
+When you update a service template:
+
+1. Make the desired changes (e.g., add new plugins, modify settings).
+2. Click "Publish New Version" to reach the Publish screen.
+3. Add a description for your changes and publish the version(s).
+
+The template definitions will be updated, with no immediate effect on the services created from this template.
+
+![Amplication Platform Changes](./assets/live-service-templates/platform-changes.png)
+
+## Propagate Template Changes to Services
+
+After updating a template, the changes can be applied to existing services through the following process:
+
+1. You will receive in-product notifications and emails about available service updates.
+2. Access the tech debt screen and use the upgrade option for the required services.
+3. This will create pending changes that include all template updates, plugins, and definitions.
+4. Review and apply these changes by choosing to "Generate the code" to update your services.
+
+This process will create a new commit with all the updated template configurations, plugins, and definitions.
+
+## Next Steps
+
+Now that you've created an individual template, you can start building a comprehensive collection of templates and [private plugins](/private-plugins/) that reflect your organization's best practices and standards. This approach helps ensure consistency and maintainability across all your services.
+
+:::tip
+For any questions or issues related to Live Service Templates, please contact our support team or join our [Discord community](https://discord.gg/amplication) for feedback and discussions.
+:::
\ No newline at end of file
diff --git a/docs/how-to/platform-console.md b/docs/how-to/platform-console.md
new file mode 100644
index 00000000..e2544136
--- /dev/null
+++ b/docs/how-to/platform-console.md
@@ -0,0 +1,104 @@
+---
+title: Platform Console
+description: Learn about Amplication's Platform Console, a hub for managing platform-wide features and configurations.
+sidebar_label: Platform Console
+slug: /platform-console
+---
+
+# Platform Console
+
+The **Platform Console** is a powerful feature in Amplication that provides a centralized hub for managing platform-wide features and configurations. It allows your team to oversee and maintain standardized practices across your services and projects.
+
+## Overview
+
+The Platform Console introduces several key tabs:
+
+1. [**Live Service Templates**](/live-service-templates): Pre-configured templates that serve as a foundation for creating and maintaining standardized services that follow your organization's best practices.
+2. [**Private Plugins**](/private-plugins/): Custom plugins visible only to your organization that can be added to templates or services to extend functionality and enforce your organization's standards.
+3. **Technical Debt Management**: Centralized tracking and resolution template and plugin changes across all your services.
+4. **Platform Changes**: In-depth overview of all changes made to templates and plugins since their last published versions.
+5. **Publish**: Version control and publish management for template and plugin updates.
+
+These tabs are managed through a dedicated Platform Console dashboard, separate from the Service Catalog.
+
+![Amplication Platform Console](./assets/amplication-platform-console.png)
+
+## Benefits
+
+- **Standardization**: Ensure all services follow organizational best practices and configurations with Live Service Templates and Private Plugins.
+- **Efficiency**: Quickly create new services based on your templates.
+- **Customization**: Create and use Private Plugins to tailor services to your organization's specific needs.
+- **Smooth Maintenance**: Update multiple services from a single location. When you update a template, all services using that template can automatically get a PR with the required changes.
+- **Technical Debt Prevention**: Implement evolving organization-wide best practices across all services through templates and private plugins, creating a scalable architecture that resists the accumulation of technical debt as your project grows.
+
+## Platform Console Features
+
+### Live Service Templates
+
+Live Service Templates is a powerful feature that allows you to create, manage, and use standardized templates for your backend services. Key aspects include:
+
+- **Template Creation**: Define reusable service templates with pre-configured settings and plugins.
+- **Service Generation**: Quickly create new services based on your defined templates.
+- **Template Management**: Edit and update templates, with the ability to propagate changes to services through automatic pull requests.
+
+For detailed information on creating and using Live Service Templates, please refer to our [Live Service Templates](/live-service-templates) documentation.
+
+### Private Plugins
+
+[Private plugins](/private-plugins/) allow you to create custom functionality specific to your organization's needs. These can be added to services or used in templates. These plugins let you build secure, proprietary integrations and define your organization's standards.
+
+:::note
+Creating and managing private plugins requires an Enterprise plan.
+:::
+
+To create a private plugin:
+
+1. In the Platform Console dashboard, navigate to the "Private Plugins" section.
+2. Click on "Create Private Repository".
+3. Connect to your plugin repository and add your existing private plugins to the project.
+
+### Technical Debt Management
+
+The Technical Debt tab helps you track and manage accumulated technical debt across all your services. It provides a comprehensive grid view of services that may be using outdated templates or plugins.
+
+For each service with technical debt, you can see:
+- Alert type (template or plugin updates)
+- Current version in use
+- Latest available version
+- Status (Active, Resolved, or Ignored)
+
+When you click "View Details" for any alert, you'll be taken to that specific service's technical debt tab where you can:
+- View detailed diffs comparing the old and new versions
+- Choose to ignore specific updates
+- Resolve technical debt using the "Upgrade" button and generating a new service version
+
+Team members associated with affected services receive notifications about technical debt alerts, helping maintain up-to-date and consistent services across your organization.
+
+### Platform Changes
+
+The Platform Changes tab provides an in-depth overview of all modifications made to templates and plugins since their last published versions. You can:
+- View detailed diffs of changes, such as plugin order updates or new plugin additions
+- See the exact code changes that will be applied
+- Review changes per template or plugin individually
+- Track what's changed since the last publish
+
+### Publish
+
+The Publish tab allows you to manage version control for template and plugin updates. Key features include:
+
+- Add version messages to describe your changes
+- Choose between publishing all changes or individual updates
+- Select version update type (major, minor, or patch)
+- Publish changes with different version messages for different templates/plugins
+
+:::note
+Publishing a new version of a template or plugin doesn't automatically update services using them. Updates become available in the Technical Debt tab, where you can review and apply them to specific services.
+:::
+
+## Conclusion
+
+The Platform Console enhances the maintainability of your backend services, ensures organizational standardization, reduces technical debt, and streamlines collaboration between platform and development teams.
+
+:::tip
+For any questions or issues related to the Platform Console, please join our [Discord community](https://discord.gg/amplication) for feedback and discussions.
+:::
\ No newline at end of file
diff --git a/docs/how-to/service-catalog.md b/docs/how-to/service-catalog.md
new file mode 100644
index 00000000..984d47c2
--- /dev/null
+++ b/docs/how-to/service-catalog.md
@@ -0,0 +1,111 @@
+---
+title: Service Catalog
+description: Learn about Amplication's Service Catalog. Manage, monitor, and configure your services through an intuitive interface.
+sidebar_label: Service Catalog
+slug: /service-catalog
+---
+
+The **Service Catalog** is your central hub for managing and monitoring all services within your Amplication project. It provides an intuitive interface to oversee your services, track their configurations, and manage changes effectively.
+
+The Service Catalog's main focus is the catalog view, which offers a comprehensive grid-based interface for managing your application services. This interface is designed to provide maximum visibility and control over your entire project.
+
+![Amplication Service Catalog](./assets/service-catalog/service-catalog.png)
+
+## Grid Columns
+The grid displays comprehensive information about each service through the following columns:
+
+- **Type** - Displays the resource type with visual indicators: purple brackets icon for services, green icon for message brokers, and distinct icons for other resource types
+- **Name** - The name of your service
+- **Owner** - Shows the assigned team or individual member responsible for the service. Clicking this field takes you to settings where you can modify ownership
+- **Code Generator** - Indicates the selected technology stack for the service
+- **Repository** - Shows the connected Git repository. Can be modified through the service's "Sync with Git" tab
+- **Description** - Custom description of your service, editable through the service settings
+- **Pending Changes** - Displays the number of uncommitted changes since the last build
+- **Last Build** - Shows build status (green checkmark for success) and timing (e.g., "2 days ago"). Clicking navigates to the specific commit details
+- **Code Gen Version** - Displays the current code generator version with status indicators:
+ - Lightning bolt: automatically updates to latest version
+ - Lock icon: version is locked to specific release
+- **Template** - Shows if the service was created from a template (orange icon). Clicking navigates to template details
+- **Template Version** - Displays the current template version number, which increments with each newly published template
+- **Actions** - Provides access to available operations for the service
+
+## Customizing the Grid
+
+### Column Management
+
+- Drag columns left or right to reorder them
+- Resize columns by dragging their edges
+- Show/hide columns by clicking on the filter icon next to search
+
+### Sorting
+
+Click any column header to sort the grid:
+
+- First click: Sort in ascending order
+- Second click: Sort in descending order
+- Third click: Remove sorting
+
+### Filter View
+
+![Add filter to grid](./assets/service-catalog/above-grid-add-filter.png)
+
+You can filter the data that displays on your grid beyond the column management filters.
+For example, you can filter by properties, resource types, project, ownership, and more.
+
+To apply filters, click the "Add filter" button above the grid, select your desired filter type, and refine the filter criteria by clicking on the added filter component to narrow down your view.
+
+### Teams Organization
+
+Teams provide an additional layer of service organization and ownership management.
+
+The owner (team or individual) is prominently displayed in the Service Catalog grid, allowing quick identification of who's responsible for each service.
+You can click the owner field to modify ownership settings directly.
+
+To set up and manage teams in your workspace, follow these steps:
+
+1. Access Teams through the Teams tab in your workspace dashboard
+2. Create new teams with:
+ - Custom names
+ - Descriptions
+ - Distinctive colors (appears in the service catalog grid)
+3. Add team members
+4. Assign services to teams or individual members for ownership
+
+### Properties
+
+Properties allow custom organization of your services:
+
+1. Access Properties through the Properties tab in your workspace dashboard.
+2. Create new properties with:
+ - Custom name and key
+ - Optional description
+ - Type selection:
+ - **Select**: Single choice from predefined options
+ - **Multi-select**: Multiple choices from predefined options
+ - **Text**: Simple text field
+ - **Link**: URL reference
+3. For Select and Multi-select types:
+ - Define custom options
+ - Assign colors to options for visual organization in the grid
+
+## Pending Changes Sidebar
+
+The Pending Changes sidebar shows you modifications across your services, including:
+
+- Plugin additions or updates
+- Entity modifications
+- Service configuration changes
+- Template applications
+
+When you're ready to apply changes, click the "Generate the code" button to build all services with pending modifications.
+
+![Amplication Service Catalog Pending Changes Sidebar](./assets/service-catalog/pending-changes-sidebar.png)
+
+## Next Steps
+
+Now that you're familiar with the Service Catalog, explore these additional capabilities:
+
+- Create [live templates](/live-service-templates/) to standardize service configurations
+- Develop [private plugins](/private-plugins/) to extend functionality
+- Build and deploy [new versions](/building-new-versions/) of your services
+- Integrate [custom code](/how-to/custom-code/) into your generated services
diff --git a/docs/platform-features/assets/alert-properties.png b/docs/platform-features/assets/alert-properties.png
new file mode 100644
index 00000000..033f090f
Binary files /dev/null and b/docs/platform-features/assets/alert-properties.png differ
diff --git a/docs/platform-features/assets/alert-settings.png b/docs/platform-features/assets/alert-settings.png
new file mode 100644
index 00000000..3e40865b
Binary files /dev/null and b/docs/platform-features/assets/alert-settings.png differ
diff --git a/docs/platform-features/assets/alert-types.png b/docs/platform-features/assets/alert-types.png
new file mode 100644
index 00000000..33f5e702
Binary files /dev/null and b/docs/platform-features/assets/alert-types.png differ
diff --git a/docs/platform-features/assets/resolve-technical-debt.png b/docs/platform-features/assets/resolve-technical-debt.png
new file mode 100644
index 00000000..00c81223
Binary files /dev/null and b/docs/platform-features/assets/resolve-technical-debt.png differ
diff --git a/docs/platform-features/assets/service-level-technical-debt.png b/docs/platform-features/assets/service-level-technical-debt.png
new file mode 100644
index 00000000..cbc50d65
Binary files /dev/null and b/docs/platform-features/assets/service-level-technical-debt.png differ
diff --git a/docs/platform-features/assets/technical-debt-grid.png b/docs/platform-features/assets/technical-debt-grid.png
new file mode 100644
index 00000000..4258ee47
Binary files /dev/null and b/docs/platform-features/assets/technical-debt-grid.png differ
diff --git a/docs/platform-features/technical-debt-management.md b/docs/platform-features/technical-debt-management.md
new file mode 100644
index 00000000..de5efbf6
--- /dev/null
+++ b/docs/platform-features/technical-debt-management.md
@@ -0,0 +1,120 @@
+---
+id: technical-debt-management
+title: Technical Debt Management
+sidebar_label: Technical Debt Management
+description: Comprehensive guide to managing technical debt in Amplication
+---
+
+# Technical Debt Management
+
+Amplication's Technical Debt Management system helps you maintain alignment between your services and organizational standards as they evolve. This feature provides automated alerts, easy updates, and comprehensive tracking to ensure your services stay current with the latest templates, plugins, and best practices.
+
+![Technical Debt Management Tab](./assets/technical-debt-grid.png)
+
+## Key Features
+
+- **Automated Technical Debt Detection**: Receive alerts when services, templates, or plugins become outdated
+- **Centralized Management**: Track and resolve technical debt across all services from a single dashboard
+- **Git Sync Integration**: Automated pull request generation for updates using [Smart Git Sync](/smart-git-sync/).
+- **Flexible Resolution Options**: Choose when and how to address technical debt
+- **Notification System**: Stay informed through in-app and email notifications
+
+## Accessing Technical Debt Management
+
+1. Navigate to the Platform Console by clicking "Platform" in the top left corner
+2. Select the "Tech Debt" tab
+
+## Understanding Technical Debt Alerts
+
+### Alert Types
+
+Amplication tracks three primary categories of technical debt:
+
+1. **Template Alerts**: Notify when a service needs updating to match new template versions
+2. **Plugin Alerts**: Indicate when plugin updates are available or when plugins require attention
+3. **Amplication Code Engine Alerts**: Signal updates to Amplication's code generation engine
+
+![Technical Debt Alert Types](./assets/alert-types.png)
+
+### Alert Properties
+
+Each alert contains essential information:
+- **Alert Type**: Specifies whether the alert is related to templates, plugins, or the code engine
+- **Affected Resource**: Identifies the specific service or template that requires attention
+- **Current Version in Use**: The version of the template, plugin, or code engine currently being used
+- **Latest Available Version**: The most recent version available for update
+- **Alert Creation Date**: The date when the system identified the technical debt
+- **Alert Status**: Current state of the alert (Active, Resolved, Ignored, or Canceled)
+
+![Technical Alert Properties](./assets/alert-properties.png)
+
+## Managing Technical Debt
+
+### Viewing Alerts
+
+The Technical Debt dashboard provides a comprehensive view of all alerts:
+
+1. **Status Filter**: Filter alerts by:
+ - Active (default view)
+ - Resolved
+ - Ignored
+ - Canceled
+
+2. **Type Filter**: Filter by:
+ - Template alerts
+ - Plugin alerts
+ - Code Engine alerts
+
+## Resolving Technical Debt
+
+### Template Updates
+
+1. Click "View Details" on a template alert
+2. Review the changes between versions in the diff view
+3. Click "Upgrade" to accept the changes
+4. Confirm the upgrade in the modal dialog
+
+:::note
+After upgrading, changes become pending changes. Generate code to create individual PRs for the updates using the code generation workflow.
+:::
+
+![Resolve Technical Debt on the Service-level](./assets/resolve-technical-debt.png)
+
+### Plugin Updates
+
+For services using "latest" version:
+1. Click "View Details" on the plugin alert
+2. The plugin will automatically update on the next code generation
+
+For services using pinned versions:
+1. Click "View Details"
+2. Generate code to apply changes
+
+
+## Notification Settings
+
+Customize how you receive technical debt alerts:
+
+1. Click the bell icon in the upper right corner
+2. Scroll to "Technical Debt Alert" settings
+3. Configure preferences for:
+ - In-app notifications
+ - Email notifications
+
+![Technical Debt Alert Settings](./assets/alert-settings.png)
+
+## Integration with Development Workflow
+
+Technical debt management integrates seamlessly with your development process:
+
+1. **Alert Detection**: Amplication automatically detects when services drift from standards
+2. **Review Process**: Team members can review and approve updates
+3. **Code Generation**: Updates are applied through your normal code generation workflow
+4. **Git Workflow**: Changes are managed through your existing Git workflow
+
+## Related Resources
+
+If you need additional support, please contact Amplication support team for assistance.
+
+- [Live Templates](/live-service-templates/)
+- [Private Plugins](/private-plugins/)
\ No newline at end of file
diff --git a/docs/plugins/assets/guides/another-database.png b/docs/plugins/assets/guides/another-database.png
new file mode 100644
index 00000000..6056b93c
Binary files /dev/null and b/docs/plugins/assets/guides/another-database.png differ
diff --git a/docs/plugins/assets/guides/choose-your-database.png b/docs/plugins/assets/guides/choose-your-database.png
new file mode 100644
index 00000000..61655504
Binary files /dev/null and b/docs/plugins/assets/guides/choose-your-database.png differ
diff --git a/docs/plugins/assets/guides/db-settings.png b/docs/plugins/assets/guides/db-settings.png
new file mode 100644
index 00000000..55eec2b8
Binary files /dev/null and b/docs/plugins/assets/guides/db-settings.png differ
diff --git a/docs/plugins/assets/private-plugins/add-new-plugin.png b/docs/plugins/assets/private-plugins/add-new-plugin.png
new file mode 100644
index 00000000..ca102670
Binary files /dev/null and b/docs/plugins/assets/private-plugins/add-new-plugin.png differ
diff --git a/docs/plugins/assets/private-plugins/add-new-version.png b/docs/plugins/assets/private-plugins/add-new-version.png
new file mode 100644
index 00000000..d4a529b1
Binary files /dev/null and b/docs/plugins/assets/private-plugins/add-new-version.png differ
diff --git a/docs/plugins/assets/private-plugins/add-private-plugin-to-service.png b/docs/plugins/assets/private-plugins/add-private-plugin-to-service.png
new file mode 100644
index 00000000..ccd4b1c2
Binary files /dev/null and b/docs/plugins/assets/private-plugins/add-private-plugin-to-service.png differ
diff --git a/docs/plugins/assets/private-plugins/configure-git-settings.png b/docs/plugins/assets/private-plugins/configure-git-settings.png
new file mode 100644
index 00000000..28d15d55
Binary files /dev/null and b/docs/plugins/assets/private-plugins/configure-git-settings.png differ
diff --git a/docs/plugins/assets/private-plugins/dotnet-postgres-db.png b/docs/plugins/assets/private-plugins/dotnet-postgres-db.png
new file mode 100644
index 00000000..f63002db
Binary files /dev/null and b/docs/plugins/assets/private-plugins/dotnet-postgres-db.png differ
diff --git a/docs/plugins/assets/private-plugins/plugin-template.png b/docs/plugins/assets/private-plugins/plugin-template.png
new file mode 100644
index 00000000..eaea517c
Binary files /dev/null and b/docs/plugins/assets/private-plugins/plugin-template.png differ
diff --git a/docs/plugins/assets/private-plugins/private-plugins-repo.png b/docs/plugins/assets/private-plugins/private-plugins-repo.png
new file mode 100644
index 00000000..3ae6bd91
Binary files /dev/null and b/docs/plugins/assets/private-plugins/private-plugins-repo.png differ
diff --git a/docs/plugins/assets/private-plugins/publish-changes.png b/docs/plugins/assets/private-plugins/publish-changes.png
new file mode 100644
index 00000000..110881a1
Binary files /dev/null and b/docs/plugins/assets/private-plugins/publish-changes.png differ
diff --git a/docs/plugins/assets/private-plugins/settings.png b/docs/plugins/assets/private-plugins/settings.png
new file mode 100644
index 00000000..e231ca21
Binary files /dev/null and b/docs/plugins/assets/private-plugins/settings.png differ
diff --git a/docs/plugins/before-after.md b/docs/plugins/before-after.md
index 72780528..5a36baa8 100644
--- a/docs/plugins/before-after.md
+++ b/docs/plugins/before-after.md
@@ -7,7 +7,9 @@ slug: /plugins/plugin-events/plugin-events-before-after
# Before and After Lifecycle Functions
-All events expose an identical interface with two functions that can be handled by the plugin and responsible for a different step in the lifecycle of the event. One for “before” the event is emitted and another for “after” the event is emitted.
+All events expose an identical interface with two functions that can be handled by the plugin and responsible for a different step in the lifecycle of the event. One for "before" the event is emitted and another for "after" the event is emitted.
+
+## Event Structure and Parameters
```tsx
export interface PluginEventType {
@@ -20,26 +22,48 @@ For each event, the type of `EventParams` is different, providing access to rele
```tsx
export interface EventParams {}
+```
+
+## Before and After Function Signatures
+```tsx
export type PluginBeforeEvent = (
dsgContext: DsgContext,
eventParams: T
) => Promisable;
+// Node.js [version](https://github.com/amplication/amplication/blob/master/libs/util/code-gen-types/src/plugins.types.ts#L21)
export type PluginAfterEvent = (
dsgContext: DsgContext,
eventParams: T,
modules: ModuleMap
) => Promisable;
+
+// .NET [version](https://github.com/amplication/amplication/blob/master/libs/util/code-gen-types/src/dotnet-plugins.types.ts#L22)
+export type PluginAfterEvent = (
+ dsgContext: DsgContext,
+ eventParams: T,
+ files: FileMap
+) => Promisable>;
```
In the `before` and `after` functions, we have an access to the context and the event params.
The [context](docs\plugins\context.md) is used to gather common parts between events.
The event params manipulate the default behavior by passing different values.
-In the `after` function, we also have access to the generated modules. An example of using this parameter is when you want to restructure the generated modules in a different folder structure.
+## Accessing and Modifying Generated Files
+
+In the `after` function, we also have access to the generated files. An example of using this parameter is when you want to restructure the generated files in a different folder structure.
+
+:::info
+In the `after` function for .NET plugins, we use a [`FileMap`](https://github.com/amplication/amplication/blob/master/libs/util/code-gen-types/src/files/file-map.ts). For Node.js plugins' `after` function we use a [`ModuleMap`](https://github.com/amplication/amplication/blob/master/libs/util/code-gen-types/src/code-gen-types.ts#L149).
+:::
+
+## Function Examples
+
+Most of the functions include examples. But, if you're looking for more comprehensive and real-world examples, you can explore the [code of the Amplication plugins](https://github.com/amplication/plugins/tree/master/plugins) directly. These plugins showcase various implementations and use cases for the before and after lifecycle functions.
-## Cautionary Guidelines
+## Best Practices and Cautions
1. In the `after` function, avoid unintentionally overriding the entire generated file. Opt for smaller changes instead.
2. In the `before` function, take care when modifying templates to not unintentionally affect code generation.
diff --git a/docs/plugins/define-plugin-settings.md b/docs/plugins/define-plugin-settings.md
index 9615f296..7367f93e 100644
--- a/docs/plugins/define-plugin-settings.md
+++ b/docs/plugins/define-plugin-settings.md
@@ -13,7 +13,7 @@ This file lives at the root of your plugin directory.
It contains two properties at the root level:
- `settings`: User-facing configuration.
-- `systemSettings` - Internal configuration.
+- `systemSettings`: Internal configuration.
```json title=".amplicationrc.json"
{
@@ -25,7 +25,7 @@ It contains two properties at the root level:
"dbName": "my-db"
},
"systemSettings": {
- "requireAuth": true
+ "requireAuthenticationEntity": true
}
}
```
@@ -52,9 +52,7 @@ The `systemSettings` property is used to contain internal configuration that you
These settings are **not visible to the user** and are solely for use in your plugin's code.
:::caution
-**`systemSettings` is currently only available for internal developers** and not community developers.
-For now, use `systemSettings` to structure your `.amplicationrc.json` correctly.
-In the future, more documentation will be provided on what internal `systemSettings` are available.
+`requireAuthenticationEntity` is the only property available in the systemSettings configuration object. Also, **`systemSettings` is currently only available for internal developers** and not community developers.
:::
## Examples
diff --git a/docs/plugins/dotnet-plugin-events-reference.md b/docs/plugins/dotnet-plugin-events-reference.md
new file mode 100644
index 00000000..e7fd5cf4
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events-reference.md
@@ -0,0 +1,1833 @@
+---
+id: dotnet-plugin-events-reference
+title: .NET Plugin Events - Reference
+sidebar_label: .NET Plugin Events - Reference
+slug: /plugins/dotnet-plugin-events-reference
+toc_max_heading_level: 2
+---
+
+# .NET Plugin Events - Reference
+
+This comprehensive reference provides detailed information about each .NET plugin event, its available parameters, and in-depth examples. Developers can use this guide to understand how to interact with and customize the .NET code generation process in Amplication.
+
+## CreateEntityController
+
+Creates a controller for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityController`
+
+### Event Params
+
+```ts
+export interface CreateEntityControllerParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+ entityActions: entityActions;
+}
+```
+
+#### entity
+
+The entity object for which the controller is being created.
+
+#### resourceName
+
+The name of the resource (typically the entity name).
+
+#### apisDir
+
+The directory where the API controllers are being generated.
+
+#### entityActions
+
+An object containing the CRUD actions available for the entity.
+
+Example:
+
+```ts
+async afterCreateEntityController(
+ context: DsgContext,
+ eventParams: CreateEntityControllerParams,
+ modules: ModuleMap
+) {
+ const { entity, resourceName, apisDir } = eventParams;
+ const controllerPath = join(apisDir, `${resourceName}Controller.cs`);
+ const controllerFile = modules.get(controllerPath);
+
+ if (controllerFile) {
+ const updatedCode = controllerFile.code.replace(
+ "public class",
+ "[ApiVersion(\"1.0\")]\npublic class"
+ );
+
+ modules.set({
+ path: controllerPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityControllerBase
+
+Creates a base controller for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityControllerBase`
+
+### Event Params
+
+```ts
+export interface CreateEntityControllerBaseParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+ moduleActions: ModuleAction[];
+ entities: Entity[];
+}
+```
+
+#### moduleActions
+
+An array of module actions available for the entity.
+
+#### entities
+
+An array of all entities in the application.
+
+Example:
+
+```ts
+async afterCreateEntityControllerBase(
+ context: DsgContext,
+ eventParams: CreateEntityControllerBaseParams,
+ modules: ModuleMap
+) {
+ const { resourceName, apisDir } = eventParams;
+ const controllerBasePath = join(apisDir, `${resourceName}ControllerBase.cs`);
+ const controllerBaseFile = modules.get(controllerBasePath);
+
+ if (controllerBaseFile) {
+ const updatedCode = controllerBaseFile.code.replace(
+ "public abstract class",
+ "[ApiController]\n[Route(\"api/[controller]\")]\npublic abstract class"
+ );
+
+ modules.set({
+ path: controllerBasePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityGrpcController
+
+Creates a gRPC controller for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityGrpcController`
+
+### Event Params
+
+```ts
+export interface CreateEntityGrpcControllerParams extends EventParams {
+ entity: Entity;
+}
+```
+
+#### entity
+
+The entity object for which the gRPC controller is being created.
+
+Example:
+
+```ts
+async afterCreateEntityGrpcController(
+ context: DsgContext,
+ eventParams: CreateEntityGrpcControllerParams,
+ modules: ModuleMap
+) {
+ const { entity } = eventParams;
+ const controllerPath = join(context.serverDirectories.srcDirectory, "GrpcControllers", `${entity.name}GrpcController.cs`);
+ const controllerFile = modules.get(controllerPath);
+
+ if (controllerFile) {
+ const updatedCode = controllerFile.code.replace(
+ "public class",
+ "[GrpcService]\npublic class"
+ );
+
+ modules.set({
+ path: controllerPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityGrpcControllerBase
+
+Creates a base gRPC controller for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityGrpcControllerBase`
+
+### Event Params
+
+```ts
+export interface CreateEntityGrpcControllerBaseParams extends EventParams {
+ entity: Entity;
+}
+```
+
+#### entity
+
+The entity object for which the base gRPC controller is being created.
+
+Example:
+
+```ts
+async afterCreateEntityGrpcControllerBase(
+ context: DsgContext,
+ eventParams: CreateEntityGrpcControllerBaseParams,
+ modules: ModuleMap
+) {
+ const { entity } = eventParams;
+ const controllerBasePath = join(context.serverDirectories.srcDirectory, "GrpcControllers", `${entity.name}GrpcControllerBase.cs`);
+ const controllerBaseFile = modules.get(controllerBasePath);
+
+ if (controllerBaseFile) {
+ const updatedCode = controllerBaseFile.code.replace(
+ "public abstract class",
+ "public abstract class"
+ );
+
+ modules.set({
+ path: controllerBasePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityControllerSpec
+
+Creates the controller spec file for the entity controller.
+
+### Event Name
+
+`CreateEntityControllerSpec`
+
+### Event Params
+
+```ts
+export interface CreateEntityControllerSpecParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityControllerSpec(
+ context: DsgContext,
+ eventParams: CreateEntityControllerSpecParams,
+ modules: ModuleMap
+) {
+ const { entity, resourceName, apisDir } = eventParams;
+ const specPath = join(apisDir, "Tests", `${resourceName}ControllerTests.cs`);
+ const specFile = modules.get(specPath);
+
+ if (specFile) {
+ const updatedCode = specFile.code.replace(
+ "public class",
+ "[TestClass]\npublic class"
+ );
+
+ modules.set({
+ path: specPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateServerAuth
+
+Sets up authentication for the .NET server.
+
+### Event Name
+
+`CreateServerAuth`
+
+### Event Params
+
+```ts
+export interface CreateServerAuthParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+## CreateAdminDotEnv
+
+Creates the .env file for the admin UI.
+
+### Event Name
+
+`CreateAdminDotEnv`
+
+### Event Params
+
+```ts
+export interface CreateAdminDotEnvParams extends EventParams {
+ envVariables: VariableDictionary;
+}
+```
+
+Example:
+
+```ts
+beforeCreateAdminDotEnv(
+ context: DsgContext,
+ eventParams: CreateAdminDotEnvParams
+) {
+ eventParams.envVariables.push(
+ { REACT_APP_API_URL: "http://localhost:3000/api" },
+ { REACT_APP_SERVER_URL: "http://localhost:3000" }
+ );
+ return eventParams;
+}
+```
+
+## CreateAdminUI
+
+Creates the admin UI for the .NET application.
+
+### Event Name
+
+`CreateAdminUI`
+
+### Event Params
+
+```ts
+export interface CreateAdminUIParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+## CreateServer
+
+Initializes the creation of the .NET server.
+
+### Event Name
+
+`CreateServer`
+
+### Event Params
+
+```ts
+export interface CreateServerParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+## CreateServerAppModule
+
+Creates the main application module for the .NET server.
+
+### Event Name
+
+`CreateServerAppModule`
+
+### Event Params
+
+```ts
+export interface CreateServerAppModuleParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+## CreateProgramFile
+
+Creates the main Program.cs file for the .NET application.
+
+### Event Name
+
+`CreateProgramFile`
+
+### Event Params
+
+```ts
+export interface CreateProgramFileParams extends EventParams {
+ builderServicesBlocks: CodeBlock[];
+ appBlocks: CodeBlock[];
+}
+```
+
+Example:
+
+```ts
+beforeCreateProgramFile(
+ context: DsgContext,
+ eventParams: CreateProgramFileParams
+) {
+ eventParams.builderServicesBlocks.push({
+ code: "builder.Services.AddSwaggerGen();",
+ comment: "Add Swagger generator"
+ });
+
+ eventParams.appBlocks.push({
+ code: `
+if (app.Environment.IsDevelopment())
+{
+ app.UseSwagger();
+ app.UseSwaggerUI();
+}`,
+ comment: "Configure Swagger middleware"
+ });
+
+ return eventParams;
+}
+```
+
+## CreateServerGitIgnore
+
+Creates the .gitignore file for the server.
+
+### Event Name
+
+`CreateServerGitIgnore`
+
+### Event Params
+
+```ts
+export interface CreateServerGitIgnoreParams extends EventParams {
+ gitignorePaths: string[];
+}
+```
+
+Example:
+
+```ts
+beforeCreateServerGitIgnore(
+ context: DsgContext,
+ eventParams: CreateServerGitIgnoreParams
+) {
+ eventParams.gitignorePaths.push(
+ "*.user",
+ "*.userosscache",
+ "*.sln.docstates"
+ );
+ return eventParams;
+}
+```
+
+## CreateAdminGitIgnore
+
+Creates the .gitignore file for the admin UI.
+
+### Event Name
+
+`CreateAdminGitIgnore`
+
+### Event Params
+
+```ts
+export interface CreateAdminGitIgnoreParams extends EventParams {
+ gitignorePaths: string[];
+}
+```
+
+Example:
+
+```ts
+beforeCreateAdminGitIgnore(
+ context: DsgContext,
+ eventParams: CreateAdminGitIgnoreParams
+) {
+ eventParams.gitignorePaths.push(
+ "node_modules",
+ "build",
+ ".env.local"
+ );
+ return eventParams;
+}
+```
+
+## CreateMessageBroker
+
+Sets up the message broker configuration for the .NET server.
+
+### Event Name
+
+`CreateMessageBroker`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+## CreateMessageBrokerTopicsEnum
+
+Creates the message broker topics enum.
+
+### Event Name
+
+`CreateMessageBrokerTopicsEnum`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerTopicsEnumParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+## CreateMessageBrokerNestJSModule
+
+Creates the NestJS module for the message broker.
+
+:::note
+This event is typically not used in .NET projects
+:::
+
+### Event Name
+
+`CreateMessageBrokerNestJSModule`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerNestJSModuleParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+## CreateMessageBrokerClientOptionsFactory
+
+Creates the client options factory for the message broker.
+
+### Event Name
+
+`CreateMessageBrokerClientOptionsFactory`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerClientOptionsFactoryParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+## CreateMessageBrokerService
+
+Creates the service for the message broker.
+
+### Event Name
+
+`CreateMessageBrokerService`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerServiceParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+## CreateMessageBrokerServiceBase
+
+Creates the base service for the message broker.
+
+### Event Name
+
+`CreateMessageBrokerServiceBase`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerServiceBaseParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+## CreateEntityService
+
+Creates a service for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityService`
+
+### Event Params
+
+```ts
+export interface CreateEntityServiceParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+ entityActions: entityActions;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityService(
+ context: DsgContext,
+ eventParams: CreateEntityServiceParams,
+ modules: ModuleMap
+) {
+ const { entity, resourceName, apisDir } = eventParams;
+ const servicePath = join(apisDir, `${resourceName}Service.cs`);
+ const serviceFile = modules.get(servicePath);
+
+ if (serviceFile) {
+ const updatedCode = serviceFile.code + `
+ public async Task<${entity.name}> CustomOperation(int id)
+ {
+ // Add custom business logic here
+ return await _context.${entity.pluralName}.FindAsync(id);
+ }
+ `;
+
+ modules.set({
+ path: servicePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityServiceBase
+
+Creates a base service for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityServiceBase`
+
+### Event Params
+
+```ts
+export interface CreateEntityServiceBaseParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+ moduleActions: ModuleAction[];
+ entities: Entity[];
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityServiceBase(
+ context: DsgContext,
+ eventParams: CreateEntityServiceBaseParams,
+ modules: ModuleMap
+) {
+ const { resourceName, apisDir } = eventParams;
+ const serviceBasePath = join(apisDir, `${resourceName}ServiceBase.cs`);
+ const serviceBaseFile = modules.get(serviceBasePath);
+
+ if (serviceBaseFile) {
+ const updatedCode = serviceBaseFile.code + `
+ protected async Task EntityExists(int id)
+ {
+ return await _context.Set().AnyAsync(e => e.Id == id);
+ }
+ `;
+
+ modules.set({
+ path: serviceBasePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateServerDockerCompose
+
+Creates or updates the Docker Compose file for the .NET server.
+
+### Event Name
+
+`CreateServerDockerCompose`
+
+### Event Params
+
+```ts
+export interface CreateServerDockerComposeParams extends EventParams {
+ fileContent: string;
+ updateProperties: { [key: string]: any }[];
+ outputFileName: string;
+}
+```
+
+Example:
+
+```ts
+beforeCreateServerDockerCompose(
+ context: DsgContext,
+ eventParams: CreateServerDockerComposeParams
+) {
+ const additionalServices = {
+ services: {
+ redis: {
+ image: "redis:alpine",
+ ports: ["6379:6379"]
+ }
+ }
+ };
+
+ eventParams.updateProperties.push(additionalServices);
+ return eventParams;
+}
+```
+
+## CreatePrismaSchema
+
+Creates the Prisma schema for the application.
+
+### Event Name
+
+`CreatePrismaSchema`
+
+### Event Params
+
+```ts
+export interface CreatePrismaSchemaParams extends EventParams {
+ entities: Entity[];
+ dataSource: PrismaDataSource;
+ clientGenerator: PrismaClientGenerator;
+}
+```
+
+Example:
+
+```ts
+beforeCreatePrismaSchema(
+ context: DsgContext,
+ eventParams: CreatePrismaSchemaParams
+) {
+ // Modify Prisma schema generation
+ return eventParams;
+}
+```
+
+## CreateServerCsproj
+
+Creates or updates the .csproj file for the .NET server.
+
+### Event Name
+
+`CreateServerCsproj`
+
+### Event Params
+
+```ts
+export interface CreateServerCsprojParams extends EventParams {
+ propertyGroup: Record;
+ packageReferences: {
+ include: string;
+ version: string;
+ includeAssets?: string;
+ privateAssets?: string;
+ }[];
+}
+```
+
+Example:
+
+```ts
+beforeCreateServerCsproj(
+ context: DsgContext,
+ eventParams: CreateServerCsprojParams
+) {
+ eventParams.propertyGroup = {
+ ...eventParams.propertyGroup,
+ "TargetFramework": "net6.0",
+ "ImplicitUsings": "enable"
+ };
+
+ eventParams.packageReferences.push({
+ include: "Swashbuckle.AspNetCore",
+ version: "6.2.3"
+ });
+
+ return eventParams;
+}
+```
+
+## CreateServerAppsettings
+
+Creates or updates the appsettings.json file for the .NET server.
+
+### Event Name
+
+`CreateServerAppsettings`
+
+### Event Params
+
+```ts
+export interface CreateServerAppsettingsParams extends EventParams {
+ updateProperties: { [key: string]: any };
+}
+```
+
+Example:
+
+```ts
+beforeCreateServerAppsettings(
+ context: DsgContext,
+ eventParams: CreateServerAppsettingsParams
+) {
+ eventParams.updateProperties = {
+ ...eventParams.updateProperties,
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ },
+ "AllowedHosts": "*"
+ };
+ return eventParams;
+}
+```
+
+## CreateAdminUIPackageJson
+
+Creates or updates the package.json file for the admin UI.
+
+### Event Name
+
+`CreateAdminUIPackageJson`
+
+### Event Params
+
+```ts
+export interface CreateAdminUIPackageJsonParams extends EventParams {
+ updateProperties: { [key: string]: any };
+}
+```
+
+Example:
+
+```ts
+beforeCreateAdminUIPackageJson(
+ context: DsgContext,
+ eventParams: CreateAdminUIPackageJsonParams
+) {
+ eventParams.updateProperties = {
+ ...eventParams.updateProperties,
+ "scripts": {
+ "start": "react-scripts start",
+ "build": "react-scripts build",
+ "test": "react-scripts test",
+ "eject": "react-scripts eject"
+ }
+ };
+ return eventParams;
+}
+```
+
+## CreateEntityModule
+
+Creates a module for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityModule`
+
+### Event Params
+
+```ts
+export interface CreateEntityModuleParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityModule(
+ context: DsgContext,
+ eventParams: CreateEntityModuleParams,
+ modules: ModuleMap
+) {
+ const { resourceName, apisDir } = eventParams;
+ const modulePath = join(apisDir, `${resourceName}Module.cs`);
+ const moduleFile = modules.get(modulePath);
+
+ if (moduleFile) {
+ const updatedCode = moduleFile.code.replace(
+ "public class",
+ "[Module]\npublic class"
+ );
+
+ modules.set({
+ path: modulePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityModuleBase
+
+Creates a base module for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityModuleBase`
+
+### Event Params
+
+```ts
+export interface CreateEntityModuleBaseParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityModuleBase(
+ context: DsgContext,
+ eventParams: CreateEntityModuleBaseParams,
+ modules: ModuleMap
+) {
+ const { resourceName, apisDir } = eventParams;
+ const moduleBasePath = join(apisDir, `${resourceName}ModuleBase.cs`);
+ const moduleBaseFile = modules.get(moduleBasePath);
+
+ if (moduleBaseFile) {
+ const updatedCode = moduleBaseFile.code + `
+ protected virtual void ConfigureAdditionalServices(IServiceCollection services)
+ {
+ // Add additional service configuration here
+ }
+ `;
+
+ modules.set({
+ path: moduleBasePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityResolver
+
+Creates a resolver for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityResolver`
+
+### Event Params
+
+```ts
+export interface CreateEntityResolverParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityResolver(
+ context: DsgContext,
+ eventParams: CreateEntityResolverParams,
+ modules: ModuleMap
+) {
+ const { resourceName, apisDir } = eventParams;
+ const resolverPath = join(apisDir, `${resourceName}Resolver.cs`);
+ const resolverFile = modules.get(resolverPath);
+
+ if (resolverFile) {
+ const updatedCode = resolverFile.code.replace(
+ "public class",
+ "[GraphQLResolver]\npublic class"
+ );
+
+ modules.set({
+ path: resolverPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityResolverBase
+
+Creates a base resolver for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityResolverBase`
+
+### Event Params
+
+```ts
+export interface CreateEntityResolverBaseParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityResolverBase(
+ context: DsgContext,
+ eventParams: CreateEntityResolverBaseParams,
+ modules: ModuleMap
+) {
+ const { resourceName, apisDir } = eventParams;
+ const resolverBasePath = join(apisDir, `${resourceName}ResolverBase.cs`);
+ const resolverBaseFile = modules.get(resolverBasePath);
+
+ if (resolverBaseFile) {
+ const updatedCode = resolverBaseFile.code + `
+ protected virtual IQueryable ApplyDefaultOrdering(IQueryable query)
+ {
+ return query.OrderBy(e => e.Id);
+ }
+ `;
+
+ modules.set({
+ path: resolverBasePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateSwagger
+
+Creates the Swagger configuration for the .NET application.
+
+### Event Name
+
+`CreateSwagger`
+
+### Event Params
+
+```ts
+export interface CreateSwaggerParams extends EventParams {
+ fileDir: string;
+ outputFileName: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateSwagger(
+ context: DsgContext,
+ eventParams: CreateSwaggerParams,
+ modules: ModuleMap
+) {
+ const { fileDir, outputFileName } = eventParams;
+ const swaggerConfig = `
+ public static class SwaggerConfig
+ {
+ public static void ConfigureSwagger(this IServiceCollection services)
+ {
+ services.AddSwaggerGen(c =>
+ {
+ c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
+ });
+ }
+ }
+ `;
+
+ modules.set({
+ path: join(fileDir, outputFileName),
+ code: swaggerConfig
+ });
+
+ return modules;
+}
+```
+
+## CreateSeed
+
+Creates the seed data file for the .NET application.
+
+### Event Name
+
+`CreateSeed`
+
+### Event Params
+
+```ts
+export interface CreateSeedParams extends EventParams {
+ fileDir: string;
+ outputFileName: string;
+ dtoNameToPath: Record;
+}
+```
+
+Example:
+
+```ts
+async afterCreateSeed(
+ context: DsgContext,
+ eventParams: CreateSeedParams,
+ modules: ModuleMap
+) {
+ const { fileDir, outputFileName } = eventParams;
+ const seedData = `
+ public static class SeedData
+ {
+ public static void Initialize(IServiceProvider serviceProvider)
+ {
+ using (var context = new ApplicationDbContext(
+ serviceProvider.GetRequiredService>()))
+ {
+ // Check if the database has been seeded
+ if (context.Users.Any())
+ {
+ return; // Database has been seeded
+ }
+
+ context.Users.AddRange(
+ new User { Name = "User 1", Email = "user1@example.com" },
+ new User { Name = "User 2", Email = "user2@example.com" }
+ );
+
+ context.SaveChanges();
+ }
+ }
+ }
+ `;
+
+ modules.set({
+ path: join(fileDir, outputFileName),
+ code: seedData
+ });
+
+ return modules;
+}
+```
+
+## CreateEntityControllerToManyRelationMethods
+
+Creates methods for handling to-many relationships in entity controllers.
+
+### Event Name
+
+`CreateEntityControllerToManyRelationMethods`
+
+### Event Params
+
+```ts
+export interface CreateEntityControllerToManyRelationMethodsParams extends EventParams {
+ field: EntityLookupField;
+ entity: Entity;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityControllerToManyRelationMethods(
+ context: DsgContext,
+ eventParams: CreateEntityControllerToManyRelationMethodsParams,
+ modules: ModuleMap
+) {
+ const { field, entity } = eventParams;
+ const controllerPath = join(context.serverDirectories.srcDirectory, "Controllers", `${entity.name}Controller.cs`);
+ const controllerFile = modules.get(controllerPath);
+
+ if (controllerFile) {
+ const methodName = `Get${field.name}`;
+ const relatedEntityName = field.properties.relatedEntity.name;
+ const updatedCode = controllerFile.code + `
+ [HttpGet("{id}/${field.name.toLowerCase()}")]
+ public async Task>> ${methodName}(int id)
+ {
+ var entity = await _context.${entity.name}s.FindAsync(id);
+ if (entity == null)
+ {
+ return NotFound();
+ }
+ return await _context.${relatedEntityName}s.Where(e => e.${entity.name}Id == id).ToListAsync();
+ }
+ `;
+
+ modules.set({
+ path: controllerPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityGrpcControllerToManyRelationMethods
+
+Creates methods for handling to-many relationships in entity gRPC controllers.
+
+### Event Name
+
+`CreateEntityGrpcControllerToManyRelationMethods`
+
+### Event Params
+
+```ts
+export interface CreateEntityGrpcControllerToManyRelationMethodsParams extends EventParams {
+ field: EntityLookupField;
+ entity: Entity;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityGrpcControllerToManyRelationMethods(
+ context: DsgContext,
+ eventParams: CreateEntityGrpcControllerToManyRelationMethodsParams,
+ modules: ModuleMap
+) {
+ const { field, entity } = eventParams;
+ const controllerPath = join(context.serverDirectories.srcDirectory, "GrpcControllers", `${entity.name}GrpcController.cs`);
+ const controllerFile = modules.get(controllerPath);
+
+ if (controllerFile) {
+ const methodName = `Get${field.name}`;
+ const relatedEntityName = field.properties.relatedEntity.name;
+ const updatedCode = controllerFile.code + `
+ public override async Task<${relatedEntityName}List> ${methodName}(${entity.name}Id request, ServerCallContext context)
+ {
+ var entities = await _context.${relatedEntityName}s.Where(e => e.${entity.name}Id == request.Id).ToListAsync();
+ var response = new ${relatedEntityName}List();
+ response.Items.AddRange(entities.Select(e => new ${relatedEntityName}Message { /* map properties */ }));
+ return response;
+ }
+ `;
+
+ modules.set({
+ path: controllerPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityResolverToManyRelationMethods
+
+Creates methods for handling to-many relationships in entity resolvers.
+
+### Event Name
+
+`CreateEntityResolverToManyRelationMethods`
+
+### Event Params
+
+```ts
+export interface CreateEntityResolverToManyRelationMethodsParams extends EventParams {
+ field: EntityLookupField;
+ entity: Entity;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityResolverToManyRelationMethods(
+ context: DsgContext,
+ eventParams: CreateEntityResolverToManyRelationMethodsParams,
+ modules: ModuleMap
+) {
+ const { field, entity } = eventParams;
+ const resolverPath = join(context.serverDirectories.srcDirectory, "Resolvers", `${entity.name}Resolver.cs`);
+ const resolverFile = modules.get(resolverPath);
+
+ if (resolverFile) {
+ const methodName = `Get${field.name}`;
+ const relatedEntityName = field.properties.relatedEntity.name;
+ const updatedCode = resolverFile.code + `
+ [GraphQLField]
+ public async Task> ${methodName}([Parent] ${entity.name} parent)
+ {
+ return await _context.${relatedEntityName}s.Where(e => e.${entity.name}Id == parent.Id).ToListAsync();
+ }
+ `;
+
+ modules.set({
+ path: resolverPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityResolverToOneRelationMethods
+
+Creates methods for handling to-one relationships in entity resolvers.
+
+### Event Name
+
+`CreateEntityResolverToOneRelationMethods`
+
+### Event Params
+
+```ts
+export interface CreateEntityResolverToOneRelationMethodsParams extends EventParams {
+ field: EntityLookupField;
+ entity: Entity;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityResolverToOneRelationMethods(
+ context: DsgContext,
+ eventParams: CreateEntityResolverToOneRelationMethodsParams,
+ modules: ModuleMap
+) {
+ const { field, entity } = eventParams;
+ const resolverPath = join(context.serverDirectories.srcDirectory, "Resolvers", `${entity.name}Resolver.cs`);
+ const resolverFile = modules.get(resolverPath);
+
+ if (resolverFile) {
+ const methodName = `Get${field.name}`;
+ const relatedEntityName = field.properties.relatedEntity.name;
+ const updatedCode = resolverFile.code + `
+ [GraphQLField]
+ public async Task<${relatedEntityName}> ${methodName}([Parent] ${entity.name} parent)
+ {
+ return await _context.${relatedEntityName}s.FirstOrDefaultAsync(e => e.Id == parent.${field.name}Id);
+ }
+ `;
+
+ modules.set({
+ path: resolverPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateDTOs
+
+Creates Data Transfer Objects (DTOs) for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateDTOs`
+
+### Event Params
+
+```ts
+export interface CreateDTOsParams extends EventParams {
+ entity: Entity;
+ dtoName: string;
+ dtoBasePath: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateDTOs(
+ context: DsgContext,
+ eventParams: CreateDTOsParams,
+ modules: ModuleMap
+) {
+ const { entity, dtoName, dtoBasePath } = eventParams;
+ const dtoPath = join(dtoBasePath, `${dtoName}.cs`);
+ const dtoFile = modules.get(dtoPath);
+
+ if (dtoFile) {
+ const updatedCode = dtoFile.code + `
+ public class ${entity.name}SummaryDTO
+ {
+ public int Id { get; set; }
+ public string Name { get; set; }
+ }
+ `;
+
+ modules.set({
+ path: dtoPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## LoadStaticFiles
+
+Loads static files into the project.
+
+### Event Name
+
+`LoadStaticFiles`
+
+### Event Params
+
+```ts
+export interface LoadStaticFilesParams extends EventParams {
+ source: string;
+ basePath: string;
+}
+```
+
+Example:
+
+```ts
+async afterLoadStaticFiles(
+ context: DsgContext,
+ eventParams: LoadStaticFilesParams,
+ modules: ModuleMap
+) {
+ const { source, basePath } = eventParams;
+ const staticFiles = await readDir(source);
+
+ for (const file of staticFiles) {
+ const content = await readFile(join(source, file));
+ modules.set({
+ path: join(basePath, file),
+ code: content
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateConnectMicroservices
+
+Creates the configuration for connecting microservices.
+
+### Event Name
+
+`CreateConnectMicroservices`
+
+### Event Params
+
+```ts
+export interface CreateConnectMicroservicesParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+## CreateServerSecretsManager
+
+Creates the configuration for the secrets manager in the server.
+
+### Event Name
+
+`CreateServerSecretsManager`
+
+### Event Params
+
+```ts
+export interface CreateServerSecretsManagerParams extends EventParams {
+ secretsNameKey: SecretsNameKey[];
+}
+```
+
+Example:
+
+```ts
+async afterCreateServerSecretsManager(
+ context: DsgContext,
+ eventParams: CreateServerSecretsManagerParams,
+ modules: ModuleMap
+) {
+ const { secretsNameKey } = eventParams;
+ const secretsManager = `
+ public static class SecretsManager
+ {
+ public enum SecretsNameKey
+ {
+ ${secretsNameKey.map(snk => `${snk.name} = "${snk.key}"`).join(',\n ')}
+ }
+
+ public static string GetSecret(SecretsNameKey key)
+ {
+ // Implement secret retrieval logic here
+ return Environment.GetEnvironmentVariable(key.ToString());
+ }
+ }
+ `;
+
+ modules.set({
+ path: join(context.serverDirectories.srcDirectory, "SecretsManager.cs"),
+ code: secretsManager
+ });
+
+ return modules;
+}
+```
+
+## CreateEntityInterface
+
+Creates an interface for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityInterface`
+
+### Event Params
+
+```ts
+export interface CreateEntityInterfaceParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+ moduleContainers: ModuleContainer[];
+ moduleActions: ModuleAction[];
+ entities: Entity[];
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityInterface(
+ context: DsgContext,
+ eventParams: CreateEntityInterfaceParams,
+ modules: ModuleMap
+) {
+ const { entity, apisDir } = eventParams;
+ const interfacePath = join(apisDir, "Interfaces", `I${entity.name}.cs`);
+ const interfaceFile = modules.get(interfacePath);
+
+ if (interfaceFile) {
+ const updatedCode = interfaceFile.code + `
+ Task IsUnique(string name);
+ `;
+
+ modules.set({
+ path: interfacePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityExtensions
+
+Creates extension methods for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityExtensions`
+
+### Event Params
+
+```ts
+export interface CreateEntityExtensionsParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityExtensions(
+ context: DsgContext,
+ eventParams: CreateEntityExtensionsParams,
+ modules: ModuleMap
+) {
+ const { entity, apisDir } = eventParams;
+ const extensionsPath = join(apisDir, "Extensions", `${entity.name}Extensions.cs`);
+ const extensionsFile = modules.get(extensionsPath);
+
+ if (extensionsFile) {
+ const updatedCode = extensionsFile.code + `
+ public static string GetDisplayName(this ${entity.name} entity)
+ {
+ return $"{entity.FirstName} {entity.LastName}";
+ }
+ `;
+
+ modules.set({
+ path: extensionsPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateEntityModel
+
+Creates a model class for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityModel`
+
+### Event Params
+
+```ts
+export interface CreateEntityModelParams extends EventParams {
+ entity: Entity;
+ entities: Entity[];
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityModel(
+ context: DsgContext,
+ eventParams: CreateEntityModelParams,
+ modules: ModuleMap
+) {
+ const { entity, resourceName, apisDir } = eventParams;
+ const modelPath = join(apisDir, "Models", `${resourceName}.cs`);
+ const modelFile = modules.get(modelPath);
+
+ if (modelFile) {
+ const updatedCode = modelFile.code.replace(
+ "public class",
+ "[Table(\"" + entity.name + "\")]\npublic class"
+ );
+
+ modules.set({
+ path: modelPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateResourceDbContextFile
+
+Creates the database context file for the .NET application.
+
+### Event Name
+
+`CreateResourceDbContextFile`
+
+### Event Params
+
+```ts
+export interface CreateResourceDbContextFileParams extends EventParams {
+ entities: Entity[];
+ resourceName: string;
+ resourceDbContextPath: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateResourceDbContextFile(
+ context: DsgContext,
+ eventParams: CreateResourceDbContextFileParams,
+ modules: ModuleMap
+) {
+ const { resourceName, resourceDbContextPath } = eventParams;
+ const dbContextFile = modules.get(resourceDbContextPath);
+
+ if (dbContextFile) {
+ const updatedCode = dbContextFile.code.replace(
+ "public class",
+ "public class " + resourceName + "DbContext : DbContext\n{\n"
+ ) + `
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ base.OnModelCreating(modelBuilder);
+ // Add your custom configurations here
+ }
+ `;
+
+ modules.set({
+ path: resourceDbContextPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateSeedDevelopmentDataFile
+
+Creates a file for seeding development data in the .NET application.
+
+### Event Name
+
+`CreateSeedDevelopmentDataFile`
+
+### Event Params
+
+```ts
+export interface CreateSeedDevelopmentDataFileParams extends EventParams {
+ seedFilePath: string;
+ resourceName: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateSeedDevelopmentDataFile(
+ context: DsgContext,
+ eventParams: CreateSeedDevelopmentDataFileParams,
+ modules: ModuleMap
+) {
+ const { seedFilePath, resourceName } = eventParams;
+ const seedFile = modules.get(seedFilePath);
+
+ if (seedFile) {
+ const updatedCode = seedFile.code + `
+ public static void SeedCustomData(${resourceName}DbContext context)
+ {
+ if (!context.Users.Any())
+ {
+ context.Users.AddRange(
+ new User { Username = "admin", Email = "admin@example.com" },
+ new User { Username = "user1", Email = "user1@example.com" }
+ );
+ context.SaveChanges();
+ }
+ }
+ `;
+
+ modules.set({
+ path: seedFilePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateControllerModuleFile
+
+Creates a module file for controllers in the .NET application.
+
+### Event Name
+
+`CreateControllerModuleFile`
+
+### Event Params
+
+```ts
+export interface CreateControllerModuleFileParams extends EventParams {
+ moduleActionsAndDtos: ModuleActionsAndDtos;
+ resourceName: string;
+ controllerModuleBasePath: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateControllerModuleFile(
+ context: DsgContext,
+ eventParams: CreateControllerModuleFileParams,
+ modules: ModuleMap
+) {
+ const { resourceName, controllerModuleBasePath } = eventParams;
+ const controllerModuleFile = modules.get(controllerModuleBasePath);
+
+ if (controllerModuleFile) {
+ const updatedCode = controllerModuleFile.code + `
+ [ApiExplorerSettings(GroupName = "${resourceName}")]
+ public class ${resourceName}ControllerModule : ControllerBase
+ {
+ // Add your custom controller logic here
+ }
+ `;
+
+ modules.set({
+ path: controllerModuleBasePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
+
+## CreateControllerBaseModuleFile
+
+Creates a base module file for controllers in the .NET application.
+
+### Event Name
+
+`CreateControllerBaseModuleFile`
+
+### Event Params
+
+```ts
+export interface CreateControllerBaseModuleFileParams extends EventParams {
+ moduleActionsAndDtos: ModuleActionsAndDtos;
+ resourceName: string;
+ controllerBaseModuleBasePath: string;
+}
+```
diff --git a/docs/plugins/dotnet-plugin-events/create-admin-dot-env.md b/docs/plugins/dotnet-plugin-events/create-admin-dot-env.md
new file mode 100644
index 00000000..0d06cf65
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-admin-dot-env.md
@@ -0,0 +1,39 @@
+---
+id: create-admin-dot-env
+title: Create Admin Dot Env | .NET Plugin Event
+description: Creates the .env file for the admin UI.
+sidebar_label: Create Admin Dot Env
+slug: /plugins/dotnet-plugin-events/create-admin-dot-env
+---
+
+# Create Admin Dot Env
+
+
+Creates the .env file for the admin UI.
+
+### Event Name
+
+`CreateAdminDotEnv`
+
+### Event Params
+
+```ts
+export interface CreateAdminDotEnvParams extends EventParams {
+ envVariables: VariableDictionary;
+}
+```
+
+Example:
+
+```ts
+beforeCreateAdminDotEnv(
+ context: DsgContext,
+ eventParams: CreateAdminDotEnvParams
+) {
+ eventParams.envVariables.push(
+ { REACT_APP_API_URL: "http://localhost:3000/api" },
+ { REACT_APP_SERVER_URL: "http://localhost:3000" }
+ );
+ return eventParams;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-admin-git-ignore.md b/docs/plugins/dotnet-plugin-events/create-admin-git-ignore.md
new file mode 100644
index 00000000..a14c5b14
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-admin-git-ignore.md
@@ -0,0 +1,40 @@
+---
+id: create-admin-git-ignore
+title: Create Admin Git Ignore | .NET Plugin Event
+description: Creates the .gitignore file for the admin UI.
+sidebar_label: Create Admin Git Ignore
+slug: /plugins/dotnet-plugin-events/create-admin-git-ignore
+---
+
+# Create Admin Git Ignore
+
+
+Creates the .gitignore file for the admin UI.
+
+### Event Name
+
+`CreateAdminGitIgnore`
+
+### Event Params
+
+```ts
+export interface CreateAdminGitIgnoreParams extends EventParams {
+ gitignorePaths: string[];
+}
+```
+
+Example:
+
+```ts
+beforeCreateAdminGitIgnore(
+ context: DsgContext,
+ eventParams: CreateAdminGitIgnoreParams
+) {
+ eventParams.gitignorePaths.push(
+ "node_modules",
+ "build",
+ ".env.local"
+ );
+ return eventParams;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-admin-ui-package-json.md b/docs/plugins/dotnet-plugin-events/create-admin-ui-package-json.md
new file mode 100644
index 00000000..67ffae99
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-admin-ui-package-json.md
@@ -0,0 +1,44 @@
+---
+id: create-admin-ui-package-json
+title: Create Admin UI Package Json | .NET Plugin Event
+description: Creates or updates the package.json file for the admin UI.
+sidebar_label: Create Admin UI Package Json
+slug: /plugins/dotnet-plugin-events/create-admin-ui-package-json
+---
+
+# Create Admin UI Package Json
+
+
+Creates or updates the package.json file for the admin UI.
+
+### Event Name
+
+`CreateAdminUIPackageJson`
+
+### Event Params
+
+```ts
+export interface CreateAdminUIPackageJsonParams extends EventParams {
+ updateProperties: { [key: string]: any };
+}
+```
+
+Example:
+
+```ts
+beforeCreateAdminUIPackageJson(
+ context: DsgContext,
+ eventParams: CreateAdminUIPackageJsonParams
+) {
+ eventParams.updateProperties = {
+ ...eventParams.updateProperties,
+ "scripts": {
+ "start": "react-scripts start",
+ "build": "react-scripts build",
+ "test": "react-scripts test",
+ "eject": "react-scripts eject"
+ }
+ };
+ return eventParams;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-admin-ui.md b/docs/plugins/dotnet-plugin-events/create-admin-ui.md
new file mode 100644
index 00000000..7f8f398b
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-admin-ui.md
@@ -0,0 +1,24 @@
+---
+id: create-admin-ui
+title: Create Admin UI | .NET Plugin Event
+description: Creates the admin UI for the .NET application.
+sidebar_label: Create Admin UI
+slug: /plugins/dotnet-plugin-events/create-admin-ui
+---
+
+# Create Admin UI
+
+
+Creates the admin UI for the .NET application.
+
+### Event Name
+
+`CreateAdminUI`
+
+### Event Params
+
+```ts
+export interface CreateAdminUIParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-connect-microservices.md b/docs/plugins/dotnet-plugin-events/create-connect-microservices.md
new file mode 100644
index 00000000..5760ff29
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-connect-microservices.md
@@ -0,0 +1,24 @@
+---
+id: create-connect-microservices
+title: Create Connect Microservices | .NET Plugin Event
+description: Creates the configuration for connecting microservices.
+sidebar_label: Create Connect Microservices
+slug: /plugins/dotnet-plugin-events/create-connect-microservices
+---
+
+# Create Connect Microservices
+
+
+Creates the configuration for connecting microservices.
+
+### Event Name
+
+`CreateConnectMicroservices`
+
+### Event Params
+
+```ts
+export interface CreateConnectMicroservicesParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-controller-base-module-file.md b/docs/plugins/dotnet-plugin-events/create-controller-base-module-file.md
new file mode 100644
index 00000000..a5143096
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-controller-base-module-file.md
@@ -0,0 +1,26 @@
+---
+id: create-controller-base-module-file
+title: Create Controller Base Module File | .NET Plugin Event
+description: Creates a base module file for controllers in the .NET application.
+sidebar_label: Create Controller Base Module File
+slug: /plugins/dotnet-plugin-events/create-controller-base-module-file
+---
+
+# Create Controller Base Module File
+
+
+Creates a base module file for controllers in the .NET application.
+
+### Event Name
+
+`CreateControllerBaseModuleFile`
+
+### Event Params
+
+```ts
+export interface CreateControllerBaseModuleFileParams extends EventParams {
+ moduleActionsAndDtos: ModuleActionsAndDtos;
+ resourceName: string;
+ controllerBaseModuleBasePath: string;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-controller-module-file.md b/docs/plugins/dotnet-plugin-events/create-controller-module-file.md
new file mode 100644
index 00000000..897b62e2
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-controller-module-file.md
@@ -0,0 +1,56 @@
+---
+id: create-controller-module-file
+title: Create Controller Module File | .NET Plugin Event
+description: Creates a module file for controllers in the .NET application.
+sidebar_label: Create Controller Module File
+slug: /plugins/dotnet-plugin-events/create-controller-module-file
+---
+
+# Create Controller Module File
+
+
+Creates a module file for controllers in the .NET application.
+
+### Event Name
+
+`CreateControllerModuleFile`
+
+### Event Params
+
+```ts
+export interface CreateControllerModuleFileParams extends EventParams {
+ moduleActionsAndDtos: ModuleActionsAndDtos;
+ resourceName: string;
+ controllerModuleBasePath: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateControllerModuleFile(
+ context: DsgContext,
+ eventParams: CreateControllerModuleFileParams,
+ modules: ModuleMap
+) {
+ const { resourceName, controllerModuleBasePath } = eventParams;
+ const controllerModuleFile = modules.get(controllerModuleBasePath);
+
+ if (controllerModuleFile) {
+ const updatedCode = controllerModuleFile.code + `
+ [ApiExplorerSettings(GroupName = "${resourceName}")]
+ public class ${resourceName}ControllerModule : ControllerBase
+ {
+ // Add your custom controller logic here
+ }
+ `;
+
+ modules.set({
+ path: controllerModuleBasePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-dtos.md b/docs/plugins/dotnet-plugin-events/create-dtos.md
new file mode 100644
index 00000000..2e5e6ac5
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-dtos.md
@@ -0,0 +1,48 @@
+---
+id: create-dtos
+title: Create DTOs | .NET Plugin Event
+description: Creates Data Transfer Objects (DTOs) for a specific entity in the .NET application.
+sidebar_label: Create DTOs
+slug: /plugins/dotnet-plugin-events/create-d-t-os
+---
+
+# Create DTOs
+
+
+Creates Data Transfer Objects (DTOs) for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateDTOs`
+
+### Event Params
+
+```ts
+export interface CreateDTOsParams extends EventParams {
+ entity: Entity;
+ dtoName: string;
+ dtoBasePath: string;
+}
+```
+
+### Example
+
+```ts
+afterCreateDTOs(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateDTOsParams,
+ files: FileMap
+): Promise> {
+ const { entity, dtoName } = eventParams;
+ const dtoFile = files.get(`DTOs/${dtoName}.cs`);
+ if (dtoFile) {
+ dtoFile.code.addProperty(
+ CsharpSupport.property({
+ name: "LastModified",
+ type: CsharpSupport.Types.dateTime(),
+ })
+ );
+ }
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-controller-base.md b/docs/plugins/dotnet-plugin-events/create-entity-controller-base.md
new file mode 100644
index 00000000..8cd1bcf3
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-controller-base.md
@@ -0,0 +1,90 @@
+---
+id: create-entity-controller-base
+title: Create Entity Controller Base | .NET Plugin Event
+description: Creates a base controller for entities in the .NET application.
+sidebar_label: Create Entity Controller Base
+slug: /plugins/dotnet-plugin-events/create-entity-controller-base
+---
+
+# Create Entity Controller Base
+
+
+Creates a base controller for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityControllerBase`
+
+### Event Params
+
+```ts
+export interface CreateEntityControllerBaseParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+ moduleActions: ModuleAction[];
+ entities: Entity[];
+}
+```
+
+#### moduleActions
+
+An array of module actions available for the entity.
+
+#### entities
+
+An array of all entities in the application.
+
+### Example
+
+```ts
+afterCreateEntityControllerBase(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateEntityControllerBaseParams,
+ files: FileMap
+): Promise> {
+ const { entity, resourceName, apisDir } = eventParams;
+ const controllerBasePath = `${apisDir}/${entity.name}/Base/${pascalCase(entity.name)}ControllerBase.cs`;
+ const controllerBaseFile = files.get(controllerBasePath);
+
+ if (controllerBaseFile) {
+ // Add a protected method to the base controller
+ controllerBaseFile.code.addMethod(
+ CsharpSupport.method({
+ name: "ValidateEntityState",
+ access: "protected",
+ returnType: CsharpSupport.Types.boolean(),
+ parameters: [
+ CsharpSupport.parameter({
+ name: "entity",
+ type: CsharpSupport.Types.reference(entity.name),
+ }),
+ ],
+ body: `
+ if (entity == null)
+ return false;
+
+ // Add custom validation logic here
+ return true;
+ `,
+ })
+ );
+
+ // Modify existing methods to use the new validation
+ const methods = controllerBaseFile.code.getMethods();
+ methods.forEach(method => {
+ if (method.name === `Create${entity.name}` || method.name === `Update${entity.name}`) {
+ const existingBody = method.body;
+ method.body = `
+ if (!ValidateEntityState(${camelCase(entity.name)}))
+ return BadRequest("Invalid entity state");
+
+ ${existingBody}
+ `;
+ }
+ });
+ }
+
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-controller-spec.md b/docs/plugins/dotnet-plugin-events/create-entity-controller-spec.md
new file mode 100644
index 00000000..11fc5cbb
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-controller-spec.md
@@ -0,0 +1,54 @@
+---
+id: create-entity-controller-spec
+title: Create Entity Controller Spec | .NET Plugin Event
+description: Creates the controller spec file for the entity controller.
+sidebar_label: Create Entity Controller Spec
+slug: /plugins/dotnet-plugin-events/create-entity-controller-spec
+---
+
+# Create Entity Controller Spec
+
+
+Creates the controller spec file for the entity controller.
+
+### Event Name
+
+`CreateEntityControllerSpec`
+
+### Event Params
+
+```ts
+export interface CreateEntityControllerSpecParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityControllerSpec(
+ context: DsgContext,
+ eventParams: CreateEntityControllerSpecParams,
+ modules: ModuleMap
+) {
+ const { entity, resourceName, apisDir } = eventParams;
+ const specPath = join(apisDir, "Tests", `${resourceName}ControllerTests.cs`);
+ const specFile = modules.get(specPath);
+
+ if (specFile) {
+ const updatedCode = specFile.code.replace(
+ "public class",
+ "[TestClass]\npublic class"
+ );
+
+ modules.set({
+ path: specPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-controller-to-many-relation-methods.md b/docs/plugins/dotnet-plugin-events/create-entity-controller-to-many-relation-methods.md
new file mode 100644
index 00000000..2e812b35
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-controller-to-many-relation-methods.md
@@ -0,0 +1,63 @@
+---
+id: create-entity-controller-to-many-relation-methods
+title: Create Entity Controller To Many Relation Methods | .NET Plugin Event
+description: Creates methods for handling to-many relationships in entity controllers.
+sidebar_label: Create Entity Controller To Many Relation Methods
+slug: /plugins/dotnet-plugin-events/create-entity-controller-to-many-relation-methods
+---
+
+# Create Entity Controller To Many Relation Methods
+
+
+Creates methods for handling to-many relationships in entity controllers.
+
+### Event Name
+
+`CreateEntityControllerToManyRelationMethods`
+
+### Event Params
+
+```ts
+export interface CreateEntityControllerToManyRelationMethodsParams extends EventParams {
+ field: EntityLookupField;
+ entity: Entity;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityControllerToManyRelationMethods(
+ context: DsgContext,
+ eventParams: CreateEntityControllerToManyRelationMethodsParams,
+ modules: ModuleMap
+) {
+ const { field, entity } = eventParams;
+ const controllerPath = join(context.serverDirectories.srcDirectory, "Controllers", `${entity.name}Controller.cs`);
+ const controllerFile = modules.get(controllerPath);
+
+ if (controllerFile) {
+ const methodName = `Get${field.name}`;
+ const relatedEntityName = field.properties.relatedEntity.name;
+ const updatedCode = controllerFile.code + `
+ [HttpGet("{id}/${field.name.toLowerCase()}")]
+ public async Task>> ${methodName}(int id)
+ {
+ var entity = await _context.${entity.name}s.FindAsync(id);
+ if (entity == null)
+ {
+ return NotFound();
+ }
+ return await _context.${relatedEntityName}s.Where(e => e.${entity.name}Id == id).ToListAsync();
+ }
+ `;
+
+ modules.set({
+ path: controllerPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-controller.md b/docs/plugins/dotnet-plugin-events/create-entity-controller.md
new file mode 100644
index 00000000..e782b320
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-controller.md
@@ -0,0 +1,86 @@
+---
+id: create-entity-controller
+title: Create Entity Controller | .NET Plugin Event
+description: Creates a controller for a specific entity in the .NET application.
+sidebar_label: Create Entity Controller
+slug: /plugins/dotnet-plugin-events/create-entity-controller
+---
+
+# Create Entity Controller
+
+
+Creates a controller for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityController`
+
+### Event Params
+
+```ts
+export interface CreateEntityControllerParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+ entityActions: entityActions;
+}
+```
+
+#### entity
+
+The entity object for which the controller is being created.
+
+#### resourceName
+
+The name of the resource (typically the entity name).
+
+#### apisDir
+
+The directory where the API controllers are being generated.
+
+#### entityActions
+
+An object containing the CRUD actions available for the entity.
+
+### Example
+
+```ts
+afterCreateEntityController(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateEntityControllerParams,
+ files: FileMap
+): Promise> {
+ const { entity, resourceName, apisDir } = eventParams;
+ const controllerPath = `${apisDir}/${entity.name}/${pascalCase(entity.name)}Controller.cs`;
+ const controllerFile = files.get(controllerPath);
+
+ if (controllerFile) {
+ // Add a custom action to the controller
+ controllerFile.code.addMethod(
+ CsharpSupport.method({
+ name: "ExportToCsv",
+ access: "public",
+ isAsync: true,
+ returnType: CsharpSupport.Types.task(CsharpSupport.Types.reference("IActionResult")),
+ decorators: [
+ CsharpSupport.decorator({
+ name: "HttpGet",
+ arguments: ["export-csv"],
+ }),
+ ],
+ body: `
+ var allItems = await _service.List();
+ var csv = ConvertToCsv(allItems);
+ return File(Encoding.UTF8.GetBytes(csv), "text/csv", "${entity.name}Export.csv");
+ `,
+ })
+ );
+
+ // Add necessary imports
+ controllerFile.code.addImport("System.Text");
+ controllerFile.code.addImport("Microsoft.AspNetCore.Mvc");
+ }
+
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-extensions.md b/docs/plugins/dotnet-plugin-events/create-entity-extensions.md
new file mode 100644
index 00000000..090dcbb3
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-extensions.md
@@ -0,0 +1,87 @@
+---
+id: create-entity-extensions
+title: Create Entity Extensions | .NET Plugin Event
+description: Creates extension methods for entities in the .NET application.
+sidebar_label: Create Entity Extensions
+slug: /plugins/dotnet-plugin-events/create-entity-extensions
+---
+
+# Create Entity Extensions
+
+
+Creates extension methods for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityExtensions`
+
+### Event Params
+
+```ts
+export interface CreateEntityExtensionsParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+### Example
+
+```ts
+afterCreateEntityExtensions(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateEntityExtensionsParams,
+ files: FileMap
+): Promise> {
+ const { entity, resourceName, apisDir } = eventParams;
+ const extensionsPath = `${apisDir}/${entity.name}/${pascalCase(entity.name)}Extensions.cs`;
+ const extensionsFile = files.get(extensionsPath);
+
+ if (extensionsFile) {
+ // Add a custom extension method
+ extensionsFile.code.addMethod(
+ CsharpSupport.method({
+ name: "ToAuditString",
+ isStatic: true,
+ returnType: CsharpSupport.Types.string(),
+ parameters: [
+ CsharpSupport.parameter({
+ name: "this",
+ type: CsharpSupport.Types.reference(entity.name),
+ isThis: true,
+ }),
+ ],
+ body: `
+ return $"{entity.Id}|{entity.CreatedAt}|{entity.UpdatedAt}";
+ `,
+ })
+ );
+
+ // Add a custom mapper extension
+ extensionsFile.code.addMethod(
+ CsharpSupport.method({
+ name: "ToDto",
+ isStatic: true,
+ returnType: CsharpSupport.Types.reference(`${entity.name}Dto`),
+ parameters: [
+ CsharpSupport.parameter({
+ name: "this",
+ type: CsharpSupport.Types.reference(entity.name),
+ isThis: true,
+ }),
+ ],
+ body: `
+ return new ${entity.name}Dto
+ {
+ Id = entity.Id,
+ // Map other properties here
+ AuditString = entity.ToAuditString()
+ };
+ `,
+ })
+ );
+ }
+
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-grpc-controller-base.md b/docs/plugins/dotnet-plugin-events/create-entity-grpc-controller-base.md
new file mode 100644
index 00000000..4ea92789
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-grpc-controller-base.md
@@ -0,0 +1,56 @@
+---
+id: create-entity-grpc-controller-base
+title: Create Entity Grpc Controller Base | .NET Plugin Event
+description: Creates a base gRPC controller for entities in the .NET application.
+sidebar_label: Create Entity Grpc Controller Base
+slug: /plugins/dotnet-plugin-events/create-entity-grpc-controller-base
+---
+
+# Create Entity Grpc Controller Base
+
+
+Creates a base gRPC controller for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityGrpcControllerBase`
+
+### Event Params
+
+```ts
+export interface CreateEntityGrpcControllerBaseParams extends EventParams {
+ entity: Entity;
+}
+```
+
+#### entity
+
+The entity object for which the base gRPC controller is being created.
+
+Example:
+
+```ts
+async afterCreateEntityGrpcControllerBase(
+ context: DsgContext,
+ eventParams: CreateEntityGrpcControllerBaseParams,
+ modules: ModuleMap
+) {
+ const { entity } = eventParams;
+ const controllerBasePath = join(context.serverDirectories.srcDirectory, "GrpcControllers", `${entity.name}GrpcControllerBase.cs`);
+ const controllerBaseFile = modules.get(controllerBasePath);
+
+ if (controllerBaseFile) {
+ const updatedCode = controllerBaseFile.code.replace(
+ "public abstract class",
+ "public abstract class"
+ );
+
+ modules.set({
+ path: controllerBasePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-grpc-controller-to-many-relation-methods.md b/docs/plugins/dotnet-plugin-events/create-entity-grpc-controller-to-many-relation-methods.md
new file mode 100644
index 00000000..58784f0f
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-grpc-controller-to-many-relation-methods.md
@@ -0,0 +1,60 @@
+---
+id: create-entity-grpc-controller-to-many-relation-methods
+title: Create Entity Grpc Controller To Many Relation Methods | .NET Plugin Event
+description: Creates methods for handling to-many relationships in entity gRPC controllers.
+sidebar_label: Create Entity Grpc Controller To Many Relation Methods
+slug: /plugins/dotnet-plugin-events/create-entity-grpc-controller-to-many-relation-methods
+---
+
+# Create Entity Grpc Controller To Many Relation Methods
+
+
+Creates methods for handling to-many relationships in entity gRPC controllers.
+
+### Event Name
+
+`CreateEntityGrpcControllerToManyRelationMethods`
+
+### Event Params
+
+```ts
+export interface CreateEntityGrpcControllerToManyRelationMethodsParams extends EventParams {
+ field: EntityLookupField;
+ entity: Entity;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityGrpcControllerToManyRelationMethods(
+ context: DsgContext,
+ eventParams: CreateEntityGrpcControllerToManyRelationMethodsParams,
+ modules: ModuleMap
+) {
+ const { field, entity } = eventParams;
+ const controllerPath = join(context.serverDirectories.srcDirectory, "GrpcControllers", `${entity.name}GrpcController.cs`);
+ const controllerFile = modules.get(controllerPath);
+
+ if (controllerFile) {
+ const methodName = `Get${field.name}`;
+ const relatedEntityName = field.properties.relatedEntity.name;
+ const updatedCode = controllerFile.code + `
+ public override async Task<${relatedEntityName}List> ${methodName}(${entity.name}Id request, ServerCallContext context)
+ {
+ var entities = await _context.${relatedEntityName}s.Where(e => e.${entity.name}Id == request.Id).ToListAsync();
+ var response = new ${relatedEntityName}List();
+ response.Items.AddRange(entities.Select(e => new ${relatedEntityName}Message { /* map properties */ }));
+ return response;
+ }
+ `;
+
+ modules.set({
+ path: controllerPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-grpc-controller.md b/docs/plugins/dotnet-plugin-events/create-entity-grpc-controller.md
new file mode 100644
index 00000000..c13a27d2
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-grpc-controller.md
@@ -0,0 +1,56 @@
+---
+id: create-entity-grpc-controller
+title: Create Entity Grpc Controller | .NET Plugin Event
+description: Creates a gRPC controller for a specific entity in the .NET application.
+sidebar_label: Create Entity Grpc Controller
+slug: /plugins/dotnet-plugin-events/create-entity-grpc-controller
+---
+
+# Create Entity Grpc Controller
+
+
+Creates a gRPC controller for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityGrpcController`
+
+### Event Params
+
+```ts
+export interface CreateEntityGrpcControllerParams extends EventParams {
+ entity: Entity;
+}
+```
+
+#### entity
+
+The entity object for which the gRPC controller is being created.
+
+Example:
+
+```ts
+async afterCreateEntityGrpcController(
+ context: DsgContext,
+ eventParams: CreateEntityGrpcControllerParams,
+ modules: ModuleMap
+) {
+ const { entity } = eventParams;
+ const controllerPath = join(context.serverDirectories.srcDirectory, "GrpcControllers", `${entity.name}GrpcController.cs`);
+ const controllerFile = modules.get(controllerPath);
+
+ if (controllerFile) {
+ const updatedCode = controllerFile.code.replace(
+ "public class",
+ "[GrpcService]\npublic class"
+ );
+
+ modules.set({
+ path: controllerPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-interface.md b/docs/plugins/dotnet-plugin-events/create-entity-interface.md
new file mode 100644
index 00000000..4147880f
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-interface.md
@@ -0,0 +1,51 @@
+---
+id: create-entity-interface
+title: Create Entity Interface | .NET Plugin Event
+description: Creates an interface for entities in the .NET application.
+sidebar_label: Create Entity Interface
+slug: /plugins/dotnet-plugin-events/create-entity-interface
+---
+
+# Create Entity Interface
+
+
+Creates an interface for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityInterface`
+
+### Event Params
+
+```ts
+export interface CreateEntityInterfaceParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+ moduleContainers: ModuleContainer[];
+ moduleActions: ModuleAction[];
+ entities: Entity[];
+}
+```
+
+### Example
+
+```ts
+afterCreateEntityInterface(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateEntityInterfaceParams,
+ files: FileMap
+): Promise> {
+ const { entity } = eventParams;
+ const interfaceFile = files.get(`Interfaces/I${entity.name}.cs`);
+ if (interfaceFile) {
+ interfaceFile.code.addMethod(
+ CsharpSupport.method({
+ name: "Validate",
+ returnType: CsharpSupport.Types.boolean(),
+ })
+ );
+ }
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-model.md b/docs/plugins/dotnet-plugin-events/create-entity-model.md
new file mode 100644
index 00000000..56886ebc
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-model.md
@@ -0,0 +1,49 @@
+---
+id: create-entity-model
+title: Create Entity Model | .NET Plugin Event
+description: Creates a model class for a specific entity in the .NET application.
+sidebar_label: Create Entity Model
+slug: /plugins/dotnet-plugin-events/create-entity-model
+---
+
+# Create Entity Model
+
+
+Creates a model class for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityModel`
+
+### Event Params
+
+```ts
+export interface CreateEntityModelParams extends EventParams {
+ entity: Entity;
+ entities: Entity[];
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+### Example
+
+```ts
+afterCreateEntityModel(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateEntityModelParams,
+ files: FileMap
+): Promise> {
+ const { entity, resourceName } = eventParams;
+ const modelFile = files.get(`${resourceName}/Models/${entity.name}.cs`);
+ if (modelFile) {
+ modelFile.code.addAttribute(
+ CsharpSupport.attribute({
+ name: "Table",
+ arguments: [`"${entity.name}s"`],
+ })
+ );
+ }
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-module-base.md b/docs/plugins/dotnet-plugin-events/create-entity-module-base.md
new file mode 100644
index 00000000..e4501c07
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-module-base.md
@@ -0,0 +1,56 @@
+---
+id: create-entity-module-base
+title: Create Entity Module Base | .NET Plugin Event
+description: Creates a base module for entities in the .NET application.
+sidebar_label: Create Entity Module Base
+slug: /plugins/dotnet-plugin-events/create-entity-module-base
+---
+
+# Create Entity Module Base
+
+
+Creates a base module for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityModuleBase`
+
+### Event Params
+
+```ts
+export interface CreateEntityModuleBaseParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityModuleBase(
+ context: DsgContext,
+ eventParams: CreateEntityModuleBaseParams,
+ modules: ModuleMap
+) {
+ const { resourceName, apisDir } = eventParams;
+ const moduleBasePath = join(apisDir, `${resourceName}ModuleBase.cs`);
+ const moduleBaseFile = modules.get(moduleBasePath);
+
+ if (moduleBaseFile) {
+ const updatedCode = moduleBaseFile.code + `
+ protected virtual void ConfigureAdditionalServices(IServiceCollection services)
+ {
+ // Add additional service configuration here
+ }
+ `;
+
+ modules.set({
+ path: moduleBasePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-module.md b/docs/plugins/dotnet-plugin-events/create-entity-module.md
new file mode 100644
index 00000000..f6440830
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-module.md
@@ -0,0 +1,54 @@
+---
+id: create-entity-module
+title: Create Entity Module | .NET Plugin Event
+description: Creates a module for a specific entity in the .NET application.
+sidebar_label: Create Entity Module
+slug: /plugins/dotnet-plugin-events/create-entity-module
+---
+
+# Create Entity Module
+
+
+Creates a module for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityModule`
+
+### Event Params
+
+```ts
+export interface CreateEntityModuleParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityModule(
+ context: DsgContext,
+ eventParams: CreateEntityModuleParams,
+ modules: ModuleMap
+) {
+ const { resourceName, apisDir } = eventParams;
+ const modulePath = join(apisDir, `${resourceName}Module.cs`);
+ const moduleFile = modules.get(modulePath);
+
+ if (moduleFile) {
+ const updatedCode = moduleFile.code.replace(
+ "public class",
+ "[Module]\npublic class"
+ );
+
+ modules.set({
+ path: modulePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-resolver-base.md b/docs/plugins/dotnet-plugin-events/create-entity-resolver-base.md
new file mode 100644
index 00000000..9f2fee97
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-resolver-base.md
@@ -0,0 +1,56 @@
+---
+id: create-entity-resolver-base
+title: Create Entity Resolver Base | .NET Plugin Event
+description: Creates a base resolver for entities in the .NET application.
+sidebar_label: Create Entity Resolver Base
+slug: /plugins/dotnet-plugin-events/create-entity-resolver-base
+---
+
+# Create Entity Resolver Base
+
+
+Creates a base resolver for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityResolverBase`
+
+### Event Params
+
+```ts
+export interface CreateEntityResolverBaseParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityResolverBase(
+ context: DsgContext,
+ eventParams: CreateEntityResolverBaseParams,
+ modules: ModuleMap
+) {
+ const { resourceName, apisDir } = eventParams;
+ const resolverBasePath = join(apisDir, `${resourceName}ResolverBase.cs`);
+ const resolverBaseFile = modules.get(resolverBasePath);
+
+ if (resolverBaseFile) {
+ const updatedCode = resolverBaseFile.code + `
+ protected virtual IQueryable ApplyDefaultOrdering(IQueryable query)
+ {
+ return query.OrderBy(e => e.Id);
+ }
+ `;
+
+ modules.set({
+ path: resolverBasePath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-resolver-to-many-relation-methods.md b/docs/plugins/dotnet-plugin-events/create-entity-resolver-to-many-relation-methods.md
new file mode 100644
index 00000000..329d56ae
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-resolver-to-many-relation-methods.md
@@ -0,0 +1,58 @@
+---
+id: create-entity-resolver-to-many-relation-methods
+title: Create Entity Resolver To Many Relation Methods | .NET Plugin Event
+description: Creates methods for handling to-many relationships in entity resolvers.
+sidebar_label: Create Entity Resolver To Many Relation Methods
+slug: /plugins/dotnet-plugin-events/create-entity-resolver-to-many-relation-methods
+---
+
+# Create Entity Resolver To Many Relation Methods
+
+
+Creates methods for handling to-many relationships in entity resolvers.
+
+### Event Name
+
+`CreateEntityResolverToManyRelationMethods`
+
+### Event Params
+
+```ts
+export interface CreateEntityResolverToManyRelationMethodsParams extends EventParams {
+ field: EntityLookupField;
+ entity: Entity;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityResolverToManyRelationMethods(
+ context: DsgContext,
+ eventParams: CreateEntityResolverToManyRelationMethodsParams,
+ modules: ModuleMap
+) {
+ const { field, entity } = eventParams;
+ const resolverPath = join(context.serverDirectories.srcDirectory, "Resolvers", `${entity.name}Resolver.cs`);
+ const resolverFile = modules.get(resolverPath);
+
+ if (resolverFile) {
+ const methodName = `Get${field.name}`;
+ const relatedEntityName = field.properties.relatedEntity.name;
+ const updatedCode = resolverFile.code + `
+ [GraphQLField]
+ public async Task> ${methodName}([Parent] ${entity.name} parent)
+ {
+ return await _context.${relatedEntityName}s.Where(e => e.${entity.name}Id == parent.Id).ToListAsync();
+ }
+ `;
+
+ modules.set({
+ path: resolverPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-resolver-to-one-relation-methods.md b/docs/plugins/dotnet-plugin-events/create-entity-resolver-to-one-relation-methods.md
new file mode 100644
index 00000000..32237ac0
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-resolver-to-one-relation-methods.md
@@ -0,0 +1,58 @@
+---
+id: create-entity-resolver-to-one-relation-methods
+title: Create Entity Resolver To One Relation Methods | .NET Plugin Event
+description: Creates methods for handling to-one relationships in entity resolvers.
+sidebar_label: Create Entity Resolver To One Relation Methods
+slug: /plugins/dotnet-plugin-events/create-entity-resolver-to-one-relation-methods
+---
+
+# Create Entity Resolver To One Relation Methods
+
+
+Creates methods for handling to-one relationships in entity resolvers.
+
+### Event Name
+
+`CreateEntityResolverToOneRelationMethods`
+
+### Event Params
+
+```ts
+export interface CreateEntityResolverToOneRelationMethodsParams extends EventParams {
+ field: EntityLookupField;
+ entity: Entity;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityResolverToOneRelationMethods(
+ context: DsgContext,
+ eventParams: CreateEntityResolverToOneRelationMethodsParams,
+ modules: ModuleMap
+) {
+ const { field, entity } = eventParams;
+ const resolverPath = join(context.serverDirectories.srcDirectory, "Resolvers", `${entity.name}Resolver.cs`);
+ const resolverFile = modules.get(resolverPath);
+
+ if (resolverFile) {
+ const methodName = `Get${field.name}`;
+ const relatedEntityName = field.properties.relatedEntity.name;
+ const updatedCode = resolverFile.code + `
+ [GraphQLField]
+ public async Task<${relatedEntityName}> ${methodName}([Parent] ${entity.name} parent)
+ {
+ return await _context.${relatedEntityName}s.FirstOrDefaultAsync(e => e.Id == parent.${field.name}Id);
+ }
+ `;
+
+ modules.set({
+ path: resolverPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-resolver.md b/docs/plugins/dotnet-plugin-events/create-entity-resolver.md
new file mode 100644
index 00000000..240e8a4c
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-resolver.md
@@ -0,0 +1,54 @@
+---
+id: create-entity-resolver
+title: Create Entity Resolver | .NET Plugin Event
+description: Creates a resolver for a specific entity in the .NET application.
+sidebar_label: Create Entity Resolver
+slug: /plugins/dotnet-plugin-events/create-entity-resolver
+---
+
+# Create Entity Resolver
+
+
+Creates a resolver for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityResolver`
+
+### Event Params
+
+```ts
+export interface CreateEntityResolverParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateEntityResolver(
+ context: DsgContext,
+ eventParams: CreateEntityResolverParams,
+ modules: ModuleMap
+) {
+ const { resourceName, apisDir } = eventParams;
+ const resolverPath = join(apisDir, `${resourceName}Resolver.cs`);
+ const resolverFile = modules.get(resolverPath);
+
+ if (resolverFile) {
+ const updatedCode = resolverFile.code.replace(
+ "public class",
+ "[GraphQLResolver]\npublic class"
+ );
+
+ modules.set({
+ path: resolverPath,
+ code: updatedCode
+ });
+ }
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-service-base.md b/docs/plugins/dotnet-plugin-events/create-entity-service-base.md
new file mode 100644
index 00000000..eb6cbda2
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-service-base.md
@@ -0,0 +1,58 @@
+---
+id: create-entity-service-base
+title: Create Entity Service Base | .NET Plugin Event
+description: Creates a base service for entities in the .NET application.
+sidebar_label: Create Entity Service Base
+slug: /plugins/dotnet-plugin-events/create-entity-service-base
+---
+
+# Create Entity Service Base
+
+
+Creates a base service for entities in the .NET application.
+
+### Event Name
+
+`CreateEntityServiceBase`
+
+### Event Params
+
+```ts
+export interface CreateEntityServiceBaseParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+ moduleActions: ModuleAction[];
+ entities: Entity[];
+}
+```
+
+### Example
+
+```ts
+afterCreateEntityServiceBase(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateEntityServiceBaseParams,
+ files: FileMap
+): Promise> {
+ const { entity } = eventParams;
+ const serviceBaseFile = files.get(`Services/Base/${entity.name}ServiceBase.cs`);
+ if (serviceBaseFile) {
+ serviceBaseFile.code.addMethod(
+ CsharpSupport.method({
+ name: "SoftDelete",
+ access: "protected",
+ returnType: CsharpSupport.Types.task(CsharpSupport.Types.void()),
+ parameters: [
+ CsharpSupport.parameter({
+ name: "id",
+ type: CsharpSupport.Types.string(),
+ }),
+ ],
+ body: "// Implement soft delete logic here",
+ })
+ );
+ }
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-entity-service.md b/docs/plugins/dotnet-plugin-events/create-entity-service.md
new file mode 100644
index 00000000..6665930a
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-entity-service.md
@@ -0,0 +1,74 @@
+---
+id: create-entity-service
+title: Create Entity Service | .NET Plugin Event
+description: Creates a service for a specific entity in the .NET application.
+sidebar_label: Create Entity Service
+slug: /plugins/dotnet-plugin-events/create-entity-service
+---
+
+# Create Entity Service
+
+
+Creates a service for a specific entity in the .NET application.
+
+### Event Name
+
+`CreateEntityService`
+
+### Event Params
+
+```ts
+export interface CreateEntityServiceParams extends EventParams {
+ entity: Entity;
+ resourceName: string;
+ apisDir: string;
+ entityActions: entityActions;
+}
+```
+
+### Example
+
+```ts
+afterCreateEntityService(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateEntityServiceParams,
+ files: FileMap
+): Promise> {
+ const { entity, resourceName, apisDir } = eventParams;
+ const servicePath = `${apisDir}/${entity.name}/${pascalCase(entity.name)}Service.cs`;
+ const serviceFile = files.get(servicePath);
+
+ if (serviceFile) {
+ // Add a custom method to the service
+ serviceFile.code.addMethod(
+ CsharpSupport.method({
+ name: "GetRecentlyModified",
+ access: "public",
+ isAsync: true,
+ returnType: CsharpSupport.Types.task(CsharpSupport.Types.list(CsharpSupport.Types.reference(entity.name))),
+ parameters: [
+ CsharpSupport.parameter({
+ name: "days",
+ type: CsharpSupport.Types.int(),
+ defaultValue: "7",
+ }),
+ ],
+ body: `
+ var cutoffDate = DateTime.UtcNow.AddDays(-days);
+ return await _repository.GetAll()
+ .Where(e => e.UpdatedAt >= cutoffDate)
+ .OrderByDescending(e => e.UpdatedAt)
+ .ToListAsync();
+ `,
+ })
+ );
+
+ // Add necessary imports
+ serviceFile.code.addImport("System");
+ serviceFile.code.addImport("System.Linq");
+ serviceFile.code.addImport("Microsoft.EntityFrameworkCore");
+ }
+
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-message-broker-client-options-factory.md b/docs/plugins/dotnet-plugin-events/create-message-broker-client-options-factory.md
new file mode 100644
index 00000000..b26af1eb
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-message-broker-client-options-factory.md
@@ -0,0 +1,48 @@
+---
+id: create-message-broker-client-options-factory
+title: Create Message Broker Client Options Factory | .NET Plugin Event
+description: Creates the client options factory for the message broker.
+sidebar_label: Create Message Broker Client Options Factory
+slug: /plugins/dotnet-plugin-events/create-message-broker-client-options-factory
+---
+
+# Create Message Broker Client Options Factory
+
+
+Creates the client options factory for the message broker.
+
+### Event Name
+
+`CreateMessageBrokerClientOptionsFactory`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerClientOptionsFactoryParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+### Example
+
+
+```ts
+afterCreateMessageBrokerClientOptionsFactory(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateMessageBrokerClientOptionsFactoryParams,
+ files: FileMap
+): Promise> {
+ const optionsFactoryFile = files.get("MessageBroker/MessageBrokerClientOptionsFactory.cs");
+ if (optionsFactoryFile) {
+ optionsFactoryFile.code.addMethod(
+ CsharpSupport.method({
+ name: "CreateConsumerConfig",
+ access: "public",
+ returnType: CsharpSupport.Types.reference("ConsumerConfig"),
+ body: "return new ConsumerConfig { GroupId = \"my-consumer-group\" };",
+ })
+ );
+ }
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-message-broker-nest-j-s-module.md b/docs/plugins/dotnet-plugin-events/create-message-broker-nest-j-s-module.md
new file mode 100644
index 00000000..52d2b50b
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-message-broker-nest-j-s-module.md
@@ -0,0 +1,28 @@
+---
+id: create-message-broker-nest-j-s-module
+title: Create Message Broker Nest J S Module | .NET Plugin Event
+description: Creates the NestJS module for the message broker.
+sidebar_label: Create Message Broker Nest J S Module
+slug: /plugins/dotnet-plugin-events/create-message-broker-nest-j-s-module
+---
+
+# Create Message Broker Nest J S Module
+
+
+Creates the NestJS module for the message broker.
+
+:::note
+This event is typically not used in .NET projects
+:::
+
+### Event Name
+
+`CreateMessageBrokerNestJSModule`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerNestJSModuleParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-message-broker-service-base.md b/docs/plugins/dotnet-plugin-events/create-message-broker-service-base.md
new file mode 100644
index 00000000..f53c8dfe
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-message-broker-service-base.md
@@ -0,0 +1,24 @@
+---
+id: create-message-broker-service-base
+title: Create Message Broker Service Base | .NET Plugin Event
+description: Creates the base service for the message broker.
+sidebar_label: Create Message Broker Service Base
+slug: /plugins/dotnet-plugin-events/create-message-broker-service-base
+---
+
+# Create Message Broker Service Base
+
+
+Creates the base service for the message broker.
+
+### Event Name
+
+`CreateMessageBrokerServiceBase`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerServiceBaseParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-message-broker-service.md b/docs/plugins/dotnet-plugin-events/create-message-broker-service.md
new file mode 100644
index 00000000..1b1ef5b1
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-message-broker-service.md
@@ -0,0 +1,38 @@
+---
+id: create-message-broker-service
+title: Create Message Broker Service | .NET Plugin Event
+description: Creates the service for the message broker.
+sidebar_label: Create Message Broker Service
+slug: /plugins/dotnet-plugin-events/create-message-broker-service
+---
+
+# Create Message Broker Service
+
+
+Creates the service for the message broker.
+
+### Event Name
+
+`CreateMessageBrokerService`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerServiceParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+### Example
+
+```ts
+async afterCreateMessageBrokerService(
+ dsgContext: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateMessageBrokerServiceParams,
+ files: FileMap
+): Promise> {
+ const messageBrokerFiles = await createMessageBroker(dsgContext);
+ await files.merge(messageBrokerFiles);
+ return files;
+}
+```
diff --git a/docs/plugins/dotnet-plugin-events/create-message-broker-topics-enum.md b/docs/plugins/dotnet-plugin-events/create-message-broker-topics-enum.md
new file mode 100644
index 00000000..1a5d8a60
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-message-broker-topics-enum.md
@@ -0,0 +1,24 @@
+---
+id: create-message-broker-topics-enum
+title: Create Message Broker Topics Enum | .NET Plugin Event
+description: Creates the message broker topics enum.
+sidebar_label: Create Message Broker Topics Enum
+slug: /plugins/dotnet-plugin-events/create-message-broker-topics-enum
+---
+
+# Create Message Broker Topics Enum
+
+
+Creates the message broker topics enum.
+
+### Event Name
+
+`CreateMessageBrokerTopicsEnum`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerTopicsEnumParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-message-broker.md b/docs/plugins/dotnet-plugin-events/create-message-broker.md
new file mode 100644
index 00000000..d5c78ebb
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-message-broker.md
@@ -0,0 +1,24 @@
+---
+id: create-message-broker
+title: Create Message Broker | .NET Plugin Event
+description: Sets up the message broker configuration for the .NET server.
+sidebar_label: Create Message Broker
+slug: /plugins/dotnet-plugin-events/create-message-broker
+---
+
+# Create Message Broker
+
+
+Sets up the message broker configuration for the .NET server.
+
+### Event Name
+
+`CreateMessageBroker`
+
+### Event Params
+
+```ts
+export interface CreateMessageBrokerParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-prisma-schema.md b/docs/plugins/dotnet-plugin-events/create-prisma-schema.md
new file mode 100644
index 00000000..452b6dc8
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-prisma-schema.md
@@ -0,0 +1,38 @@
+---
+id: create-prisma-schema
+title: Create Prisma Schema | .NET Plugin Event
+description: Creates the Prisma schema for the application.
+sidebar_label: Create Prisma Schema
+slug: /plugins/dotnet-plugin-events/create-prisma-schema
+---
+
+# Create Prisma Schema
+
+
+Creates the Prisma schema for the application.
+
+### Event Name
+
+`CreatePrismaSchema`
+
+### Event Params
+
+```ts
+export interface CreatePrismaSchemaParams extends EventParams {
+ entities: Entity[];
+ dataSource: PrismaDataSource;
+ clientGenerator: PrismaClientGenerator;
+}
+```
+
+Example:
+
+```ts
+beforeCreatePrismaSchema(
+ context: DsgContext,
+ eventParams: CreatePrismaSchemaParams
+) {
+ // Modify Prisma schema generation
+ return eventParams;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-program-file.md b/docs/plugins/dotnet-plugin-events/create-program-file.md
new file mode 100644
index 00000000..5e241ee2
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-program-file.md
@@ -0,0 +1,54 @@
+---
+id: create-program-file
+title: Create Program File | .NET Plugin Event
+description: Creates the main Program.cs file for the .NET application.
+sidebar_label: Create Program File
+slug: /plugins/dotnet-plugin-events/create-program-file
+---
+
+# Create Program File
+
+
+Creates the main Program.cs file for the .NET application.
+
+### Event Name
+
+`CreateProgramFile`
+
+### Event Params
+
+```ts
+export interface CreateProgramFileParams extends EventParams {
+ builderServicesBlocks: CodeBlock[];
+ appBlocks: CodeBlock[];
+}
+```
+
+### Example
+
+```ts
+beforeCreateProgramFile(
+ { resourceInfo }: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateProgramFileParams
+) {
+ const serviceNamespace = pascalCase(resourceInfo?.name ?? "");
+ const serviceDbContext = `${pascalCase(resourceInfo?.name ?? "")}DbContext`;
+ eventParams.builderServicesBlocks.push(
+ new CodeBlock({
+ code: `builder.Services.AddDbContext<${serviceDbContext}>(opt => opt.UseNpgsql(builder.Configuration.GetConnectionString("${CONNECTION_STRING}")));`,
+ references: [
+ new ClassReference({
+ name: "AddDbContext",
+ namespace: "Microsoft.EntityFrameworkCore",
+ }),
+ new ClassReference({
+ name: serviceDbContext,
+ namespace: `${serviceNamespace}.Infrastructure`,
+ }),
+ ],
+ })
+ );
+
+ return eventParams;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-resource-db-context-file.md b/docs/plugins/dotnet-plugin-events/create-resource-db-context-file.md
new file mode 100644
index 00000000..af576a69
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-resource-db-context-file.md
@@ -0,0 +1,59 @@
+---
+id: create-resource-db-context-file
+title: Create Resource Db Context File | .NET Plugin Event
+description: Creates the database context file for the .NET application.
+sidebar_label: Create Resource Db Context File
+slug: /plugins/dotnet-plugin-events/create-resource-db-context-file
+---
+
+# Create Resource Db Context File
+
+
+Creates the database context file for the .NET application.
+
+### Event Name
+
+`CreateResourceDbContextFile`
+
+### Event Params
+
+```ts
+export interface CreateResourceDbContextFileParams extends EventParams {
+ entities: Entity[];
+ resourceName: string;
+ resourceDbContextPath: string;
+}
+```
+
+### Example
+
+```ts
+afterCreateResourceDbContextFile(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateResourceDbContextFileParams,
+ files: FileMap
+): FileMap {
+ const { resourceDbContextPath, resourceName } = eventParams;
+
+ const modelFile = files.get(
+ `${resourceDbContextPath}${resourceName}DbContext.cs`
+ );
+
+ if (!modelFile) return files;
+
+ modelFile.code.parentClassReference = CsharpSupport.genericClassReference({
+ reference: CsharpSupport.classReference({
+ name: `IdentityDbContext`,
+ namespace: "Microsoft.AspNetCore.Identity.EntityFrameworkCore",
+ }),
+ innerType: CsharpSupport.Types.reference(
+ CsharpSupport.classReference({
+ name: `IdentityUser`,
+ namespace: "Microsoft.AspNetCore.Identity",
+ })
+ ),
+ });
+
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-seed-development-data-file.md b/docs/plugins/dotnet-plugin-events/create-seed-development-data-file.md
new file mode 100644
index 00000000..3db04da1
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-seed-development-data-file.md
@@ -0,0 +1,73 @@
+---
+id: create-seed-development-data-file
+title: Create Seed Development Data File | .NET Plugin Event
+description: Creates a file for seeding development data in the .NET application.
+sidebar_label: Create Seed Development Data File
+slug: /plugins/dotnet-plugin-events/create-seed-development-data-file
+---
+
+# Create Seed Development Data File
+
+
+Creates a file for seeding development data in the .NET application.
+
+### Event Name
+
+`CreateSeedDevelopmentDataFile`
+
+### Event Params
+
+```ts
+export interface CreateSeedDevelopmentDataFileParams extends EventParams {
+ seedFilePath: string;
+ resourceName: string;
+}
+```
+
+### Example
+
+```ts
+afterCreateSeedDevelopmentDataFile(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateSeedDevelopmentDataFileParams,
+ files: FileMap
+): FileMap {
+ const { seedFilePath, resourceName } = eventParams;
+ const { entities } = context;
+
+ if (!entities) return files;
+
+ const seedFile = files.get(seedFilePath);
+ seedFile?.code.addMethod(
+ CsharpSupport.method({
+ name: "SeedDevUser",
+ access: "public",
+ isAsync: true,
+ body: CreateSeedDevelopmentDataBody(resourceName, context),
+ type: MethodType.STATIC,
+ parameters: [
+ CsharpSupport.parameter({
+ name: "serviceProvider",
+ type: CsharpSupport.Types.reference(
+ CsharpSupport.classReference({
+ name: "IServiceProvider",
+ namespace: `${resourceName}.Infrastructure.Models`,
+ })
+ ),
+ }),
+ CsharpSupport.parameter({
+ name: "configuration",
+ type: CsharpSupport.Types.reference(
+ CsharpSupport.classReference({
+ name: "IConfiguration",
+ namespace: "",
+ })
+ ),
+ }),
+ ],
+ })
+ );
+
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-seed.md b/docs/plugins/dotnet-plugin-events/create-seed.md
new file mode 100644
index 00000000..63198fd8
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-seed.md
@@ -0,0 +1,69 @@
+---
+id: create-seed
+title: Create Seed | .NET Plugin Event
+description: Creates the seed data file for the .NET application.
+sidebar_label: Create Seed
+slug: /plugins/dotnet-plugin-events/create-seed
+---
+
+# Create Seed
+
+
+Creates the seed data file for the .NET application.
+
+### Event Name
+
+`CreateSeed`
+
+### Event Params
+
+```ts
+export interface CreateSeedParams extends EventParams {
+ fileDir: string;
+ outputFileName: string;
+ dtoNameToPath: Record;
+}
+```
+
+Example:
+
+```ts
+async afterCreateSeed(
+ context: DsgContext,
+ eventParams: CreateSeedParams,
+ modules: ModuleMap
+) {
+ const { fileDir, outputFileName } = eventParams;
+ const seedData = `
+ public static class SeedData
+ {
+ public static void Initialize(IServiceProvider serviceProvider)
+ {
+ using (var context = new ApplicationDbContext(
+ serviceProvider.GetRequiredService>()))
+ {
+ // Check if the database has been seeded
+ if (context.Users.Any())
+ {
+ return; // Database has been seeded
+ }
+
+ context.Users.AddRange(
+ new User { Name = "User 1", Email = "user1@example.com" },
+ new User { Name = "User 2", Email = "user2@example.com" }
+ );
+
+ context.SaveChanges();
+ }
+ }
+ }
+ `;
+
+ modules.set({
+ path: join(fileDir, outputFileName),
+ code: seedData
+ });
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-server-app-module.md b/docs/plugins/dotnet-plugin-events/create-server-app-module.md
new file mode 100644
index 00000000..8a0cf9e6
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-server-app-module.md
@@ -0,0 +1,24 @@
+---
+id: create-server-app-module
+title: Create Server App Module | .NET Plugin Event
+description: Creates the main application module for the .NET server.
+sidebar_label: Create Server App Module
+slug: /plugins/dotnet-plugin-events/create-server-app-module
+---
+
+# Create Server App Module
+
+
+Creates the main application module for the .NET server.
+
+### Event Name
+
+`CreateServerAppModule`
+
+### Event Params
+
+```ts
+export interface CreateServerAppModuleParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-server-appsettings.md b/docs/plugins/dotnet-plugin-events/create-server-appsettings.md
new file mode 100644
index 00000000..6e4e48f5
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-server-appsettings.md
@@ -0,0 +1,45 @@
+---
+id: create-server-appsettings
+title: Create Server Appsettings | .NET Plugin Event
+description: Creates or updates the appsettings.json file for the .NET server.
+sidebar_label: Create Server Appsettings
+slug: /plugins/dotnet-plugin-events/create-server-appsettings
+---
+
+# Create Server Appsettings
+
+
+Creates or updates the appsettings.json file for the .NET server.
+
+### Event Name
+
+`CreateServerAppsettings`
+
+### Event Params
+
+```ts
+export interface CreateServerAppsettingsParams extends EventParams {
+ updateProperties: { [key: string]: any };
+}
+```
+
+### Example
+
+```ts
+beforeCreateServerAppsettings(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateServerAppsettingsParams
+) {
+ const { port, password, user, host, dbName } = getPluginSettings(
+ context.pluginInstallations
+ );
+
+ eventParams.updateProperties = {
+ ...eventParams.updateProperties,
+ ConnectionStrings: {
+ [CONNECTION_STRING]: `Host=${host}:${port};Username=${user};Password=${password};Database=${dbName}`,
+ },
+ };
+ return eventParams;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-server-auth.md b/docs/plugins/dotnet-plugin-events/create-server-auth.md
new file mode 100644
index 00000000..1a3f365e
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-server-auth.md
@@ -0,0 +1,53 @@
+---
+id: create-server-auth
+title: Create Server Auth | .NET Plugin Event
+description: Sets up authentication for the .NET server.
+sidebar_label: Create Server Auth
+slug: /plugins/dotnet-plugin-events/create-server-auth
+---
+
+# Create Server Auth
+
+
+Sets up authentication for the .NET server.
+
+### Event Name
+
+`CreateServerAuth`
+
+### Event Params
+
+```ts
+export interface CreateServerAuthParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
+
+### Example
+
+```ts
+afterCreateServerAuth(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateServerAuthParams,
+ files: FileMap
+): Promise> {
+ const authFile = files.get("Auth/AuthService.cs");
+ if (authFile) {
+ authFile.code.addMethod(
+ CsharpSupport.method({
+ name: "ValidateToken",
+ access: "public",
+ returnType: CsharpSupport.Types.boolean(),
+ parameters: [
+ CsharpSupport.parameter({
+ name: "token",
+ type: CsharpSupport.Types.string(),
+ }),
+ ],
+ body: "// Add token validation logic here\nreturn true;",
+ })
+ );
+ }
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-server-csproj.md b/docs/plugins/dotnet-plugin-events/create-server-csproj.md
new file mode 100644
index 00000000..bcbd0104
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-server-csproj.md
@@ -0,0 +1,46 @@
+---
+id: create-server-csproj
+title: Create Server Csproj | .NET Plugin Event
+description: Creates or updates the .csproj file for the .NET server.
+sidebar_label: Create Server Csproj
+slug: /plugins/dotnet-plugin-events/create-server-csproj
+---
+
+# Create Server Csproj
+
+
+Creates or updates the .csproj file for the .NET server.
+
+### Event Name
+
+`CreateServerCsproj`
+
+### Event Params
+
+```ts
+export interface CreateServerCsprojParams extends EventParams {
+ propertyGroup: Record;
+ packageReferences: {
+ include: string;
+ version: string;
+ includeAssets?: string;
+ privateAssets?: string;
+ }[];
+}
+```
+
+### Example
+
+```ts
+beforeCreateServerCsproj(
+ _: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateServerCsprojParams
+) {
+ eventParams.packageReferences.push({
+ include: "Npgsql.EntityFrameworkCore.PostgreSQL",
+ version: "8.0.4",
+ });
+
+ return eventParams;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-server-docker-compose.md b/docs/plugins/dotnet-plugin-events/create-server-docker-compose.md
new file mode 100644
index 00000000..86dbe03d
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-server-docker-compose.md
@@ -0,0 +1,42 @@
+---
+id: create-server-docker-compose
+title: Create Server Docker Compose | .NET Plugin Event
+description: Creates or updates the Docker Compose file for the .NET server.
+sidebar_label: Create Server Docker Compose
+slug: /plugins/dotnet-plugin-events/create-server-docker-compose
+---
+
+# Create Server Docker Compose
+
+
+Creates or updates the Docker Compose file for the .NET server.
+
+### Event Name
+
+`CreateServerDockerCompose`
+
+### Event Params
+
+```ts
+export interface CreateServerDockerComposeParams extends EventParams {
+ fileContent: string;
+ updateProperties: { [key: string]: any }[];
+ outputFileName: string;
+}
+```
+
+### Example
+
+```ts
+beforeCreateServerDockerCompose(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateServerDockerComposeParams
+) {
+ const settings = getPluginSettings(context.pluginInstallations);
+
+ eventParams.updateProperties.push(
+ ...updateDockerComposeProperties(settings)
+ );
+ return eventParams;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-server-git-ignore.md b/docs/plugins/dotnet-plugin-events/create-server-git-ignore.md
new file mode 100644
index 00000000..5a9e840e
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-server-git-ignore.md
@@ -0,0 +1,41 @@
+---
+id: create-server-git-ignore
+title: Create Server Git Ignore | .NET Plugin Event
+description: Creates the .gitignore file for the server.
+sidebar_label: Create Server Git Ignore
+slug: /plugins/dotnet-plugin-events/create-server-git-ignore
+---
+
+# Create Server Git Ignore
+
+
+Creates the .gitignore file for the server.
+
+### Event Name
+
+`CreateServerGitIgnore`
+
+### Event Params
+
+```ts
+export interface CreateServerGitIgnoreParams extends EventParams {
+ gitignorePaths: string[];
+}
+```
+
+### Example
+
+```ts
+beforeCreateServerGitIgnore(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.CreateServerGitIgnoreParams
+): Promise {
+ eventParams.gitignorePaths.push(
+ "*.user",
+ "*.userosscache",
+ "*.sln.docstates",
+ "[Tt]est[Rr]esult*"
+ );
+ return eventParams;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-server-secrets-manager.md b/docs/plugins/dotnet-plugin-events/create-server-secrets-manager.md
new file mode 100644
index 00000000..d89f4e8a
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-server-secrets-manager.md
@@ -0,0 +1,58 @@
+---
+id: create-server-secrets-manager
+title: Create Server Secrets Manager | .NET Plugin Event
+description: Creates the configuration for the secrets manager in the server.
+sidebar_label: Create Server Secrets Manager
+slug: /plugins/dotnet-plugin-events/create-server-secrets-manager
+---
+
+# Create Server Secrets Manager
+
+
+Creates the configuration for the secrets manager in the server.
+
+### Event Name
+
+`CreateServerSecretsManager`
+
+### Event Params
+
+```ts
+export interface CreateServerSecretsManagerParams extends EventParams {
+ secretsNameKey: SecretsNameKey[];
+}
+```
+
+Example:
+
+```ts
+async afterCreateServerSecretsManager(
+ context: DsgContext,
+ eventParams: CreateServerSecretsManagerParams,
+ modules: ModuleMap
+) {
+ const { secretsNameKey } = eventParams;
+ const secretsManager = `
+ public static class SecretsManager
+ {
+ public enum SecretsNameKey
+ {
+ ${secretsNameKey.map(snk => `${snk.name} = "${snk.key}"`).join(',\n ')}
+ }
+
+ public static string GetSecret(SecretsNameKey key)
+ {
+ // Implement secret retrieval logic here
+ return Environment.GetEnvironmentVariable(key.ToString());
+ }
+ }
+ `;
+
+ modules.set({
+ path: join(context.serverDirectories.srcDirectory, "SecretsManager.cs"),
+ code: secretsManager
+ });
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-server.md b/docs/plugins/dotnet-plugin-events/create-server.md
new file mode 100644
index 00000000..0ce9ae24
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-server.md
@@ -0,0 +1,24 @@
+---
+id: create-server
+title: Create Server | .NET Plugin Event
+description: Initializes the creation of the .NET server.
+sidebar_label: Create Server
+slug: /plugins/dotnet-plugin-events/create-server
+---
+
+# Create Server
+
+
+Initializes the creation of the .NET server.
+
+### Event Name
+
+`CreateServer`
+
+### Event Params
+
+```ts
+export interface CreateServerParams extends EventParams {}
+```
+
+This event does not use any additional parameters.
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/create-swagger.md b/docs/plugins/dotnet-plugin-events/create-swagger.md
new file mode 100644
index 00000000..1e647db0
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/create-swagger.md
@@ -0,0 +1,56 @@
+---
+id: create-swagger
+title: Create Swagger | .NET Plugin Event
+description: Creates the Swagger configuration for the .NET application.
+sidebar_label: Create Swagger
+slug: /plugins/dotnet-plugin-events/create-swagger
+---
+
+# Create Swagger
+
+
+Creates the Swagger configuration for the .NET application.
+
+### Event Name
+
+`CreateSwagger`
+
+### Event Params
+
+```ts
+export interface CreateSwaggerParams extends EventParams {
+ fileDir: string;
+ outputFileName: string;
+}
+```
+
+Example:
+
+```ts
+async afterCreateSwagger(
+ context: DsgContext,
+ eventParams: CreateSwaggerParams,
+ modules: ModuleMap
+) {
+ const { fileDir, outputFileName } = eventParams;
+ const swaggerConfig = `
+ public static class SwaggerConfig
+ {
+ public static void ConfigureSwagger(this IServiceCollection services)
+ {
+ services.AddSwaggerGen(c =>
+ {
+ c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
+ });
+ }
+ }
+ `;
+
+ modules.set({
+ path: join(fileDir, outputFileName),
+ code: swaggerConfig
+ });
+
+ return modules;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugin-events/load-static-files.md b/docs/plugins/dotnet-plugin-events/load-static-files.md
new file mode 100644
index 00000000..ac6d75d6
--- /dev/null
+++ b/docs/plugins/dotnet-plugin-events/load-static-files.md
@@ -0,0 +1,60 @@
+---
+id: load-static-files
+title: Load Static Files | .NET Plugin Event
+description: Loads static files into the project.
+sidebar_label: Load Static Files
+slug: /plugins/dotnet-plugin-events/load-static-files
+---
+
+# Load Static Files
+
+
+Loads static files into the project.
+
+### Event Name
+
+`LoadStaticFiles`
+
+### Event Params
+
+```ts
+export interface LoadStaticFilesParams extends EventParams {
+ source: string;
+ basePath: string;
+}
+```
+
+### Example
+
+```ts
+async afterLoadStaticFiles(
+ context: dotnetTypes.DsgContext,
+ eventParams: dotnet.LoadStaticFilesParams,
+ files: FileMap
+): Promise> {
+ const { resourceInfo } = context;
+ if (!resourceInfo) return files;
+
+ const resourceName = pascalCase(resourceInfo.name);
+
+ const destPath = `${eventParams.basePath}/src/APIs/Common/Auth/ProgramAuthExtensions.cs`;
+ const filePath = resolve(
+ __dirname,
+ "./static/common/auth/ProgramAuthExtensions.cs"
+ );
+
+ const programAuthExtensionsFileMap = await createStaticFileFileMap(
+ destPath,
+ filePath,
+ context,
+ [
+ CsharpSupport.classReference({
+ name: `${resourceName}DbContext`,
+ namespace: `${resourceName}.Infrastructure`,
+ }),
+ ]
+ );
+
+ return files;
+}
+```
\ No newline at end of file
diff --git a/docs/plugins/dotnet-plugins.md b/docs/plugins/dotnet-plugins.md
new file mode 100644
index 00000000..df197785
--- /dev/null
+++ b/docs/plugins/dotnet-plugins.md
@@ -0,0 +1,65 @@
+---
+id: dotnet-plugins
+title: .NET Plugins
+sidebar_label: .NET Plugins
+slug: /dotnet-plugins
+pagination_next: plugins/overview
+pagination_prev: getting-started/plugins
+---
+
+# Amplication .NET Plugins
+
+The following plugins are currently available for .NET services generated by Amplication.
+Additional plugins will be added in future releases of Amplication.
+
+:::note
+For the most updated list of .NET plugins, please check the _Plugins_ tab on your Amplication dashboard.
+:::
+
+### PostgreSQL DB for .NET
+
+Use a PostgreSQL database in the service generated by Amplication.
+
+[PostgreSQL](https://github.com/amplication/plugins/tree/master/plugins/db-postgres) is a free and open-source relational database management system that is designed to be highly scalable, reliable, and powerful. It is known for its ability to handle large amounts of data and a high volume of queries.
+
+### MS SQL Server DB for .NET
+
+Use an MS SQL Server database in the service generated by Amplication.
+
+[MS SQL Server](https://github.com/amplication/plugins/tree/master/plugins/db-sqlserver) is a relational database management system developed by Microsoft. It is designed to be robust, scalable, and secure, making it an excellent choice for enterprise-level applications and data-intensive operations.
+
+### Kafka
+
+Use a Kafka message broker to communicate between your services.
+
+[Apache Kafka](https://github.com/amplication/plugins/tree/master/plugins/broker-kafka) is a distributed streaming platform, used for building real-time data pipelines and streaming applications. It is a publish-subscribe messaging system that allows for the creation of high-throughput and low-latency systems.
+
+In the Apache Kafka messaging system, processes known as producers write data to Kafka topics, and processes known as consumers read data from Kafka topics.
+
+### Authentication and Authorization using ASP.NET Core Identity
+
+Add Authentication and Authorization to your .NET Services.
+
+[ASP.NET Core Identity](https://github.com/amplication/plugins/tree/master/plugins/dotnet-auth-core-identity) is a membership system that adds login functionality to ASP.NET Core apps. It allows you to add login features, manage users, passwords, profile data, roles, and more.
+
+:::info
+This plugin provides a robust and customizable solution for managing user authentication and authorization in your .NET applications generated by Amplication.
+:::
+
+### Terraform - AWS Core
+
+Adds terraform code for provisioning Amazon Web Services core network infrastructure.
+
+The [Terraform AWS Core plugin](https://github.com/amplication/plugins/tree/master/plugins/dotnet-provisioning-terraform-aws-core) adds a foundational networking setup using Terraform for AWS. This serves as a basis for adding additional resources for provisioning, such as databases, deployments, and more.
+
+### Helm Chart
+
+Adds a Helm Chart for the generated service which can be used for deployment of the application within a Kubernetes cluster.
+
+The [Helm Chart plugin](https://github.com/amplication/plugins/tree/master/plugins/dotnet-deployment-helm-chart) generates Helm charts for your service, facilitating deployment within Kubernetes clusters.
+
+### Terraform - AWS Database RDS
+
+Adds terraform code for provisioning Amazon Web Services Relational Database Service (RDS) as an addition to the 'core' terraform code base.
+
+The [Terraform AWS Database RDS plugin](https://github.com/amplication/plugins/tree/master/plugins/dotnet-provisioning-terraform-aws-rds) adds infrastructure-as-code for setting up an RDS instance on AWS, complementing the core network setup.
diff --git a/docs/plugins/event-hierarchy.md b/docs/plugins/event-hierarchy.md
index a2440faf..df92cea8 100644
--- a/docs/plugins/event-hierarchy.md
+++ b/docs/plugins/event-hierarchy.md
@@ -7,10 +7,33 @@ slug: /plugins/event-hierarchy
# Event Hierarchy
-We have two main events in our `Data Service Generator (DSG)` service. One for the server creation and the other for the admin-ui creation. **These events are running simultaneously, and there is no guarantee which will finish first**
+We have two main event hierarchies in our Data Service Generator (DSG) service: one for Node.js services and one for .NET services. Each of these hierarchies includes events to create the server's files and, in the case of Node.js, the admin-ui files.
-Each of these main events includes other events to create the server’s files and the admin-ui files (in our source code it is sometimes referred as and `modules`).
+## Node.js Event Hierarchy
-The following diagram represents the execution order of the events in DSG.
+For Node.js services, we have two main events: one for the server creation and the other for the admin-ui creation. **These events are running simultaneously, and there is no guarantee which will finish first.**
-![](.\assets\hierarchy.png)
+Each of these main events includes other events to create the server's files and the admin-ui files (in our source code, it is sometimes referred to as `modules`).
+
+For a complete list of Node.js events, descriptions, parameters, and examples, refer to the [Node.js Plugin Events Reference](/plugins/plugin-events/create-server/) section.
+
+The following diagram represents the execution order of the events in DSG for Node.js:
+
+![A Diagram of Node.js Plugins Events](./assets/hierarchy.png)
+
+## .NET Event Hierarchy
+
+For .NET services, the event hierarchy is focused on server-side generation. It includes events for creating various components of the .NET service, such as controllers, services, database models, and infrastructure elements.
+
+Key events in the .NET hierarchy include:
+
+1. [`CreateServer`](/plugins/dotnet-plugin-events/create-server): The main event for creating the .NET server.
+2. [`CreateProgramFile`](/plugins/dotnet-plugin-events/create-program-file): Creates the main program file for the .NET application.
+3. [`CreateEntityController`](/plugins/dotnet-plugin-events/create-entity-controller) and [`CreateEntityService`](/plugins/dotnet-plugin-events/create-entity-service): Create controllers and services for each entity.
+4. [`CreateServerAuth`](/plugins/dotnet-plugin-events/create-server-auth): Sets up authentication for the .NET server.
+
+The order of execution is deterministic and events run synchronously. For a complete list of .NET events, descriptions, parameters, and examples, refer to the [.NET Plugin Events Reference](/plugins/dotnet-plugin-events/create-server) page.
+
+:::note
+The event hierarchies for Node.js and .NET are distinct and tailored to the specific needs and structures of each platform.
+:::
\ No newline at end of file
diff --git a/docs/plugins/plugin-architecture.md b/docs/plugins/plugin-architecture.md
index 4ea02b1b..56de5452 100644
--- a/docs/plugins/plugin-architecture.md
+++ b/docs/plugins/plugin-architecture.md
@@ -1,23 +1,29 @@
---
id: plugin-architecture
-title: Plugin Architecture
-sidebar_label: Plugin Architecture
+title: Plugin Architecture Overview
+sidebar_label: Custom Plugin Architecture
slug: /plugins/plugin-architecture
---
-Amplication's `Data Service Generator (DSG)` service is responsible for the code generation process. This process is divided into several functions, where each function plays a different part in this process.
+Amplication's Data Service Generator (DSG) service is responsible for the code generation process. This process is divided into several functions, each playing a different part in the process for both Node.js and .NET services.
-To enable intervention in the code generation process, we wrap these functions in a function named `pluginWrapper`
+To enable intervention in the code generation process, we wrap these functions in a function named `pluginWrapper`.
The `pluginWrapper` function is invoked with the following arguments:
- **func** - the DSG function we want to wrap.
- **event** - the name of event we want to capture, and change something in the triggered process.
-- **args** - the original parameters of the DSG function. There are most likely will be used as the parameters of the event, for the plugin developer to have access to these params and manipulate the returned value of the function.
+- **args** - the original parameters of the DSG function. These are likely to be used as the parameters of the event, for the plugin developer to have access to these params and manipulate the returned value of the function.
For the purpose of this architecture overview, remember that every event has before and after property (which is a function), representing the event's lifecycle in which you can intervene (before the emission of the event and after the emission of the event). For more information about `before` and `after` event see [Before and After Lifecycle Functions](docs\plugins\before-after.md)
-When the `pluginWrapper` function is invoked, it checks whether the event argument that was passed has a `before` or `after` property. If so, it invokes other functions that are responsible for calculating the final behavior when this event is emitted, or in other words
-the outcome of the function that this event is responsible to execute.
+When the `pluginWrapper` function is invoked, it checks whether the event argument that was passed has a `before` or `after` property. If so, it invokes other functions that are responsible for calculating the final behavior when this event is emitted, or in other words, the outcome of the function that this event is responsible to execute.
-If no part of the event lifecycle was provided or if non of its params were changed, the default behavior will be executed.
+If no part of the event lifecycle was provided or if none of its params were changed, the default behavior will be executed.
+
+## Node.js vs .NET
+
+While the overall architecture remains similar for both Node.js and .NET services, there are distinct events and parameters for each. The Node.js events are defined in the `EventNames` enum, while the .NET events are defined in the `DotnetEventNames` enum.
+
+- [Node.js Event Reference](/plugins/plugin-events/create-server/)
+- [.NET Event Reference](/plugins/dotnet-plugin-events/create-server/)
\ No newline at end of file
diff --git a/docs/plugins/private-plugins.md b/docs/plugins/private-plugins.md
new file mode 100644
index 00000000..478d973e
--- /dev/null
+++ b/docs/plugins/private-plugins.md
@@ -0,0 +1,268 @@
+---
+id: private-plugins
+slug: /private-plugins
+toc_max_heading_level: 2
+---
+
+# Creating and Using Private Plugins
+
+Private Plugins enable you to create plugins exclusively for your organization's use.
+These plugins let you build secure, proprietary integrations and define your organization's standards. You can use them to protect sensitive business logic and enforce development best practices across your services.
+
+:::note
+Private Plugins are only **available for Enterprise Plan users**.
+:::
+
+Unlike community plugins hosted on public package managers, private plugins reside in your own Git repository, giving you complete control over your plugin infrastructure and code.
+
+## Create Your Private Plugins Repository
+
+First, set up a dedicated Git repository to host your plugin's source code and builds:
+
+1. Create a new Git repository specifically for your private plugins
+2. Create a `plugins` folder in the repository root
+
+The `plugins` folder will contain separate folders for each of your private plugins.
+
+![Private Plugins Repo](./assets/private-plugins/private-plugins-repo.png)
+
+## Configure Git Settings In Platform Console
+
+Next, configure your private plugins repository in the Platform Console:
+
+1. Navigate to your project's **Platform Console** from the top header
+2. Click the **Private Plugins** tab
+3. Select **Git Settings** in the left sidebar
+4. Enable the **Override default settings** toggle
+5. Choose your dedicated plugin repository from the dropdown
+
+:::important
+Never use the same repository for private plugins and generated services to avoid build conflicts.
+:::
+
+![Publish Your Platform Console Changes](./assets/private-plugins/configure-git-settings.png)
+
+## Add a New Private Plugin
+
+Next, add a new private plugin to your Platform Console:
+
+1. In the Private Plugins tab's sidebar, click the `Add Private Plugin` field
+2. Enter a unique name using kebab-case (e.g., `acme-corp-authentication`)
+3. Set the plugin's **Display Name** and **Description** - these will appear in the UI when selecting plugins
+4. Choose the appropriate code generator (Node.js or .NET) that matches your target services
+
+![Publish Your Platform Console Changes](./assets/private-plugins/add-new-plugin.png)
+
+## Set Up Your Private Plugin Folder
+
+After creating the plugin entry in the Platform Console, set up your development environment.
+
+### For Node.js Plugins:
+
+You can get started using our Node.js plugin template.
+
+![Node.js Plugin Template](./assets/private-plugins/plugin-template.png)
+
+First, navigate to the plugins folder.
+
+```bash
+cd plugins
+```
+
+Next, clone the plugin template and name it with your plugin's `Plugin Id`.
+
+```bash
+git clone https://github.com/amplication/plugin-template your-plugin-id
+```
+
+### For .NET Plugins:
+
+To create a new .NET plugin, we recommend copying and modifying the existing .NET Postgres Database plugin as a starting template.
+
+![.NET Postgres Database Plugin](./assets/private-plugins/dotnet-postgres-db.png)
+
+First, navigate to the `plugins` folder within your project:
+
+```bash
+cd plugins
+```
+
+Next, clone the .NET Postgres Database plugin.
+
+To avoid downloading the entire repository, we'll use a sparse checkout to copy only the `dotnet-db-postgres` folder from Amplication's plugins repository.
+
+Follow the steps below to complete this process:
+
+1. **Initialize the Clone Without Checking Out Files**
+ Begin by cloning the Amplication plugins repository without checking out any files:
+
+ ```bash
+ git clone --no-checkout https://github.com/amplication/plugins
+ ```
+
+2. **Set Up Sparse Checkout for the Plugin**
+ Specify that you only want to download the `dotnet-db-postgres` folder:
+
+ ```bash
+ git sparse-checkout set plugins/dotnet-db-postgres
+ ```
+
+3. **Check Out the Specified Folder**
+ Now, check out the files. This will only download the `plugins/dotnet-db-postgres` folder:
+
+ ```bash
+ git checkout
+ ```
+
+4. **Rename the Folder to Your Plugin ID**
+ Finally, rename the cloned `dotnet-db-postgres` folder to match your plugin's `Plugin Id`:
+
+ ```bash
+ mv plugins/dotnet-db-postgres your-plugin-id
+ ```
+
+## Develop Your Plugin
+
+Now that your plugin structure is set up, it's time to start building your plugin.
+We've prepared several resources and reference materials to help guide your plugin development process.
+
+Core Documentation:
+
+- [Private Plugins Overview](https://docs.amplication.com/plugins/overview/)
+- [.NET Plugin Events Reference Guide](https://docs.amplication.com/plugins/dotnet-plugin-events/create-server/)
+- [Node.js Plugin Events Reference Guide](https://docs.amplication.com/plugins/plugin-events/create-server/)
+
+Community Plugin Examples:
+
+- Browse the [official plugins repository](https://github.com/amplication/plugins/tree/master/plugins) for real-world examples
+
+:::note
+Study the published Node.js and .NET community plugins for best practices and guidance on how to structure your code effectively.
+:::
+
+## Add Versions to Your Plugin
+
+After developing your plugin, you'll need to version it both in Amplication and your Git repository.
+First, let's add a version through the Amplication UI:
+
+1. Navigate to the Private Plugins tab and select your plugin
+2. Scroll to **Add New Version** and click `Add Version`
+3. Note the version number you assign (e.g., `0.1.0`)
+
+![Publish Your Platform Console Changes](./assets/private-plugins/add-new-version.png)
+
+## Tag Your Git Repository
+
+Next, let's add a git tag to your plugin.
+Amplication uses Git tags to identify plugin versions during code generation.
+
+Create a tag with your Plugin ID and version from the previous step:
+
+```bash
+git tag "your-plugin-id@0.1.0"
+```
+
+Push the tag to your remote repository:
+
+```bash
+git push origin "your-plugin-id@0.1.0"
+```
+
+## Configure Plugin Settings
+
+Plugin settings allow you to define customizable options that users can configure when using your plugin. These settings can include API keys, feature flags, or other configuration values that modify your plugin's behavior.
+
+1. Click the **Edit** button (pencil icon) next to your version
+2. Configure user-facing settings in the **Settings** field:
+ ```json
+ {
+ "apiKey": "default-api-key",
+ "enableFeatureX": true
+ }
+ ```
+3. Set internal configurations in the **Configurations** field:
+ ```json
+ {
+ "requireAuthenticationEntity": true
+ }
+ ```
+
+![Publish Your Platform Console Changes](./assets/private-plugins/settings.png)
+
+:::note
+For a real-world example of using settings in your plugin, see the [Supertokens authentication plugin](https://github.com/amplication/plugins/blob/a94dac7956e51903df0240eef7b704999fc6a752/plugins/auth-supertokens/src/index.ts#L160).
+:::
+
+## Publish Your Plugin
+
+After adding a version to your plugin, configuring your plugin settings, and tagging your repository, it's time to publish your plugin. Publishing makes your plugin version available for use in services and templates, and sets it as the latest version.
+
+1. Go to your Platform Console
+2. Click on "Publish New Version" in your Platform Changes sidebar
+3. Add an optional version message
+4. Click **Publish** to make your changes available
+
+![Publish Your Platform Console Changes](./assets/private-plugins/publish-changes.png)
+
+## Use Private Plugins in Templates and Services
+
+You can use your private plugins in both templates and services, provided the code generator matches your plugin's code generator.
+
+### Include the Plugin in a Template
+
+1. Navigate to the Templates tab in your Platform Console
+2. Click on Create Template or navigate to an existing Template
+3. Ensure that your template's code generator matches your private plugin's code generator
+4. In your template's overview page, click on Plugins
+5. Go to the Private Plugins tab on the left sidebar
+6. Click Install on your private plugin
+
+### Include Plugin in a Service
+
+1. Navigate to your service in the Service Catalog
+2. Click on the Plugins tab
+3. Look for your private plugin in the Private Plugins section
+ :::note
+ Your plugin will only appear if its code generator matches your service's code generator
+ :::
+4. Click Install to add the plugin to your service
+
+![Include Plugin in a service](./assets/private-plugins/add-private-plugin-to-service.png)
+
+### Configure Plugin Settings
+
+1. Go to the Installed Plugins tab in the left sidebar
+2. Click Settings next to your private plugin
+3. Enter the JSON configuration that matches your plugin's user-facing settings
+
+## Best Practices and Common Pitfalls
+
+### Repository Management
+
+- Keep private plugins in a dedicated git repository separate from services
+- Maintain proper version control with meaningful commits
+
+### Code Generator Compatibility
+
+- Always match plugin and service code generators
+- Verify compatibility before starting development
+
+### Version Control
+
+- Use correct tag format: `PluginId@Version`
+- Always push tags to remote repository that match the tag you set in the UI
+
+### Code Generation Errors
+
+- Build failures during code generation: Review logs and ensure proper repository setup
+- Undefined property errors during code generation: Verify plugin versions and ensure the plugin is properly published
+- Dependency errors during service generation: Check `package.json` configuration
+
+## Next Steps
+
+You successfully created your private plugin.
+It's version-controlled in your Git repository and available for use in both templates and services that match its code generator.
+
+For more information or assistance:
+- Join our [Discord community](https://amplication.com/discord) for technical discussions and support
+- Enterprise customers can contact our support team through their designated support channels
diff --git a/docs/tutorials/react-todos/step-002.md b/docs/tutorials/react-todos/step-002.md
index cc2136d9..aabbe567 100644
--- a/docs/tutorials/react-todos/step-002.md
+++ b/docs/tutorials/react-todos/step-002.md
@@ -188,20 +188,25 @@ Make sure that you replace `first-service` with the name of the service that you
By doing this the Todo app UI will now run on port `5000` during development so it won't conflict with Amplication's default port for the server (which is `3000`).
- We've also set the start to script to run our frontend and backend code at the same time.
+ We've also set the `start` script to run our frontend and backend code at the same time.
-5. Before starting the server there are a few additional steps required. Read `server/README.md` for directions to:
+6. Before starting the server there are a few additional steps required. Read `server/README.md` for directions to:
- Create a Prisma client
- Start a database in Docker
- Initiate the database
-6. When those steps have been completed run the following command:
+7. When those steps have been completed run the following command:
```bash
npm run start
```
+> **Note:** If you encounter an error indicating that port `5000` is already in use, it means another software may be using the port, causing a conflict. This issue can be resolved by changing the port used for the frontend in `package.json`. Update the start script for the frontend to use a different port, for instance:
+> ```json
+> "start:frontend": "cross-env PORT=5001 npm --prefix web start",
+> ```
+
## Step 8 - Wrap Up
The frontend of the Todo app will be running at [http://localhost:5000/](http://localhost:5000/), and the backend will be running at [http://localhost:3000/](http://localhost:3000/).
diff --git a/docs/welcome.md b/docs/welcome.md
index c0d45dc4..eeeab1b9 100644
--- a/docs/welcome.md
+++ b/docs/welcome.md
@@ -1,52 +1,54 @@
---
id: welcome
-title: Getting Started
-description: Master Amplication with in-depth developer guides, API details, and tutorials.
-sidebar_label: Introduction
+title: Amplication Documentation
+description: Learn how Amplication helps teams build and maintain standardized backend services while enforcing best practices and preventing technical debt.
+sidebar_label: Overview
slug: /
---
-# Get Started with Amplication
+# Amplication Documentation
-Hello and welcome to Amplication's developer documentation.
+Amplication helps you scaffold, build, maintain, and scale backend services that align with your organization's best practices, supporting you throughout the entire development process.
-[Amplication](/about/) is an open-source backend development tool. It accelerates the development of Node.js and .NET applications by auto-generating production-ready backends.
+Our platform combines live templates, AI-powered code generation, and proactive technical debt management to help teams quickly scaffold, create, maintain, and scale production-ready backend services while continuously enforcing organizational standards.
-Streamline your development process and increase productivity so you can focus on what matters most: **creating awesome applications**.
+## Quickstart
-## Quick Start
+[Create your first service](/first-service/) with Amplication's AI, Jovu, and generate a _production-ready codebase in minutes_.
-[Create your first service](/first-service/) with Amplication.
-Set up a new service in less than 1 minute with our onboarding wizard.
+## Embed Your Organization's Best Practices
-## Key Features of Amplication
+Define and maintain standardized development practices through live templates and private plugins, including code conventions, tools, architecture patterns and more.
+Create templates with pre-configured settings, code generator version, and plugins. When templates or plugins are updated, these changes are automatically proposed as pull requests to all dependent services, ensuring your standards continuously evolve across your entire service portfolio.
-Amplication helps you build a fully functional backend in minutes. Just define your [data models](/how-to/create-entity/), roles, and [permissions](/how-to/set-access-permissions/) — and Amplication will generate a Node.js or .NET application with everything you need.
+- [**Live Service Templates**](/live-service-templates): Create and maintain standardized service architectures that automatically propagate best practices
+- **[Private Plugins](/private-plugins)**: Create organization-specific plugins for secure, internal functionality and standardization, or use [community plugins](/getting-started/plugins/) for common features. Support for security, deployment, monitoring, and more functionality.
+- [**Platform Console**](/platform-console): Centrally manage service standards and configurations
-All generated applications include the following features:
+## Technical Debt Prevention
-- Fully-functional [REST](/api/#rest-api) and [GraphQL](/api/#graphql-apis) APIs for all your data models.
-- [Authentication](/authentication/) & Authorization
-- React Admin UI
-- Logging
-- [Smart Git Sync](/smart-git-sync/)
-- [Automatic Code Generation](/getting-started/view-generated-code/)
-- [Deploy](/deploy/) & Publish
+Track and manage technical debt through our [Platform Console](/platform-console) and Service Catalog.
+Monitor template versions, plugin updates, and dependency changes across all services.
+Receive automatic notifications when updates are available and get clear upgrade paths for outdated services.
+Maintain consistent standards across your entire service portfolio, with all changes tracked through version control.
-In addition, developers can utilize their skills to [customize the generated application](/how-to/custom-code/) afterwards.
+## AI-powered Backend Generation
-## Other Ways to Get Started
+Our AI assistant, Jovu, helps you rapidly generate production-ready backend services with built-in best practices. Generate complete service infrastructure including REST and GraphQL APIs, database models, authentication, and logging in minutes. Customize your services through our platform's intuitive interface while maintaining consistent standards.
-### 1. Step-by-Step Tutorials
+- **[Jovu](/amplication-ai/)**: Generate production-ready code, get intelligent suggestions for your service's architecture, and more with Amplication AI.
+- **[Full Stack Code Generation](/getting-started/)**: Fully-functional REST and GraphQL APIs, database models, authentication, logging, React Admin UI, and more.
+- [Set up Entities and Fields](/set-up-entities)
+- [Configure API Endpoints](/custom-types-and-actions)
+- [Add Authentication and Authorization](/configure-roles-and-permissions)
-Our step-by-step tutorials show you how to build real-world applications with Amplication. These tutorials guide you through various aspects of Amplication's features and functionality.
+## Developer Self-Service
-Check out our [Tutorials](/tutorials/) page for a collection of guides.
+Enable developers to quickly create standardized services through our Service Catalog.
+Leverage plugins to efficiently add functionality in a standardized way across services.
+Support for multiple database options to match your technology stack.
-### 2. Explore Our Sample Apps
-
-If you prefer to jump directly into the code, we have [sample apps generated by Amplication](https://github.com/amplication/sample-app) available on GitHub. You can use this repository as the starting point for your own projects or to understand Amplication's capabilities better.
-
-## Join the Amplication Community
-
-Join Amplication's vibrant [community on Discord](https://amplication.com/discord) to collaborate with fellow developers, ask questions, and share your experiences.
+- Service Catalog
+- **[Database Support](/getting-started/#databases)**: Support for PostgreSQL, MySQL, MongoDB, MS SQL Server, and more
+- **Deployment & CI/CD**: Plugins for streamlined deployment to [AWS ECS](/deploy/aws/ecs), [Docker Desktop](/deploy/docker-desktop/), [Kubernetes](/deploy/kubernetes) and more
+- **[Import Your Existing DB](/how-to/import-prisma-schema/)**: Use your existing databases for a head start on development
\ No newline at end of file
diff --git a/docusaurus.config.js b/docusaurus.config.js
index f922a16f..7499b89d 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -8,6 +8,9 @@ module.exports = {
organizationName: "amplication", // Usually your GitHub org/user name.
projectName: "amplication", // Usually your repo name.
trailingSlash: true,
+ stylesheets: [
+ "https://fonts.googleapis.com/css?family=Poppins"
+ ],
themeConfig: {
metadata: [
{ name: "twitter:card", content: "summary_large_image" },
@@ -46,28 +49,32 @@ module.exports = {
},
items: [
{
- to: "/",
+ to: "/amplication-ai",
+ position: "left",
+ label: "AI",
+ },
+ {
+ to: "/platform-console/",
position: "left",
- label: "Get Started",
- activeBaseRegex: '^/$'
+ label: "Platform Console",
},
{
- to: "/tutorials",
+ to: "/service-catalog/",
position: "left",
- label: "Tutorials",
+ label: "Service Catalog",
},
{
- to: "/custom-code",
+ to: "/live-service-templates",
position: "left",
- label: "Custom Code",
+ label: "Live Templates",
},
{
- to: "/api",
+ to: "/private-plugins/",
position: "left",
- label: "Generated APIs",
+ label: "Private Plugins",
},
{
- to: "https://app.amplication.com/login",
+ to: "https://app.amplication.com/login?event=startNowClicked&source=documentation",
label: "Start Now",
position: "right",
className: "start-now-button",
@@ -173,6 +180,7 @@ module.exports = {
editUrl: "https://github.com/amplication/docs/edit/main/",
showLastUpdateAuthor: true,
showLastUpdateTime: true,
+ breadcrumbs: false
},
blog: false,
theme: {
@@ -191,12 +199,12 @@ module.exports = {
{
redirects: [
{
- to: "/user-entity",
- from: ["/how-to/add-delete-user-entity"]
+ to: "/plugins/guides/authentication",
+ from: ["/authentication-plugin-examples"]
},
{
- to: "/deploy/docker-desktop",
- from: ["/deploy"]
+ to: "/user-entity",
+ from: ["/how-to/add-delete-user-entity"]
},
{
to: "/getting-started/",
diff --git a/sidebars.js b/sidebars.js
index d2aa4739..1baff869 100644
--- a/sidebars.js
+++ b/sidebars.js
@@ -1,19 +1,34 @@
const sidebars = {
someSidebar: [
+ // Static "Documentation" label
+ {
+ type: 'html',
+ value: '',
+ defaultStyle: true,
+ },
+ {
+ type: 'doc',
+ id: 'welcome',
+ label: 'Overview',
+ },
+ {
+ type: 'doc',
+ id: 'getting-started/first-service',
+ label: 'Create Your First Service',
+ },
{
type: "category",
- label: "Get Started",
- link: {
- type: "doc",
- id: "welcome",
- },
+ label: "Platform Features",
items: [
- "welcome",
- "getting-started/first-service",
- "getting-started/set-up-entities",
- "getting-started/configure-roles-and-permissions",
- "getting-started/add-plugins-for-service",
- "getting-started/commit-changes-and-build-new-versions"
+ "how-to/platform-console",
+ "how-to/service-catalog",
+ "how-to/live-service-templates",
+ "platform-features/technical-debt-management",
+ {
+ type: "doc",
+ id: "plugins/private-plugins",
+ label: "Private Plugins",
+ },
],
},
{
@@ -84,6 +99,20 @@ const sidebars = {
"getting-started/relations"
]
},
+ {
+ type: "category",
+ label: "Deployment",
+ link: {
+ type: "doc",
+ id: "how-to/deploy",
+ },
+ items: [
+ "how-to/deploy",
+ "getting-started/deploy-docker-desktop",
+ "how-to/deploy-kubernetes",
+ "how-to/deploy-to-aws-ecs",
+ ]
+ },
{
type: "category",
label: "Enterprise Features",
@@ -141,12 +170,7 @@ const sidebars = {
},
"how-to/analytics-dashboard",
"how-to/understanding-break-the-monolith",
- "getting-started/deploy-docker-desktop",
- "how-to/deploy-kubernetes",
- "how-to/deploy-to-aws-ecs",
- "how-to/how-to-create-service",
- "how-to/authentication-plugin-examples",
- "how-to/create-message-broker",
+ "how-to/how-to-create-service"
],
},
{
@@ -159,53 +183,97 @@ const sidebars = {
items: [
"getting-started/plugins",
"getting-started/community-plugins",
- "plugins/how-to-create-plugin",
- "plugins/how-to-test-plugin",
- "plugins/publish-plugin",
+ "plugins/dotnet-plugins",
+ {
+ type: "category",
+ label: "Plugin Guides",
+ items: [
+ "how-to/choose-configure-update-database",
+ "how-to/authentication-plugin-examples",
+ "how-to/create-message-broker",
+ ]
+ },
{
type: "category",
- label: "Custom Plugin Architecture",
+ label: "Custom Plugins",
+ link: {
+ type:"doc",
+ id: "plugins/overview"
+ },
items: [
+ "plugins/overview",
"plugins/plugin-architecture",
+ "plugins/how-to-create-plugin",
+ "plugins/define-plugin-settings",
+ "plugins/how-to-test-plugin",
+ "plugins/publish-plugin",
+ "plugins/private-plugins",
"plugins/plugin-events-before-after",
"plugins/context-skip-default",
"plugins/event-hierarchy",
- ],
- },
- {
- type: "category",
- label: "Custom Plugin Events - Reference",
- items: [
- "plugins/plugin-events/create-server",
- "plugins/plugin-events/create-server-docker-compose",
- "plugins/plugin-events/create-server-docker-compose-dev",
{
- type: 'doc',
- id: 'plugins/plugin-events/create-server-docker-compose-db',
- className: 'plugin-event-not-recommended',
+ type: "category",
+ label: ".NET Plugin Events - Reference",
+ items: [
+ "plugins/dotnet-plugin-events/create-server",
+ "plugins/dotnet-plugin-events/create-server-appsettings",
+ "plugins/dotnet-plugin-events/create-server-auth",
+ "plugins/dotnet-plugin-events/create-program-file",
+ "plugins/dotnet-plugin-events/create-server-csproj",
+ "plugins/dotnet-plugin-events/create-server-docker-compose",
+ "plugins/dotnet-plugin-events/create-server-git-ignore",
+ "plugins/dotnet-plugin-events/create-entity-model",
+ "plugins/dotnet-plugin-events/create-resource-db-context-file",
+ "plugins/dotnet-plugin-events/create-message-broker",
+ "plugins/dotnet-plugin-events/create-message-broker-client-options-factory",
+ "plugins/dotnet-plugin-events/create-message-broker-service",
+ "plugins/dotnet-plugin-events/create-entity-controller",
+ "plugins/dotnet-plugin-events/create-entity-controller-base",
+ "plugins/dotnet-plugin-events/create-dtos",
+ "plugins/dotnet-plugin-events/create-entity-extensions",
+ "plugins/dotnet-plugin-events/create-entity-interface",
+ "plugins/dotnet-plugin-events/create-entity-service",
+ "plugins/dotnet-plugin-events/create-entity-service-base",
+ "plugins/dotnet-plugin-events/create-seed-development-data-file",
+ "plugins/dotnet-plugin-events/load-static-files"
+ ],
},
- "plugins/plugin-events/create-server-dot-env",
- "plugins/plugin-events/create-server-auth",
- "plugins/plugin-events/create-package-json",
- "plugins/plugin-events/create-entity-service",
- "plugins/plugin-events/create-entity-service-base",
- "plugins/plugin-events/create-entity-controller",
- "plugins/plugin-events/create-entity-controller-base",
- "plugins/plugin-events/create-entity-resolver",
- "plugins/plugin-events/create-entity-resolver-base",
- "plugins/plugin-events/create-message-broker-service",
- "plugins/plugin-events/create-message-broker-service-base",
- "plugins/plugin-events/create-message-broker-nestjs-module",
- "plugins/plugin-events/create-message-broker-client-options-factory",
- "plugins/plugin-events/create-message-broker-topics-enum",
- "plugins/plugin-events/create-prisma-schema",
+ {
+ type: "category",
+ label: "Node.js Plugin Events - Reference",
+ items: [
+ "plugins/plugin-events/create-server",
+ "plugins/plugin-events/create-server-docker-compose",
+ "plugins/plugin-events/create-server-docker-compose-dev",
+ {
+ type: 'doc',
+ id: 'plugins/plugin-events/create-server-docker-compose-db',
+ className: 'plugin-event-not-recommended',
+ },
+ "plugins/plugin-events/create-server-dot-env",
+ "plugins/plugin-events/create-server-auth",
+ "plugins/plugin-events/create-package-json",
+ "plugins/plugin-events/create-entity-service",
+ "plugins/plugin-events/create-entity-service-base",
+ "plugins/plugin-events/create-entity-controller",
+ "plugins/plugin-events/create-entity-controller-base",
+ "plugins/plugin-events/create-entity-resolver",
+ "plugins/plugin-events/create-entity-resolver-base",
+ "plugins/plugin-events/create-message-broker-service",
+ "plugins/plugin-events/create-message-broker-service-base",
+ "plugins/plugin-events/create-message-broker-nestjs-module",
+ "plugins/plugin-events/create-message-broker-client-options-factory",
+ "plugins/plugin-events/create-message-broker-topics-enum",
+ "plugins/plugin-events/create-prisma-schema",
+ ],
+ }
],
- }
+ },
]
},
{
type: "category",
- label: "Learn",
+ label: "Tutorials",
link: {
type: "doc",
id: "tutorials/index",
@@ -263,19 +331,20 @@ const sidebars = {
}
],
},
- {
- type: "category",
- label: "About",
- link: {
- type: "doc",
- id: "about/index",
- },
- items: [
- "about/licensing",
- "about/product-roadmap",
- "getting-started/phone-home",
- ],
- },
+
+ // {
+ // type: "category",
+ // label: "About",
+ // link: {
+ // type: "doc",
+ // id: "about/index",
+ // },
+ // items: [
+ // "about/licensing",
+ // "about/product-roadmap",
+ // "getting-started/phone-home",
+ // ],
+ // },
"faqs/faqs",
@@ -319,7 +388,7 @@ const sidebars = {
},
{
type: "category",
- label: "Contribute To Amplication",
+ label: "Contribute",
link: {
type: "doc",
id: "contributing",
diff --git a/src/css/custom.css b/src/css/custom.css
index 06b43db1..62962b24 100644
--- a/src/css/custom.css
+++ b/src/css/custom.css
@@ -202,8 +202,135 @@ article > header {
opacity: 0.5;
}
+.tabs-container {
+ background-color: rgb(21 25 44);
+ border-radius: var(--ifm-alert-border-radius);
+ padding-bottom: var(--ifm-tabs-padding-vertical);
+}
+
+/* Amplication Sidebar Header */
+.amplication-sidebar-header {
+ flex: 1;
+ line-height: 1.25;
+ font-size: 0.9rem;
+ margin: 0;
+ font-weight: 600;
+}
+
@media only screen and (max-width: 996px) {
.start-now-button {
display: none;
}
}
+
+.menu__link {
+ color: #B7BAC7;
+ font-size: 14px;
+}
+
+.menu__link.menu__link--active,
+.menu__link.menu__link--sublist.menu__link--active {
+ color: #FFF;
+}
+
+.markdown a, .markdown a:hover {
+ color: #53DBEE;
+}
+
+.navbar__link:hover, .navbar__link--active {
+ color: #53DBEE;
+}
+
+.markdown .alert a {
+ text-decoration-color: #53DBEE;
+}
+
+.theme-edit-this-page {
+ color: #53DBEE;
+}
+
+.pagination-nav__link:hover {
+ border-color: #53DBEE;
+}
+
+.pagination-nav__label {
+ color: #53DBEE;
+}
+
+.navbar__link {
+ font-size: 14px;
+}
+
+.navbar__logo img {
+ height: 82%;
+}
+
+@media only screen and (max-width: 995px) {
+ .navbar__logo img {
+ height: 90%;
+ }
+}
+
+.table-of-contents__link {
+ color: #B7BAC7;
+ font-size: 12px;
+}
+
+.table-of-contents__link.toc-highlight.table-of-contents__link--active,
+.table-of-contents__link:hover {
+ color: #FFF;
+}
+
+.breadcrumbs__link > svg > path {
+ fill: #B7BAC7;
+}
+
+.markdown h1:first-child {
+ font-size: 32px;
+ font-weight: 600;
+ line-height: 1.25rem;
+ margin-top: 1rem;
+}
+
+.markdown > h2 {
+ font-size: 18px;
+ font-weight: 600;
+ line-height: 1.25rem;
+}
+
+.markdown > pre,
+.markdown > ul,
+.markdown > ol,
+.markdown > p {
+ color: #D3D4DC;
+ font-size: 14px;
+ line-height: 1.25rem;
+}
+
+.markdown .theme-admonition {
+ font-size: 14px;
+}
+
+.markdown .theme-admonition a {
+ text-decoration: none;
+}
+
+.markdown .theme-admonition a:hover {
+ text-decoration: underline;
+}
+
+.menu__link--sublist-caret:after {
+ background: var(--ifm-menu-link-sublist-icon) 50% / 1.5rem 1.5rem
+}
+
+.menu__caret:before {
+ background: var(--ifm-menu-link-sublist-icon) 50% / 1.5rem 1.5rem
+}
+
+.menu::-webkit-scrollbar-track {
+ background-color: #15192C;
+}
+
+.menu::-webkit-scrollbar-thumb {
+ background-color: #373D57;
+}